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(QObject * parent = 0)
47 : QAbstractItemDelegate(parent)
48 , m_showText(false)
49 , m_useDirtyPresets(false) {}
50
51 ~KisPresetDelegate() override {}
52
54 void paint(QPainter *, const QStyleOptionViewItem &, const QModelIndex &) const override;
55
57 QSize sizeHint(const QStyleOptionViewItem & option, const QModelIndex &) const override {
58 return option.decorationSize;
59 }
60
61 void setShowText(bool showText) {
62 m_showText = showText;
63 }
64
68
69private:
72};
73
74void KisPresetDelegate::paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const
75{
76 painter->save();
77 painter->setRenderHint(QPainter::SmoothPixmapTransform, true);
78 if (!(option.state & QStyle::State_Enabled)) {
79 painter->setOpacity(0.2);
80 }
81
82 if (!index.isValid()) {
83 painter->restore();
84 return;
85 }
86
87 bool dirty = index.data(Qt::UserRole + KisAbstractResourceModel::Dirty).toBool();
88
89 QImage preview = KisResourceThumbnailCache::instance()->getImage(index);
90
91 if (preview.isNull()) {
92 preview = QImage(512, 512, QImage::Format_RGB32);
93 preview.fill(Qt::red);
94 }
95
96 qreal devicePixelRatioF = painter->device()->devicePixelRatioF();
97
98 QRect paintRect = option.rect.adjusted(1, 1, -1, -1);
99 if (!m_showText) {
100 QImage previewHighDpi =
102 paintRect.size() * devicePixelRatioF,
103 Qt::IgnoreAspectRatio,
104 Qt::SmoothTransformation);
105 previewHighDpi.setDevicePixelRatio(devicePixelRatioF);
106 painter->drawImage(paintRect.x(), paintRect.y(), previewHighDpi);
107 }
108 else {
109 QSize pixSize(paintRect.height(), paintRect.height());
110 QImage previewHighDpi = KisResourceThumbnailCache::instance()->getImage(index,
111 pixSize * devicePixelRatioF,
112 Qt::KeepAspectRatio,
113 Qt::SmoothTransformation);
114 previewHighDpi.setDevicePixelRatio(devicePixelRatioF);
115 painter->drawImage(paintRect.x(), paintRect.y(), previewHighDpi);
116
117 // Put an asterisk after the preset if it is dirty. This will help in case the pixmap icon is too small
118
119 QString dirtyPresetIndicator = QString("");
120 if (m_useDirtyPresets && dirty) {
121 dirtyPresetIndicator = QString("*");
122 }
123
124// qreal brushSize = metaData["paintopSize"].toReal();
125// qDebug() << "brushsize" << brushSize;
126// QString brushSizeText;
127// // Disable displayed decimal precision beyond a certain brush size
128// if (brushSize < 100) {
129// brushSizeText = QString::number(brushSize, 'g', 3);
130// }
131// else {
132// brushSizeText = QString::number(brushSize, 'f', 0);
133// }
134
135// painter->drawText(pixSize.width() + 10, option.rect.y() + option.rect.height() - 10, brushSizeText); // brush size
136
137 QString presetDisplayName = index.data(Qt::UserRole + KisAbstractResourceModel::Name).toString().replace("_", " "); // don't need underscores that might be part of the file name
138 painter->drawText(pixSize.width() + 10, option.rect.y() + option.rect.height() - 10, presetDisplayName.append(dirtyPresetIndicator));
139
140 }
141
142 if (m_useDirtyPresets && dirty) {
143 const QIcon icon = KisIconUtils::loadIcon("dirty-preset");
144 QPixmap pixmap = icon.pixmap(QSize(16,16));
145 painter->drawPixmap(paintRect.x() + 3, paintRect.y() + 3, pixmap);
146 }
147
148 if (index.data(Qt::UserRole + KisAbstractResourceModel::BrokenStatus).toBool()) {
149 const QIcon icon = KisIconUtils::loadIcon("broken-preset");
150 icon.paint(painter, QRect(paintRect.x() + paintRect.height() - 25, paintRect.y() + paintRect.height() - 25, 25, 25));
151 }
152
153 if (option.state & QStyle::State_Selected) {
154 painter->setCompositionMode(QPainter::CompositionMode_HardLight);
155 painter->setOpacity(1.0);
156 painter->fillRect(option.rect, option.palette.highlight());
157
158 // highlight is not strong enough to pick out preset. draw border around it.
159 painter->setCompositionMode(QPainter::CompositionMode_SourceOver);
160 painter->setPen(QPen(option.palette.highlight(), 4, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin));
161 QRect selectedBorder = option.rect.adjusted(2 , 2, -2, -2); // constrict the rectangle so it doesn't bleed into other presets
162 painter->drawRect(selectedBorder);
163 }
164
165 painter->restore();
166
167}
168
170 : QWidget(parent)
171{
172 setObjectName("KisPresetChooser");
173
174 QVBoxLayout * layout = new QVBoxLayout(this);
175 layout->setContentsMargins(0, 0, 0, 0);
176
179 m_delegate = new KisPresetDelegate(this);
181 m_chooser->setSynced(true);
183 layout->addWidget(m_chooser);
184
185 connect(m_chooser, SIGNAL(resourceSelected(KoResourceSP )),
187
188 connect(m_chooser, SIGNAL(resourceSelected(KoResourceSP )),
189 this, SIGNAL(resourceSelected(KoResourceSP )));
190 connect(m_chooser, SIGNAL(resourceClicked(KoResourceSP )),
191 this, SIGNAL(resourceClicked(KoResourceSP )));
192
194
196
197 connect(KisConfigNotifier::instance(), SIGNAL(configChanged()),
198 SLOT(notifyConfigChanged()));
199
200
202}
203
207
213
218
223
230
232{
234 if (!resource) return;
235
236 KisPaintOpPresetSP preset = resource.dynamicCast<KisPaintOpPreset>();
238
240 preset->updateProxy(), SIGNAL(sigSettingsChanged()),
241 this, SLOT(slotCurrentPresetChanged()));
242}
243
245{
247 if (!currentResource) return;
248
250 Q_EMIT m_chooser->tagFilterModel()->dataChanged(index,
251 index,
252 {Qt::UserRole + KisAbstractResourceModel::Thumbnail});
253}
254
256{
257 switch (m_mode) {
258 case ViewMode::THUMBNAIL: {
260 m_delegate->setShowText(false);
261 break;
262 }
263 case ViewMode::DETAIL: {
265 m_delegate->setShowText(true);
266 break;
267 }
268 }
269}
270
275
280
282{
284}
285
290
291void KisPresetChooser::setPresetFilter(const QString& paintOpId)
292{
293 QMap<QString, QVariant> metaDataFilter;
294 if (!paintOpId.isEmpty()) { // empty means "all"
295 metaDataFilter["paintopid"] = paintOpId;
296 }
297 m_chooser->tagFilterModel()->setMetaDataFilter(metaDataFilter);
299}
300
302{
304 chooserSync->setBaseLength(newSize);
305}
306
308{
310 return chooserSync->baseLength();
311}
312
314{
315 // save icon size
316 if (KisConfig(true).presetIconSize() != iconSize()) {
318 }
319}
320
322{
323 switch (newViewMode) {
325 m_delegate->setShowText(true);
326 break;
327 }
328 default: {
329 m_delegate->setShowText(false);
330 }
331 }
332}
float value(const T *src, size_t ch)
@ 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(QObject *parent=0)
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 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()