Windows11Style: Misc cleanup for drawControl(CE_ItemViewItem)

Cleanup CE_ItemViewItem branch in drawControl():
 - use local rect instead rect, vopt->rect or option->rect for
   consistency
 - move out viewItemPosition comparisons into local booleans
 - fix coding style
 - merge two QPainter::drawLine() calls into one

Pick-to: 6.8
Task-number: QTBUG-131585
Change-Id: I7cd2f96a2a733a55d5e7fb5956c59bd043317cb2
Reviewed-by: Wladimir Leuschner <wladimir.leuschner@qt.io>
(cherry picked from commit 44edab7c84be101025dc6f9a74f87944ea3a22e9)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Christian Ehrlicher 2024-12-02 16:27:53 +01:00 committed by Qt Cherry-pick Bot
parent 1426bd170b
commit 37effa5dd3

View File

@ -1003,8 +1003,11 @@ void QWindows11Style::drawPrimitive(PrimitiveElement element, const QStyleOption
} }
break; break;
} }
case QStyle::PE_PanelItemViewRow: case PE_PanelItemViewRow:
if (const QStyleOptionViewItem *vopt = qstyleoption_cast<const QStyleOptionViewItem *>(option)) { if (const QStyleOptionViewItem *vopt = qstyleoption_cast<const QStyleOptionViewItem *>(option)) {
const QRect &rect = vopt->rect;
const bool isRtl = option->direction == Qt::RightToLeft;
painter->setPen(Qt::NoPen); painter->setPen(Qt::NoPen);
if (vopt->features & QStyleOptionViewItem::Alternate) if (vopt->features & QStyleOptionViewItem::Alternate)
painter->setBrush(vopt->palette.alternateBase()); painter->setBrush(vopt->palette.alternateBase());
@ -1016,11 +1019,14 @@ void QWindows11Style::drawPrimitive(PrimitiveElement element, const QStyleOption
painter->setBrush(WINUI3Colors[colorSchemeIndex][subtleHighlightColor]); painter->setBrush(WINUI3Colors[colorSchemeIndex][subtleHighlightColor]);
painter->setPen(Qt::NoPen); painter->setPen(Qt::NoPen);
painter->drawRoundedRect(vopt->rect.marginsRemoved(QMargins(0,2,-2,2)),2,2); painter->drawRoundedRect(vopt->rect.marginsRemoved(QMargins(0,2,-2,2)),2,2);
const int offset = qobject_cast<const QTreeView *>(widget) ? 2 : 0;
if (vopt->viewItemPosition == QStyleOptionViewItem::Beginning && option->state & State_Selected) { if (vopt->viewItemPosition == QStyleOptionViewItem::Beginning && option->state & State_Selected) {
painter->setPen(QPen(option->palette.accent().color())); painter->setPen(QPen(option->palette.accent().color()));
painter->drawLine(option->rect.x(),option->rect.y()+offset,option->rect.x(),option->rect.y() + option->rect.height()-2); const auto xPos = isRtl ? rect.right() - 1 : rect.left();
painter->drawLine(option->rect.x()+1,option->rect.y()+2,option->rect.x()+1,option->rect.y() + option->rect.height()-2); const QLineF lines[2] = {
QLineF(xPos, rect.y() + 2, xPos, rect.y() + rect.height() - 2),
QLineF(xPos + 1, rect.y() + 2, xPos + 1, rect.y() + rect.height() - 2),
};
painter->drawLines(lines, 2);
} }
} }
} }
@ -1654,28 +1660,35 @@ void QWindows11Style::drawControl(ControlElement element, const QStyleOption *op
} }
break; break;
} }
case QStyle::CE_ItemViewItem: { case CE_ItemViewItem: {
if (const QStyleOptionViewItem *vopt = qstyleoption_cast<const QStyleOptionViewItem *>(option)) { if (const QStyleOptionViewItem *vopt = qstyleoption_cast<const QStyleOptionViewItem *>(option)) {
if (const QAbstractItemView *view = qobject_cast<const QAbstractItemView *>(widget)) { if (const QAbstractItemView *view = qobject_cast<const QAbstractItemView *>(widget)) {
QRect checkRect = proxy()->subElementRect(SE_ItemViewItemCheckIndicator, vopt, widget); QRect checkRect = proxy()->subElementRect(SE_ItemViewItemCheckIndicator, vopt, widget);
QRect iconRect = proxy()->subElementRect(SE_ItemViewItemDecoration, vopt, widget); QRect iconRect = proxy()->subElementRect(SE_ItemViewItemDecoration, vopt, widget);
QRect textRect = proxy()->subElementRect(SE_ItemViewItemText, vopt, widget); QRect textRect = proxy()->subElementRect(SE_ItemViewItemText, vopt, widget);
QRect rect = vopt->rect; const QRect &rect = vopt->rect;
const bool isRtl = option->direction == Qt::RightToLeft;
bool onlyOne = vopt->viewItemPosition == QStyleOptionViewItem::OnlyOne ||
vopt->viewItemPosition == QStyleOptionViewItem::Invalid;
bool isFirst = vopt->viewItemPosition == QStyleOptionViewItem::Beginning;
bool isLast = vopt->viewItemPosition == QStyleOptionViewItem::End;
painter->setPen(highContrastTheme == true ? vopt->palette.buttonText().color() : WINUI3Colors[colorSchemeIndex][frameColorLight]); painter->setPen(highContrastTheme == true ? vopt->palette.buttonText().color() : WINUI3Colors[colorSchemeIndex][frameColorLight]);
if (vopt->viewItemPosition == QStyleOptionViewItem::OnlyOne || vopt->viewItemPosition == QStyleOptionViewItem::Invalid) { if (isFirst) {
} else if (vopt->viewItemPosition == QStyleOptionViewItem::Beginning) { painter->drawLine(rect.topRight() + QPointF(0.5, 0.0),
painter->drawLine(QPointF(option->rect.topRight()) + QPointF(0.5,0.0), rect.bottomRight() + QPointF(0.5, 0.0));
QPointF(option->rect.bottomRight()) + QPointF(0.5,0.0)); } else if (isLast) {
} else if (vopt->viewItemPosition == QStyleOptionViewItem::End) { painter->drawLine(rect.topLeft() - QPointF(0.5, 0.0),
painter->drawLine(QPointF(option->rect.topLeft()) - QPointF(0.5,0.0), rect.bottomLeft() - QPointF(0.5, 0.0));
QPointF(option->rect.bottomLeft()) - QPointF(0.5,0.0));
} else { } else {
painter->drawLine(QPointF(option->rect.topRight()) + QPointF(0.5,0.0), const QLineF lines[2] = {
QPointF(option->rect.bottomRight()) + QPointF(0.5,0.0)); QLineF(rect.topRight() + QPointF(0.5, 0.0),
painter->drawLine(QPointF(option->rect.topLeft()) - QPointF(0.5,0.0), rect.bottomRight() + QPointF(0.5, 0.0)),
QPointF(option->rect.bottomLeft()) - QPointF(0.5,0.0)); QLineF(rect.topLeft() - QPointF(0.5, 0.0),
rect.bottomLeft() - QPointF(0.5, 0.0)),
};
painter->drawLines(lines, 2);
} }
const bool isTreeView = qobject_cast<const QTreeView *>(widget); const bool isTreeView = qobject_cast<const QTreeView *>(widget);
@ -1695,14 +1708,17 @@ void QWindows11Style::drawControl(ControlElement element, const QStyleOption *op
} }
painter->setPen(Qt::NoPen); painter->setPen(Qt::NoPen);
if (vopt->viewItemPosition == QStyleOptionViewItem::OnlyOne || vopt->viewItemPosition == QStyleOptionViewItem::Invalid) { if (onlyOne) {
painter->drawRoundedRect(vopt->rect.marginsRemoved(QMargins(2,2,2,2)),secondLevelRoundingRadius,secondLevelRoundingRadius); painter->drawRoundedRect(rect.marginsRemoved(QMargins(2, 2, 2, 2)),
} else if (vopt->viewItemPosition == QStyleOptionViewItem::Beginning) { secondLevelRoundingRadius, secondLevelRoundingRadius);
painter->drawRoundedRect(rect.marginsRemoved(QMargins(2,2,0,2)),secondLevelRoundingRadius,secondLevelRoundingRadius); } else if (isFirst) {
} else if (vopt->viewItemPosition == QStyleOptionViewItem::End) { painter->drawRoundedRect(rect.marginsRemoved(QMargins(2, 2, 0, 2)),
painter->drawRoundedRect(vopt->rect.marginsRemoved(QMargins(0,2,2,2)),secondLevelRoundingRadius,secondLevelRoundingRadius); secondLevelRoundingRadius, secondLevelRoundingRadius);
} else if (isLast) {
painter->drawRoundedRect(rect.marginsRemoved(QMargins(0, 2, 2, 2)),
secondLevelRoundingRadius, secondLevelRoundingRadius);
} else { } else {
painter->drawRect(vopt->rect.marginsRemoved(QMargins(0,2,0,2))); painter->drawRect(rect.marginsRemoved(QMargins(0, 2, 0, 2)));
} }
// draw the check mark // draw the check mark
@ -1734,20 +1750,20 @@ void QWindows11Style::drawControl(ControlElement element, const QStyleOption *op
QIcon::State state = vopt->state & QStyle::State_Open ? QIcon::On : QIcon::Off; QIcon::State state = vopt->state & QStyle::State_Open ? QIcon::On : QIcon::Off;
vopt->icon.paint(painter, iconRect, vopt->decorationAlignment, mode, state); vopt->icon.paint(painter, iconRect, vopt->decorationAlignment, mode, state);
if (!view || !view->isPersistentEditorOpen(vopt->index)) {
painter->setPen(QPen(option->palette.text().color())); painter->setPen(QPen(option->palette.text().color()));
if (!view || !view->isPersistentEditorOpen(vopt->index))
d->viewItemDrawText(painter, vopt, textRect); d->viewItemDrawText(painter, vopt, textRect);
if (vopt->state & State_Selected }
&& (vopt->viewItemPosition == QStyleOptionViewItem::Beginning if (vopt->state & State_Selected && (isFirst || onlyOne)) {
|| vopt->viewItemPosition == QStyleOptionViewItem::OnlyOne
|| vopt->viewItemPosition == QStyleOptionViewItem::Invalid)) {
if (const QListView *lv = qobject_cast<const QListView *>(widget); if (const QListView *lv = qobject_cast<const QListView *>(widget);
lv && lv->viewMode() != QListView::IconMode) { lv && lv->viewMode() != QListView::IconMode) {
painter->setPen(QPen(vopt->palette.accent().color())); painter->setPen(QPen(vopt->palette.accent().color()));
painter->drawLine(option->rect.x(), option->rect.y() + 2, const auto xPos = isRtl ? rect.right() - 1 : rect.left();
option->rect.x(),option->rect.y() + option->rect.height() - 2); const QLineF lines[2] = {
painter->drawLine(option->rect.x() + 1, option->rect.y() + 2, QLineF(xPos, rect.y() + 2, xPos, rect.y() + rect.height() - 2),
option->rect.x() + 1,option->rect.y() + option->rect.height() - 2); QLineF(xPos + 1, rect.y() + 2, xPos + 1, rect.y() + rect.height() - 2),
};
painter->drawLines(lines, 2);
} }
} }
} else { } else {