MyGUI  3.2.2
MyGUI_MenuControl.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_MENU_CONTROL_H_
8 #define MYGUI_MENU_CONTROL_H_
9 
10 #include "MyGUI_Prerequest.h"
11 #include "MyGUI_Types.h"
12 #include "MyGUI_MenuItemType.h"
13 #include "MyGUI_Widget.h"
14 #include "MyGUI_Any.h"
15 #include "MyGUI_EventPair.h"
16 #include "MyGUI_MenuItemType.h"
18 #include "MyGUI_IItem.h"
19 #include "MyGUI_IItemContainer.h"
20 
21 namespace MyGUI
22 {
23 
24  typedef delegates::CMultiDelegate2<MenuControl*, MenuItem*> EventHandle_MenuCtrlPtrMenuItemPtr;
25  typedef delegates::CMultiDelegate1<MenuControl*> EventHandle_MenuCtrlPtr;
26 
31  public Widget,
32  public IItemContainer,
33  public MemberObsolete<MenuControl>
34  {
36 
37  public:
38  MenuControl();
39 
40  struct ItemInfo
41  {
42  ItemInfo(MenuItem* _item, const UString& _name, MenuItemType _type, MenuControl* _submenu, const std::string& _id, Any _data) :
43  item(_item),
44  name(_name),
45  type(_type),
46  submenu(_submenu),
47  id(_id),
48  data(_data),
49  width(0)
50  {
51  }
52 
62  std::string id;
66  int width;
67  };
68 
69  typedef std::vector<ItemInfo> VectorMenuItemInfo;
70 
71  public:
73  virtual void setVisible(bool _value);
74 
76  void setVisibleSmooth(bool _value);
77 
78  //------------------------------------------------------------------------------//
79  // манипуляции айтемами
80 
82  size_t getItemCount() const;
83 
85  MenuItem* insertItemAt(size_t _index, const UString& _name, MenuItemType _type = MenuItemType::Normal, const std::string& _id = "", Any _data = Any::Null);
87  MenuItem* insertItem(MenuItem* _to, const UString& _name, MenuItemType _type = MenuItemType::Normal, const std::string& _id = "", Any _data = Any::Null);
88 
90  MenuItem* addItem(const UString& _name, MenuItemType _type = MenuItemType::Normal, const std::string& _id = "", Any _data = Any::Null);
91 
93  void removeItemAt(size_t _index);
95  void removeItem(MenuItem* _item);
96 
98  void removeAllItems();
99 
100 
102  MenuItem* getItemAt(size_t _index);
103 
105  size_t getItemIndex(MenuItem* _item);
106 
108  size_t findItemIndex(MenuItem* _item);
109 
111  MenuItem* findItemWith(const UString& _name);
112 
113  //------------------------------------------------------------------------------//
114  // манипуляции данными
115 
117  void setItemDataAt(size_t _index, Any _data);
119  void setItemData(MenuItem* _item, Any _data);
120 
122  void clearItemDataAt(size_t _index);
124  void clearItemData(MenuItem* _item);
125 
127  template <typename ValueType>
128  ValueType* getItemDataAt(size_t _index, bool _throw = true)
129  {
130  MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "MenuControl::getItemDataAt");
131  return mItemsInfo[_index].data.castType<ValueType>(_throw);
132  }
134  template <typename ValueType>
135  ValueType* getItemData(MenuItem* _item, bool _throw = true)
136  {
137  return getItemDataAt<ValueType>(getItemIndex(_item), _throw);
138  }
139 
141  void setItemIdAt(size_t _index, const std::string& _id);
143  void setItemId(MenuItem* _item, const std::string& _id);
144 
146  const std::string& getItemIdAt(size_t _index);
148  const std::string& getItemId(MenuItem* _item);
149 
151  MenuItem* getItemById(const std::string& _id);
152 
154  MenuItem* findItemById(const std::string& _id, bool _recursive = false);
155 
157  size_t getItemIndexById(const std::string& _id);
158  //------------------------------------------------------------------------------//
159  // манипуляции отображением
160 
162  void setItemNameAt(size_t _index, const UString& _name);
164  void setItemName(MenuItem* _item, const UString& _name);
165 
167  const UString& getItemNameAt(size_t _index);
169  const UString& getItemName(MenuItem* _item);
170 
172  size_t findItemIndexWith(const UString& _name);
173 
175  void setItemChildVisibleAt(size_t _index, bool _visible);
177  void setItemChildVisible(MenuItem* _item, bool _visible);
178 
179  //------------------------------------------------------------------------------//
180  // остальные манипуляции
181 
183  template <typename Type>
184  Type* createItemChildTAt(size_t _index)
185  {
186  return static_cast<Type*>(createItemChildByType(_index, Type::getClassTypeName()));
187  }
188 
190  template <typename Type>
192  {
193  return createItemChildTAt<Type>(getItemIndex(_item));
194  }
195 
197  MenuControl* getItemChildAt(size_t _index);
198 
200  MenuControl* getItemChild(MenuItem* _item);
201 
203  MenuControl* createItemChildAt(size_t _index);
204 
206  MenuControl* createItemChild(MenuItem* _item);
207 
209  void removeItemChildAt(size_t _index);
210 
212  void removeItemChild(MenuItem* _item);
213 
214 
216  MenuItemType getItemTypeAt(size_t _index);
217 
219  MenuItemType getItemType(MenuItem* _item);
220 
222  void setItemTypeAt(size_t _index, MenuItemType _type);
224  void setItemType(MenuItem* _item, MenuItemType _type);
225 
227  void setPopupAccept(bool _value);
229  bool getPopupAccept() const;
230 
232  MenuItem* getMenuItemParent();
233 
235  void setVerticalAlignment(bool _value);
237  bool getVerticalAlignment() const;
238 
239 
240  /*events:*/
247 
253 
254 
255  /*internal:*/
256  void _notifyDeleteItem(MenuItem* _item);
257  void _notifyDeletePopup(MenuItem* _item);
258  void _notifyUpdateName(MenuItem* _item);
259  void _wrapItemChild(MenuItem* _item, MenuControl* _widget);
260 
261  // IItemContainer impl
262  virtual size_t _getItemCount();
263  virtual void _addItem(const MyGUI::UString& _name);
264  virtual void _removeItemAt(size_t _index);
265  virtual Widget* _getItemAt(size_t _index);
266  virtual void _setItemNameAt(size_t _index, const UString& _name);
267  virtual const UString& _getItemNameAt(size_t _index);
268  virtual void _setItemSelected(IItem* _item);
269 
270  void _updateItems(size_t _index);
271  void _updateSizeForEmpty();
272 
273  protected:
274  virtual void initialiseOverride();
275  virtual void shutdownOverride();
276 
277  virtual void onKeyChangeRootFocus(bool _focus);
278 
279  virtual void onWidgetCreated(Widget* _widget);
280 
281  virtual void setPropertyOverride(const std::string& _key, const std::string& _value);
282 
283  private:
284  void notifyRootKeyChangeFocus(Widget* _sender, bool _focus);
285  void notifyMouseButtonClick(Widget* _sender);
286  void notifyMouseSetFocus(Widget* _sender, Widget* _new);
287 
288  const std::string& getSkinByType(MenuItemType _type) const;
289  std::string getIconIndexByType(MenuItemType _type) const;
290 
291  void update();
292 
293  MenuItemType getItemType(bool _submenu, bool _separator) const;
294 
295  void notifyMenuCtrlAccept(MenuItem* _item);
296 
297  Widget* createItemChildByType(size_t _index, const std::string& _type);
298 
299  void _wrapItem(MenuItem* _item, size_t _index, const UString& _name, MenuItemType _type, const std::string& _id, Any _data);
300 
301  ControllerFadeAlpha* createControllerFadeAlpha(float _alpha, float _coef, bool _enable);
302 
303  Widget* _getClientWidget();
304 
305  void _setItemChildVisibleAt(size_t _index, bool _visible, bool _smooth);
306 
307  protected:
309  // нужно ли выбрасывать по нажатию
314 
315  private:
316  VectorMenuItemInfo mItemsInfo;
317 
318  std::string mItemNormalSkin;
319  std::string mItemPopupSkin;
320  std::string mItemSeparatorSkin;
321 
322  std::string mSubMenuSkin;
323  std::string mSubMenuLayer;
324 
325  // флаг, чтобы отсеч уведомления от айтемов, при общем шутдауне виджета
326  bool mShutdown;
327 
328  bool mVerticalAlignment;
329  int mDistanceButton;
330  bool mPopupAccept;
331  MenuItem* mOwner;
332  bool mAnimateSmooth;
333 
334  bool mChangeChildSkin;
335  Widget* mClient;
336  bool mInternalCreateChild;
337  };
338 
339 } // namespace MyGUI
340 
341 #endif // MYGUI_MENU_CONTROL_H_
MyGUI::IItemContainer
Definition: MyGUI_IItemContainer.h:18
MyGUI::MenuControl::ItemInfo::width
int width
Definition: MyGUI_MenuControl.h:66
MyGUI::MenuControl::ItemInfo::item
MenuItem * item
Definition: MyGUI_MenuControl.h:54
MyGUI_Widget.h
MyGUI::MenuControl::ItemInfo::id
std::string id
Definition: MyGUI_MenuControl.h:62
MyGUI::MenuControl::getItemData
ValueType * getItemData(MenuItem *_item, bool _throw=true)
Get item data.
Definition: MyGUI_MenuControl.h:135
MyGUI_EventPair.h
MYGUI_ASSERT_RANGE
#define MYGUI_ASSERT_RANGE(index, size, owner)
Definition: MyGUI_Diagnostic.h:54
MyGUI::EventHandle_MenuCtrlPtr
delegates::CMultiDelegate1< MenuControl * > EventHandle_MenuCtrlPtr
Definition: MyGUI_MenuControl.h:25
MyGUI::MenuControl::ItemInfo
Definition: MyGUI_MenuControl.h:40
MyGUI::MenuControl::ItemInfo::name
UString name
Definition: MyGUI_MenuControl.h:56
MyGUI::MenuControl::eventMenuCtrlClose
EventHandle_MenuCtrlPtr eventMenuCtrlClose
Definition: MyGUI_MenuControl.h:252
MyGUI::MenuControl::mResizeToContent
bool mResizeToContent
Definition: MyGUI_MenuControl.h:313
MyGUI::MenuControl::VectorMenuItemInfo
std::vector< ItemInfo > VectorMenuItemInfo
Definition: MyGUI_MenuControl.h:69
MyGUI::Widget
Widget properties. Skin childs. Widget widget description should be here.
Definition: MyGUI_Widget.h:29
MyGUI_IItemContainer.h
MyGUI::Any
Definition: MyGUI_Any.h:63
MyGUI::MenuControl::ItemInfo::data
Any data
Definition: MyGUI_MenuControl.h:64
MyGUI::MenuItem
MenuItem properties. Skin childs. MenuItem widget description should be here.
Definition: MyGUI_MenuItem.h:21
MyGUI::UString
A UTF-16 string with implicit conversion to/from std::string and std::wstring.
Definition: MyGUI_UString.h:168
MyGUI::MenuControl::getItemDataAt
ValueType * getItemDataAt(size_t _index, bool _throw=true)
Get item data from specified position.
Definition: MyGUI_MenuControl.h:128
MyGUI_Prerequest.h
MyGUI::MenuControl::eventMenuCtrlAccept
EventHandle_MenuCtrlPtrMenuItemPtr eventMenuCtrlAccept
Definition: MyGUI_MenuControl.h:246
MyGUI::MenuControl::mHideByAccept
bool mHideByAccept
Definition: MyGUI_MenuControl.h:308
MyGUI::MenuControl::mHideByLostKey
bool mHideByLostKey
Definition: MyGUI_MenuControl.h:312
MyGUI::EventHandle_MenuCtrlPtrMenuItemPtr
delegates::CMultiDelegate2< MenuControl *, MenuItem * > EventHandle_MenuCtrlPtrMenuItemPtr
Definition: MyGUI_MenuControl.h:24
MyGUI::IItem
Definition: MyGUI_IItem.h:17
MyGUI_ControllerFadeAlpha.h
MYGUI_RTTI_DERIVED
#define MYGUI_RTTI_DERIVED(DerivedType)
Definition: MyGUI_RTTI.h:65
MyGUI::MenuControl::mIsMenuDrop
bool mIsMenuDrop
Definition: MyGUI_MenuControl.h:311
MyGUI::MenuControl::ItemInfo::ItemInfo
ItemInfo(MenuItem *_item, const UString &_name, MenuItemType _type, MenuControl *_submenu, const std::string &_id, Any _data)
Definition: MyGUI_MenuControl.h:42
MyGUI::MenuControl::ItemInfo::type
MenuItemType type
Definition: MyGUI_MenuControl.h:58
MyGUI::MemberObsolete
Definition: MyGUI_DeprecatedTypes.h:13
MyGUI::MenuControl::ItemInfo::submenu
MenuControl * submenu
Definition: MyGUI_MenuControl.h:60
MyGUI_MenuItemType.h
MyGUI::MenuControl::createItemChildTAt
Type * createItemChildTAt(size_t _index)
Definition: MyGUI_MenuControl.h:184
MyGUI_IItem.h
MYGUI_EXPORT
#define MYGUI_EXPORT
Definition: MyGUI_Platform.h:103
MyGUI::MenuControl
MenuControl properties. Skin childs. MenuControl widget description should be here.
Definition: MyGUI_MenuControl.h:30
MyGUI::MenuControl::createItemChildT
Type * createItemChildT(MenuItem *_item)
Definition: MyGUI_MenuControl.h:191
MyGUI_Types.h
MyGUI::MenuControl::mMenuDropMode
bool mMenuDropMode
Definition: MyGUI_MenuControl.h:310
MyGUI::ControllerFadeAlpha
Definition: MyGUI_ControllerFadeAlpha.h:18
MyGUI::MenuItemType
Definition: MyGUI_MenuItemType.h:15
MyGUI::Any::Null
static AnyEmpty Null
Definition: MyGUI_Any.h:67
MyGUI
Definition: MyGUI_ActionController.h:14
MyGUI_Any.h
MyGUI::MenuItemType::Normal
Definition: MyGUI_MenuItemType.h:19