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