22#include <QApplication>
25 : QStyledItemDelegate(parent)
33 QStyleOptionViewItem opt = option;
34 initStyleOption(&opt, index);
36 const QWidget* w = opt.widget;
37 const QStyle* style = w ? w->style() : QApplication::style();
38 const int height = opt.rect.height();
39 const int center = height / 2 + opt.rect.top();
41 painter->setLayoutDirection(Qt::LeftToRight);
44 QFont titleFont = opt.font;
45 titleFont.setBold(
true);
46 titleFont.setPointSize(titleFont.pointSize() + 1);
48 const QFontMetrics titleMetrics(titleFont);
49 const QPalette::ColorRole colorRole = opt.state & QStyle::State_Selected ? QPalette::HighlightedText : QPalette::Text;
51 QPalette::ColorGroup cg = opt.state & QStyle::State_Enabled ? QPalette::Normal : QPalette::Disabled;
52 if (cg == QPalette::Normal && !(opt.state & QStyle::State_Active)) {
53 cg = QPalette::Inactive;
57 opt.palette.setColor(QPalette::All, QPalette::HighlightedText, opt.palette.color(QPalette::Active, QPalette::Text));
58 opt.palette.setColor(QPalette::All, QPalette::Highlight, opt.palette.base().color().darker(108));
61 QPalette textPalette = opt.palette;
62 textPalette.setCurrentColorGroup(cg);
64 int leftPosition = m_padding;
65 int rightPosition = opt.rect.right() - m_padding;
68 style->drawPrimitive(QStyle::PE_PanelItemViewItem, &opt, painter, w);
71 const int checkboxSize = 18;
72 const int checkboxYPos = center - (checkboxSize / 2);
73 QStyleOptionViewItem opt2 = opt;
74 opt2.checkState == Qt::Checked ? opt2.state |= QStyle::State_On : opt2.state |= QStyle::State_Off;
75 QRect styleCheckBoxRect = style->subElementRect(QStyle::SE_ItemViewItemCheckIndicator, &opt2, w);
76 opt2.rect = QRect(leftPosition, checkboxYPos, styleCheckBoxRect.width(), styleCheckBoxRect.height());
77 style->drawPrimitive(QStyle::PE_IndicatorItemViewItemCheck, &opt2, painter, w);
78 leftPosition = opt2.rect.right() + m_padding;
81 const int iconSize = 32;
82 const int iconYPos = center - (iconSize / 2);
83 QRect iconRect(leftPosition, iconYPos, iconSize, iconSize);
84 QPixmap pixmap = index.data(Qt::DecorationRole).value<QIcon>().pixmap(iconSize);
85 painter->drawPixmap(iconRect, pixmap);
86 leftPosition = iconRect.right() + m_padding;
89 const QString name = index.data(Qt::DisplayRole).toString();
90 const int leftTitleEdge = leftPosition + 2;
91 const int rightTitleEdge = rightPosition - m_padding;
92 QRect nameRect(leftTitleEdge, opt.rect.top() + m_padding, rightTitleEdge - leftTitleEdge, titleMetrics.height());
93 painter->setFont(titleFont);
94 style->drawItemText(painter, nameRect, Qt::AlignLeft, textPalette,
true, name, colorRole);
97 const int descriptionYPos = nameRect.bottom() + opt.fontMetrics.leading();
98 QRect descriptionRect(nameRect.x(), descriptionYPos, nameRect.width(), opt.fontMetrics.height());
99 const QString description = opt.fontMetrics.elidedText(index.data(Qt::UserRole + 2).toString(), Qt::ElideRight, descriptionRect.width());
100 painter->setFont(opt.font);
101 style->drawItemText(painter, descriptionRect, Qt::TextSingleLine | Qt::AlignLeft, textPalette,
true, description, colorRole);
109 QStyleOptionViewItem opt(option);
110 initStyleOption(&opt, index);
112 const QWidget* w = opt.widget;
113 const QStyle* style = w ? w->style() : QApplication::style();
114 const int padding = style->pixelMetric(QStyle::PM_FocusFrameHMargin,
nullptr) + 1;
116 QFont titleFont = opt.font;
117 titleFont.setBold(
true);
118 titleFont.setPointSize(titleFont.pointSize() + 1);
120 m_padding = padding > 5 ? padding : 5;
122 const QFontMetrics titleMetrics(titleFont);
124 m_rowHeight = 2 * m_padding + 2 * opt.fontMetrics.leading() + opt.fontMetrics.height() + titleMetrics.height();
127 return QSize(200, m_rowHeight);
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override
PluginListDelegate(QListWidget *parent)
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override