1// Aseprite
2// Copyright (C) 2021-2022 Igara Studio S.A.
3// Copyright (C) 2001-2017 David Capello
4//
5// This program is distributed under the terms of
6// the End-User License Agreement for Aseprite.
7
8#ifndef APP_UI_EDITOR_MOVING_CEL_STATE_H_INCLUDED
9#define APP_UI_EDITOR_MOVING_CEL_STATE_H_INCLUDED
10#pragma once
11
12#include "app/ui/editor/standby_state.h"
13
14#include "app/context_access.h"
15#include "app/ui/editor/delayed_mouse_move.h"
16#include "app/ui/editor/handle_type.h"
17#include "doc/cel_list.h"
18
19#include <vector>
20
21namespace doc {
22 class Cel;
23}
24
25namespace app {
26 class Editor;
27
28 class MovingCelCollect {
29 public:
30 MovingCelCollect(Editor* editor, Layer* layer);
31
32 bool empty() const { return m_celList.empty(); }
33
34 Cel* mainCel() const { return m_mainCel; }
35 const CelList& celList() const { return m_celList; }
36
37 private:
38 Cel* m_mainCel;
39 CelList m_celList;
40 };
41
42 class MovingCelState : public StandbyState
43 , DelayedMouseMoveDelegate {
44 public:
45 MovingCelState(Editor* editor,
46 const ui::MouseMessage* msg,
47 const HandleType handle,
48 const MovingCelCollect& collect);
49
50 virtual void onBeforePopState(Editor* editor) override;
51 virtual bool onMouseUp(Editor* editor, ui::MouseMessage* msg) override;
52 virtual bool onMouseMove(Editor* editor, ui::MouseMessage* msg) override;
53 virtual bool onKeyDown(Editor* editor, ui::KeyMessage* msg) override;
54 virtual bool onUpdateStatusBar(Editor* editor) override;
55
56 virtual bool requireBrushPreview() override { return false; }
57
58 private:
59 gfx::Point intCelOffset() const;
60 gfx::RectF calcFullBounds() const;
61 bool restoreCelStartPosition() const;
62 // ContextObserver
63 void onBeforeCommandExecution(CommandExecutionEvent& ev);
64
65 // DelayedMouseMoveDelegate impl
66 void onCommitMouseMove(Editor* editor,
67 const gfx::PointF& spritePos) override;
68
69 ContextReader m_reader;
70 DelayedMouseMove m_delayedMouseMove;
71 Cel* m_cel;
72 CelList m_celList;
73 std::vector<gfx::RectF> m_celStarts;
74 gfx::PointF m_cursorStart;
75 gfx::PointF m_celOffset;
76 gfx::SizeF m_celMainSize;
77 gfx::SizeF m_celScale;
78 bool m_maskVisible;
79 bool m_hasReference = false;
80 bool m_moved = false;
81 bool m_scaled = false;
82 HandleType m_handle;
83 Editor* m_editor;
84
85 obs::scoped_connection m_ctxConn;
86 };
87
88} // namespace app
89
90#endif // APP_UI_EDITOR_MOVING_CEL_STATE_H_INCLUDED
91