1 /*
2  * Xournal++
3  *
4  * Handles the XournalppCursor
5  *
6  * @author Xournal++ Team
7  * https://github.com/xournalpp/xournalpp
8  *
9  * @license GNU GPLv2 or later
10  */
11 
12 #pragma once
13 
14 #include <string>
15 #include <vector>
16 
17 #include <gtk/gtk.h>
18 
19 #include "control/tools/CursorSelectionType.h"
20 #include "gui/inputdevices/InputEvents.h"
21 
22 #include "XournalType.h"
23 
24 class Control;
25 
26 class XournalppCursor {
27 public:
28     XournalppCursor(Control* control);
29     virtual ~XournalppCursor();
30 
31     void setCursorBusy(bool busy);
32     void updateCursor();
33 
34     void setMouseSelectionType(CursorSelectionType selectionType);
35 
36     void setMouseDown(bool mouseDown);
37     void setInvisible(bool invisible);
38     void setInsidePage(bool insidePage);
39     void activateDrawDirCursor(bool enable, bool shift = false, bool ctrl = false);
40     void setInputDeviceClass(InputDeviceClass inputDevice);
41     void setRotationAngle(double angle);
42     void setMirror(bool mirror);
43 
44 private:
45     void setCursor(int id);
46 
47     GdkCursor* getPenCursor();
48 
49     GdkCursor* getEraserCursor();
50     GdkCursor* getHighlighterCursor();
51     GdkCursor* getResizeCursor(double deltaAngle);
52 
53     GdkCursor* createHighlighterOrPenCursor(int size, double alpha);
54     GdkCursor* createCustomDrawDirCursor(int size, bool shift, bool ctrl);
55 
56 private:
57     InputDeviceClass inputDevice = INPUT_DEVICE_MOUSE;
58 
59     Control* control = nullptr;
60     bool busy = false;
61     bool insidePage = false;
62     CursorSelectionType selectionType = CURSOR_SELECTION_NONE;
63 
64     bool mouseDown = false;
65     bool invisible = false;
66 
67     // One shot drawDir custom cursor -drawn instead of pen/stylus then cleared.
68     bool drawDirActive = false;
69     bool drawDirShift = false;
70     bool drawDirCtrl = false;
71 
72     // avoid re-assigning same cursor
73     guint currentCursor = 0;        // enum AVAILABLECURSORS
74     gulong currentCursorFlavour{};  // for different flavours of a cursor (i.e. drawdir, pen and highlighter custom
75                                     // cursors)
76 
77     // for resizing rotated/mirrored selections
78     double angle = 0;
79     bool mirror = false;
80 };
81