File indexing completed on 2024-05-12 16:01:42

0001 /*
0002  *  SPDX-FileCopyrightText: 2004 Boudewijn Rempt <boud@valdyas.org>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 #ifndef KIS_SELECTION_MANAGER_
0007 #define KIS_SELECTION_MANAGER_
0008 
0009 #include <QObject>
0010 #include <QList>
0011 #include <QPointer>
0012 
0013 #include <kis_image.h>
0014 #include "KisView.h"
0015 #include <KisSelectionTags.h>
0016 
0017 #include <kritaui_export.h>
0018 
0019 class KisActionManager;
0020 class KisAction;
0021 class QAction;
0022 class KisDocument;
0023 
0024 class KisViewManager;
0025 class KisClipboard;
0026 class KisNodeCommandsAdapter;
0027 class KisView;
0028 
0029 class KisSelectionFilter;
0030 class KisSelectionDecoration;
0031 
0032 /**
0033  * The selection manager is responsible selections
0034  * and the clipboard.
0035  */
0036 class KRITAUI_EXPORT KisSelectionManager : public QObject
0037 {
0038 
0039     Q_OBJECT
0040     Q_PROPERTY(bool displaySelection READ displaySelection NOTIFY displaySelectionChanged);
0041     Q_PROPERTY(bool havePixelsSelected READ havePixelsSelected NOTIFY currentSelectionChanged);
0042 public:
0043 
0044     KisSelectionManager(KisViewManager * view);
0045     ~KisSelectionManager() override;
0046 
0047     void setup(KisActionManager* actionManager);
0048 
0049     void setView(QPointer<KisView>imageView);
0050 
0051 public:
0052     /**
0053      * This function return if the selection should be displayed
0054      */
0055     bool displaySelection();
0056 
0057     bool showSelectionAsMask() const;
0058 
0059 public Q_SLOTS:
0060 
0061     void updateGUI();
0062     void selectionChanged();
0063     void clipboardDataChanged();
0064 
0065     void cut();
0066     void copy();
0067 
0068     void cutSharp();
0069     void copySharp();
0070 
0071     void copyMerged();
0072     void paste();
0073     void pasteNew();
0074     void pasteAt();
0075     void pasteInto();
0076     void pasteAsReference();
0077     void pasteShapeStyle();
0078     void cutToNewLayer();
0079     void selectAll();
0080     void deselect();
0081     void invert();
0082     void clear();
0083     void fillForegroundColor();
0084     void fillBackgroundColor();
0085     void fillPattern();
0086     void fillForegroundColorOpacity();
0087     void fillBackgroundColorOpacity();
0088     void fillPatternOpacity();
0089     void reselect();
0090     void editSelection();
0091     void convertToVectorSelection();
0092     void convertToRasterSelection();
0093     void convertShapesToVectorSelection();
0094     void convertToShape();
0095     
0096     void copySelectionToNewLayer();
0097     void toggleDisplaySelection();
0098 
0099     void shapeSelectionChanged();
0100     void imageResizeToSelection();
0101     void paintSelectedShapes();
0102 
0103     void slotToggleSelectionDecoration();
0104 
0105     void slotStrokeSelection();
0106 
0107     void selectOpaqueOnNode(KisNodeSP node, SelectionAction action);
0108 
0109 Q_SIGNALS:
0110     void currentSelectionChanged();
0111     void signalUpdateGUI();
0112     void displaySelectionChanged();
0113     void strokeSelected();
0114 
0115 public:
0116     bool havePixelsSelected();
0117     bool havePixelsInClipboard();
0118     bool haveShapesSelected();
0119     bool haveShapesInClipboard();
0120 
0121     /// Checks if the current selection is editable and has some pixels selected in the pixel selection
0122     bool haveAnySelectionWithPixels();
0123     bool haveShapeSelectionWithShapes();
0124     bool haveRasterSelectionWithPixels();
0125 
0126 private:
0127     void fill(const KoColor& color, bool fillWithPattern, const QString& transactionText);
0128     void updateStatusBar();
0129 
0130     KisViewManager * m_view {0};
0131     KisDocument * m_doc {0};
0132     QPointer<KisView>m_imageView {0};
0133     KisClipboard * m_clipboard {0};
0134 
0135     KisNodeCommandsAdapter* m_adapter {0};
0136 
0137     KisAction *m_copy {0};
0138     KisAction *m_copyMerged {0};
0139     KisAction *m_cut {0};
0140     KisAction *m_paste {0};
0141     KisAction *m_pasteAt {0};
0142     KisAction *m_pasteInto {0};
0143     KisAction *m_pasteAsReference {0};
0144     KisAction *m_pasteNew {0};
0145     KisAction *m_pasteShapeStyle {0};
0146     KisAction *m_cutToNewLayer {0};
0147     KisAction *m_selectAll {0};
0148     KisAction *m_deselect {0};
0149     KisAction *m_clear {0};
0150     KisAction *m_reselect {0};
0151     KisAction *m_invert {0};
0152     KisAction *m_copyToNewLayer {0};
0153     KisAction *m_fillForegroundColor {0};
0154     KisAction *m_fillBackgroundColor {0};
0155     KisAction *m_fillPattern {0};
0156     KisAction *m_fillForegroundColorOpacity {0};
0157     KisAction *m_fillBackgroundColorOpacity {0};
0158     KisAction *m_fillPatternOpacity {0};
0159     KisAction *m_imageResizeToSelection {0};
0160     KisAction *m_strokeShapes {0};
0161     KisAction *m_toggleDisplaySelection {0};
0162     KisAction *m_toggleSelectionOverlayMode {0};
0163     KisAction *m_strokeSelected {0};
0164 
0165 
0166     QList<QAction*> m_pluginActions;
0167     QPointer<KisSelectionDecoration> m_selectionDecoration;
0168 
0169 };
0170 
0171 #endif // KIS_SELECTION_MANAGER_