1 // Copyright (c) 2007, Rodrigo Braz Monteiro
2 // All rights reserved.
3 //
4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are met:
6 //
7 //   * Redistributions of source code must retain the above copyright notice,
8 //     this list of conditions and the following disclaimer.
9 //   * Redistributions in binary form must reproduce the above copyright notice,
10 //     this list of conditions and the following disclaimer in the documentation
11 //     and/or other materials provided with the distribution.
12 //   * Neither the name of the Aegisub Group nor the names of its contributors
13 //     may be used to endorse or promote products derived from this software
14 //     without specific prior written permission.
15 //
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 // POSSIBILITY OF SUCH DAMAGE.
27 //
28 // Aegisub Project http://www.aegisub.org/
29 
30 /// @file visual_feature->h
31 /// @see visual_feature->cpp
32 /// @ingroup visual_ts
33 ///
34 
35 #pragma once
36 
37 #include "vector2d.h"
38 
39 #include <boost/intrusive/list_hook.hpp>
40 
41 class OpenGLWrapper;
42 class AssDialogue;
43 
44 /// VisualDraggableFeature display types
45 enum DraggableFeatureType {
46 	DRAG_NONE,
47 	DRAG_BIG_SQUARE,
48 	DRAG_BIG_CIRCLE,
49 	DRAG_BIG_TRIANGLE,
50 	DRAG_SMALL_SQUARE,
51 	DRAG_SMALL_CIRCLE
52 };
53 
54 /// @class VisualDraggableFeature
55 /// @brief Onscreen control used by many visual tools
56 ///
57 /// By itself this class doesn't do much. It mostly just draws itself at a
58 /// specified position and performs hit-testing.
59 class VisualDraggableFeature : public boost::intrusive::make_list_base_hook<boost::intrusive::link_mode<boost::intrusive::auto_unlink>>::type {
60 	Vector2D start; ///< position before the last drag operation began
61 
62 public:
63 	DraggableFeatureType type = DRAG_NONE; ///< Shape of feature
64 	Vector2D pos;                          ///< Position of this feature
65 	int layer = 0;                         ///< Layer; Higher = above
66 	AssDialogue* line = nullptr;           ///< The dialogue line this feature is for; may be nullptr
67 
68 	/// @brief Is the given point over this feature?
69 	/// @param mouse_pos Position of the mouse
70 	bool IsMouseOver(Vector2D mouse_pos) const;
71 
72 	/// @brief Draw this feature
73 	/// @param gl OpenGLWrapper to use
74 	void Draw(OpenGLWrapper const& gl) const;
75 
76 	/// Start a drag
77 	void StartDrag();
78 
79 	/// Update the position of the feature during a drag
80 	/// @param d New position of the feature
81 	/// @param single_axis Only apply the larger of the two changes to the position
82 	void UpdateDrag(Vector2D d, bool single_axis);
83 
84 	/// Has this feature actually moved since a drag was last started?
85 	bool HasMoved() const;
86 };
87