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.setPointSize(font.pointSize()-1);
131 font.setBold(false);
132 font.setStyle(QFont::StyleItalic);
133 painter->setFont(font);
134 QRectF descRect(QPointF(previewSize.width() + leftMargin, paintRect.y() + descOffset + painter->fontMetrics().lineSpacing()),
135 QPointF(paintRect.right() - rightMargin, paintRect.bottom() - vertMargin));
136
137 int numLines = floor(((float)descRect.height() / (float)painter->fontMetrics().lineSpacing()));
138 if (numLines > 0) {
139 int elideWidth = 0;
140 QTextLayout textLayout(description);
141 textLayout.beginLayout();
142 for (int i = 0; i < numLines; i++) {
143 QTextLine line = textLayout.createLine();
144 if (line.isValid()) {
145 line.setLineWidth(descRect.width());
146 elideWidth += line.naturalTextWidth();
147 }
148 }
149
150 QString elidedText = painter->fontMetrics().elidedText(description, Qt::ElideRight, elideWidth);
151 painter->drawText(descRect, Qt::AlignLeft|Qt::TextWordWrap, elidedText);
152 }
153 }
154 }
155
156 painter->restore();
157}
158
159
161 : QWidget(parent)
162{
164
170
171 QVBoxLayout* layout = new QVBoxLayout(this);
172 layout->setContentsMargins(0,0,0,0);
173
174 // TODO: menu for view mode change
175 QMenu* menu = new QMenu(this);
176 menu->setStyleSheet("margin: 6px");
177 menu->addSection(i18nc("@title Which elements to display (e.g., thumbnails or details)", "Display"));
178
179 QActionGroup *actionGroup = new QActionGroup(this);
180
181 KisConfig cfg(true);
183
184 QAction* action = menu->addAction(KisIconUtils::loadIcon("view-preview"),
185 i18n("Thumbnails"), this, SLOT(slotSetModeThumbnail()));
186 action->setCheckable(true);
187 action->setChecked(m_mode == KisGamutMaskChooser::THUMBNAIL);
188 action->setActionGroup(actionGroup);
189
190 action = menu->addAction(KisIconUtils::loadIcon("view-list-details"),
191 i18n("Details"), this, SLOT(slotSetModeDetail()));
192 action->setCheckable(true);
193 action->setChecked(m_mode == KisGamutMaskChooser::DETAIL);
194 action->setActionGroup(actionGroup);
195
196 // setting the view mode
199 KisPopupButton* viewModeButton = m_itemChooser->viewModeButton();
200 viewModeButton->setPopupWidget(menu);
201
202 layout->addWidget(m_itemChooser);
203
205}
206
211
216
217void KisGamutMaskChooser::resizeEvent(QResizeEvent *event)
218{
219 QWidget::resizeEvent(event);
221}
222
228
230{
231 KisConfig cfg(false);
232 cfg.writeEntry("GamutMasks.viewMode", qint32(m_mode));
233
236 m_itemChooser->setRowHeight(this->fontMetrics().lineSpacing() * 4);
237 m_itemChooser->setColumnWidth(this->fontMetrics().lineSpacing() * 4);
239 }
242 m_itemChooser->setRowHeight(this->fontMetrics().lineSpacing()*4);
244 }
245}
246
248{
249 Q_EMIT sigGamutMaskSelected(resource.staticCast<KoGamutMask>());
250}
251
256
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
void writeEntry(const QString &name, const T &value)
Definition kis_config.h:779
T readEntry(const QString &name, const T &defaultValue=T())
Definition kis_config.h:789
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