MyGUI  3.2.1
MyGUI_Widget.h
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 #ifndef __MYGUI_WIDGET_H__
8 #define __MYGUI_WIDGET_H__
9 
10 #include "MyGUI_Prerequest.h"
11 #include "MyGUI_Any.h"
13 #include "MyGUI_WidgetUserData.h"
14 #include "MyGUI_WidgetInput.h"
15 #include "MyGUI_ResourceSkin.h"
16 #include "MyGUI_ResourceLayout.h"
17 #include "MyGUI_IObject.h"
18 #include "MyGUI_SkinItem.h"
20 
21 namespace MyGUI
22 {
23 
25 
30  public IObject,
31  public ICroppedRectangle,
32  public UserData,
33  public WidgetInput,
35  public SkinItem,
36  public MemberObsolete<Widget>
37  {
38  // для вызова закрытых деструкторов
39  friend class WidgetManager;
40 
42 
43  public:
44  Widget();
45 
53  Widget* createWidgetT(const std::string& _type, const std::string& _skin, const IntCoord& _coord, Align _align, const std::string& _name = "");
54 
56  Widget* createWidgetT(const std::string& _type, const std::string& _skin, int _left, int _top, int _width, int _height, Align _align, const std::string& _name = "");
57 
59  Widget* createWidgetRealT(const std::string& _type, const std::string& _skin, const FloatCoord& _coord, Align _align, const std::string& _name = "");
60 
62  Widget* createWidgetRealT(const std::string& _type, const std::string& _skin, float _left, float _top, float _width, float _height, Align _align, const std::string& _name = "");
63 
64  // templates for creating widgets by type
66  template <typename T>
67  T* createWidget(const std::string& _skin, const IntCoord& _coord, Align _align, const std::string& _name = "")
68  {
69  return static_cast<T*>(createWidgetT(T::getClassTypeName(), _skin, _coord, _align, _name));
70  }
71 
73  template <typename T>
74  T* createWidget(const std::string& _skin, int _left, int _top, int _width, int _height, Align _align, const std::string& _name = "")
75  {
76  return static_cast<T*>(createWidgetT(T::getClassTypeName(), _skin, IntCoord(_left, _top, _width, _height), _align, _name));
77  }
78 
80  template <typename T>
81  T* createWidgetReal(const std::string& _skin, const FloatCoord& _coord, Align _align, const std::string& _name = "")
82  {
83  return static_cast<T*>(createWidgetRealT(T::getClassTypeName(), _skin, _coord, _align, _name));
84  }
85 
87  template <typename T>
88  T* createWidgetReal(const std::string& _skin, float _left, float _top, float _width, float _height, Align _align, const std::string& _name = "")
89  {
90  return static_cast<T*>(createWidgetRealT(T::getClassTypeName(), _skin, _left, _top, _width, _height, _align, _name));
91  }
92 
102  Widget* createWidgetT(WidgetStyle _style, const std::string& _type, const std::string& _skin, const IntCoord& _coord, Align _align, const std::string& _layer = "", const std::string& _name = "");
103 
105  template <typename T>
106  T* createWidget(WidgetStyle _style, const std::string& _skin, const IntCoord& _coord, Align _align, const std::string& _layer = "", const std::string& _name = "")
107  {
108  return static_cast<T*>(createWidgetT(_style, T::getClassTypeName(), _skin, _coord, _align, _layer, _name));
109  }
110 
112  virtual void setPosition(const IntPoint& _value);
114  virtual void setSize(const IntSize& _value);
116  virtual void setCoord(const IntCoord& _value);
117 
119  void setPosition(int _left, int _top);
121  void setSize(int _width, int _height);
123  void setCoord(int _left, int _top, int _width, int _height);
124 
126  void setRealPosition(const FloatPoint& _value);
128  void setRealSize(const FloatSize& _value);
130  void setRealCoord(const FloatCoord& _value);
131 
133  void setRealPosition(float _left, float _top);
135  void setRealSize(float _width, float _height);
137  void setRealCoord(float _left, float _top, float _width, float _height);
138 
140  const std::string& getName() const;
141 
143  virtual void setVisible(bool _value);
145  bool getVisible() const;
146 
151  void setDepth(int _value);
153  int getDepth() const;
154 
156  bool getInheritedVisible() const;
157 
159  virtual void setAlign(Align _value);
161  Align getAlign() const;
162 
164  void setAlpha(float _value);
166  float getAlpha() const;
167 
178  void setInheritsAlpha(bool _value);
180  bool getInheritsAlpha() const;
181 
182  void setColour(const Colour& _value);
183 
184  // являемся ли мы рутовым виджетом
186  bool isRootWidget() const;
187 
189  Widget* getParent() const;
190 
191  IntSize getParentSize() const;
192 
194  EnumeratorWidgetPtr getEnumerator() const;
195 
197  size_t getChildCount();
198 
200  Widget* getChildAt(size_t _index);
201 
206  Widget* findWidget(const std::string& _name);
207 
211  void findWidgets(const std::string& _name, VectorWidgetPtr& _result);
212 
214  virtual void setEnabled(bool _value);
216  void setEnabledSilent(bool _value);
218  bool getEnabled() const;
219 
221  bool getInheritedEnabled() const;
222 
224  IntCoord getClientCoord();
225 
227  Widget* getClientWidget();
228 
232  void detachFromWidget(const std::string& _layer = "");
233 
239  void attachToWidget(Widget* _parent, WidgetStyle _style = WidgetStyle::Child, const std::string& _layer = "");
240 
242  void changeWidgetSkin(const std::string& _skinName);
243 
249  void setWidgetStyle(WidgetStyle _style, const std::string& _layer = "");
251  WidgetStyle getWidgetStyle() const;
252 
257  void setProperty(const std::string& _key, const std::string& _value);
258 
259 
267 
273 
274  /*internal:*/
275  // метод для запроса номера айтема и контейнера
276  virtual size_t _getItemIndex(Widget* _item);
277 
278  // дает приоритет виджету при пиккинге
279  void _forcePick(Widget* _widget);
280 
281  void _initialise(WidgetStyle _style, const IntCoord& _coord, const std::string& _skinName, Widget* _parent, ICroppedRectangle* _croppedParent, const std::string& _name);
282  void _shutdown();
283 
284  // удяляет неудачника
285  void _destroyChildWidget(Widget* _widget);
286 
287  void _setContainer(Widget* _value);
288  Widget* _getContainer();
289 
290  void _setAlign(const IntSize& _oldsize, const IntSize& _newSize);
291  bool _checkPoint(int _left, int _top) const;
292 
293  Widget* _createSkinWidget(WidgetStyle _style, const std::string& _type, const std::string& _skin, const IntCoord& _coord, Align _align, const std::string& _layer = "", const std::string& _name = "");
294 
295  // сброс всех данных контейнера, тултипы и все остальное
296  virtual void _resetContainer(bool _update);
297 
298  bool _setWidgetState(const std::string& _value);
299 
300  // перерисовывает детей
301  void _updateChilds();
302 
303  protected:
304  // все создание только через фабрику
305  virtual ~Widget();
306 
307  virtual void shutdownOverride();
308  virtual void initialiseOverride();
309 
310  void _updateView(); // обновления себя и детей
311 
312  // создает виджет
313  Widget* baseCreateWidget(WidgetStyle _style, const std::string& _type, const std::string& _skin, const IntCoord& _coord, Align _align, const std::string& _layer, const std::string& _name, bool _template);
314 
315  // удаляет всех детей
316  void _destroyAllChildWidget();
317 
318  // запрашиваем у конейтера айтем по позиции мыши
319  virtual size_t _getContainerIndex(const IntPoint& _point);
320 
321  virtual void baseUpdateEnable();
322 
323  // наследуемся он LayerInfo
324  virtual ILayerItem* getLayerItemByPoint(int _left, int _top) const;
325  virtual const IntCoord& getLayerItemCoord() const;
326 
327  template <typename T>
328  void assignWidget(T*& _widget, const std::string& _name)
329  {
330  _widget = nullptr;
331  for (VectorWidgetPtr::iterator iter = mWidgetChildSkin.begin(); iter != mWidgetChildSkin.end(); ++iter)
332  {
333  Widget* find = (*iter)->findWidget(_name);
334  if (nullptr != find)
335  {
336  _widget = find->castType<T>(false);
337  break;
338  }
339  }
340  }
341 
342  VectorWidgetPtr getSkinWidgetsByName(const std::string& _name);
343 
344  void destroySkinWidget(Widget* _widget);
345 
346  virtual void onWidgetCreated(Widget* _widget);
347  virtual void onWidgetDestroy(Widget* _widget);
348 
349  void setWidgetClient(Widget* _widget);
350 
351  virtual void setPropertyOverride(const std::string& _key, const std::string& _value);
352 
353  private:
354  void frameEntered(float _frame);
355 
356  const WidgetInfo* initialiseWidgetSkinBase(ResourceSkin* _info, ResourceLayout* _templateInfo);
357  void shutdownWidgetSkinBase();
358 
359  void _updateAlpha();
360  void _updateAbsolutePoint();
361 
362  // для внутреннего использования
363  void _updateVisible();
364 
365  void _updateEnabled();
366 
367  float _getRealAlpha() const;
368 
369  void _createChildSkinWidget(ResourceSkin* _info);
370  void _destroyChildSkinWidget();
371 
372  void _parseSkinProperties(ResourceSkin* _info);
373  void _checkInheristProperties();
374 
375  void _linkChildWidget(Widget* _widget);
376  void _unlinkChildWidget(Widget* _widget);
377 
378  void setSkinProperty(ResourceSkin* _info);
379 
380  virtual void resizeLayerItemView(const IntSize& _oldView, const IntSize& _newView);
381 
382  void addWidget(Widget* _widget);
383 
384  private:
385  // клиентская зона окна
386  // если виджет имеет пользовательские окна не в себе
387  // то обязательно проинициализировать Client
388  Widget* mWidgetClient;
389 
390  // вектор всех детей виджетов
391  VectorWidgetPtr mWidgetChild;
392 
393  // вектор детей скина
394  VectorWidgetPtr mWidgetChildSkin;
395 
396  // доступен ли на виджет
397  bool mEnabled;
398  bool mInheritsEnabled;
399  // для иерархического скрытия
400  bool mInheritsVisible;
401  // прозрачность и флаг наследования альфы нашего оверлея
402  float mAlpha;
403  float mRealAlpha;
404  bool mInheritsAlpha;
405  // имя виджета
406  std::string mName;
407 
408  // наш отец в иерархии виджетов
409  Widget* mParent;
410 
411  // поведение виджета, перекрывающийся дочерний или всплывающий
412  WidgetStyle mWidgetStyle;
413 
414  Widget* mContainer;
415 
416  Align mAlign;
417  bool mVisible;
418  int mDepth;
419  };
420 
421 } // namespace MyGUI
422 
423 #endif // __MYGUI_WIDGET_H__