diff options
Diffstat (limited to 'Swift/QtUI/Roster')
-rw-r--r-- | Swift/QtUI/Roster/DelegateCommons.cpp | 13 | ||||
-rw-r--r-- | Swift/QtUI/Roster/DelegateCommons.h | 28 | ||||
-rw-r--r-- | Swift/QtUI/Roster/GroupItemDelegate.cpp | 110 | ||||
-rw-r--r-- | Swift/QtUI/Roster/GroupItemDelegate.h | 29 | ||||
-rw-r--r-- | Swift/QtUI/Roster/RosterDelegate.cpp | 128 | ||||
-rw-r--r-- | Swift/QtUI/Roster/RosterDelegate.h | 17 |
6 files changed, 207 insertions, 118 deletions
diff --git a/Swift/QtUI/Roster/DelegateCommons.cpp b/Swift/QtUI/Roster/DelegateCommons.cpp new file mode 100644 index 0000000..3cd3695 --- /dev/null +++ b/Swift/QtUI/Roster/DelegateCommons.cpp @@ -0,0 +1,13 @@ +/* + * Copyright (c) 2010 Kevin Smith + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#include "DelegateCommons.h" + +namespace Swift { +const int DelegateCommons::horizontalMargin = 2; +const int DelegateCommons::verticalMargin = 2; +const int DelegateCommons::farLeftMargin = 2; +} diff --git a/Swift/QtUI/Roster/DelegateCommons.h b/Swift/QtUI/Roster/DelegateCommons.h new file mode 100644 index 0000000..ac5efc4 --- /dev/null +++ b/Swift/QtUI/Roster/DelegateCommons.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2010 Kevin Smith + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#pragma once + +#include <QApplication> +#include <QFont> + +namespace Swift { + class DelegateCommons { + public: + DelegateCommons() : nameFont(QApplication::font()), detailFont(QApplication::font()) { + detailFontSizeDrop = nameFont.pointSize() >= 10 ? 2 : 0; + detailFont.setStyle(QFont::StyleItalic); + detailFont.setPointSize(nameFont.pointSize() - detailFontSizeDrop); + } + + int detailFontSizeDrop; + QFont nameFont; + QFont detailFont; + static const int horizontalMargin; + static const int verticalMargin; + static const int farLeftMargin; + }; +} diff --git a/Swift/QtUI/Roster/GroupItemDelegate.cpp b/Swift/QtUI/Roster/GroupItemDelegate.cpp new file mode 100644 index 0000000..6f13b40 --- /dev/null +++ b/Swift/QtUI/Roster/GroupItemDelegate.cpp @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2010 Kevin Smith + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#include "GroupItemDelegate.h" + +#include <QPainter> +#include <QPen> + +namespace Swift { + +GroupItemDelegate::GroupItemDelegate() : groupFont_(QApplication::font()) { + groupFont_.setPointSize(common_.nameFont.pointSize() - common_.detailFontSizeDrop); + groupFont_.setWeight(QFont::Bold); +} + +QSize GroupItemDelegate::sizeHint(const QStyleOptionViewItem& /*option*/, const QModelIndex& /*index*/) const { + QFontMetrics groupMetrics(groupFont_); + return QSize(150, groupMetrics.height() + 4); +} + +void GroupItemDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QString& name, int rowCount, bool expanded) const { + painter->save(); + painter->setPen(QPen(QColor(189, 189, 189))); + //FIXME: It looks like Qt is passing us a rectangle that's too small + //This deliberately draws outside the lines, and we need to find a better solution. + int correctionAmount = groupCornerRadius_ > 0 ? 0 : 1; + QRect region(QPoint(option.rect.left() - correctionAmount, option.rect.top()), QSize(option.rect.width() + correctionAmount, option.rect.height() - common_.verticalMargin)); + QLinearGradient fillGradient(region.topLeft(), region.bottomLeft()); + fillGradient.setColorAt(0, QColor(244, 244, 244)); + fillGradient.setColorAt(0.1, QColor(231, 231, 231)); + fillGradient.setColorAt(1, QColor(209, 209, 209)); + + QBrush backgroundBrush = QBrush(fillGradient); + QPainterPath fillPath; + fillPath.addRoundedRect(region, groupCornerRadius_, groupCornerRadius_); + QPainterPath linePath; + linePath.addRoundedRect(region, groupCornerRadius_, groupCornerRadius_); + painter->fillPath(fillPath, backgroundBrush); + painter->drawPath(linePath); + + double triangleWidth = 9; + double triangleHeight = 5; + paintExpansionTriangle(painter, region.adjusted(common_.horizontalMargin + 1, 0, 0, 0), triangleWidth, triangleHeight, expanded); + + int textLeftOffset = 3 * common_.horizontalMargin + 1 + triangleWidth; + QFontMetrics fontMetrics(groupFont_); + int textTopOffset = (option.rect.height() - fontMetrics.height()) / 2; + painter->setFont(groupFont_); + int contactCountWidth = 0; + QRect textRect = region.adjusted(textLeftOffset, textTopOffset, -1 * textLeftOffset, -1 * textTopOffset); + + if (!expanded) { + QFontMetrics groupMetrics(groupFont_); + int contactCount = rowCount; + QString countString = QString("%1").arg(contactCount); + contactCountWidth = groupMetrics.width(countString) + 2 * common_.horizontalMargin; + int offsetAmount = textRect.width() - contactCountWidth + common_.horizontalMargin; + QRect countRect = textRect.adjusted(offsetAmount, 0, 0/*-1 * offsetAmount*/, 0); + //qDebug() << "Painting count string " << countString << " at " << countRect << " from offset " << offsetAmount; + paintShadowText(painter, countRect, countString); + } + QRect nameTextRect = textRect.adjusted(0, 0, contactCountWidth, 0); + paintShadowText(painter, nameTextRect, name); + painter->restore(); +} + +void GroupItemDelegate::paintExpansionTriangle(QPainter* painter, const QRect& region, int width, int height, bool expanded) const { + QBrush triangleBrush(QColor(110, 110, 110)); + QBrush triangleShadowBrush(QColor(47, 47, 47)); + QPainterPath trianglePath; + QPainterPath triangleShadowPath; + QPolygonF triangle; + QPolygonF triangleShadow; + QPointF triangleTopLeft(region.left(), region.top() + region.height() / 2 - height / 2); + QPointF shadowOffset(0,-1); + QPointF trianglePoint2; + QPointF trianglePoint3; + + if (expanded) { + triangleTopLeft += QPoint(0, 1); + trianglePoint2 = triangleTopLeft + QPointF(width, 0); + trianglePoint3 = trianglePoint2 + QPointF(-1 * (width / 2), height); + //qDebug() << "Plotting expanded" << triangleTopLeft << ", " << trianglePoint2 << ", " << trianglePoint3; + } else { + trianglePoint2 = triangleTopLeft + QPointF(0, width); + trianglePoint3 = trianglePoint2 + QPointF(height, -1 * (width / 2)); + //qDebug() << "Plotting collapsed" << triangleTopLeft << ", " << trianglePoint2 << ", " << trianglePoint3; + } + triangle << triangleTopLeft << trianglePoint2 << trianglePoint3 << triangleTopLeft; + triangleShadow << triangleTopLeft + shadowOffset << trianglePoint2 + shadowOffset << trianglePoint3 + shadowOffset << triangleTopLeft + shadowOffset; + + trianglePath.addPolygon(triangle); + triangleShadowPath.addPolygon(triangleShadow); + painter->fillPath(triangleShadowPath, triangleShadowBrush); + painter->fillPath(trianglePath, triangleBrush); +} + +void GroupItemDelegate::paintShadowText(QPainter* painter, const QRect& region, const QString& text) const { + painter->setPen(QPen(QColor(254, 254, 254))); + painter->drawText(region.adjusted(0, 1, 0, 0), Qt::AlignTop, text); + painter->setPen(QPen(QColor(115, 115, 115))); + painter->drawText(region, Qt::AlignTop, text); +} + +const int GroupItemDelegate::groupCornerRadius_ = 0; + +} diff --git a/Swift/QtUI/Roster/GroupItemDelegate.h b/Swift/QtUI/Roster/GroupItemDelegate.h new file mode 100644 index 0000000..1378e14 --- /dev/null +++ b/Swift/QtUI/Roster/GroupItemDelegate.h @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2010 Kevin Smith + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#pragma once + +#include <QStyledItemDelegate> +#include <QColor> +#include <QFont> + +#include "DelegateCommons.h" + +namespace Swift { + class QtTreeWidgetItem; + class GroupItemDelegate : public QStyledItemDelegate { + public: + GroupItemDelegate(); + QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const; + void paint(QPainter* painter, const QStyleOptionViewItem& option, const QString& name, int rowCount, bool expanded) const; + private: + void paintShadowText(QPainter* painter, const QRect& region, const QString& text) const; + void paintExpansionTriangle(QPainter* painter, const QRect& region, int width, int height, bool expanded) const; + QFont groupFont_; + static const int groupCornerRadius_; + DelegateCommons common_; + }; +} diff --git a/Swift/QtUI/Roster/RosterDelegate.cpp b/Swift/QtUI/Roster/RosterDelegate.cpp index b70faad..0c12d6e 100644 --- a/Swift/QtUI/Roster/RosterDelegate.cpp +++ b/Swift/QtUI/Roster/RosterDelegate.cpp @@ -19,36 +19,29 @@ namespace Swift { -RosterDelegate::RosterDelegate() : nameFont_(QApplication::font()), statusFont_(QApplication::font()), groupFont_(QApplication::font()) { - int statusFontSizeDrop = nameFont_.pointSize() >= 10 ? 2 : 0; - statusFont_.setStyle(QFont::StyleItalic); - statusFont_.setPointSize(nameFont_.pointSize() - statusFontSizeDrop); - groupFont_.setPointSize(nameFont_.pointSize() - statusFontSizeDrop); - groupFont_.setWeight(QFont::Bold); +RosterDelegate::RosterDelegate() { + groupDelegate_ = new GroupItemDelegate(); +} + +RosterDelegate::~RosterDelegate() { + delete groupDelegate_; } QSize RosterDelegate::sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index ) const { QtTreeWidgetItem* item = static_cast<QtTreeWidgetItem*>(index.internalPointer()); if (!item || !item->isContact()) { - return groupSizeHint(option, index); + return groupDelegate_->sizeHint(option, index); } return contactSizeHint(option, index); } -QSize RosterDelegate::groupSizeHint(const QStyleOptionViewItem& option, const QModelIndex& index ) const { - Q_UNUSED(option); - Q_UNUSED(index); - QFontMetrics groupMetrics(groupFont_); - return QSize(150, groupMetrics.height() + 4); -} - QSize RosterDelegate::contactSizeHint(const QStyleOptionViewItem& option, const QModelIndex& index ) const { Q_UNUSED(option); Q_UNUSED(index); - int heightByAvatar = avatarSize_ + verticalMargin_ * 2; - QFontMetrics nameMetrics(nameFont_); - QFontMetrics statusMetrics(statusFont_); - int sizeByText = 2 * verticalMargin_ + nameMetrics.height() + statusMetrics.height(); + int heightByAvatar = avatarSize_ + common_.verticalMargin * 2; + QFontMetrics nameMetrics(common_.nameFont); + QFontMetrics statusMetrics(common_.detailFont); + int sizeByText = 2 * common_.verticalMargin + 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); //qDebug() << "Returning size" << size; @@ -65,91 +58,14 @@ void RosterDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option } void RosterDelegate::paintGroup(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const { - painter->save(); - painter->setPen(QPen(QColor(189, 189, 189))); - //FIXME: It looks like Qt is passing us a rectangle that's too small - //This deliberately draws outside the lines, and we need to find a better solution. - int correctionAmount = groupCornerRadius_ > 0 ? 0 : 1; - QRect region(QPoint(option.rect.left() - correctionAmount, option.rect.top()), QSize(option.rect.width() + correctionAmount, option.rect.height() - verticalMargin_)); - QLinearGradient fillGradient(region.topLeft(), region.bottomLeft()); - fillGradient.setColorAt(0, QColor(244, 244, 244)); - fillGradient.setColorAt(0.1, QColor(231, 231, 231)); - fillGradient.setColorAt(1, QColor(209, 209, 209)); - - QBrush backgroundBrush = QBrush(fillGradient); - QPainterPath fillPath; - fillPath.addRoundedRect(region, groupCornerRadius_, groupCornerRadius_); - QPainterPath linePath; - linePath.addRoundedRect(region, groupCornerRadius_, groupCornerRadius_); - painter->fillPath(fillPath, backgroundBrush); - painter->drawPath(linePath); - - double triangleWidth = 9; - double triangleHeight = 5; QtTreeWidgetItem* item = index.isValid() ? static_cast<QtTreeWidgetItem*>(index.internalPointer()) : NULL; if (item) { - paintExpansionTriangle(painter, region.adjusted(horizontalMargin_ + 1, 0, 0, 0), triangleWidth, triangleHeight, item->isExpanded()); - } - - int textLeftOffset = 3 * horizontalMargin_ + 1 + triangleWidth; - QFontMetrics fontMetrics(groupFont_); - int textTopOffset = (option.rect.height() - fontMetrics.height()) / 2; - painter->setFont(groupFont_); - int contactCountWidth = 0; - QRect textRect = region.adjusted(textLeftOffset, textTopOffset, -1 * textLeftOffset, -1 * textTopOffset); - - if (!item->isExpanded()) { - QFontMetrics groupMetrics(groupFont_); - int contactCount = item->rowCount(); - QString countString = QString("%1").arg(contactCount); - contactCountWidth = groupMetrics.width(countString) + 2 * horizontalMargin_; - int offsetAmount = textRect.width() - contactCountWidth + horizontalMargin_; - QRect countRect = textRect.adjusted(offsetAmount, 0, 0/*-1 * offsetAmount*/, 0); - //qDebug() << "Painting count string " << countString << " at " << countRect << " from offset " << offsetAmount; - paintShadowText(painter, countRect, countString); + groupDelegate_->paint(painter, option, index.data(Qt::DisplayRole).toString(), item->rowCount(), item->isExpanded()); } - QRect nameTextRect = textRect.adjusted(0, 0, contactCountWidth, 0); - paintShadowText(painter, nameTextRect, index.data(Qt::DisplayRole).toString()); - painter->restore(); } -void RosterDelegate::paintExpansionTriangle(QPainter* painter, const QRect& region, int width, int height, bool expanded) const { - QBrush triangleBrush(QColor(110, 110, 110)); - QBrush triangleShadowBrush(QColor(47, 47, 47)); - QPainterPath trianglePath; - QPainterPath triangleShadowPath; - QPolygonF triangle; - QPolygonF triangleShadow; - QPointF triangleTopLeft(region.left(), region.top() + region.height() / 2 - height / 2); - QPointF shadowOffset(0,-1); - QPointF trianglePoint2; - QPointF trianglePoint3; - - if (expanded) { - triangleTopLeft += QPoint(0, 1); - trianglePoint2 = triangleTopLeft + QPointF(width, 0); - trianglePoint3 = trianglePoint2 + QPointF(-1 * (width / 2), height); - //qDebug() << "Plotting expanded" << triangleTopLeft << ", " << trianglePoint2 << ", " << trianglePoint3; - } else { - trianglePoint2 = triangleTopLeft + QPointF(0, width); - trianglePoint3 = trianglePoint2 + QPointF(height, -1 * (width / 2)); - //qDebug() << "Plotting collapsed" << triangleTopLeft << ", " << trianglePoint2 << ", " << trianglePoint3; - } - triangle << triangleTopLeft << trianglePoint2 << trianglePoint3 << triangleTopLeft; - triangleShadow << triangleTopLeft + shadowOffset << trianglePoint2 + shadowOffset << trianglePoint3 + shadowOffset << triangleTopLeft + shadowOffset; - - trianglePath.addPolygon(triangle); - triangleShadowPath.addPolygon(triangleShadow); - painter->fillPath(triangleShadowPath, triangleShadowBrush); - painter->fillPath(trianglePath, triangleBrush); -} -void RosterDelegate::paintShadowText(QPainter* painter, const QRect& region, const QString& text) const { - painter->setPen(QPen(QColor(254, 254, 254))); - painter->drawText(region.adjusted(0, 1, 0, 0), Qt::AlignTop, text); - painter->setPen(QPen(QColor(115, 115, 115))); - painter->drawText(region, Qt::AlignTop, text); -} + void RosterDelegate::paintContact(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const { //qDebug() << "painting" << index.data(Qt::DisplayRole).toString(); @@ -165,7 +81,7 @@ void RosterDelegate::paintContact(QPainter* painter, const QStyleOptionViewItem& painter->setPen(QPen(nameColor)); } - QRect presenceIconRegion(QPoint(farLeftMargin_, fullRegion.top()), QSize(presenceIconWidth_, fullRegion.height() - verticalMargin_)); + QRect presenceIconRegion(QPoint(common_.farLeftMargin, fullRegion.top()), QSize(presenceIconWidth_, fullRegion.height() - common_.verticalMargin)); int calculatedAvatarSize = presenceIconRegion.height(); //This overlaps the presenceIcon, so must be painted first @@ -181,19 +97,19 @@ void RosterDelegate::paintContact(QPainter* painter, const QStyleOptionViewItem& : QIcon(":/icons/offline.png"); presenceIcon.paint(painter, presenceIconRegion, Qt::AlignBottom | Qt::AlignHCenter); - QFontMetrics nameMetrics(nameFont_); - painter->setFont(nameFont_); + QFontMetrics nameMetrics(common_.nameFont); + painter->setFont(common_.nameFont); int extraFontWidth = nameMetrics.width("H"); - int leftOffset = avatarRegion.right() + horizontalMargin_ * 2 + extraFontWidth / 2; + int leftOffset = avatarRegion.right() + common_.horizontalMargin * 2 + extraFontWidth / 2; QRect textRegion(fullRegion.adjusted(leftOffset, 0, 0/*-leftOffset*/, 0)); - int nameHeight = nameMetrics.height() + verticalMargin_; - QRect nameRegion(textRegion.adjusted(0, verticalMargin_, 0, 0)); + int nameHeight = nameMetrics.height() + common_.verticalMargin; + QRect nameRegion(textRegion.adjusted(0, common_.verticalMargin, 0, 0)); painter->drawText(nameRegion, Qt::AlignTop, index.data(Qt::DisplayRole).toString()); - painter->setFont(statusFont_); + painter->setFont(common_.detailFont); painter->setPen(QPen(QColor(160,160,160))); QRect statusTextRegion(textRegion.adjusted(0, nameHeight, 0, 0)); @@ -205,9 +121,5 @@ void RosterDelegate::paintContact(QPainter* painter, const QStyleOptionViewItem& const int RosterDelegate::avatarSize_ = 20; const int RosterDelegate::presenceIconHeight_ = 16; const int RosterDelegate::presenceIconWidth_ = 16; -const int RosterDelegate::groupCornerRadius_ = 0; -const int RosterDelegate::horizontalMargin_ = 2; -const int RosterDelegate::verticalMargin_ = 2; -const int RosterDelegate::farLeftMargin_ = 2; } diff --git a/Swift/QtUI/Roster/RosterDelegate.h b/Swift/QtUI/Roster/RosterDelegate.h index 7713968..696ea03 100644 --- a/Swift/QtUI/Roster/RosterDelegate.h +++ b/Swift/QtUI/Roster/RosterDelegate.h @@ -10,29 +10,26 @@ #include <QColor> #include <QFont> +#include "GroupItemDelegate.h" +#include "DelegateCommons.h" + namespace Swift { class QtTreeWidgetItem; class RosterDelegate : public QStyledItemDelegate { public: RosterDelegate(); + ~RosterDelegate(); QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const; void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const; private: - QSize groupSizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const; QSize contactSizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const; void paintGroup(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const; void paintContact(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const; - void paintShadowText(QPainter* painter, const QRect& region, const QString& text) const; - void paintExpansionTriangle(QPainter* painter, const QRect& region, int width, int height, bool expanded) const; - QFont nameFont_; - QFont statusFont_; - QFont groupFont_; + DelegateCommons common_; + GroupItemDelegate* groupDelegate_; static const int avatarSize_; static const int presenceIconHeight_; static const int presenceIconWidth_; - static const int groupCornerRadius_; - static const int horizontalMargin_; - static const int verticalMargin_ ; - static const int farLeftMargin_; + }; } |