HoverRace  2.0
UiViewModel.h
Go to the documentation of this file.
1 
2 // UiViewModel.h
3 //
4 // Copyright (c) 2013-2015 Michael Imamura.
5 //
6 // Licensed under GrokkSoft HoverRace SourceCode License v1.0(the "License");
7 // you may not use this file except in compliance with the License.
8 //
9 // A copy of the license should have been attached to the package from which
10 // you have taken this file. If you can not find the license you can not use
11 // this file.
12 //
13 //
14 // The author makes no representations about the suitability of
15 // this software for any purpose. It is provided "as is" "AS IS",
16 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
17 // implied.
18 //
19 // See the License for the specific language governing permissions
20 // and limitations under the License.
21 
22 #pragma once
23 
24 #include "../Control/Nav.h"
25 #include "../Util/MR_Types.h"
26 #include "../Vec.h"
27 #include "UiLayoutFlags.h"
28 #include "ViewModel.h"
29 
30 #if defined(_WIN32) && defined(HR_ENGINE_SHARED)
31 # ifdef MR_ENGINE
32 # define MR_DllDeclare __declspec( dllexport )
33 # else
34 # define MR_DllDeclare __declspec( dllimport )
35 # endif
36 #else
37 # define MR_DllDeclare
38 #endif
39 
40 namespace HoverRace {
41  namespace Control {
42  namespace Mouse {
43  struct Click;
44  struct Scroll;
45  }
46  }
47 }
48 
49 namespace HoverRace {
50 namespace Display {
51 
57 {
58  using SUPER = ViewModel;
59 
60 public:
61  struct Props
62  {
63  enum
64  {
65  POS,
69  };
70  };
71 
77  enum class Alignment
78  {
79  NW,
80  N,
81  NE,
82  E,
83  SE,
84  S,
85  SW,
86  W,
87  CENTER,
88  };
89 
90 public:
91  UiViewModel(uiLayoutFlags_t layoutFlags = 0) :
92  SUPER(), pos(0, 0), translation(0, 0), alignment(Alignment::NW),
93  layoutFlags(layoutFlags), focused(false) { }
94  virtual ~UiViewModel() { }
95 
96 public:
97  virtual bool OnMouseMoved(const Vec2&) { return false; }
98  virtual bool OnMousePressed(const Control::Mouse::Click&) { return false; }
99  virtual bool OnMouseReleased(const Control::Mouse::Click&) { return false; }
100  virtual bool OnMouseScrolled(const Control::Mouse::Scroll&) { return false; }
101  virtual bool OnAction() { return false; }
102  virtual bool OnNavigate(const Control::Nav&) { return false; }
103 
104 public:
110  const Vec2 &GetPos() const { return pos; }
111  void SetPos(const Vec2 &pos);
113  void SetPos(double x, double y) { SetPos(Vec2(x, y)); }
114 
119  const Vec2 &GetTranslation() const { return translation; }
120  void SetTranslation(const Vec2 &translation);
122  void SetTranslation(double x, double y) { SetTranslation(Vec2(x, y)); }
123 
129  Alignment GetAlignment() const { return alignment; }
130  void SetAlignment(Alignment alignment);
131 
132  Vec2 GetAlignedPos(const Vec2 &pos, double w, double h) const;
133 
140  Vec2 GetAlignedPos(double w, double h) const
141  {
142  return GetAlignedPos(pos + translation, w, h);
143  }
144 
149  uiLayoutFlags_t GetLayoutFlags() const { return layoutFlags; }
150 
151  // Convenience functions for querying layout flags.
152  uiLayoutFlags_t IsLayoutUnscaled() const { return layoutFlags & UiLayoutFlags::UNSCALED; }
153  uiLayoutFlags_t IsLayoutFloating() const { return layoutFlags & UiLayoutFlags::FLOATING; }
154 
155 # ifdef _DEBUG
156 
160  std::string GetId() const { return id; }
161 
167  void SetId(std::string id) { this->id = id; }
168 # endif
169 
174  bool IsFocused() const { return focused; }
175 
188  virtual bool TryFocus(const Control::Nav &nav = Control::Nav::NEUTRAL)
189  {
190  HR_UNUSED(nav);
191  return false;
192  }
193 
200  virtual void DropFocus() { SetFocused(false); }
201 
202 protected:
203  void SetFocused(bool focused);
204 
205 public:
206  using focusRequestedSignal_t =
207  boost::signals2::signal<void(UiViewModel&)>;
208  focusRequestedSignal_t &GetFocusRequestedSignal() { return focusRequestedSignal; }
209 
210  void RequestFocus();
211 
212 public:
214  boost::signals2::signal<void(UiViewModel&, const Control::Nav&)>;
215  focusRelinquishedSignal_t &GetFocusRelinquishedSignal() { return focusRelinquishedSignal; }
216 
217 protected:
218  void RelinquishFocus(const Control::Nav &nav);
219 
220 private:
225 # ifdef _DEBUG
226  std::string id;
227 # endif
228  bool focused;
231 };
232 
233 } // namespace Display
234 } // namespace HoverRace
235 
236 #undef MR_DllDeclare
void SetPos(double x, double y)
Convenience function for SetPos(const Vec2&).
Definition: UiViewModel.h:113
Base class for renderable components.
Definition: ViewModel.h:55
focusRelinquishedSignal_t & GetFocusRelinquishedSignal()
Definition: UiViewModel.h:215
virtual void DropFocus()
Force this widget to give up focus, if it is currently focused.
Definition: UiViewModel.h:200
virtual bool OnMouseMoved(const Vec2 &)
Definition: UiViewModel.h:97
uiLayoutFlags_t IsLayoutFloating() const
Definition: UiViewModel.h:153
uiLayoutFlags_t GetLayoutFlags() const
Retrieve the layout flags.
Definition: UiViewModel.h:149
Base class for UI (2D) components.
Definition: UiViewModel.h:56
#define MR_DllDeclare
Definition: UiViewModel.h:37
UiViewModel(uiLayoutFlags_t layoutFlags=0)
Definition: UiViewModel.h:91
Upper-left quadrant.
Alignment
Imagine the component pinned to the container with a thumbtack.
Definition: UiViewModel.h:77
virtual bool OnAction()
Definition: UiViewModel.h:101
uiLayoutFlags_t IsLayoutUnscaled() const
Definition: UiViewModel.h:152
Definition: UiViewModel.h:61
uiLayoutFlags_t layoutFlags
Definition: UiViewModel.h:224
Upper-right quadrant.
Mouse click events.
Definition: Action.h:67
virtual ~UiViewModel()
Definition: UiViewModel.h:94
virtual bool TryFocus(const Control::Nav &nav=Control::Nav::NEUTRAL)
Attempts to give this widget focus.
Definition: UiViewModel.h:188
Definition: Vec.h:38
virtual bool OnMouseReleased(const Control::Mouse::Click &)
Definition: UiViewModel.h:99
bool focused
Definition: UiViewModel.h:228
MR_UInt32 uiLayoutFlags_t
Definition: UiLayoutFlags.h:53
virtual bool OnNavigate(const Control::Nav &)
Definition: UiViewModel.h:102
boost::signals2::signal< void(UiViewModel &)> focusRequestedSignal_t
Definition: UiViewModel.h:207
Don&#39;t scale the component to the UI viewport.
Definition: UiLayoutFlags.h:48
bool IsFocused() const
Check if this widget currently has input focus.
Definition: UiViewModel.h:174
Lower-left quadrant.
Vec2 pos
Definition: UiViewModel.h:221
Mouse scroll events.
Definition: Action.h:77
void SetTranslation(double x, double y)
Convenience function for SetTranslation(const Vec2&).
Definition: UiViewModel.h:122
virtual bool OnMousePressed(const Control::Mouse::Click &)
Definition: UiViewModel.h:98
const Vec2 & GetTranslation() const
Retrieves the position translation.
Definition: UiViewModel.h:119
boost::signals2::signal< void(UiViewModel &, const Control::Nav &)> focusRelinquishedSignal_t
Definition: UiViewModel.h:214
const Vec2 & GetPos() const
Get the position of the component.
Definition: UiViewModel.h:110
virtual bool OnMouseScrolled(const Control::Mouse::Scroll &)
Definition: UiViewModel.h:100
A navigation direction.
Definition: Nav.h:45
Vec2 GetAlignedPos(double w, double h) const
Retrieve the position adjusted by the current alignment.
Definition: UiViewModel.h:140
Vec2 translation
Definition: UiViewModel.h:222
focusRequestedSignal_t focusRequestedSignal
Definition: UiViewModel.h:229
Alignment alignment
Definition: UiViewModel.h:223
Definition: Announcement.h:24
Alignment GetAlignment() const
Retrieve the alignment of the component.
Definition: UiViewModel.h:129
Lower-right quadrant.
focusRelinquishedSignal_t focusRelinquishedSignal
Definition: UiViewModel.h:230
Use absolute (screen-space) coordinates.
Definition: UiLayoutFlags.h:49
First index for subclasses.
Definition: UiViewModel.h:68
focusRequestedSignal_t & GetFocusRequestedSignal()
Definition: UiViewModel.h:208