Pencil2D Animation
Download Community News Docs Contribute
  • Overview
  • Articles
  • Code
  •  
  • Class List
  • Class Index
  • Class Hierarchy
  • Class Members
  • File List
Loading...
Searching...
No Matches
  • core_lib
  • src
  • managers
toolmanager.cpp
1/*
2
3Pencil2D - Traditional Animation Software
4Copyright (C) 2005-2007 Patrick Corrieri & Pascal Naidon
5Copyright (C) 2012-2020 Matthew Chiawen Chang
6
7This program is free software; you can redistribute it and/or
8modify it under the terms of the GNU General Public License
9as published by the Free Software Foundation; version 2 of the License.
10
11This program is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16*/
17#include "toolmanager.h"
18
19#include <cmath>
20#include <QDebug>
21
22#include "stroketool.h"
23#include "pentool.h"
24#include "penciltool.h"
25#include "brushtool.h"
26#include "buckettool.h"
27#include "erasertool.h"
28#include "eyedroppertool.h"
29#include "handtool.h"
30#include "movetool.h"
31#include "polylinetool.h"
32#include "selecttool.h"
33#include "smudgetool.h"
34#include "cameratool.h"
35#include "editor.h"
36
37
38ToolManager::ToolManager(Editor* editor) : BaseManager(editor, __FUNCTION__)
39{
40}
41
42ToolManager::~ToolManager()
43{
44 foreach(BaseTool* tool, mToolSetHash)
45 {
46 tool->saveSettings();
47 }
48}
49
50bool ToolManager::init()
51{
52 mToolSetHash.insert(PEN, new PenTool(this));
53 mToolSetHash.insert(PENCIL, new PencilTool(this));
54 mToolSetHash.insert(BRUSH, new BrushTool(this));
55 mToolSetHash.insert(ERASER, new EraserTool(this));
56 mToolSetHash.insert(BUCKET, new BucketTool(this));
57 mToolSetHash.insert(EYEDROPPER, new EyedropperTool(this));
58 mToolSetHash.insert(HAND, new HandTool(this));
59 mToolSetHash.insert(MOVE, new MoveTool(this));
60 mToolSetHash.insert(POLYLINE, new PolylineTool(this));
61 mToolSetHash.insert(SELECT, new SelectTool(this));
62 mToolSetHash.insert(SMUDGE, new SmudgeTool(this));
63 mToolSetHash.insert(CAMERA, new CameraTool(this));
64
65 foreach(BaseTool* pTool, mToolSetHash.values())
66 {
67 pTool->initialize(editor());
68 }
69
70 setDefaultTool();
71
72 return true;
73}
74
75Status ToolManager::load(Object*)
76{
77 setDefaultTool();
78 return Status::OK;
79}
80
81Status ToolManager::save(Object*)
82{
83 return Status::OK;
84}
85
86BaseTool* ToolManager::currentTool() const
87{
88 if (mTemporaryTool != nullptr)
89 {
90 return mTemporaryTool;
91 }
92 else if (mTabletEraserTool != nullptr)
93 {
94 return mTabletEraserTool;
95 }
96 return mCurrentTool;
97}
98
99StrokeTool* ToolManager::currentStrokeTool() const
100{
101 return dynamic_cast<StrokeTool*>(mCurrentTool);
102}
103
104bool ToolManager::isStrokeTool(const BaseTool *baseTool) const
105{
106 return dynamic_cast<const StrokeTool*>(baseTool) != nullptr;
107}
108
109bool ToolManager::isTransformTool(const BaseTool *baseTool) const
110{
111 return dynamic_cast<const TransformTool*>(baseTool) != nullptr;
112}
113
114TransformTool* ToolManager::currentTransformTool() const
115{
116 return dynamic_cast<TransformTool*>(mCurrentTool);
117}
118
119BaseTool* ToolManager::getTool(ToolType eToolType)
120{
121 return mToolSetHash[eToolType];
122}
123
124void ToolManager::setDefaultTool()
125{
126 // Set default tool
127 // (called by the main window init)
128 ToolType defaultToolType = PENCIL;
129
130 setCurrentTool(defaultToolType);
131 mTabletEraserTool = nullptr;
132 mTemporaryTool = nullptr;
133}
134
135void ToolManager::setCurrentTool(ToolType eToolType)
136{
137 // We're already using this tool
138 if (mCurrentTool == getTool(eToolType)) { return; }
139
140 if (mCurrentTool != nullptr)
141 {
142 mCurrentTool->leavingThisTool();
143 }
144
145 mCurrentTool = getTool(eToolType);
146 mCurrentTool->enteringThisTool();
147 if (mTemporaryTool == nullptr && mTabletEraserTool == nullptr)
148 {
149 emit toolChanged(eToolType);
150 }
151}
152
153bool ToolManager::leavingThisTool()
154{
155 return currentTool()->leavingThisTool();
156}
157
158void ToolManager::cleanupAllToolsData()
159{
160 foreach(BaseTool* tool, mToolSetHash)
161 {
162 tool->clearToolData();
163 }
164}
165
166void ToolManager::resetAllTools()
167{
168 // Reset can be useful to solve some pencil settings problems.
169 // Beta-testers should be recommended to reset before sending tool related issues.
170 // This can prevent from users to stop working on their project.
171
172 foreach(BaseTool* tool, mToolSetHash)
173 {
174 tool->resetSettings();
175 }
176 emit toolsReset();
177 qDebug("tools restored to default settings");
178}
179
180void ToolManager::tabletSwitchToEraser()
181{
182 mTabletEraserTool = getTool(ERASER);
183
184 // We should only notify a tool change if we're positive that the state has changed and it should only happen once
185 // if the user for some reason is using another temporary tool at the same time, that takes first priority
186 if (mTemporaryTool == nullptr)
187 {
188 emit toolChanged(ERASER);
189 }
190}
191
192void ToolManager::tabletRestorePrevTool()
193{
194 if (mTemporaryTool == nullptr && mTabletEraserTool != nullptr)
195 {
196 mTabletEraserTool = nullptr;
197 emit toolChanged(currentTool()->type());
198 }
199}
200
201bool ToolManager::setTemporaryTool(ToolType eToolType, QFlags<Qt::Key> keys, Qt::KeyboardModifiers modifiers)
202{
203 if (mTemporaryTool != nullptr) return false;
204 mTemporaryTriggerKeys = keys;
205 mTemporaryTriggerModifiers = modifiers;
206 mTemporaryTriggerMouseButtons = Qt::NoButton;
207 setTemporaryTool(eToolType);
208 return true;
209}
210
211bool ToolManager::setTemporaryTool(ToolType eToolType, Qt::MouseButtons buttons)
212{
213 if (mTemporaryTool != nullptr) return false;
214 mTemporaryTriggerKeys = {};
215 mTemporaryTriggerModifiers = Qt::NoModifier;
216 mTemporaryTriggerMouseButtons = buttons;
217 setTemporaryTool(eToolType);
218 return true;
219}
220
221bool ToolManager::tryClearTemporaryTool(Qt::Key key)
222{
223 Qt::KeyboardModifier modifier = Qt::NoModifier;
224 switch(key)
225 {
226 case Qt::Key_Control:
227 modifier = Qt::ControlModifier;
228 break;
229 case Qt::Key_Shift:
230 modifier = Qt::ShiftModifier;
231 break;
232 case Qt::Key_Alt:
233 modifier = Qt::AltModifier;
234 break;
235 case Qt::Key_Meta:
236 modifier = Qt::MetaModifier;
237 break;
238 default:
239 break;
240 }
241
242 if (mTemporaryTriggerKeys.testFlag(key) ||
243 mTemporaryTriggerModifiers.testFlag(modifier))
244 {
245 clearTemporaryTool();
246 return true;
247 }
248 return false;
249}
250
251bool ToolManager::tryClearTemporaryTool(Qt::MouseButton button)
252{
253 if (mTemporaryTriggerMouseButtons != Qt::NoButton && mTemporaryTriggerMouseButtons.testFlag(button))
254 {
255 clearTemporaryTool();
256 return true;
257 }
258 return false;
259}
260
261void ToolManager::setTemporaryTool(ToolType eToolType)
262{
263 mTemporaryTool = getTool(eToolType);
264 emit toolChanged(eToolType);
265}
266
267void ToolManager::clearTemporaryTool()
268{
269 if (mTemporaryTool) {
270 mTemporaryTool->leavingThisTool();
271 mTemporaryTool = nullptr;
272 }
273 mTemporaryTriggerKeys = {};
274 mTemporaryTriggerModifiers = Qt::NoModifier;
275 mTemporaryTriggerMouseButtons = Qt::NoButton;
276 emit toolChanged(currentTool()->type());
277}
BaseManager
Definition: basemanager.h:29
BaseTool
Definition: basetool.h:47
BaseTool::leavingThisTool
virtual bool leavingThisTool()
Will clean up active connections.
Definition: basetool.cpp:91
BaseTool::enteringThisTool
virtual bool enteringThisTool()
Setup active connections here that should only emit while tool is active leavingThisTool will handle ...
Definition: basetool.h:97
BrushTool
Definition: brushtool.h:27
BucketTool
Definition: buckettool.h:30
CameraTool
Definition: cameratool.h:45
Editor
Definition: editor.h:71
EraserTool
Definition: erasertool.h:24
EyedropperTool
Definition: eyedroppertool.h:27
HandTool
Definition: handtool.h:26
MoveTool
Definition: movetool.h:31
Object
Definition: object.h:42
PenTool
Definition: pentool.h:26
PencilTool
Definition: penciltool.h:27
PolylineTool
Definition: polylinetool.h:26
SelectTool
Definition: selecttool.h:33
SmudgeTool
Definition: smudgetool.h:24
Status
Definition: pencilerror.h:40
StrokeTool
Definition: stroketool.h:35
TransformTool
Definition: transformtool.h:23
QFlags
QFlags::testFlag
bool testFlag(Enum flag) const const
QHash::insert
QHash::iterator insert(const Key &key, const T &value)
QHash::values
QList< T > values() const const
Qt::Key
Key
Qt::KeyboardModifiers
typedef KeyboardModifiers
Qt::NoButton
NoButton
Generated on Wed Dec 24 2025 23:46:02 for Pencil2D by doxygen 1.9.6 based on revision 1be63043db1f7fc0545528fc3b6d5098a552755b