Warning, file /graphics/krita/plugins/paintops/libpaintop/kis_simple_paintop_factory.h was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001 /* 0002 * SPDX-FileCopyrightText: 2009 Sven Langkamp <sven.langkamp@gmail.com> 0003 * 0004 * SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #ifndef KIS_SIMPLE_PAINTOP_FACTORY_H 0008 #define KIS_SIMPLE_PAINTOP_FACTORY_H 0009 0010 #include <brushengine/kis_paintop_factory.h> 0011 #include <brushengine/kis_paintop_settings.h> 0012 #include <kis_icon.h> 0013 #include <KisCppQuirks.h> 0014 #include <KoResourceLoadResult.h> 0015 0016 class QWidget; 0017 0018 #ifdef HAVE_THREADED_TEXT_RENDERING_WORKAROUND 0019 0020 namespace detail { 0021 0022 template< class, class = std::void_t<> > 0023 struct has_preinitialize_statically : std::false_type { }; 0024 0025 template< class T > 0026 struct has_preinitialize_statically<T, std::void_t<decltype(std::declval<T>().preinitializeOpStatically(KisPaintOpSettingsSP()))>> : std::true_type { }; 0027 0028 0029 template <typename T> 0030 void preinitializeOpStatically(const KisPaintOpSettingsSP settings, typename std::enable_if_t<has_preinitialize_statically<T>::value> * = 0) 0031 { 0032 T::preinitializeOpStatically(settings); 0033 } 0034 0035 template <typename T> 0036 void preinitializeOpStatically(const KisPaintOpSettingsSP settings, typename std::enable_if_t<!has_preinitialize_statically<T>::value> * = 0) 0037 { 0038 Q_UNUSED(settings); 0039 // noop 0040 } 0041 0042 } 0043 0044 #endif /* HAVE_THREADED_TEXT_RENDERING_WORKAROUND */ 0045 0046 namespace detail { 0047 0048 template< class, class = std::void_t<> > 0049 struct has_prepare_linked_resources : std::false_type { }; 0050 0051 template< class T > 0052 struct has_prepare_linked_resources<T, std::void_t<decltype(std::declval<T>().prepareLinkedResources(KisPaintOpSettingsSP(),KisResourcesInterfaceSP()))>> : std::true_type { }; 0053 0054 template <typename T> 0055 QList<KoResourceLoadResult> prepareLinkedResources(const KisPaintOpSettingsSP settings, 0056 KisResourcesInterfaceSP resourcesInterface, 0057 std::enable_if_t<has_prepare_linked_resources<T>::value> * = 0) 0058 { 0059 return T::prepareLinkedResources(settings, resourcesInterface); 0060 } 0061 0062 template <typename T> 0063 QList<KoResourceLoadResult> prepareLinkedResources(const KisPaintOpSettingsSP settings, 0064 KisResourcesInterfaceSP resourcesInterface, 0065 std::enable_if_t<!has_prepare_linked_resources<T>::value> * = 0) 0066 { 0067 Q_UNUSED(settings); 0068 Q_UNUSED(resourcesInterface); 0069 // noop 0070 return {}; 0071 } 0072 0073 0074 template< class, class = std::void_t<> > 0075 struct has_prepare_embedded_resources : std::false_type { }; 0076 0077 template< class T > 0078 struct has_prepare_embedded_resources<T, std::void_t<decltype(std::declval<T>().prepareEmbeddedResources(KisPaintOpSettingsSP(),KisResourcesInterfaceSP()))>> : std::true_type { }; 0079 0080 template <typename T> 0081 QList<KoResourceLoadResult> prepareEmbeddedResources(const KisPaintOpSettingsSP settings, 0082 KisResourcesInterfaceSP resourcesInterface, 0083 std::enable_if_t<has_prepare_embedded_resources<T>::value> * = 0) 0084 { 0085 return T::prepareEmbeddedResources(settings, resourcesInterface); 0086 } 0087 0088 template <typename T> 0089 QList<KoResourceLoadResult> prepareEmbeddedResources(const KisPaintOpSettingsSP settings, 0090 KisResourcesInterfaceSP resourcesInterface, 0091 std::enable_if_t<!has_prepare_embedded_resources<T>::value> * = 0) 0092 { 0093 Q_UNUSED(settings); 0094 Q_UNUSED(resourcesInterface); 0095 // noop 0096 return {}; 0097 } 0098 0099 template< class, class = std::void_t<> > 0100 struct has_create_interstroke_data_factory : std::false_type { }; 0101 0102 template< class T > 0103 struct has_create_interstroke_data_factory<T, std::void_t<decltype(std::declval<T>().createInterstrokeDataFactory(KisPaintOpSettingsSP(), KisResourcesInterfaceSP()))>> : std::true_type { }; 0104 0105 template <typename T> 0106 KisInterstrokeDataFactory* createInterstrokeDataFactory(const KisPaintOpSettingsSP settings, KisResourcesInterfaceSP resourcesInterface, 0107 std::enable_if_t<has_create_interstroke_data_factory<T>::value> * = 0) 0108 { 0109 return T::createInterstrokeDataFactory(settings, resourcesInterface); 0110 } 0111 0112 template <typename T> 0113 KisInterstrokeDataFactory* createInterstrokeDataFactory(const KisPaintOpSettingsSP settings, KisResourcesInterfaceSP resourcesInterface, 0114 std::enable_if_t<!has_create_interstroke_data_factory<T>::value> * = 0) 0115 { 0116 Q_UNUSED(settings); 0117 Q_UNUSED(resourcesInterface); 0118 // noop 0119 return 0; 0120 } 0121 0122 template< class, class = std::void_t<> > 0123 struct supports_extended_initilization : std::false_type { }; 0124 0125 template< class T > 0126 struct supports_extended_initilization<T, 0127 std::void_t<decltype(T(std::declval<QWidget*>(), 0128 std::declval<KisResourcesInterfaceSP>(), 0129 std::declval<KoCanvasResourcesInterfaceSP>()))> > : std::true_type { }; 0130 0131 template <typename T> 0132 KisPaintOpConfigWidget* createConfigWidget(QWidget* parent, KisResourcesInterfaceSP resourcesInterface, KoCanvasResourcesInterfaceSP canvasResourcesInterface, 0133 std::enable_if_t<supports_extended_initilization<T>::value> * = 0) 0134 { 0135 T* widget = new T(parent, resourcesInterface, canvasResourcesInterface); 0136 widget->setResourcesInterface(resourcesInterface); 0137 widget->setCanvasResourcesInterface(canvasResourcesInterface); 0138 return widget; 0139 } 0140 0141 template <typename T> 0142 KisPaintOpConfigWidget* createConfigWidget(QWidget* parent, KisResourcesInterfaceSP resourcesInterface, KoCanvasResourcesInterfaceSP canvasResourcesInterface, 0143 std::enable_if_t<!supports_extended_initilization<T>::value> * = 0) 0144 { 0145 // TODO: remove this constructor and pass everything into the constructor 0146 T* widget = new T(parent); 0147 widget->setResourcesInterface(resourcesInterface); 0148 widget->setCanvasResourcesInterface(canvasResourcesInterface); 0149 return widget; 0150 } 0151 0152 } 0153 0154 /** 0155 * Base template class for simple paintop factories 0156 */ 0157 template <class Op, class OpSettings, class OpSettingsWidget> class KisSimplePaintOpFactory : public KisPaintOpFactory 0158 { 0159 0160 public: 0161 0162 KisSimplePaintOpFactory(const QString& id, const QString& name, const QString& category, 0163 const QString& pixmap, const QString& model = QString(), 0164 const QStringList& whiteListedCompositeOps = QStringList(), int priority = 100, 0165 bool lodSizeThresholdSupported = true) 0166 : KisPaintOpFactory(whiteListedCompositeOps) 0167 , m_id(id) 0168 , m_name(name) 0169 , m_category(category) 0170 , m_pixmap(pixmap) 0171 , m_model(model) 0172 , m_lodSizeThresholdSupported(lodSizeThresholdSupported) 0173 { 0174 setPriority(priority); 0175 } 0176 0177 ~KisSimplePaintOpFactory() override { 0178 } 0179 0180 #ifdef HAVE_THREADED_TEXT_RENDERING_WORKAROUND 0181 void preinitializePaintOpIfNeeded(const KisPaintOpSettingsSP settings) override { 0182 detail::preinitializeOpStatically<Op>(settings); 0183 } 0184 #endif /* HAVE_THREADED_TEXT_RENDERING_WORKAROUND */ 0185 0186 KisPaintOp *createOp(const KisPaintOpSettingsSP settings, KisPainter *painter, KisNodeSP node, KisImageSP image) override { 0187 KisPaintOp * op = new Op(settings, painter, node, image); 0188 Q_CHECK_PTR(op); 0189 return op; 0190 } 0191 0192 QList<KoResourceLoadResult> prepareLinkedResources(const KisPaintOpSettingsSP settings, KisResourcesInterfaceSP resourcesInterface) override { 0193 return detail::prepareLinkedResources<Op>(settings, resourcesInterface); 0194 } 0195 0196 QList<KoResourceLoadResult> prepareEmbeddedResources(const KisPaintOpSettingsSP settings, KisResourcesInterfaceSP resourcesInterface) override { 0197 return detail::prepareEmbeddedResources<Op>(settings, resourcesInterface); 0198 } 0199 0200 KisInterstrokeDataFactory* createInterstrokeDataFactory(const KisPaintOpSettingsSP settings, KisResourcesInterfaceSP resourcesInterface) const override { 0201 return detail::createInterstrokeDataFactory<Op>(settings, resourcesInterface); 0202 } 0203 0204 KisPaintOpSettingsSP createSettings(KisResourcesInterfaceSP resourcesInterface) override { 0205 KisPaintOpSettingsSP settings = new OpSettings(resourcesInterface); 0206 settings->setModelName(m_model); 0207 return settings; 0208 } 0209 0210 KisPaintOpConfigWidget* createConfigWidget(QWidget* parent, KisResourcesInterfaceSP resourcesInterface, KoCanvasResourcesInterfaceSP canvasResourcesInterface) override { 0211 return detail::createConfigWidget<OpSettingsWidget>(parent, resourcesInterface, canvasResourcesInterface); 0212 } 0213 0214 QString id() const override { 0215 return m_id; 0216 } 0217 0218 QString name() const override { 0219 return m_name; 0220 } 0221 0222 QIcon icon() override { 0223 return KisIconUtils::loadIcon(id()); 0224 } 0225 0226 QString category() const override { 0227 return m_category; 0228 } 0229 0230 bool lodSizeThresholdSupported() const override { 0231 return m_lodSizeThresholdSupported; 0232 } 0233 0234 private: 0235 QString m_id; 0236 QString m_name; 0237 QString m_category; 0238 QString m_pixmap; 0239 QString m_model; 0240 bool m_lodSizeThresholdSupported; 0241 }; 0242 0243 #endif // KIS_SIMPLE_PAINTOP_FACTORY_H