1 /*
2 SPDX-FileCopyrightText: 2007-2008 Robert Knight <robertknight@gmail.com>
3 SPDX-FileCopyrightText: 2018 Harald Sitter <sitter@kde.org>
4
5 SPDX-License-Identifier: GPL-2.0-or-later
6 */
7
8 // Own
9 #include "ColorSchemeViewDelegate.h"
10
11 // Konsole
12 #include "ColorScheme.h"
13
14 // KDE
15 #include <KLocalizedString>
16 #include <KWindowSystem>
17
18 // Qt
19 #include <QApplication>
20 #include <QPainter>
21
22 using namespace Konsole;
23
ColorSchemeViewDelegate(QObject * parent)24 ColorSchemeViewDelegate::ColorSchemeViewDelegate(QObject *parent)
25 : QAbstractItemDelegate(parent)
26 {
27 }
28
paint(QPainter * painter,const QStyleOptionViewItem & option,const QModelIndex & index) const29 void ColorSchemeViewDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
30 {
31 const auto *scheme = index.data(Qt::UserRole + 1).value<const ColorScheme *>();
32 QFont profileFont = index.data(Qt::UserRole + 2).value<QFont>();
33 Q_ASSERT(scheme);
34 if (scheme == nullptr) {
35 return;
36 }
37
38 painter->setRenderHint(QPainter::Antialiasing);
39
40 // Draw background
41 QStyle *style = option.widget != nullptr ? option.widget->style() : QApplication::style();
42 style->drawPrimitive(QStyle::PE_PanelItemViewItem, &option, painter, option.widget);
43
44 // Draw name
45 QPalette::ColorRole textColor = ((option.state & QStyle::State_Selected) != 0) ? QPalette::HighlightedText : QPalette::Text;
46 painter->setPen(option.palette.color(textColor));
47 painter->setFont(option.font);
48
49 // Determine width of sample text using profile's font
50 const QString sampleText = i18n("AaZz09...");
51 QFontMetrics profileFontMetrics(profileFont);
52 const int sampleTextWidth = profileFontMetrics.boundingRect(sampleText).width();
53
54 painter->drawText(option.rect.adjusted(sampleTextWidth + 15, 0, 0, 0), Qt::AlignLeft | Qt::AlignVCenter, index.data(Qt::DisplayRole).toString());
55
56 // Draw the preview
57 const int x = option.rect.left();
58 const int y = option.rect.top();
59
60 QRect previewRect(x + 4, y + 4, sampleTextWidth + 8, option.rect.height() - 8);
61
62 bool transparencyAvailable = KWindowSystem::compositingActive();
63
64 if (transparencyAvailable) {
65 painter->save();
66 QColor color = scheme->backgroundColor();
67 color.setAlphaF(scheme->opacity());
68 painter->setPen(Qt::NoPen);
69 painter->setCompositionMode(QPainter::CompositionMode_Source);
70 painter->setBrush(color);
71 painter->drawRect(previewRect);
72 painter->restore();
73 } else {
74 painter->setPen(Qt::NoPen);
75 painter->setBrush(scheme->backgroundColor());
76 painter->drawRect(previewRect);
77 }
78
79 // draw color scheme name using scheme's foreground color
80 QPen pen(scheme->foregroundColor());
81 painter->setPen(pen);
82
83 // TODO: respect antialias setting
84 painter->setFont(profileFont);
85 painter->drawText(previewRect, Qt::AlignCenter, sampleText);
86 }
87
sizeHint(const QStyleOptionViewItem & option,const QModelIndex &) const88 QSize ColorSchemeViewDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex & /*index*/) const
89 {
90 const int width = 200;
91 const int margin = 5;
92 const int colorWidth = width / TABLE_COLORS;
93 const int heightForWidth = (colorWidth * 2) + option.fontMetrics.height() + margin;
94
95 // temporary
96 return {width, heightForWidth};
97 }
98