Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_paintop_settings_widget.cpp
Go to the documentation of this file.
1/* This file is part of the KDE project
2 * SPDX-FileCopyrightText: 2008 Boudewijn Rempt <boud@valdyas.org>
3 * SPDX-FileCopyrightText: 2011 Silvio Heinrich <plassy@web.de>
4 *
5 * SPDX-License-Identifier: LGPL-2.0-or-later
6 */
7
11
12#include <QHBoxLayout>
13#include <QList>
14#include <QStackedWidget>
15#include <QVBoxLayout>
16#include <QPainter>
17#include <QStyleOptionViewItem>
18#include <QAction>
19#include <QShowEvent>
20
22#include <kis_cmb_composite.h>
28
29#include <lager/constant.hpp>
30#include <KisLager.h>
31
32
45
48 , m_d(new Private())
49{
50 setObjectName("KisPaintOpPresetsWidget");
51
56 m_d->optionsList->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents);
57 m_d->optionsList->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
58
59 QSizePolicy policy = QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
60 m_d->optionsList->setSizePolicy(policy);
61
62 m_d->optionsList->setMinimumWidth(160); // this should be just big enough to show all of the setting names
63
64 m_d->optionsStack = new QStackedWidget(this);
65 policy = QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
66 m_d->optionsStack->setSizePolicy(policy);
67
68 QHBoxLayout* layout = new QHBoxLayout(this);
69 layout->addWidget(m_d->optionsList);
70 layout->addWidget(m_d->optionsStack);
71
72 layout->setStretch(0, 0);
73 layout->setStretch(1, 1);
74
75 m_saveLockedOption = false;
76
77 connect(m_d->optionsList, SIGNAL(activated(QModelIndex)), this, SLOT(changePage(QModelIndex)));
78 connect(m_d->optionsList, SIGNAL(clicked(QModelIndex)), this, SLOT(changePage(QModelIndex)));
79 connect(m_d->optionsList, SIGNAL(rightClickedMenuDropSettingsTriggered()), this, SLOT(slotLockPropertiesDrop()));
80 connect(m_d->optionsList, SIGNAL(rightClickedMenuSaveSettingsTriggered()), this, SLOT(slotLockPropertiesSave()));
81 connect(m_d->optionsList, SIGNAL(sigEntryChecked(QModelIndex)), this, SLOT(slotEntryChecked(QModelIndex)));
82 connect (m_d->optionsList, SIGNAL(lockAreaTriggered(QModelIndex)), this, SLOT(lockProperties(QModelIndex)));
83
84 // allow the list viewport to be responsive to input release events
85 m_d->optionsList->viewport()->installEventFilter(this);
86}
87
88
94
99
104
106{
107 if (!option->configurationPage()) return;
108 m_d->model->addPaintOpOption(option, m_d->optionsStack->count(), option->label(), category);
109 connect(option, SIGNAL(sigSettingChanged()), SIGNAL(sigConfigurationItemChanged()));
110 m_d->optionsStack->addWidget(option->configurationPage());
111 m_d->paintOpOptions << option;
112
115 option->effectiveLodLimitations());
116}
117
119{
120 Q_ASSERT(!config->getString("paintop").isEmpty());
122 int indexcount = 0;
123 Q_FOREACH (KisPaintOpOption* option, m_d->paintOpOptions) {
124 option->startReadOptionSetting(propertiesProxy);
125
127 KisOptionInfo info;
128 info.option = option;
129 info.index = indexcount;
130
131 m_d->model->categoriesMapper()->itemFromRow(m_d->model->indexOf(info).row())->setLocked(option->isLocked());
134 indexcount++;
135 }
136}
137
145
147{
149
150 Q_FOREACH (const KisPaintOpOption* option, m_d->paintOpOptions) {
151 if (option->isCheckable() && !option->isChecked()) continue;
152 option->lodLimitations(&l);
153 }
154
155 return l;
156}
157
158lager::reader<KisPaintopLodLimitations> KisPaintOpSettingsWidget::lodLimitationsReader() const
159{
160 return m_d->lodLimitations.value_or(lager::make_constant(KisPaintopLodLimitations()));
161}
162
164{
165 return lager::make_constant(1.0);
166}
167
169{
171
172 Q_FOREACH (KisPaintOpOption* option, m_d->paintOpOptions) {
173 option->setImage(image);
174 }
175}
176
178{
180
181 Q_FOREACH (KisPaintOpOption* option, m_d->paintOpOptions) {
182 option->setNode(node);
183 }
184}
185
194
203
204void KisPaintOpSettingsWidget::changePage(const QModelIndex& index)
205{
206 KisOptionInfo info;
207 QPalette palette;
208 palette.setColor(QPalette::Base, QColor(255,200,200));
209 palette.setColor(QPalette::Text, Qt::black);
210
211 if(m_d->model->entryAt(info, index)) {
212 m_d->optionsStack->setCurrentIndex(info.index);
213 }
214
216}
217
221
222void KisPaintOpSettingsWidget::lockProperties(const QModelIndex& index)
223{
224 KisOptionInfo info;
225 if (m_d->model->entryAt(info, index)) {
226 m_d->optionsList->setCurrentIndex(index);
229
230 if (!info.option->isLocked()){
232 info.option->setLocked(true);
233 m_d->model->categoriesMapper()->itemFromRow(index.row())->setLocked(true);
234 m_d->model->signalDataChanged(index);
235
236 }
237 else {
239 info.option->setLocked(false);
240 m_d->model->categoriesMapper()->itemFromRow(index.row())->setLocked(false);
241 m_d->model->signalDataChanged(index);
242
244 Q_EMIT sigSaveLockedConfig(p);
245 }
246 else {
247 Q_EMIT sigDropLockedConfig(p);
248 }
249 m_saveLockedOption = false;
250 }
251 }
252}
263void KisPaintOpSettingsWidget::slotEntryChecked(const QModelIndex &index)
264{
265 Q_UNUSED(index);
267}
268
269bool KisPaintOpSettingsWidget::eventFilter(QObject *obj, QEvent *event)
270{
271 if (event->type() == (QEvent::MouseButtonRelease) || event->type() == QEvent::TabletRelease) {
272 // bit of a hack to properly work with the KisCategorizedListView type:
273 // get the mouse position and utilize indexAt() instead of currentIndex() to
274 // ensure the pages don't swap back and forth if the user repeatedly clicks
275 // another option's checkbox too quickly
276 const QMouseEvent* mevent = static_cast<const QMouseEvent*>(event);
277 QModelIndex index = m_d->optionsList->indexAt(mevent->pos());
278 changePage(index);
279 event->accept();
280 }
281
282 return QObject::eventFilter(obj, event);
283}
const Params2D p
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
DataItem * itemFromRow(int row) const
bool entryAt(TEntry &entry, QModelIndex index) const
SpecificCategoriesMapper * categoriesMapper()
QModelIndex indexOf(const TEntry &entry) const
void setModel(QAbstractItemModel *model) override
virtual void setCanvasResourcesInterface(KoCanvasResourcesInterfaceSP canvasResourcesInterface)
void sigSaveLockedConfig(KisPropertiesConfigurationSP p)
void sigConfigurationItemChanged()
void sigDropLockedConfig(KisPropertiesConfigurationSP p)
virtual KoCanvasResourcesInterfaceSP canvasResourcesInterface() const
static KisLockedPropertiesServer * instance()
void addToLockedProperties(KisPropertiesConfigurationSP p)
KisLockedPropertiesProxySP createLockedPropertiesProxy(KisPropertiesConfiguration *settings)
void removeFromLockedProperties(KisPropertiesConfigurationSP p)
KisResourcesInterfaceSP resourcesInterface() const
virtual void setImage(KisImageWSP image)
virtual void setResourcesInterface(KisResourcesInterfaceSP resourcesInterface)
virtual void setNode(KisNodeWSP node)
void addPaintOpOption(KisPaintOpOption *option, int widgetIndex, const QString &label, const QString &category)
void signalDataChanged(const QModelIndex &index)
static QString categoryName(KisPaintOpOption::PaintopCategory category)
virtual void lodLimitations(KisPaintopLodLimitations *l) const
void startReadOptionSetting(const KisPropertiesConfigurationSP setting)
virtual void setCanvasResourcesInterface(KoCanvasResourcesInterfaceSP canvasResourcesInterface)
virtual void setNode(KisNodeWSP node)
virtual void setResourcesInterface(KisResourcesInterfaceSP resourcesInterface)
KisPaintOpOption::PaintopCategory category() const
void startWriteOptionSetting(KisPropertiesConfigurationSP setting) const
virtual bool isCheckable() const
virtual void setImage(KisImageWSP image)
QWidget * configurationPage() const
OptionalLodLimitationsReader effectiveLodLimitations() const
virtual bool isChecked() const
void setLocked(bool value)
void setCanvasResourcesInterface(KoCanvasResourcesInterfaceSP canvasResourcesInterface) override
bool eventFilter(QObject *obj, QEvent *event) override
lager::reader< qreal > effectiveBrushSize() const override
void slotEntryChecked(const QModelIndex &index)
void setImage(KisImageWSP image) override
Reimplemented, sets image on option widgets.
KisPaintopLodLimitations lodLimitations() const override
void lockProperties(const QModelIndex &index)
void addPaintOpOption(KisPaintOpOption *option)
void setResourcesInterface(KisResourcesInterfaceSP resourcesInterface) override
void setNode(KisNodeWSP node) override
Reimplemented, sets node on option widgets.
void setConfiguration(const KisPropertiesConfigurationSP config) override
Reimplemented.
void writeConfiguration(KisPropertiesConfigurationSP config) const override
Reimplemented.
lager::reader< KisPaintopLodLimitations > lodLimitationsReader() const override
std::optional< lager::reader< T > > fold_optional_cursors(const Func &func, Cursors &&...cursors)
Definition KisLager.h:37
rgba palette[MAX_PALETTE]
Definition palette.c:35
KisPaintOpOption * option
std::optional< lager::reader< KisPaintopLodLimitations > > lodLimitations