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

0001 /*
0002  *  kis_tool_crop.h - part of Krita
0003  *
0004  *  SPDX-FileCopyrightText: 2004 Boudewijn Rempt <boud@valdyas.org>
0005  *
0006  *  SPDX-License-Identifier: GPL-2.0-or-later
0007  */
0008 
0009 #ifndef KIS_TOOL_CROP_H_
0010 #define KIS_TOOL_CROP_H_
0011 
0012 #include <QPoint>
0013 #include <QPainterPath>
0014 
0015 #include <kis_icon.h>
0016 
0017 #include <kconfig.h>
0018 #include <kconfiggroup.h>
0019 
0020 #include <QKeySequence>
0021 #include <KoToolFactoryBase.h>
0022 #include "kis_tool.h"
0023 #include "flake/kis_node_shape.h"
0024 #include "ui_wdg_tool_crop.h"
0025 #include "kis_constrained_rect.h"
0026 #include "kis_action.h"
0027 #include "kistoolcropconfigwidget.h"
0028 
0029 class QRect;
0030 struct DecorationLine;
0031 
0032 
0033 /**
0034  * Crop tool
0035  */
0036 class KisToolCrop : public KisTool
0037 {
0038 
0039     Q_OBJECT
0040     Q_ENUMS(CropToolType);
0041     Q_PROPERTY(CropToolType cropType READ cropType WRITE setCropType NOTIFY cropTypeChanged);
0042     Q_PROPERTY(bool cropTypeSelectable READ cropTypeSelectable WRITE setCropTypeSelectable NOTIFY cropTypeSelectableChanged);
0043     Q_PROPERTY(int cropX READ cropX WRITE setCropX NOTIFY cropXChanged);
0044     Q_PROPERTY(int cropY READ cropY WRITE setCropY NOTIFY cropYChanged);
0045     Q_PROPERTY(int cropWidth READ cropWidth WRITE setCropWidth NOTIFY cropWidthChanged);
0046     Q_PROPERTY(bool lockWidth READ lockWidth WRITE setLockWidth NOTIFY lockWidthChanged);
0047     Q_PROPERTY(int cropHeight READ cropHeight WRITE setCropHeight NOTIFY cropHeightChanged);
0048     Q_PROPERTY(bool lockHeight READ lockHeight WRITE setLockHeight NOTIFY lockHeightChanged);
0049     Q_PROPERTY(double ratio READ ratio WRITE setRatio NOTIFY ratioChanged);
0050     Q_PROPERTY(bool lockRatio READ lockRatio WRITE setLockRatio NOTIFY lockRatioChanged);
0051     Q_PROPERTY(int decoration READ decoration WRITE setDecoration NOTIFY decorationChanged);
0052 
0053 public:
0054     enum CropToolType {
0055         ImageCropType,
0056         CanvasCropType,
0057         LayerCropType,
0058         FrameCropType
0059     };
0060 
0061     KisToolCrop(KoCanvasBase * canvas);
0062     ~KisToolCrop() override;
0063 
0064     QWidget* createOptionWidget() override;
0065 
0066     void beginPrimaryAction(KoPointerEvent *event) override;
0067     void continuePrimaryAction(KoPointerEvent *event) override;
0068     void endPrimaryAction(KoPointerEvent *event) override;
0069     void beginPrimaryDoubleClickAction(KoPointerEvent *event) override;
0070 
0071     void mouseMoveEvent(KoPointerEvent *e) override;
0072     void canvasResourceChanged(int key, const QVariant &res) override;
0073 
0074     void paint(QPainter &painter, const KoViewConverter &converter) override;
0075 
0076     QMenu *popupActionsMenu() override;
0077 
0078     CropToolType cropType() const;
0079     bool cropTypeSelectable() const;
0080     int cropX() const;
0081     int cropY() const;
0082     int cropWidth() const;
0083     bool lockWidth() const;
0084     int cropHeight() const;
0085     bool lockHeight() const;
0086     double ratio() const;
0087     bool lockRatio() const;
0088     int decoration() const;
0089     bool growCenter() const;
0090     bool allowGrow() const;
0091 
0092 Q_SIGNALS:
0093     void cropTypeSelectableChanged();
0094     void cropTypeChanged(int value);
0095     void decorationChanged(int value);
0096 
0097     void cropXChanged(int value);
0098     void cropYChanged(int value);
0099     void cropWidthChanged(int value);
0100     void cropHeightChanged(int value);
0101 
0102     void ratioChanged(double value);
0103 
0104     void lockWidthChanged(bool value);
0105     void lockHeightChanged(bool value);
0106     void lockRatioChanged(bool value);
0107 
0108     void canGrowChanged(bool value);
0109     void isCenteredChanged(bool value);
0110 
0111 public Q_SLOTS:
0112 
0113     void activate(const QSet<KoShape*> &shapes) override;
0114     void deactivate() override;
0115 
0116     void requestStrokeEnd() override;
0117     void requestStrokeCancellation() override;
0118     void requestUndoDuringStroke() override;
0119     void requestRedoDuringStroke() override;
0120 
0121     void crop();
0122 
0123     void showSizeOnCanvas();
0124 
0125     void setCropTypeLegacy(int cropType);
0126     void setCropType(CropToolType cropType);
0127     void setCropTypeSelectable(bool selectable);
0128     void setCropX(int x);
0129     void setCropY(int y);
0130     void setCropWidth(int x);
0131     void setLockWidth(bool lock);
0132     void setCropHeight(int y);
0133     void setLockHeight(bool lock);
0134     void setRatio(double ratio);
0135     void setLockRatio(bool lock);
0136     void setDecoration(int i);
0137     void setAllowGrow(bool g);
0138     void setGrowCenter(bool g);
0139 
0140     void slotRectChanged();
0141 
0142 private:
0143     void doCanvasUpdate(const QRect &updateRect);
0144 
0145 private:
0146     void cancelStroke();
0147     QRectF boundingRect();
0148     QRectF borderLineRect();
0149     QPainterPath handlesPath();
0150     void paintOutlineWithHandles(QPainter& gc);
0151     qint32 mouseOnHandle(const QPointF currentViewPoint);
0152     void setMoveResizeCursor(qint32 handle);
0153     QRectF lowerRightHandleRect(QRectF cropBorderRect);
0154     QRectF upperRightHandleRect(QRectF cropBorderRect);
0155     QRectF lowerLeftHandleRect(QRectF cropBorderRect);
0156     QRectF upperLeftHandleRect(QRectF cropBorderRect);
0157     QRectF lowerHandleRect(QRectF cropBorderRect);
0158     QRectF rightHandleRect(QRectF cropBorderRect);
0159     QRectF upperHandleRect(QRectF cropBorderRect);
0160     QRectF leftHandleRect(QRectF cropBorderRect);
0161     void drawDecorationLine(QPainter *p, DecorationLine *decorLine, QRectF rect);
0162 
0163     bool tryContinueLastCropAction();
0164 
0165 private:
0166     QPoint m_dragStart;
0167 
0168     qint32 m_handleSize {13};
0169     bool m_haveCropSelection {false};
0170     qint32 m_mouseOnHandleType {0};
0171 
0172     CropToolType m_cropType {ImageCropType};
0173     bool m_cropTypeSelectable {false};
0174 
0175     int m_decoration {1};
0176     bool m_resettingStroke {false};
0177     QRect m_lastCanvasUpdateRect;
0178 
0179     KConfigGroup configGroup;
0180     KisToolCropConfigWidget* optionsWidget {nullptr};
0181 
0182     QScopedPointer<QMenu> m_contextMenu;
0183     KisAction* applyCrop {nullptr};
0184     KisAction* centerToggleOption {nullptr};
0185     KisAction* growToggleOption {nullptr};
0186     KisAction* lockWidthToggleOption {nullptr};
0187     KisAction* lockHeightToggleOption {nullptr};
0188     KisAction* lockRatioToggleOption {nullptr};
0189 
0190     enum handleType {
0191         None = 0,
0192         UpperLeft = 1,
0193         UpperRight = 2,
0194         LowerLeft = 3,
0195         LowerRight = 4,
0196         Upper = 5,
0197         Lower = 6,
0198         Left = 7,
0199         Right = 8,
0200         Inside = 9
0201     };
0202     QList<DecorationLine *> m_decorations;
0203 
0204     KisConstrainedRect m_finalRect;
0205     QRect m_initialDragRect;
0206     QPointF m_dragOffsetDoc;
0207 };
0208 
0209 class KisToolCropFactory : public KoToolFactoryBase
0210 {
0211 
0212 public:
0213     KisToolCropFactory()
0214             : KoToolFactoryBase("KisToolCrop") {
0215         setToolTip(i18n("Crop Tool"));
0216         setSection(ToolBoxSection::Transform);
0217         setActivationShapeId(KRITA_TOOL_ACTIVATION_ID);
0218         setPriority(11);
0219         setIconName(koIconNameCStr("tool_crop"));
0220         setShortcut(QKeySequence("C"));
0221     }
0222 
0223     ~KisToolCropFactory() override {}
0224 
0225     KoToolBase * createTool(KoCanvasBase *canvas) override {
0226         return new KisToolCrop(canvas);
0227     }
0228 
0229 };
0230 
0231 
0232 
0233 #endif // KIS_TOOL_CROP_H_
0234