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