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