From 573d4c8050fa6548e4680fd74c1a0872e9a62c34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Wed, 5 Feb 2014 01:34:50 +0100 Subject: [PATCH] Paint the headers nicer. --- gui/groupview/Group.cpp | 66 ++++++++++++++++++++++++------------- gui/groupview/Group.h | 3 +- gui/groupview/GroupView.cpp | 9 ++--- 3 files changed, 50 insertions(+), 28 deletions(-) diff --git a/gui/groupview/Group.cpp b/gui/groupview/Group.cpp index f216cc6e..7cce674a 100644 --- a/gui/groupview/Group.cpp +++ b/gui/groupview/Group.cpp @@ -35,18 +35,18 @@ Group::HitResults Group::hitScan(const QPoint &pos) const int body_end = body_start + contentHeight() + 5; // FIXME: wtf is this 5? int y = pos.y(); // int x = pos.x(); - if(y < y_start) + if (y < y_start) { results = Group::NoHit; } - else if(y < body_start) + else if (y < body_start) { results = Group::HeaderHit; int collapseSize = headerHeight() - 4; // the icon QRect iconRect = QRect(view->m_leftMargin + 2, 2 + y_start, collapseSize, collapseSize); - if(iconRect.contains(pos)) + if (iconRect.contains(pos)) { results |= Group::CheckboxHit; } @@ -58,37 +58,53 @@ Group::HitResults Group::hitScan(const QPoint &pos) const return results; } -void Group::drawHeader(QPainter *painter, const int y) +void Group::drawHeader(QPainter *painter, const QStyleOptionViewItem &option, const int y) { + QStyleOptionViewItemV4 opt = option; painter->save(); - int height = headerHeight() - 4; - int collapseSize = height; - - // the icon - QRect iconRect = QRect(view->m_leftMargin + 2, 2 + y, collapseSize, collapseSize); - painter->setPen(QPen(Qt::black, 1)); - painter->drawRect(iconRect); static const int margin = 2; + static const int spacing = 10; + int height = headerHeight(); + int text_height = height - 2 * margin; + + // set the text colors + QPalette::ColorGroup cg = QPalette::Normal; + painter->setPen(opt.palette.color(cg, QPalette::Text)); + + // set up geometry + QRect iconRect = QRect(view->m_leftMargin + margin, y + margin, text_height - 1, text_height - 1); QRect iconSubrect = iconRect.adjusted(margin, margin, -margin, -margin); + QRect smallRect = iconSubrect.adjusted(margin, margin, -margin, -margin); int midX = iconSubrect.center().x(); int midY = iconSubrect.center().y(); - if (collapsed) + + // checkboxy thingy { - painter->drawLine(midX, iconSubrect.top(), midX, iconSubrect.bottom()); + painter->drawRect(iconSubrect); + + painter->setBrush(opt.palette.text()); + painter->drawRect(smallRect.x(), midY, smallRect.width(), 2); + if(collapsed) + { + painter->drawRect(midX, smallRect.y(), 2, smallRect.height()); + } } - painter->drawLine(iconSubrect.left(), midY, iconSubrect.right(), midY); - // the text - int textWidth = painter->fontMetrics().width(text); - QRect textRect = QRect(iconRect.right() + 4, y, textWidth, headerHeight()); - painter->setBrush(view->viewOptions().palette.text()); - view->style()->drawItemText(painter, textRect, Qt::AlignHCenter | Qt::AlignVCenter, - view->viewport()->palette(), true, text); + int x_left = iconRect.right(); + if(text.length()) + { + // the text + int text_width = painter->fontMetrics().width(text); + QRect textRect = QRect(x_left + spacing, y + margin, text_width, text_height); + x_left = textRect.right(); + view->style()->drawItemText(painter, textRect, Qt::AlignHCenter | Qt::AlignVCenter, + opt.palette, true, text); + } // the line - painter->drawLine(textRect.right() + 4, y + headerHeight() / 2, - view->contentWidth() - view->m_rightMargin, y + headerHeight() / 2); + painter->drawLine(x_left + spacing, midY + 1, view->contentWidth() - view->m_rightMargin, + midY + 1); painter->restore(); } @@ -100,7 +116,11 @@ int Group::totalHeight() const int Group::headerHeight() const { - return view->viewport()->fontMetrics().height() + 4; + int raw = view->viewport()->fontMetrics().height() + 4; + // add english. maybe. depends on font height. + if(raw % 2 == 0) + raw++; + return std::min( raw , 25 ); } int Group::contentHeight() const diff --git a/gui/groupview/Group.h b/gui/groupview/Group.h index 455ee1a8..46a12f63 100644 --- a/gui/groupview/Group.h +++ b/gui/groupview/Group.h @@ -3,6 +3,7 @@ #include #include #include +#include class GroupView; class QPainter; @@ -26,7 +27,7 @@ struct Group void update(); /// draw the header at y-position. - void drawHeader(QPainter *painter, const int y); + void drawHeader(QPainter *painter, const QStyleOptionViewItem &option, const int y); /// height of the group, in total. includes a small bit of padding. int totalHeight() const; diff --git a/gui/groupview/GroupView.cpp b/gui/groupview/GroupView.cpp index fb4b45f4..9e186854 100644 --- a/gui/groupview/GroupView.cpp +++ b/gui/groupview/GroupView.cpp @@ -206,7 +206,7 @@ int GroupView::categoryRowHeight(const QModelIndex &index) const largestHeight = qMax(largestHeight, itemDelegate()->sizeHint(viewOptions(), i).height()); } - return largestHeight; + return largestHeight + m_spacing; } QPair GroupView::categoryInternalPosition(const QModelIndex &index) const @@ -423,11 +423,14 @@ void GroupView::paintEvent(QPaintEvent *event) { QPainter painter(this->viewport()); + QStyleOptionViewItemV4 option(viewOptions()); + option.widget = this; + int y = -verticalOffset(); for (int i = 0; i < m_groups.size(); ++i) { Group *category = m_groups.at(i); - category->drawHeader(&painter, y); + category->drawHeader(&painter, option, y); y += category->totalHeight() + m_categoryMargin; } @@ -439,9 +442,7 @@ void GroupView::paintEvent(QPaintEvent *event) continue; } Qt::ItemFlags flags = index.flags(); - QStyleOptionViewItemV4 option(viewOptions()); option.rect = visualRect(index); - option.widget = this; option.features |= QStyleOptionViewItemV2::WrapText; // FIXME: what is the meaning of this anyway? if (flags & Qt::ItemIsSelectable && selectionModel()->isSelected(index))