1// Aseprite
2// Copyright (C) 2020 Igara Studio S.A.
3// Copyright (C) 2001-2018 David Capello
4//
5// This program is distributed under the terms of
6// the End-User License Agreement for Aseprite.
7
8#ifndef APP_TOOLS_CONTROLLER_H_INCLUDED
9#define APP_TOOLS_CONTROLLER_H_INCLUDED
10#pragma once
11
12#include "app/tools/stroke.h"
13#include "app/tools/trace_policy.h"
14#include "gfx/point.h"
15
16#include <string>
17#include <vector>
18
19namespace app {
20 namespace tools {
21
22 class ToolLoop;
23
24 // This class controls user input.
25 class Controller {
26 public:
27 virtual ~Controller() { }
28
29 virtual bool canSnapToGrid() { return true; }
30 virtual bool isFreehand() { return false; }
31 virtual bool isOnePoint() { return false; }
32 virtual bool isTwoPoints() { return false; }
33
34 virtual void prepareController(ToolLoop* loop) { }
35
36 // Called when the user starts drawing and each time a new button is
37 // pressed. The controller could be sure that this method is called
38 // at least one time. The point is a position relative to sprite
39 // bounds.
40 virtual void pressButton(ToolLoop* loop, Stroke& stroke, const Stroke::Pt& pt) = 0;
41
42 // Called each time a mouse button is released.
43 virtual bool releaseButton(Stroke& stroke, const Stroke::Pt& pt) = 0;
44
45 // Called when the mouse is moved.
46 virtual void movement(ToolLoop* loop, Stroke& stroke, const Stroke::Pt& pt) = 0;
47
48 // The input and output strokes are relative to sprite coordinates.
49 virtual void getStrokeToInterwine(const Stroke& input, Stroke& output) = 0;
50 virtual void getStatusBarText(ToolLoop* loop, const Stroke& stroke, std::string& text) = 0;
51
52 // Last point used by this controller, useful to save the last
53 // point of a freehand tool.
54 virtual Stroke::Pt getLastPoint() const { return gfx::Point(0, 0); }
55
56 // Special trace policy that can change in the middle of the
57 // ToolLoop. This is for LineFreehandController which uses a
58 // TracePolicy::Last for TwoPoints controller (Line-like tool)
59 // and then a TracePolicy::Accumulate for freehand (Pencil tool).
60 virtual bool handleTracePolicy() const { return false; }
61 virtual TracePolicy getTracePolicy() const { return TracePolicy::Accumulate; }
62
63 // Returns the angle for a shape-like intertwiner (rectangles,
64 // ellipses, etc.).
65 virtual double getShapeAngle() const { return 0.0; }
66 };
67
68 } // namespace tools
69} // namespace app
70
71#endif // APP_TOOLS_CONTROLLER_H_INCLUDED
72