MyGUI 3.4.3
MyGUI_ControllerEdgeHide.cpp
Go to the documentation of this file.
1/*
2 * This source file is part of MyGUI. For the latest info, see http://mygui.info/
3 * Distributed under the MIT License
4 * (See accompanying file COPYING.MIT or copy at http://opensource.org/licenses/MIT)
5 */
6
7#include "MyGUI_Precompiled.h"
9#include "MyGUI_Gui.h"
10#include "MyGUI_InputManager.h"
11#include "MyGUI_WidgetManager.h"
12#include "MyGUI_Widget.h"
13
14namespace MyGUI
15{
16
17#ifdef M_PI
18 #undef M_PI
19#endif
20 const float M_PI = 3.141593f;
21
23 {
24 recalculateTime(_widget);
25 // вызываем пользовательский делегат для подготовки
26 eventPreAction(_widget, this);
27 }
28
29 bool ControllerEdgeHide::addTime(Widget* _widget, float _time)
30 {
31 const IntSize& view_size = _widget->getParentSize();
32 // do nothing if we have minimized window
33 if (view_size.width <= 1 && view_size.height <= 1)
34 return true;
35
38
39 while ((keyFocus != nullptr) && (_widget != keyFocus))
40 keyFocus = keyFocus->getParent();
41 while ((mouseFocus != nullptr) && (_widget != mouseFocus))
42 mouseFocus = mouseFocus->getParent();
43
44 // if our widget or its children have focus
45 bool haveFocus = ((keyFocus != nullptr) || (mouseFocus != nullptr)) || (!_widget->getVisible());
46
47 mElapsedTime += haveFocus ? -_time : _time;
48
49 if (mElapsedTime >= mTime)
50 {
51 mElapsedTime = mTime;
52 }
53 if (mElapsedTime <= 0)
54 {
55 mElapsedTime = 0.0f;
56 return true;
57 }
58
59 float k = std::sin(M_PI * mElapsedTime / mTime - M_PI / 2);
60 if (k < 0)
61 k = (-std::pow(-k, 0.7f) + 1) / 2;
62 else
63 k = (std::pow(k, 0.7f) + 1) / 2;
64
65 MyGUI::IntCoord coord = _widget->getCoord();
66 // if widget was moved
67 if (coord != mLastCoord)
68 {
69 // if still moving - leave it alone
70 if (haveFocus)
71 return true;
72 recalculateTime(_widget);
73 }
74
75 bool nearBorder = false;
76
77 bool behindLeft = coord.left <= 0;
78 bool behindRight = coord.right() >= view_size.width - 1;
79 bool behindTop = coord.top <= 0;
80 bool behindBottom = coord.bottom() >= view_size.height - 1;
81 if (behindLeft && !behindRight)
82 {
83 coord.left = -int(float(coord.width - mRemainPixels - mShadowSize) * k);
84 nearBorder = true;
85 }
86 if (behindTop && !behindBottom)
87 {
88 coord.top = -int(float(coord.height - mRemainPixels - mShadowSize) * k);
89 nearBorder = true;
90 }
91 if (behindRight && !behindLeft)
92 {
93 coord.left = int(float(view_size.width - 1) - float(mRemainPixels) * k - float(coord.width) * (1.f - k));
94 nearBorder = true;
95 }
96 if (behindBottom && !behindTop)
97 {
98 coord.top = int(float(view_size.height - 1) - float(mRemainPixels) * k - float(coord.height) * (1.f - k));
99 nearBorder = true;
100 }
101
102 if (nearBorder)
103 {
104 _widget->setCoord(coord);
105 }
106 else
107 {
108 mElapsedTime = 0;
109 }
110 mLastCoord = coord;
111
112 eventUpdateAction(_widget, this);
113
114 return true;
115 }
116
117 void ControllerEdgeHide::setProperty(std::string_view _key, std::string_view _value)
118 {
119 if (_key == "Time")
121 else if (_key == "RemainPixels")
123 else if (_key == "ShadowSize")
125 }
126
127 void ControllerEdgeHide::recalculateTime(Widget* _widget)
128 {
129 float k = 0;
130 const MyGUI::IntCoord& coord = _widget->getCoord();
131 const MyGUI::IntSize& view_size = _widget->getParentSize();
132
133 bool behindLeft = coord.left <= 0;
134 bool behindRight = coord.right() >= view_size.width - 1;
135 bool behindTop = coord.top <= 0;
136 bool behindBottom = coord.bottom() >= view_size.height - 1;
137 // check if widget is near any border and not near opposite borders at same time
138 if (behindLeft && !behindRight)
139 {
140 k = -(float)coord.left / (coord.width - mRemainPixels - mShadowSize);
141 }
142 else if (behindTop && !behindBottom)
143 {
144 k = -(float)coord.top / (coord.height - mRemainPixels - mShadowSize);
145 }
146 else if (behindRight && !behindLeft)
147 {
148 k = (float)(coord.right() - view_size.width + 1) / (coord.width - mRemainPixels);
149 }
150 else if (behindBottom && !behindTop)
151 {
152 k = (float)(coord.bottom() - view_size.height + 1) / (coord.height - mRemainPixels);
153 }
154
155 //mElapsedTime = (asin(k)/M_PI + 1./2) * mTime;
156 // this is reversed formula from ControllerEdgeHide::addTime k calculation
157 if (k > 0.5f)
158 mElapsedTime = (std::asin(std::pow(2 * k - 1, 1 / 0.7f)) / M_PI + 1.f / 2) * mTime;
159 else
160 mElapsedTime = (std::asin(-std::pow(-2 * k + 1, 1 / 0.7f)) / M_PI + 1.f / 2) * mTime;
161 }
162
164 {
165 mTime = _value;
166 }
167
169 {
170 mRemainPixels = _value;
171 }
172
174 {
175 mShadowSize = _value;
176 }
177
178} // namespace MyGUI
bool addTime(Widget *_widget, float _time) override
void prepareItem(Widget *_widget) override
void setProperty(std::string_view _key, std::string_view _value) override
EventPairAddParameter< EventHandle_WidgetPtr, EventHandle_WidgetPtrControllerItemPtr > eventPreAction
EventPairAddParameter< EventHandle_WidgetPtr, EventHandle_WidgetPtrControllerItemPtr > eventUpdateAction
const IntCoord & getCoord() const
Widget * getKeyFocusWidget() const
Widget * getMouseFocusWidget() const
static InputManager & getInstance()
widget description should be here.
Widget * getParent() const
IntSize getParentSize() const
bool getVisible() const
void setCoord(const IntCoord &_coord) override
T parseValue(std::string_view _value)