Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_preset_chooser.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2002 Patrick Julien <freak@codepimps.org>
3 * SPDX-FileCopyrightText: 2009 Sven Langkamp <sven.langkamp@gmail.com>
4 * SPDX-FileCopyrightText: 2011 Silvio Heinrich <plassy@web.de>
5 * SPDX-FileCopyrightText: 2011 Srikanth Tiyyagura <srikanth.tulasiram@gmail.com>
6 * SPDX-FileCopyrightText: 2011 José Luis Vergara <pentalis@gmail.com>
7 *
8 * SPDX-License-Identifier: GPL-2.0-or-later
9 */
10
11#include "kis_preset_chooser.h"
12
13#include <QVBoxLayout>
14#include <QPainter>
15#include <QAbstractItemDelegate>
16#include <QStyleOptionViewItem>
17#include <QSortFilterProxyModel>
18#include <KisResourceModel.h>
19#include <QApplication>
20
21#include <kis_config.h>
22#include <klocalizedstring.h>
23#include <KisKineticScroller.h>
24
25#include <KoIcon.h>
29#include <KisResourceLocator.h>
30#include <KisResourceTypes.h>
31
34#include "kis_config_notifier.h"
35#include <kis_icon.h>
40
41
43class KisPresetDelegate : public QAbstractItemDelegate
44{
45public:
46 KisPresetDelegate(KisResourceMetaDataModel *metaDataModel, QObject * parent = 0)
47 : QAbstractItemDelegate(parent)
48 , m_showText(false)
49 , m_useDirtyPresets(false)
50 , m_metaDataModel(metaDataModel) {}
51
52 ~KisPresetDelegate() override {}
53
55 void paint(QPainter *, const QStyleOptionViewItem &, const QModelIndex &) const override;
56
58 QSize sizeHint(const QStyleOptionViewItem & option, const QModelIndex &) const override {
59 return option.decorationSize;
60 }
61
62 void setShowText(bool showText) {
63 m_showText = showText;
64 }
65
69
70private:
74};
75
76void KisPresetDelegate::paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const
77{
78 painter->save();
79 painter->setRenderHint(QPainter::SmoothPixmapTransform, true);
80 if (!(option.state & QStyle::State_Enabled)) {
81 painter->setOpacity(0.2);
82 }
83
84 if (!index.isValid()) {
85 painter->restore();
86 return;
87 }
88
89 bool dirty = index.data(Qt::UserRole + KisAbstractResourceModel::Dirty).toBool();
90
91 QImage preview = KisResourceThumbnailCache::instance()->getImage(index);
92
93 if (preview.isNull()) {
94 preview = QImage(512, 512, QImage::Format_RGB32);
95 preview.fill(Qt::red);
96 }
97
98 qreal devicePixelRatioF = painter->device()->devicePixelRatioF();
99
100 QRect paintRect = option.rect.adjusted(1, 1, -1, -1);
101 if (!m_showText) {
102 QImage previewHighDpi =
104 paintRect.size() * devicePixelRatioF,
105 Qt::IgnoreAspectRatio,
106 Qt::SmoothTransformation);
107 previewHighDpi.setDevicePixelRatio(devicePixelRatioF);
108 painter->drawImage(paintRect.x(), paintRect.y(), previewHighDpi);
109 }
110 else {
111 QSize pixSize(paintRect.height(), paintRect.height());
112 QImage previewHighDpi = KisResourceThumbnailCache::instance()->getImage(index,
113 pixSize * devicePixelRatioF,
114 Qt::KeepAspectRatio,
115 Qt::SmoothTransformation);
116 previewHighDpi.setDevicePixelRatio(devicePixelRatioF);
117 painter->drawImage(paintRect.x(), paintRect.y(), previewHighDpi);
118
119 // Put an asterisk after the preset if it is dirty. This will help in case the pixmap icon is too small
120
121 QString dirtyPresetIndicator = QString("");
122 if (m_useDirtyPresets && dirty) {
123 dirtyPresetIndicator = QString("*");
124 }
125
126// qreal brushSize = metaData["paintopSize"].toReal();
127// qDebug() << "brushsize" << brushSize;
128// QString brushSizeText;
129// // Disable displayed decimal precision beyond a certain brush size
130// if (brushSize < 100) {
131// brushSizeText = QString::number(brushSize, 'g', 3);
132// }
133// else {
134// brushSizeText = QString::number(brushSize, 'f', 0);
135// }
136
137// painter->drawText(pixSize.width() + 10, option.rect.y() + option.rect.height() - 10, brushSizeText); // brush size
138
139 QString presetDisplayName = index.data(Qt::UserRole + KisAbstractResourceModel::Name).toString().replace("_", " "); // don't need underscores that might be part of the file name
140 painter->drawText(pixSize.width() + 10, option.rect.y() + option.rect.height() - 10, presetDisplayName.append(dirtyPresetIndicator));
141
142 }
143
144 if (m_useDirtyPresets && dirty) {
145 const QIcon icon = KisIconUtils::loadIcon("dirty-preset");
146 QPixmap pixmap = icon.pixmap(QSize(16,16));
147 painter->drawPixmap(paintRect.x() + 3, paintRect.y() + 3, pixmap);
148 }
149
150 if (index.data(Qt::UserRole + KisAbstractResourceModel::BrokenStatus).toBool()) {
151 const QIcon icon = KisIconUtils::loadIcon("broken-preset");
152 icon.paint(painter, QRect(paintRect.x() + paintRect.height() - 25, paintRect.y() + paintRect.height() - 25, 25, 25));
153 }
154
155 if (option.state & QStyle::State_Selected) {
156 painter->setCompositionMode(QPainter::CompositionMode_HardLight);
157 painter->setOpacity(1.0);
158 painter->fillRect(option.rect, option.palette.highlight());
159
160 // highlight is not strong enough to pick out preset. draw border around it.
161 painter->setCompositionMode(QPainter::CompositionMode_SourceOver);
162 painter->setPen(QPen(option.palette.highlight(), 4, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin));
163 QRect selectedBorder = option.rect.adjusted(2 , 2, -2, -2); // constrict the rectangle so it doesn't bleed into other presets
164 painter->drawRect(selectedBorder);
165 }
166
167 painter->restore();
168
169}
170
172 : QWidget(parent)
173{
174 setObjectName("KisPresetChooser");
175
176 QVBoxLayout * layout = new QVBoxLayout(this);
177 layout->setContentsMargins(0, 0, 0, 0);
178
183 m_chooser->setSynced(true);
185 layout->addWidget(m_chooser);
186
189
191 this, SIGNAL(resourceSelected(KoResourceSP )));
193 this, SIGNAL(resourceClicked(KoResourceSP )));
194
196
198
199 connect(KisConfigNotifier::instance(), SIGNAL(configChanged()),
200 SLOT(notifyConfigChanged()));
201
202
204}
205
209
215
220
225
232
234{
236 if (!resource) return;
237
238 KisPaintOpPresetSP preset = resource.dynamicCast<KisPaintOpPreset>();
240
242 preset->updateProxy(), SIGNAL(sigSettingsChanged()),
243 this, SLOT(slotCurrentPresetChanged()));
244}
245
247{
249 if (!currentResource) return;
250
252 Q_EMIT m_chooser->tagFilterModel()->dataChanged(index,
253 index,
254 {Qt::UserRole + KisAbstractResourceModel::Thumbnail});
255}
256
258{
259 switch (m_mode) {
260 case ViewMode::THUMBNAIL: {
262 m_delegate->setShowText(false);
263 break;
264 }
265 case ViewMode::DETAIL: {
267 m_delegate->setShowText(true);
268 break;
269 }
270 }
271}
272
277
282
284{
286}
287
292
293void KisPresetChooser::setPresetFilter(const QString& paintOpId)
294{
295 QMap<QString, QVariant> metaDataFilter;
296 if (!paintOpId.isEmpty()) { // empty means "all"
297 metaDataFilter["paintopid"] = paintOpId;
298 }
299 m_chooser->tagFilterModel()->setMetaDataFilter(metaDataFilter);
301}
302
304{
306 chooserSync->setBaseLength(newSize);
307}
308
310{
312 return chooserSync->baseLength();
313}
314
316{
317 // save icon size
318 if (KisConfig(true).presetIconSize() != iconSize()) {
320 }
321}
322
324{
325 switch (newViewMode) {
327 m_delegate->setShowText(true);
328 break;
329 }
330 default: {
331 m_delegate->setShowText(false);
332 }
333 }
334}
float value(const T *src, size_t ch)
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
@ Dirty
A dirty resource is one that has been modified locally but not saved.
@ BrokenStatus
Whether the resource is broken (bool)
static KisConfigNotifier * instance()
bool useDirtyPresets(bool defaultValue=false) const
void setPresetIconSize(const int value) const
int presetIconSize(bool defaultValue=false) const
@ DETAIL
Shows thumbnails.
int iconSize()
get the base size for the icons. Used by the slider in the view options
void slotResourceWasSelected(KoResourceSP resource)
void resourceSelected(KoResourceSP resource)
void setPresetFilter(const QString &paintOpId)
void setCurrentResource(KoResourceSP resource)
KisResourceItemChooser * m_chooser
KisSignalAutoConnectionsStore m_currentPresetConnections
void saveIconSize()
saves the icon size for the presets. called by the horizontal slider release event.
void setIconSize(int newSize)
sets the icon size. Used by slider in view menu
KisPresetDelegate * m_delegate
void showHideBrushNames(ListViewMode newViewMode)
void setViewMode(ViewMode mode)
Sets a list of resources in the paintop list, when ever user press enter in the lineedit of paintop_p...
KisPresetChooser(QWidget *parent=0)
void showTaggingBar(bool show)
Sets the visibility of tagging klineEdits.
void resourceClicked(KoResourceSP resource)
KisResourceItemChooser * itemChooser()
KoResourceSP currentResource() const
The resource item delegate for rendering the resource preview.
void setUseDirtyPresets(bool value)
void paint(QPainter *, const QStyleOptionViewItem &, const QModelIndex &) const override
reimplemented
KisPresetDelegate(KisResourceMetaDataModel *metaDataModel, QObject *parent=0)
KisResourceMetaDataModel * m_metaDataModel
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &) const override
reimplemented
void setShowText(bool showText)
void setCurrentResource(KoResourceSP resource)
Sets the item representing the resource as selected.
void setListViewMode(ListViewMode viewMode)
void listViewModeChanged(ListViewMode newViewMode)
Emitted when the view mode for the internal KisResourceItemListView changes.
void setRowHeight(int rowHeight)
Sets the height of the view rows.
KisTagFilterResourceProxyModel * tagFilterModel() const
void setItemDelegate(QAbstractItemDelegate *delegate)
Sets a custom delegate for the view.
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)
void addUniqueConnection(Sender sender, Signal signal, Receiver receiver, Method method)
void setMetaDataFilter(QMap< QString, QVariant > metaDataMap)
setMetaDataFilter provides a set of metadata to filter on, for instance by paintop id category.
QModelIndex indexForResource(KoResourceSP resource) const override
indexFromResource
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128
QIcon loadIcon(const QString &name)
const QString PaintOpPresets
static KisResourceItemChooserSync * instance()