File indexing completed on 2024-06-16 04:17:42

0001 /*
0002  *  SPDX-FileCopyrightText: 1999 Matthias Elter <elter@kde.org>
0003  *  SPDX-FileCopyrightText: 2002 Patrick Julien <freak@codepimps.org>
0004  *  SPDX-FileCopyrightText: 2010 Lukáš Tvrdý <lukast.dev@gmail.com>
0005  *  SPDX-FileCopyrightText: 2018 Emmet & Eoin O'Neill <emmetoneill.pdx@gmail.com>
0006  *
0007  *  SPDX-License-Identifier: GPL-2.0-or-later
0008  */
0009 
0010 #ifndef KIS_TOOL_COLOR_SAMPLER_H_
0011 #define KIS_TOOL_COLOR_SAMPLER_H_
0012 
0013 #include <QTimer>
0014 #include "KoToolFactoryBase.h"
0015 #include "ui_wdgcolorsampler.h"
0016 #include "kis_tool.h"
0017 #include <kis_icon.h>
0018 #include <KoColorSet.h>
0019 #include <QPainter>
0020 #include <KisAsyncColorSamplerHelper.h>
0021 
0022 class KisTagFilterResourceProxyModel;
0023 
0024 namespace KisToolUtils {
0025 struct ColorSamplerConfig;
0026 }
0027 
0028 class ColorSamplerOptionsWidget : public QWidget, public Ui::ColorSamplerOptionsWidget
0029 {
0030     Q_OBJECT
0031 
0032 public:
0033     ColorSamplerOptionsWidget(QWidget *parent) : QWidget(parent) {
0034         setupUi(this);
0035     }
0036 };
0037 
0038 class KisToolColorSampler : public KisTool
0039 {
0040     Q_OBJECT
0041 
0042 public:
0043     KisToolColorSampler(KoCanvasBase *canvas);
0044     ~KisToolColorSampler() override;
0045 
0046 public:
0047     struct Configuration {
0048         Configuration();
0049 
0050         bool toForegroundColor;
0051         bool updateColor;
0052         bool addPalette;
0053         bool normaliseValues;
0054         bool sampleMerged;
0055         int radius;
0056         int blend;
0057 
0058         void save() const;
0059         void load();
0060     };
0061 
0062 public:
0063     QWidget* createOptionWidget() override;
0064 
0065     void beginPrimaryAction(KoPointerEvent *event) override;
0066     void continuePrimaryAction(KoPointerEvent *event) override;
0067     void mouseMoveEvent(KoPointerEvent *event) override;
0068     void endPrimaryAction(KoPointerEvent *event) override;
0069     void requestUpdateOutline(const QPointF &outlineDocPoint, const KoPointerEvent *event);
0070 
0071     void activatePrimaryAction() override;
0072     void deactivatePrimaryAction() override;
0073 
0074     void paint(QPainter &gc, const KoViewConverter &converter) override;
0075 
0076 protected:
0077     void activate(const QSet<KoShape*> &) override;
0078     void deactivate() override;
0079 
0080 public Q_SLOTS:
0081     void slotSetUpdateColor(bool);
0082     void slotSetNormaliseValues(bool);
0083     void slotSetAddPalette(bool);
0084     void slotChangeRadius(int);
0085     void slotChangeBlend(int);
0086     void slotSetColorSource(int value);
0087 
0088 private Q_SLOTS:
0089     void slotChangePalette(int);
0090 
0091     void slotColorPickerRequestedCursor(const QCursor &cursor);
0092     void slotColorPickerRequestedCursorReset();
0093     void slotColorPickerRequestedOutlineUpdate();
0094     void slotColorPickerSelectedColor(const KoColor &color);
0095     void slotColorPickerSelectionFinished(const KoColor &color);
0096 
0097 private:
0098     void displaySampledColor(const KoColor &color);
0099     void updateOptionWidget();
0100 
0101     // Configuration
0102     QScopedPointer<KisToolUtils::ColorSamplerConfig> m_config;
0103 
0104     bool m_isActivated {false};
0105     QPointF m_outlineDocPoint;
0106 
0107     QRectF m_oldColorPreviewUpdateRect;
0108 
0109     KoColor m_sampledColor;
0110 
0111     KisAsyncColorSamplerHelper m_helper;
0112 
0113     ColorSamplerOptionsWidget *m_optionsWidget {0};
0114     KisTagFilterResourceProxyModel *m_tagFilterProxyModel {0};
0115 };
0116 
0117 class KisToolColorSamplerFactory : public KoToolFactoryBase
0118 {
0119 public:
0120     KisToolColorSamplerFactory()
0121             : KoToolFactoryBase("KritaSelected/KisToolColorSampler") {
0122         setToolTip(i18n("Color Sampler Tool"));
0123         setSection(ToolBoxSection::Fill);
0124         setPriority(2);
0125         setIconName(koIconNameCStr("krita_tool_color_sampler"));
0126         setShortcut(QKeySequence(Qt::Key_P));
0127         setActivationShapeId(KRITA_TOOL_ACTIVATION_ID);
0128     }
0129 
0130     ~KisToolColorSamplerFactory() override {}
0131 
0132     KoToolBase *createTool(KoCanvasBase *canvas) override {
0133         return new KisToolColorSampler(canvas);
0134     }
0135 };
0136 
0137 #endif // KIS_TOOL_COLOR_SAMPLER_H_