Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_simple_paintop_factory.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2009 Sven Langkamp <sven.langkamp@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7#ifndef KIS_SIMPLE_PAINTOP_FACTORY_H
8#define KIS_SIMPLE_PAINTOP_FACTORY_H
9
12#include <kis_icon.h>
13#include <KisCppQuirks.h>
15
16class QWidget;
17
18#ifdef HAVE_THREADED_TEXT_RENDERING_WORKAROUND
19
20namespace detail {
21
22template< class, class = std::void_t<> >
23struct has_preinitialize_statically : std::false_type { };
24
25template< class T >
26struct has_preinitialize_statically<T, std::void_t<decltype(std::declval<T>().preinitializeOpStatically(KisPaintOpSettingsSP()))>> : std::true_type { };
27
28
29template <typename T>
30void preinitializeOpStatically(const KisPaintOpSettingsSP settings, typename std::enable_if_t<has_preinitialize_statically<T>::value> * = 0)
31{
32 T::preinitializeOpStatically(settings);
33}
34
35template <typename T>
36void preinitializeOpStatically(const KisPaintOpSettingsSP settings, typename std::enable_if_t<!has_preinitialize_statically<T>::value> * = 0)
37{
38 Q_UNUSED(settings);
39 // noop
40}
41
42}
43
44#endif /* HAVE_THREADED_TEXT_RENDERING_WORKAROUND */
45
46namespace detail {
47
48template< class, class = std::void_t<> >
49struct has_prepare_linked_resources : std::false_type { };
50
51template< class T >
52struct has_prepare_linked_resources<T, std::void_t<decltype(std::declval<T>().prepareLinkedResources(KisPaintOpSettingsSP(),KisResourcesInterfaceSP()))>> : std::true_type { };
53
54template <typename T>
56 KisResourcesInterfaceSP resourcesInterface,
57 std::enable_if_t<has_prepare_linked_resources<T>::value> * = 0)
58{
59 return T::prepareLinkedResources(settings, resourcesInterface);
60}
61
62template <typename T>
64 KisResourcesInterfaceSP resourcesInterface,
65 std::enable_if_t<!has_prepare_linked_resources<T>::value> * = 0)
66{
67 Q_UNUSED(settings);
68 Q_UNUSED(resourcesInterface);
69 // noop
70 return {};
71}
72
73
74template< class, class = std::void_t<> >
75struct has_prepare_embedded_resources : std::false_type { };
76
77template< class T >
78struct has_prepare_embedded_resources<T, std::void_t<decltype(std::declval<T>().prepareEmbeddedResources(KisPaintOpSettingsSP(),KisResourcesInterfaceSP()))>> : std::true_type { };
79
80template <typename T>
82 KisResourcesInterfaceSP resourcesInterface,
83 std::enable_if_t<has_prepare_embedded_resources<T>::value> * = 0)
84{
85 return T::prepareEmbeddedResources(settings, resourcesInterface);
86}
87
88template <typename T>
90 KisResourcesInterfaceSP resourcesInterface,
91 std::enable_if_t<!has_prepare_embedded_resources<T>::value> * = 0)
92{
93 Q_UNUSED(settings);
94 Q_UNUSED(resourcesInterface);
95 // noop
96 return {};
97}
98
99template< class, class = std::void_t<> >
100struct has_create_interstroke_data_factory : std::false_type { };
101
102template< class T >
103struct has_create_interstroke_data_factory<T, std::void_t<decltype(std::declval<T>().createInterstrokeDataFactory(KisPaintOpSettingsSP(), KisResourcesInterfaceSP()))>> : std::true_type { };
104
105template <typename T>
107 std::enable_if_t<has_create_interstroke_data_factory<T>::value> * = 0)
108{
109 return T::createInterstrokeDataFactory(settings, resourcesInterface);
110}
111
112template <typename T>
114 std::enable_if_t<!has_create_interstroke_data_factory<T>::value> * = 0)
115{
116 Q_UNUSED(settings);
117 Q_UNUSED(resourcesInterface);
118 // noop
119 return 0;
120}
121
122template< class, class = std::void_t<> >
123struct supports_extended_initilization : std::false_type { };
124
125template< class T >
127 std::void_t<decltype(T(std::declval<QWidget*>(),
128 std::declval<KisResourcesInterfaceSP>(),
129 std::declval<KoCanvasResourcesInterfaceSP>()))> > : std::true_type { };
130
131template <typename T>
132KisPaintOpConfigWidget* createConfigWidget(QWidget* parent, KisResourcesInterfaceSP resourcesInterface, KoCanvasResourcesInterfaceSP canvasResourcesInterface,
133 std::enable_if_t<supports_extended_initilization<T>::value> * = 0)
134{
135 T* widget = new T(parent, resourcesInterface, canvasResourcesInterface);
136 widget->setResourcesInterface(resourcesInterface);
137 widget->setCanvasResourcesInterface(canvasResourcesInterface);
138 return widget;
139}
140
141template <typename T>
142KisPaintOpConfigWidget* createConfigWidget(QWidget* parent, KisResourcesInterfaceSP resourcesInterface, KoCanvasResourcesInterfaceSP canvasResourcesInterface,
143 std::enable_if_t<!supports_extended_initilization<T>::value> * = 0)
144{
145 // TODO: remove this constructor and pass everything into the constructor
146 T* widget = new T(parent);
147 widget->setResourcesInterface(resourcesInterface);
148 widget->setCanvasResourcesInterface(canvasResourcesInterface);
149 return widget;
150}
151
152}
153
157template <class Op, class OpSettings, class OpSettingsWidget> class KisSimplePaintOpFactory : public KisPaintOpFactory
158{
159
160public:
161
162 KisSimplePaintOpFactory(const QString& id, const QString& name, const QString& category,
163 const QString& pixmap, const QString& model = QString(),
165 bool lodSizeThresholdSupported = true)
167 , m_id(id)
168 , m_name(name)
170 , m_pixmap(pixmap)
171 , m_model(model)
173 {
175 }
176
178 }
179
180#ifdef HAVE_THREADED_TEXT_RENDERING_WORKAROUND
181 void preinitializePaintOpIfNeeded(const KisPaintOpSettingsSP settings) override {
182 detail::preinitializeOpStatically<Op>(settings);
183 }
184#endif /* HAVE_THREADED_TEXT_RENDERING_WORKAROUND */
185
186 KisPaintOp *createOp(const KisPaintOpSettingsSP settings, KisPainter *painter, KisNodeSP node, KisImageSP image) override {
187 KisPaintOp * op = new Op(settings, painter, node, image);
188 Q_CHECK_PTR(op);
189 return op;
190 }
191
193 return detail::prepareLinkedResources<Op>(settings, resourcesInterface);
194 }
195
197 return detail::prepareEmbeddedResources<Op>(settings, resourcesInterface);
198 }
199
201 return detail::createInterstrokeDataFactory<Op>(settings, resourcesInterface);
202 }
203
205 KisPaintOpSettingsSP settings = new OpSettings(resourcesInterface);
206 settings->setModelName(m_model);
207 return settings;
208 }
209
210 KisPaintOpConfigWidget* createConfigWidget(QWidget* parent, KisResourcesInterfaceSP resourcesInterface, KoCanvasResourcesInterfaceSP canvasResourcesInterface) override {
211 return detail::createConfigWidget<OpSettingsWidget>(parent, resourcesInterface, canvasResourcesInterface);
212 }
213
214 QString id() const override {
215 return m_id;
216 }
217
218 QString name() const override {
219 return m_name;
220 }
221
222 QIcon icon() override {
223 return KisIconUtils::loadIcon(id());
224 }
225
226 QString category() const override {
227 return m_category;
228 }
229
230 bool lodSizeThresholdSupported() const override {
232 }
233
234private:
235 QString m_id;
236 QString m_name;
237 QString m_category;
238 QString m_pixmap;
239 QString m_model;
241};
242
243#endif // KIS_SIMPLE_PAINTOP_FACTORY_H
QList< QString > QStringList
QStringList whiteListedCompositeOps() const
void setPriority(int newPriority)
KisSimplePaintOpFactory(const QString &id, const QString &name, const QString &category, const QString &pixmap, const QString &model=QString(), const QStringList &whiteListedCompositeOps=QStringList(), int priority=100, bool lodSizeThresholdSupported=true)
QList< KoResourceLoadResult > prepareLinkedResources(const KisPaintOpSettingsSP settings, KisResourcesInterfaceSP resourcesInterface) override
KisPaintOpConfigWidget * createConfigWidget(QWidget *parent, KisResourcesInterfaceSP resourcesInterface, KoCanvasResourcesInterfaceSP canvasResourcesInterface) override
QList< KoResourceLoadResult > prepareEmbeddedResources(const KisPaintOpSettingsSP settings, KisResourcesInterfaceSP resourcesInterface) override
KisInterstrokeDataFactory * createInterstrokeDataFactory(const KisPaintOpSettingsSP settings, KisResourcesInterfaceSP resourcesInterface) const override
bool lodSizeThresholdSupported() const override
QString category() const override
KisPaintOpSettingsSP createSettings(KisResourcesInterfaceSP resourcesInterface) override
KisPaintOp * createOp(const KisPaintOpSettingsSP settings, KisPainter *painter, KisNodeSP node, KisImageSP image) override
QIcon loadIcon(const QString &name)
QList< KoResourceLoadResult > prepareEmbeddedResources(const KisPaintOpSettingsSP settings, KisResourcesInterfaceSP resourcesInterface, std::enable_if_t< has_prepare_embedded_resources< T >::value > *=0)
KisInterstrokeDataFactory * createInterstrokeDataFactory(const KisPaintOpSettingsSP settings, KisResourcesInterfaceSP resourcesInterface, std::enable_if_t< has_create_interstroke_data_factory< T >::value > *=0)
QList< KoResourceLoadResult > prepareLinkedResources(const KisPaintOpSettingsSP settings, KisResourcesInterfaceSP resourcesInterface, std::enable_if_t< has_prepare_linked_resources< T >::value > *=0)
KisPaintOpConfigWidget * createConfigWidget(QWidget *parent, KisResourcesInterfaceSP resourcesInterface, KoCanvasResourcesInterfaceSP canvasResourcesInterface, std::enable_if_t< supports_extended_initilization< T >::value > *=0)