25#include <QApplication>
26#include <QtGuiVersion>
29 : QStyledItemDelegate(parent)
44 GM_Script *script =
static_cast<GM_Script*
>(index.data(Qt::UserRole + 10).value<
void*>());
48 QStyleOptionViewItem opt = option;
49 initStyleOption(&opt, index);
51 const QWidget* w = opt.widget;
52 const QStyle* style = w ? w->style() : QApplication::style();
53 const int height = opt.rect.height();
54 const int center = height / 2 + opt.rect.top();
57 painter->setLayoutDirection(Qt::LeftToRight);
60 QFont titleFont = opt.font;
61 titleFont.setBold(
true);
62 titleFont.setPointSize(titleFont.pointSize() + 1);
64 const QFontMetrics titleMetrics(titleFont);
65 const QPalette::ColorRole colorRole = opt.state & QStyle::State_Selected ? QPalette::HighlightedText : QPalette::Text;
67 QPalette::ColorGroup cg = opt.state & QStyle::State_Enabled ? QPalette::Normal : QPalette::Disabled;
68 if (cg == QPalette::Normal && !(opt.state & QStyle::State_Active)) {
69 cg = QPalette::Inactive;
73 opt.palette.setColor(QPalette::All, QPalette::HighlightedText, opt.palette.color(QPalette::Active, QPalette::Text));
74 opt.palette.setColor(QPalette::All, QPalette::Highlight, opt.palette.base().color().darker(108));
77 QPalette textPalette = opt.palette;
78 textPalette.setCurrentColorGroup(cg);
80 int leftPosition = m_padding;
81 int rightPosition = opt.rect.right() - m_padding - 16;
83 rightPosition -= m_padding + 16;
86 style->drawPrimitive(QStyle::PE_PanelItemViewItem, &opt, painter, w);
89 const int checkboxSize = 18;
90 const int checkboxYPos = center - (checkboxSize / 2);
91 QStyleOptionViewItem opt2 = opt;
92 opt2.checkState == Qt::Checked ? opt2.state |= QStyle::State_On : opt2.state |= QStyle::State_Off;
93 QRect styleCheckBoxRect = style->subElementRect(QStyle::SE_ItemViewItemCheckIndicator, &opt2, w);
94 opt2.rect = QRect(leftPosition, checkboxYPos, styleCheckBoxRect.width(), styleCheckBoxRect.height());
95 style->drawPrimitive(QStyle::PE_IndicatorItemViewItemCheck, &opt2, painter, w);
96 leftPosition = opt2.rect.right() + m_padding;
99 const int iconSize = 32;
100 const int iconYPos = center - (iconSize / 2);
101 QRect iconRect(leftPosition, iconYPos, iconSize, iconSize);
102 QPixmap pixmap = index.data(Qt::DecorationRole).value<QIcon>().pixmap(iconSize);
103 if (!pixmap.isNull()) {
104 painter->drawPixmap(iconRect, pixmap);
105 leftPosition = iconRect.right() + m_padding;
107 leftPosition += m_padding;
111 const QString name = index.data(Qt::DisplayRole).toString();
112 const int leftTitleEdge = leftPosition + 2;
113 const int rightTitleEdge = rightPosition - m_padding;
114 const int leftPosForVersion = titleMetrics.horizontalAdvance(name) + m_padding;
115 QRect nameRect(leftTitleEdge, opt.rect.top() + m_padding, rightTitleEdge - leftTitleEdge, titleMetrics.height());
116 painter->setFont(titleFont);
117 style->drawItemText(painter, nameRect, Qt::AlignLeft, textPalette,
true, name, colorRole);
120 QRect versionRect(nameRect.x() + leftPosForVersion, nameRect.y(), rightTitleEdge - leftPosForVersion, titleMetrics.height());
121 QFont versionFont = titleFont;
122 versionFont.setBold(
false);
123 painter->setFont(versionFont);
124 style->drawItemText(painter, versionRect, Qt::AlignLeft, textPalette,
true, script->
version(), colorRole);
127 const int infoYPos = nameRect.bottom() + opt.fontMetrics.leading();
128 QRect infoRect(nameRect.x(), infoYPos, nameRect.width(), opt.fontMetrics.height());
129 const QString info = opt.fontMetrics.elidedText(script->
description(), Qt::ElideRight, infoRect.width());
130 painter->setFont(opt.font);
131 style->drawItemText(painter, infoRect, Qt::TextSingleLine | Qt::AlignLeft, textPalette,
true, info, colorRole);
135 const int updateIconSize = 16;
136 const int updateIconYPos = center - (updateIconSize / 2);
137 const QPixmap updatePixmap = m_updateIcon.pixmap(16, script->
isUpdating() ? QIcon::Disabled : QIcon::Normal);
138 QRect updateIconRect(rightPosition, updateIconYPos, updateIconSize, updateIconSize);
139 painter->drawPixmap(updateIconRect, updatePixmap);
140 rightPosition += m_padding + 16;
144 const int removeIconSize = 16;
145 const int removeIconYPos = center - (removeIconSize / 2);
146 QRect removeIconRect(rightPosition, removeIconYPos, removeIconSize, removeIconSize);
147 painter->drawPixmap(removeIconRect, m_removePixmap);
155 QStyleOptionViewItem opt(option);
156 initStyleOption(&opt, index);
158 const QWidget* w = opt.widget;
159 const QStyle* style = w ? w->style() : QApplication::style();
160 const int padding = style->pixelMetric(QStyle::PM_FocusFrameHMargin,
nullptr) + 1;
162 QFont titleFont = opt.font;
163 titleFont.setBold(
true);
164 titleFont.setPointSize(titleFont.pointSize() + 1);
168 const QFontMetrics titleMetrics(titleFont);
170 m_rowHeight = 2 * m_padding + opt.fontMetrics.leading() + opt.fontMetrics.height() + titleMetrics.height();
173 return QSize(200, m_rowHeight);
QString description() const
GM_SettingsListDelegate(QObject *parent=nullptr)
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override
static QIcon standardIcon(QStyle::StandardPixmap icon)