Krita Source Code Documentation
Loading...
Searching...
No Matches
KisGamutMaskChooser.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2018 Anna Medonosova <anna.medonosova@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
8
9#include <QWidget>
10#include <QVBoxLayout>
11#include <QAbstractItemDelegate>
12#include <QMenu>
13#include <QActionGroup>
14#include <QFontMetrics>
15#include <QTextDocument>
16#include <QTextLayout>
17
20#include <KisResourceModel.h>
22#include <kis_icon_utils.h>
23#include <kis_config.h>
24#include "KisPopupButton.h"
27
28
30class KisGamutMaskDelegate: public QAbstractItemDelegate
31{
32public:
33 KisGamutMaskDelegate(KisResourceMetaDataModel *metaDataModel, QObject * parent = 0) : QAbstractItemDelegate(parent)
34 , m_mode(KisGamutMaskChooser::ViewMode::THUMBNAIL)
35 , m_metaDataModel(metaDataModel)
36 {
37 }
39
41 void paint(QPainter *, const QStyleOptionViewItem &, const QModelIndex &) const override;
42
44 QSize sizeHint(const QStyleOptionViewItem & option, const QModelIndex &) const override {
45 return option.decorationSize;
46 }
47
49 m_mode = mode;
50 }
51
52private:
55};
56
57void KisGamutMaskDelegate::paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const
58{
59 painter->save();
60 painter->setRenderHint(QPainter::SmoothPixmapTransform, true);
61
62 if (!index.isValid())
63 return;
64
65 QImage preview = index.data(Qt::UserRole + KisAbstractResourceModel::Thumbnail).value<QImage>();
66 QString name = index.data(Qt::UserRole + KisAbstractResourceModel::Name).value<QString>();
67
68 if(preview.isNull()) {
69 return;
70 }
71
72 QRect paintRect = option.rect.adjusted(1, 1, -1, -1);
73
74 qreal devicePixelRatioF = painter->device()->devicePixelRatioF();
75
77 QImage previewHighDPI =
79 paintRect.size() * devicePixelRatioF,
80 Qt::IgnoreAspectRatio,
81 Qt::SmoothTransformation);
82 previewHighDPI.setDevicePixelRatio(devicePixelRatioF);
83 painter->drawImage(paintRect.x(), paintRect.y(), previewHighDPI);
84
85 if (option.state & QStyle::State_Selected) {
86 painter->setCompositionMode(QPainter::CompositionMode_Overlay);
87 painter->setOpacity(0.5);
88 painter->fillRect(paintRect, Qt::white);
89 painter->setCompositionMode(QPainter::CompositionMode_SourceOver);
90 painter->setOpacity(1.0);
91 painter->setPen(QPen(option.palette.highlight(), 2, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin));
92 QRect selectedBorder = option.rect.adjusted(1, 1, -1, -1);
93 painter->drawRect(selectedBorder);
94 }
95 } else {
96 QSize previewSize(paintRect.height(), paintRect.height());
97
98 QImage previewHighDPI =
100 previewSize * devicePixelRatioF,
101 Qt::IgnoreAspectRatio,
102 Qt::SmoothTransformation);
103 previewHighDPI.setDevicePixelRatio(devicePixelRatioF);
104
105 if (option.state & QStyle::State_Selected) {
106 painter->setPen(QPen(option.palette.highlight(), 2.0));
107 painter->fillRect(option.rect, option.palette.highlight());
108 painter->setPen(option.palette.highlightedText().color());
109 }
110 painter->drawImage(paintRect.x(), paintRect.y(), previewHighDPI);
111
112 int leftMargin = 8;
113 int rightMargin = 7;
114 int vertMargin = 4;
115 int descOffset = 7;
116 QFont font = option.font;
117 font.setBold(true);
118 painter->setFont(font);
119 QRectF titleRect(QPointF(previewSize.width() + leftMargin, paintRect.y() + vertMargin),
120 QPointF(paintRect.width() - rightMargin, paintRect.y() + descOffset + painter->fontMetrics().lineSpacing()));
121 painter->drawText(titleRect, Qt::AlignLeft,
122 painter->fontMetrics().elidedText(
123 name, Qt::ElideRight, titleRect.width()
124 )
125 );
126 const QString descriptionKey = "description";
127 const int resourceId = index.data(Qt::UserRole + KisAbstractResourceModel::Id).toInt();
128 const QString description = m_metaDataModel->metaDataValue(resourceId, descriptionKey).toString();
129 if (!description.isEmpty() && !description.isNull()) {
130 // Font size may be in pixels (on Android) or points (everywhere else.)
131 if (font.pixelSize() == -1) {
132 font.setPointSize(font.pointSize() - 1);
133 } else {
134 font.setPixelSize(font.pixelSize() - 1);
135 }
136 font.setBold(false);
137 font.setStyle(QFont::StyleItalic);
138 painter->setFont(font);
139 QRectF descRect(QPointF(previewSize.width() + leftMargin, paintRect.y() + descOffset + painter->fontMetrics().lineSpacing()),
140 QPointF(paintRect.right() - rightMargin, paintRect.bottom() - vertMargin));
141
142 int numLines = floor(((float)descRect.height() / (float)painter->fontMetrics().lineSpacing()));
143 if (numLines > 0) {
144 int elideWidth = 0;
145 QTextLayout textLayout(description);
146 textLayout.beginLayout();
147 for (int i = 0; i < numLines; i++) {
148 QTextLine line = textLayout.createLine();
149 if (line.isValid()) {
150 line.setLineWidth(descRect.width());
151 elideWidth += line.naturalTextWidth();
152 }
153 }
154
155 QString elidedText = painter->fontMetrics().elidedText(description, Qt::ElideRight, elideWidth);
156 painter->drawText(descRect, Qt::AlignLeft|Qt::TextWordWrap, elidedText);
157 }
158 }
159 }
160
161 painter->restore();
162}
163
164
166 : QWidget(parent)
167{
169
175
176 QVBoxLayout* layout = new QVBoxLayout(this);
177 layout->setContentsMargins(0,0,0,0);
178
179 // TODO: menu for view mode change
180 QMenu* menu = new QMenu(this);
181 menu->setStyleSheet("margin: 6px");
182 menu->addSection(i18nc("@title Which elements to display (e.g., thumbnails or details)", "Display"));
183
184 QActionGroup *actionGroup = new QActionGroup(this);
185
186 KisConfig cfg(true);
188
189 QAction* action = menu->addAction(KisIconUtils::loadIcon("view-preview"),
190 i18n("Thumbnails"), this, SLOT(slotSetModeThumbnail()));
191 action->setCheckable(true);
192 action->setChecked(m_mode == KisGamutMaskChooser::THUMBNAIL);
193 action->setActionGroup(actionGroup);
194
195 action = menu->addAction(KisIconUtils::loadIcon("view-list-details"),
196 i18n("Details"), this, SLOT(slotSetModeDetail()));
197 action->setCheckable(true);
198 action->setChecked(m_mode == KisGamutMaskChooser::DETAIL);
199 action->setActionGroup(actionGroup);
200
201 // setting the view mode
204 KisPopupButton* viewModeButton = m_itemChooser->viewModeButton();
205 viewModeButton->setPopupWidget(menu);
206
207 layout->addWidget(m_itemChooser);
208
210}
211
216
221
222void KisGamutMaskChooser::resizeEvent(QResizeEvent *event)
223{
224 QWidget::resizeEvent(event);
226}
227
233
235{
236 KisConfig cfg(false);
237 cfg.writeEntry("GamutMasks.viewMode", qint32(m_mode));
238
241 m_itemChooser->setRowHeight(this->fontMetrics().lineSpacing() * 4);
242 m_itemChooser->setColumnWidth(this->fontMetrics().lineSpacing() * 4);
244 }
247 m_itemChooser->setRowHeight(this->fontMetrics().lineSpacing()*4);
249 }
250}
251
253{
254 Q_EMIT sigGamutMaskSelected(resource.staticCast<KoGamutMask>());
255}
256
261
void writeEntry(const QString &name, const T &value)
Definition kis_config.h:822
T readEntry(const QString &name, const T &defaultValue=T())
Definition kis_config.h:832
void resizeEvent(QResizeEvent *event) override
void setCurrentResource(KoResourceSP resource)
KisResourceItemChooser * m_itemChooser
void resourceSelected(KoResourceSP resource)
void setViewMode(ViewMode mode)
KisGamutMaskDelegate * m_delegate
KisGamutMaskChooser(QWidget *parent=nullptr)
void sigGamutMaskSelected(KoGamutMaskSP mask)
The resource item delegate for rendering the resource preview.
KisGamutMaskDelegate(KisResourceMetaDataModel *metaDataModel, QObject *parent=0)
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &) const override
reimplemented
KisResourceMetaDataModel * m_metaDataModel
void setViewMode(KisGamutMaskChooser::ViewMode mode)
KisGamutMaskChooser::ViewMode m_mode
void paint(QPainter *, const QStyleOptionViewItem &, const QModelIndex &) const override
reimplemented
void setPopupWidget(QWidget *widget)
void setCurrentResource(KoResourceSP resource)
Sets the item representing the resource as selected.
void setListViewMode(ListViewMode viewMode)
void setColumnWidth(int columnWidth)
Sets the width of the view columns.
void setRowHeight(int rowHeight)
Sets the height of the view rows.
void setItemDelegate(QAbstractItemDelegate *delegate)
Sets a custom delegate for the view.
QVariant metaDataValue(int resourceId, const QString &key)
static KisResourceMetaDataModel * resourceMetadataModel()
static KisResourceThumbnailCache * instance()
QImage getImage(const QModelIndex &index, const QSize size=QSize(-1, -1), Qt::AspectRatioMode aspectMode=Qt::IgnoreAspectRatio, Qt::TransformationMode transformMode=Qt::FastTransformation)
The resource type for gamut masks used by the artistic color selector.
Definition KoGamutMask.h:44
QIcon loadIcon(const QString &name)
const QString GamutMasks