1 // SPDX-License-Identifier: GPL-3.0-or-later
2 // SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors
3 
4 #include "capturetoolbutton.h"
5 #include "src/tools/capturetool.h"
6 #include "src/tools/toolfactory.h"
7 #include "src/utils/colorutils.h"
8 #include "src/utils/confighandler.h"
9 #include "src/utils/globalvalues.h"
10 #include <QApplication>
11 #include <QIcon>
12 #include <QMouseEvent>
13 #include <QPropertyAnimation>
14 #include <QToolTip>
15 
16 // Button represents a single button of the capture widget, it can enable
17 // multiple functionality.
18 
CaptureToolButton(const ButtonType t,QWidget * parent)19 CaptureToolButton::CaptureToolButton(const ButtonType t, QWidget* parent)
20   : CaptureButton(parent)
21   , m_buttonType(t)
22   , m_tool(nullptr)
23   , m_emergeAnimation(nullptr)
24 {
25     initButton();
26     if (t == TYPE_SELECTIONINDICATOR) {
27         QFont f = this->font();
28         setFont(QFont(f.family(), 7, QFont::Bold));
29     } else {
30         updateIcon();
31     }
32 }
33 
~CaptureToolButton()34 CaptureToolButton::~CaptureToolButton()
35 {
36     if (m_tool) {
37         delete m_tool;
38         m_tool = nullptr;
39     }
40     if (m_emergeAnimation) {
41         delete m_emergeAnimation;
42         m_emergeAnimation = nullptr;
43     }
44 }
45 
initButton()46 void CaptureToolButton::initButton()
47 {
48     if (m_tool) {
49         delete m_tool;
50         m_tool = nullptr;
51     }
52     m_tool = ToolFactory().CreateTool(m_buttonType, this);
53 
54     resize(GlobalValues::buttonBaseSize(), GlobalValues::buttonBaseSize());
55     setMask(QRegion(QRect(-1,
56                           -1,
57                           GlobalValues::buttonBaseSize() + 2,
58                           GlobalValues::buttonBaseSize() + 2),
59                     QRegion::Ellipse));
60 
61     setToolTip(m_tool->description());
62 
63     m_emergeAnimation = new QPropertyAnimation(this, "size", this);
64     m_emergeAnimation->setEasingCurve(QEasingCurve::InOutQuad);
65     m_emergeAnimation->setDuration(80);
66     m_emergeAnimation->setStartValue(QSize(0, 0));
67     m_emergeAnimation->setEndValue(
68       QSize(GlobalValues::buttonBaseSize(), GlobalValues::buttonBaseSize()));
69 }
70 
updateIcon()71 void CaptureToolButton::updateIcon()
72 {
73     setIcon(icon());
74     setIconSize(size() * 0.6);
75 }
76 
77 QVector<CaptureToolButton::ButtonType>
getIterableButtonTypes()78 CaptureToolButton::getIterableButtonTypes()
79 {
80     return iterableButtonTypes;
81 }
82 
83 // get icon returns the icon for the type of button
icon() const84 QIcon CaptureToolButton::icon() const
85 {
86     return m_tool->icon(m_mainColor, true);
87 }
88 
mousePressEvent(QMouseEvent * e)89 void CaptureToolButton::mousePressEvent(QMouseEvent* e)
90 {
91     if (e->button() == Qt::LeftButton) {
92         emit pressedButton(this);
93         emit pressed();
94     }
95 }
96 
animatedShow()97 void CaptureToolButton::animatedShow()
98 {
99     if (!isVisible()) {
100         show();
101         m_emergeAnimation->start();
102         connect(
103           m_emergeAnimation, &QPropertyAnimation::finished, this, []() {});
104     }
105 }
106 
tool() const107 CaptureTool* CaptureToolButton::tool() const
108 {
109     return m_tool;
110 }
111 
setColor(const QColor & c)112 void CaptureToolButton::setColor(const QColor& c)
113 {
114     m_mainColor = c;
115     CaptureButton::setColor(c);
116     updateIcon();
117 }
118 
119 QColor CaptureToolButton::m_mainColor = ConfigHandler().uiMainColorValue();
120 
121 static std::map<CaptureToolButton::ButtonType, int> buttonTypeOrder
122 {
123     { CaptureToolButton::TYPE_PENCIL, 0 },
124       { CaptureToolButton::TYPE_DRAWER, 1 },
125       { CaptureToolButton::TYPE_ARROW, 2 },
126       { CaptureToolButton::TYPE_SELECTION, 3 },
127       { CaptureToolButton::TYPE_RECTANGLE, 4 },
128       { CaptureToolButton::TYPE_CIRCLE, 5 },
129       { CaptureToolButton::TYPE_MARKER, 6 },
130       { CaptureToolButton::TYPE_TEXT, 7 },
131       { CaptureToolButton::TYPE_PIXELATE, 8 },
132       { CaptureToolButton::TYPE_CIRCLECOUNT, 9 },
133       { CaptureToolButton::TYPE_SELECTIONINDICATOR, 10 },
134       { CaptureToolButton::TYPE_MOVESELECTION, 11 },
135       { CaptureToolButton::TYPE_UNDO, 12 },
136       { CaptureToolButton::TYPE_REDO, 13 },
137       { CaptureToolButton::TYPE_COPY, 14 },
138       { CaptureToolButton::TYPE_SAVE, 15 },
139       { CaptureToolButton::TYPE_IMAGEUPLOADER, 16 },
140 #if not defined(Q_OS_MACOS)
141       { CaptureToolButton::TYPE_OPEN_APP, 17 },
142       { CaptureToolButton::TYPE_EXIT, 18 }, { CaptureToolButton::TYPE_PIN, 19 },
143 #else
144       { CaptureToolButton::TYPE_EXIT, 17 }, { CaptureToolButton::TYPE_PIN, 18 },
145 #endif
146 
147       { CaptureToolButton::TYPE_SIZEINCREASE, 20 },
148       { CaptureToolButton::TYPE_SIZEDECREASE, 21 },
149 };
150 
getPriorityByButton(CaptureToolButton::ButtonType b)151 int CaptureToolButton::getPriorityByButton(CaptureToolButton::ButtonType b)
152 {
153     auto it = buttonTypeOrder.find(b);
154     return it == buttonTypeOrder.cend() ? (int)buttonTypeOrder.size()
155                                         : it->second;
156 }
157 
158 QVector<CaptureToolButton::ButtonType>
159   CaptureToolButton::iterableButtonTypes = {
160       CaptureToolButton::TYPE_PENCIL,
161       CaptureToolButton::TYPE_DRAWER,
162       CaptureToolButton::TYPE_ARROW,
163       CaptureToolButton::TYPE_SELECTION,
164       CaptureToolButton::TYPE_RECTANGLE,
165       CaptureToolButton::TYPE_CIRCLE,
166       CaptureToolButton::TYPE_MARKER,
167       CaptureToolButton::TYPE_TEXT,
168       CaptureToolButton::TYPE_PIXELATE,
169       CaptureToolButton::TYPE_SELECTIONINDICATOR,
170       CaptureToolButton::TYPE_MOVESELECTION,
171       CaptureToolButton::TYPE_UNDO,
172       CaptureToolButton::TYPE_REDO,
173       CaptureToolButton::TYPE_COPY,
174       CaptureToolButton::TYPE_SAVE,
175       CaptureToolButton::TYPE_EXIT,
176       CaptureToolButton::TYPE_IMAGEUPLOADER,
177 #if not defined(Q_OS_MACOS)
178       CaptureToolButton::TYPE_OPEN_APP,
179 #endif
180       CaptureToolButton::TYPE_PIN,
181       CaptureToolButton::TYPE_CIRCLECOUNT,
182       CaptureToolButton::TYPE_SIZEINCREASE,
183       CaptureToolButton::TYPE_SIZEDECREASE,
184   };
185