Visual and scroll behavior changes to groupview

Scroll by rows, not pixels.
Paint the checkboxy thing again! Make0 it behave.
Set the group header height properly.
This commit is contained in:
Petr Mrázek 2014-02-09 20:45:18 +01:00
parent 0d30a2655f
commit 18f532b0d7
2 changed files with 134 additions and 129 deletions

View File

@ -61,55 +61,6 @@ Group::HitResults Group::hitScan(const QPoint &pos) const
void Group::drawHeader(QPainter *painter, const QStyleOptionViewItem &option) void Group::drawHeader(QPainter *painter, const QStyleOptionViewItem &option)
{ {
/*
QStyleOptionViewItemV4 opt = option;
painter->save();
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();
// checkboxy thingy
{
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());
}
}
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(x_left + spacing, midY + 1, view->contentWidth() - view->m_rightMargin,
midY + 1);
painter->restore();
*/
painter->setRenderHint(QPainter::Antialiasing); painter->setRenderHint(QPainter::Antialiasing);
const QRect optRect = option.rect; const QRect optRect = option.rect;
@ -181,11 +132,50 @@ void Group::drawHeader(QPainter *painter, const QStyleOptionViewItem &option)
} }
//END: right vertical line //END: right vertical line
//BEGIN: checkboxy thing
{
painter->save();
painter->setRenderHint(QPainter::Antialiasing, false);
painter->setFont(font);
QColor penColor(option.palette.text().color());
penColor.setAlphaF(0.6);
painter->setPen(penColor);
QRect iconSubRect(option.rect);
iconSubRect.setTop(iconSubRect.top() + 7);
iconSubRect.setLeft(iconSubRect.left() + 7);
int sizing = fontMetrics.height();
int even = ( (sizing - 1) % 2 );
iconSubRect.setHeight(sizing - even);
iconSubRect.setWidth(sizing - even);
painter->drawRect(iconSubRect);
/*
if(collapsed)
painter->drawText(iconSubRect, Qt::AlignHCenter | Qt::AlignVCenter, "+");
else
painter->drawText(iconSubRect, Qt::AlignHCenter | Qt::AlignVCenter, "-");
*/
painter->setBrush(option.palette.text());
painter->fillRect(iconSubRect.x(), iconSubRect.y() + iconSubRect.height() / 2,
iconSubRect.width(), 2, penColor);
if (collapsed)
{
painter->fillRect(iconSubRect.x() + iconSubRect.width() / 2, iconSubRect.y(), 2,
iconSubRect.height(), penColor);
}
painter->restore();
}
//END: checkboxy thing
//BEGIN: text //BEGIN: text
{ {
QRect textRect(option.rect); QRect textRect(option.rect);
textRect.setTop(textRect.top() + 7); textRect.setTop(textRect.top() + 7);
textRect.setLeft(textRect.left() + 7); textRect.setLeft(textRect.left() + 7 + fontMetrics.height() + 7);
textRect.setHeight(fontMetrics.height()); textRect.setHeight(fontMetrics.height());
textRect.setRight(textRect.right() - 7); textRect.setRight(textRect.right() - 7);
@ -207,11 +197,20 @@ int Group::totalHeight() const
int Group::headerHeight() const int Group::headerHeight() const
{ {
QFont font(QApplication::font());
font.setBold(true);
QFontMetrics fontMetrics(font);
const int height = fontMetrics.height() + 1 /* 1 pixel-width gradient */
+ 11 /* top and bottom separation */;
return height;
/*
int raw = view->viewport()->fontMetrics().height() + 4; int raw = view->viewport()->fontMetrics().height() + 4;
// add english. maybe. depends on font height. // add english. maybe. depends on font height.
if (raw % 2 == 0) if (raw % 2 == 0)
raw++; raw++;
return std::min(raw, 25); return std::min(raw, 25);
*/
} }
int Group::contentHeight() const int Group::contentHeight() const

View File

@ -121,6 +121,8 @@ void GroupView::updateGeometries()
category->m_verticalPosition = totalHeight; category->m_verticalPosition = totalHeight;
totalHeight += category->totalHeight() + m_categoryMargin; totalHeight += category->totalHeight() + m_categoryMargin;
} }
auto category = m_groups.last();
int itemScroll = category->contentHeight() / category->numRows();
/* /*
// remove the last margin (we don't want it) // remove the last margin (we don't want it)
totalHeight -= m_categoryMargin; totalHeight -= m_categoryMargin;
@ -128,6 +130,10 @@ void GroupView::updateGeometries()
totalHeight += m_categoryMargin; totalHeight += m_categoryMargin;
*/ */
totalHeight += m_bottomMargin; totalHeight += m_bottomMargin;
verticalScrollBar()->setSingleStep ( itemScroll );
const int rowsPerPage = qMax ( viewport()->height() / itemScroll, 1 );
verticalScrollBar()->setPageStep ( rowsPerPage * itemScroll );
verticalScrollBar()->setRange(0, totalHeight - height()); verticalScrollBar()->setRange(0, totalHeight - height());
} }