From 887f585b613120875fe84750a2097378cbcc7560 Mon Sep 17 00:00:00 2001
From: Kevin Smith <git@kismith.co.uk>
Date: Wed, 26 Aug 2009 07:58:33 +0100
Subject: Roster rendering now takes account of the text height as well as the
 avatar height.


diff --git a/Swift/QtUI/Roster/RosterDelegate.cpp b/Swift/QtUI/Roster/RosterDelegate.cpp
index c6b8a8c..ae7a4b0 100644
--- a/Swift/QtUI/Roster/RosterDelegate.cpp
+++ b/Swift/QtUI/Roster/RosterDelegate.cpp
@@ -1,5 +1,6 @@
 #include "RosterDelegate.h"
 
+#include <QApplication>
 #include <QPainter>
 #include <QColor>
 #include <QBrush>
@@ -9,15 +10,26 @@
 #include "QtTreeWidgetItem.h"
 
 namespace Swift {
+
+RosterDelegate::RosterDelegate() : nameFont_(QApplication::font()), statusFont_(QApplication::font()) {
+	nameFont_.setPointSize(12);
+	statusFont_.setStyle(QFont::StyleItalic);
+	statusFont_.setPointSize(10);
+}
+	
 QSize RosterDelegate::sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index ) const {
 	QtTreeWidgetItem* item = static_cast<QtTreeWidgetItem*>(index.internalPointer());
-	if (item && !item->isContact()) {
+	if (!item || !item->isContact()) {
 		return QStyledItemDelegate::sizeHint(option, index);
 	}
+	int sizeByAvatar = avatarSize_ + margin_ * 2;
+	QFontMetrics nameMetrics(nameFont_);
+	QFontMetrics statusMetrics(statusFont_);
+	int sizeByText = 2 * margin_ + nameMetrics.height() + statusMetrics.height();
 	//Doesn't work, yay! FIXME: why?
-	QSize size = (option.state & QStyle::State_Selected) ? QSize(150, 80) : QSize(150, avatarSize_ + margin_ * 2);
+	//QSize size = (option.state & QStyle::State_Selected) ? QSize(150, 80) : QSize(150, avatarSize_ + margin_ * 2);
 	//qDebug() << "Returning size" << size;
-	return size;
+	return QSize(150, sizeByText > sizeByAvatar ? sizeByText : sizeByAvatar);
 }
 
 void RosterDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const {
@@ -34,7 +46,10 @@ void RosterDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option
 	if ( option.state & QStyle::State_Selected ) {
 		painter->fillRect(fullRegion, option.palette.highlight());
 		painter->setPen(option.palette.highlightedText().color());
-	} 
+	} else {
+		QColor nameColor = index.data(Qt::TextColorRole).value<QColor>();
+		painter->setPen(QPen(nameColor));
+	}
 	
 	QRect presenceIconRegion(QPoint(margin_, fullRegion.top()), QSize(presenceIconWidth_, fullRegion.height()));
 	
@@ -51,22 +66,17 @@ void RosterDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option
 		: QIcon(":/icons/offline.png");
 	presenceIcon.paint(painter, presenceIconRegion, Qt::AlignBottom | Qt::AlignHCenter);
 	
-	QFont nameFont = painter->font();
-	QFont statusFont = painter->font();
-	
-	painter->setFont(nameFont);
+	painter->setFont(nameFont_);
 	QRect textRegion(fullRegion.adjusted(avatarRegion.right() + margin_ * 2, 0, 0, 0));
 	
-	QFontMetrics nameMetrics(nameFont);
+	QFontMetrics nameMetrics(nameFont_);
 	int nameHeight = nameMetrics.height() + margin_;
 	QRect nameRegion(textRegion.adjusted(0, margin_, 0, 0));
-	QColor nameColor = index.data(Qt::TextColorRole).value<QColor>();
-	painter->setPen(QPen(nameColor));
+	
 	painter->drawText(nameRegion, Qt::AlignTop, index.data(Qt::DisplayRole).toString());
 	
-	statusFont.setStyle(QFont::StyleItalic);
-	statusFont.setPointSize(10);
-	painter->setFont(statusFont);
+	
+	painter->setFont(statusFont_);
 	painter->setPen(QPen(QColor(160,160,160)));
 	QRect statusTextRegion(textRegion.adjusted(0, nameHeight, 0, 0));
 	painter->drawText(statusTextRegion, Qt::AlignTop, index.data(StatusTextRole).toString());
diff --git a/Swift/QtUI/Roster/RosterDelegate.h b/Swift/QtUI/Roster/RosterDelegate.h
index 55775cf..dcbb665 100644
--- a/Swift/QtUI/Roster/RosterDelegate.h
+++ b/Swift/QtUI/Roster/RosterDelegate.h
@@ -2,13 +2,17 @@
 
 #include <QStyledItemDelegate>
 #include <QColor>
+#include <QFont>
 
 namespace Swift {
 	class RosterDelegate : public QStyledItemDelegate {
 	public:
+		RosterDelegate();
 		QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const;
 		void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const;
 	private:
+		QFont nameFont_;
+		QFont statusFont_;
 		static const int avatarSize_ = 28;
 		static const int presenceIconHeight_ = 16;
 		static const int presenceIconWidth_ = 16;
-- 
cgit v0.10.2-6-g49f6