MyGUI 3.4.3
MyGUI_PointerManager.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"
10#include "MyGUI_LayerManager.h"
12#include "MyGUI_WidgetManager.h"
13#include "MyGUI_XmlDocument.h"
14#include "MyGUI_Widget.h"
16#include "MyGUI_InputManager.h"
17#include "MyGUI_Gui.h"
18
21
22namespace MyGUI
23{
24
26
28 mXmlPointerTagName("Pointer"),
29 mXmlPropertyTagName("Property"),
30 mXmlDefaultPointerValue("Default"),
31 mSingletonHolder(this)
32 {
33 }
34
36 {
37 MYGUI_ASSERT(!mIsInitialise, getClassTypeName() << " initialised twice");
38 MYGUI_LOG(Info, "* Initialise: " << getClassTypeName());
39
40 Gui::getInstance().eventFrameStart += newDelegate(this, &PointerManager::notifyFrameStart);
41 InputManager::getInstance().eventChangeMouseFocus += newDelegate(this, &PointerManager::notifyChangeMouseFocus);
43
45 newDelegate(this, &PointerManager::_load);
46
47 const std::string& resourceCategory = ResourceManager::getInstance().getCategoryName();
50
51 mPointer = nullptr;
52 mMousePointer = nullptr;
53 mWidgetOwner = nullptr;
54 mVisible = true;
55
56 mSkinName = "ImageBox";
57
58 MYGUI_LOG(Info, getClassTypeName() << " successfully initialized");
59 mIsInitialise = true;
60 }
61
63 {
64 MYGUI_ASSERT(mIsInitialise, getClassTypeName() << " is not initialised");
65 MYGUI_LOG(Info, "* Shutdown: " << getClassTypeName());
66
67 InputManager::getInstance().eventChangeMouseFocus -= newDelegate(this, &PointerManager::notifyChangeMouseFocus);
68 Gui::getInstance().eventFrameStart -= newDelegate(this, &PointerManager::notifyFrameStart);
69
70 const std::string& resourceCategory = ResourceManager::getInstance().getCategoryName();
73
74 // удаляем все виджеты
75 _destroyAllChildWidget();
76
77 mWidgetOwner = nullptr;
78
81
82 MYGUI_LOG(Info, getClassTypeName() << " successfully shutdown");
83 mIsInitialise = false;
84 }
85
86 void PointerManager::_load(xml::ElementPtr _node, std::string_view _file, Version _version)
87 {
88#ifndef MYGUI_DONT_USE_OBSOLETE
89 loadOldPointerFormat(_node, _file, _version, mXmlPointerTagName);
90#endif // MYGUI_DONT_USE_OBSOLETE
91
93 while (node.next())
94 {
95 if (node->getName() == mXmlPropertyTagName)
96 {
97 std::string_view key = node->findAttribute("key");
98 std::string_view value = node->findAttribute("value");
99 if (key == "Default")
100 setDefaultPointer(value);
101 else if (key == "Layer")
102 setLayerName(value);
103 else if (key == "Skin")
104 mSkinName = value;
105 }
106 }
107 }
108
109 void PointerManager::notifyFrameStart(float _time)
110 {
112 if (mOldPoint != mPoint)
113 {
114 mOldPoint = mPoint;
115
116 if (nullptr != mMousePointer && mPointer != nullptr)
117 mPointer->setPosition(mMousePointer, mPoint);
118 }
119 }
120
121 void PointerManager::setVisible(bool _visible)
122 {
123 if (nullptr != mMousePointer)
124 mMousePointer->setVisible(_visible);
125 mVisible = _visible;
126 }
127
128 void PointerManager::setPointer(std::string_view _name, Widget* _owner)
129 {
130 if (nullptr == mMousePointer)
131 return;
132
133 IResource* result = getByName(_name);
134 if (result == nullptr)
135 {
136 mPointer = nullptr;
137 mMousePointer->setVisible(false);
138 return;
139 }
140
141 mMousePointer->setVisible(mVisible);
142 mPointer = result->castType<IPointer>();
143 mPointer->setImage(mMousePointer);
144 mPointer->setPosition(mMousePointer, mPoint);
145
146 mWidgetOwner = _owner;
147 }
148
149 void PointerManager::_unlinkWidget(Widget* _widget)
150 {
151 if (_widget == mWidgetOwner)
152 setPointer(mDefaultName, nullptr);
153 else if (_widget == mMousePointer)
154 mMousePointer = nullptr;
155 }
156
158 {
159 setPointer(mDefaultName, nullptr);
160 }
161
162 // создает виджет
163 Widget* PointerManager::baseCreateWidget(
164 WidgetStyle _style,
165 std::string_view _type,
166 std::string_view _skin,
167 const IntCoord& _coord,
168 Align _align,
169 std::string_view _layer,
170 std::string_view _name)
171 {
172 Widget* widget =
174 .createWidget(_style, _type, _skin, _coord, /*_align, */ nullptr, nullptr, /*this, */ _name);
175 mWidgetChild.push_back(widget);
176
177 widget->setAlign(_align);
178
179 // присоединяем виджет с уровню
180 if (!_layer.empty())
182 return widget;
183 }
184
185 // удаляет всех детей
186 void PointerManager::_destroyAllChildWidget()
187 {
188 WidgetManager& manager = WidgetManager::getInstance();
189 while (!mWidgetChild.empty())
190 {
191 // сразу себя отписывем, иначе вложенной удаление убивает все
192 Widget* widget = mWidgetChild.back();
193 mWidgetChild.pop_back();
194
195 // отписываем от всех
196 manager.unlinkFromUnlinkers(widget);
197
198 // и сами удалим, так как его больше в списке нет
200 }
201 }
202
203 void PointerManager::setDefaultPointer(std::string_view _value)
204 {
205 Update();
206
207 mDefaultName = _value;
208 setPointer(mDefaultName, nullptr);
209 }
210
211 void PointerManager::setLayerName(std::string_view _value)
212 {
213 Update();
214
215 mLayerName = _value;
216 if (LayerManager::getInstance().isExist(_value))
217 LayerManager::getInstance().attachToLayerNode(mLayerName, mMousePointer);
218 }
219
220 void PointerManager::Update()
221 {
222 if (mMousePointer == nullptr)
223 mMousePointer = static_cast<ImageBox*>(baseCreateWidget(
226 mSkinName,
227 IntCoord(),
229 std::string_view{},
230 std::string_view{}));
231 }
232
233 IPointer* PointerManager::getByName(std::string_view _name) const
234 {
235 IResource* result = nullptr;
236 if (!_name.empty() && _name != mXmlDefaultPointerValue)
237 result = ResourceManager::getInstance().getByName(_name, false);
238
239 if (result == nullptr)
240 result = ResourceManager::getInstance().getByName(mDefaultName, false);
241
242 return result ? result->castType<IPointer>(false) : nullptr;
243 }
244
245 void PointerManager::notifyChangeMouseFocus(Widget* _widget)
246 {
247 std::string_view pointer;
248 if (_widget != nullptr && _widget->getInheritedEnabled())
249 pointer = _widget->getPointer();
250 if (pointer != mCurrentMousePointer)
251 {
252 mCurrentMousePointer = pointer;
253 if (mCurrentMousePointer.empty())
254 {
256 eventChangeMousePointer(mDefaultName);
257 }
258 else
259 {
260 setPointer(mCurrentMousePointer, _widget);
261 eventChangeMousePointer(mCurrentMousePointer);
262 }
263 }
264 }
265
266 void PointerManager::setPointer(std::string_view _name)
267 {
268 setPointer(_name, nullptr);
269 }
270
272 {
273 return mVisible;
274 }
275
276 const std::string& PointerManager::getDefaultPointer() const
277 {
278 return mDefaultName;
279 }
280
281 const std::string& PointerManager::getLayerName() const
282 {
283 return mLayerName;
284 }
285
286} // namespace MyGUI
#define MYGUI_ASSERT(exp, dest)
#define MYGUI_LOG(level, text)
#define MYGUI_SINGLETON_DEFINITION(ClassName)
void registerFactory(std::string_view _category, std::string_view _type, Delegate::IDelegate *_delegate)
static FactoryManager & getInstance()
void unregisterFactory(std::string_view _category, std::string_view _type)
static Gui & getInstance()
Definition MyGUI_Gui.cpp:34
EventHandle_FrameEventDelegate eventFrameStart
Definition MyGUI_Gui.h:215
Type * castType(bool _throw=true)
virtual void setImage(ImageBox *_image)=0
virtual void setPosition(ImageBox *_image, const IntPoint &_point)=0
widget description should be here.
static std::string_view getClassTypeName()
const IntPoint & getMousePosition() const
delegates::MultiDelegate< Widget * > eventChangeMouseFocus
static InputManager & getInstance()
static LayerManager & getInstance()
void attachToLayerNode(std::string_view _name, Widget *_item)
void loadOldPointerFormat(xml::ElementPtr _node, std::string_view _file, Version _version, std::string_view _tag)
PointerManager(const PointerManager &)=delete
static std::string_view getClassTypeName()
void setPointer(std::string_view _name)
const std::string & getDefaultPointer() const
void setVisible(bool _visible)
const std::string & getLayerName() const
EventPairConvertStringView< delegates::MultiDelegate< const std::string & >, delegates::MultiDelegate< std::string_view > > eventChangeMousePointer
void setDefaultPointer(std::string_view _value)
void setLayerName(std::string_view _value)
IPointer * getByName(std::string_view _name) const
void unregisterLoadXmlDelegate(std::string_view _key)
const std::string & getCategoryName() const
LoadXmlDelegate & registerLoadXmlDelegate(std::string_view _key)
IResource * getByName(std::string_view _name, bool _throw=true) const
static ResourceManager & getInstance()
widget description should be here.
bool getInheritedEnabled() const
virtual void setVisible(bool _value)
virtual void setAlign(Align _value)
const std::string & getPointer() const
void unregisterUnlinker(IUnlinkWidget *_unlink)
Widget * createWidget(WidgetStyle _style, std::string_view _type, std::string_view _skin, const IntCoord &_coord, Widget *_parent, ICroppedRectangle *_cropeedParent, std::string_view _name)
static WidgetManager & getInstance()
void _deleteWidget(Widget *_widget)
void registerUnlinker(IUnlinkWidget *_unlink)
bool findAttribute(std::string_view _name, std::string &_value)
ElementEnumerator getElementEnumerator()
const std::string & getName() const
Element * ElementPtr
types::TCoord< int > IntCoord
Definition MyGUI_Types.h:36
delegates::DelegateFunction< Args... > * newDelegate(void(*_func)(Args... args))