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