File indexing completed on 2024-06-23 04:28:08

0001 /*
0002  *  SPDX-FileCopyrightText: 2011 Lukáš Tvrdý <lukast.dev@gmail.com>
0003  *  SPDX-FileCopyrightText: 2011 Dmitry Kazakov <dimula73@gmail.com>
0004  *
0005  *  SPDX-License-Identifier: GPL-2.0-or-later
0006  */
0007 
0008 #ifndef __KIS_TOOL_MULTIHAND_H
0009 #define __KIS_TOOL_MULTIHAND_H
0010 
0011 #include "kis_tool_brush.h"
0012 #include <kis_icon.h>
0013 #include "kis_tool_multihand_config.h"
0014 
0015 class QPushButton;
0016 class QCheckBox;
0017 class QComboBox;
0018 class QStackedWidget;
0019 class KisSliderSpinBox;
0020 class KisToolMultihandHelper;
0021 
0022 class KisToolMultihand : public KisToolBrush
0023 {
0024     Q_OBJECT
0025 public:
0026     KisToolMultihand(KoCanvasBase *canvas);
0027     ~KisToolMultihand() override;
0028     void beginPrimaryAction(KoPointerEvent *event) override;
0029     void continuePrimaryAction(KoPointerEvent *event) override;
0030     void endPrimaryAction(KoPointerEvent *event) override;
0031 
0032     void beginAlternateAction(KoPointerEvent *event, AlternateAction action) override;
0033     void continueAlternateAction(KoPointerEvent *event, AlternateAction action) override;
0034     void endAlternateAction(KoPointerEvent *event, AlternateAction action) override;
0035 
0036     void mouseMoveEvent(KoPointerEvent* event) override;
0037 
0038 
0039 protected:
0040     void paint(QPainter& gc, const KoViewConverter &converter) override;
0041     
0042     QWidget* createOptionWidget() override;
0043 
0044 private:
0045     void initTransformations();
0046     void finishAxesSetup();
0047     void updateCanvas();
0048     QVector<QPoint> intervalLocations();
0049 
0050 private Q_SLOTS:
0051     void activateAxesPointModeSetup();
0052     void resetAxes();
0053     void slotSetHandsCount(int count);
0054     void slotSetAxesAngle(qreal angle);
0055     void slotSetTransformMode(int qcomboboxIndex);
0056     void slotSetAxesVisible(bool vis);
0057     void slotSetMirrorVertically(bool mirror);
0058     void slotSetMirrorHorizontally(bool mirror);
0059     void slotSetTranslateRadius(int radius);
0060     void slotAddSubbrushesMode(bool checked);
0061     void slotRemoveAllSubbrushes();
0062     void slotSetIntervals();
0063     void slotSetKeepAspect();
0064 
0065 private:
0066     KisToolMultihandHelper *m_helper;
0067 
0068     enum enumTransformModes:int { SYMMETRY=0, MIRROR, TRANSLATE, SNOWFLAKE, COPYTRANSLATE, COPYTRANSLATEINTERVALS };
0069     enumTransformModes m_transformMode;
0070     QPointF m_axesPoint;
0071     qreal m_angle;
0072     int m_handsCount;
0073     bool m_mirrorVertically;
0074     bool m_mirrorHorizontally;
0075     bool m_showAxes;
0076     int m_translateRadius;
0077 
0078     bool m_setupAxesFlag;
0079     bool m_addSubbrushesMode;
0080     QPointF m_lastToolPos;
0081     QVector<QPointF> m_subbrOriginalLocations;
0082 
0083     int m_intervalX;
0084     int m_intervalY;
0085 
0086     KisToolMultiHandConfigWidget* customUI;
0087 };
0088 
0089 
0090 class KisToolMultiBrushFactory : public KisToolBrushFactory
0091 {
0092 
0093 public:
0094     KisToolMultiBrushFactory()
0095         : KisToolBrushFactory("KritaShape/KisToolMultiBrush") {
0096 
0097         setToolTip(i18n("Multibrush Tool"));
0098 
0099         // Temporarily
0100         setSection(ToolBoxSection::Shape);
0101         setIconName(koIconNameCStr("krita_tool_multihand"));
0102         setShortcut(QKeySequence(Qt::Key_Q));
0103         setPriority(11);
0104         setActivationShapeId(KRITA_TOOL_ACTIVATION_ID);
0105     }
0106 
0107     ~KisToolMultiBrushFactory() override {}
0108 
0109     KoToolBase * createTool(KoCanvasBase *canvas) override {
0110         return new KisToolMultihand(canvas);
0111     }
0112 
0113 };
0114 
0115 #endif /* __KIS_TOOL_MULTIHAND_H */