00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef __MYGUI_MENU_CTRL_H__
00024 #define __MYGUI_MENU_CTRL_H__
00025
00026 #include "MyGUI_Prerequest.h"
00027 #include "MyGUI_Types.h"
00028 #include "MyGUI_MenuItemType.h"
00029 #include "MyGUI_Widget.h"
00030 #include "MyGUI_Any.h"
00031 #include "MyGUI_EventPair.h"
00032 #include "MyGUI_MenuItemType.h"
00033 #include "MyGUI_ControllerFadeAlpha.h"
00034
00035 namespace MyGUI
00036 {
00037
00038 typedef delegates::CDelegate2<MenuCtrl*, MenuItem*> EventHandle_MenuCtrlPtrMenuItemPtr;
00039 typedef delegates::CDelegate1<MenuCtrl*> EventHandle_MenuCtrlPtr;
00040
00041 class MYGUI_EXPORT MenuCtrl :
00042 public Widget
00043 {
00044 MYGUI_RTTI_DERIVED( MenuCtrl )
00045
00046 public:
00047 MenuCtrl();
00048
00049 enum ItemImage
00050 {
00051 ItemImageNone,
00052 ItemImagePopup
00053 };
00054
00055 struct ItemInfo
00056 {
00057 ItemInfo(MenuItem* _item, const UString& _name, MenuItemType _type, MenuCtrl* _submenu, const std::string& _id, Any _data) :
00058 item(_item),
00059 name(_name),
00060 type(_type),
00061 submenu(_submenu),
00062 id(_id),
00063 data(_data),
00064 width(0)
00065 {
00066 }
00067
00069 MenuItem* item;
00071 UString name;
00073 MenuItemType type;
00075 MenuCtrl* submenu;
00077 std::string id;
00079 Any data;
00081 int width;
00082 };
00083
00084 typedef std::vector<ItemInfo> VectorMenuItemInfo;
00085
00086 public:
00088 virtual void setVisible(bool _value);
00089
00091 void setVisibleSmooth(bool _value);
00092
00093
00094
00095
00097 size_t getItemCount() const { return mItemsInfo.size(); }
00098
00100 MenuItem* insertItemAt(size_t _index, const UString& _name, MenuItemType _type = MenuItemType::Normal, const std::string& _id = "", Any _data = Any::Null);
00102 MenuItem* insertItem(MenuItem* _to, const UString& _name, MenuItemType _type = MenuItemType::Normal, const std::string& _id = "", Any _data = Any::Null);
00103
00105 MenuItem* addItem(const UString& _name, MenuItemType _type = MenuItemType::Normal, const std::string& _id = "", Any _data = Any::Null);
00106
00108 void removeItemAt(size_t _index);
00110 void removeItem(MenuItem* _item);
00111
00113 void removeAllItems();
00114
00115
00117 MenuItem* getItemAt(size_t _index);
00118
00120 size_t getItemIndex(MenuItem* _item);
00121
00123 size_t findItemIndex(MenuItem* _item);
00124
00126 MenuItem* findItemWith(const UString& _name);
00127
00128
00129
00130
00132 void setItemDataAt(size_t _index, Any _data);
00134 void setItemData(MenuItem* _item, Any _data) { setItemDataAt(getItemIndex(_item), _data); }
00135
00137 void clearItemDataAt(size_t _index) { setItemDataAt(_index, Any::Null); }
00139 void clearItemData(MenuItem* _item) { clearItemDataAt(getItemIndex(_item)); }
00140
00142 template <typename ValueType>
00143 ValueType * getItemDataAt(size_t _index, bool _throw = true)
00144 {
00145 MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "MenuCtrl::getItemDataAt");
00146 return mItemsInfo[_index].data.castType<ValueType>(_throw);
00147 }
00149 template <typename ValueType>
00150 ValueType * getItemData(MenuItem* _item, bool _throw = true)
00151 {
00152 return getItemDataAt<ValueType>(getItemIndex(_item), _throw);
00153 }
00154
00156 void setItemIdAt(size_t _index, const std::string& _id);
00158 void setItemId(MenuItem* _item, const std::string& _id) { setItemIdAt(getItemIndex(_item), _id); }
00159
00161 const std::string& getItemIdAt(size_t _index);
00163 const std::string& getItemId(MenuItem* _item) { return getItemIdAt(getItemIndex(_item)); }
00164
00166 MenuItem* getItemById(const std::string& _id);
00167
00169 size_t getItemIndexById(const std::string& _id);
00170
00171
00172
00174 void setItemNameAt(size_t _index, const UString& _name);
00176 void setItemName(MenuItem* _item, const UString& _name) { setItemNameAt(getItemIndex(_item), _name); }
00177
00179 const UString& getItemNameAt(size_t _index);
00181 const UString& getItemName(MenuItem* _item) { return getItemNameAt(getItemIndex(_item)); }
00182
00184 size_t findItemIndexWith(const UString& _name);
00185
00187 void setItemChildVisibleAt(size_t _index, bool _visible);
00189 void setItemChildVisible(MenuItem* _item, bool _visible) { setItemChildVisibleAt(getItemIndex(_item), _visible); }
00190
00191
00192
00193
00195 template <typename Type>
00196 Type * createItemChildTAt(size_t _index)
00197 {
00198 return static_cast<Type*>(createItemChildByType(_index, Type::getClassTypeName()));
00199 }
00200
00202 template <typename Type>
00203 Type * createItemChildT(MenuItem* _item) { return createItemChildTAt<Type>(getItemIndex(_item)); }
00204
00206 MenuCtrl* getItemChildAt(size_t _index);
00207
00209 MenuCtrl* getItemChild(MenuItem* _item) { return getItemChildAt(getItemIndex(_item)); }
00210
00212 MenuCtrl* createItemChildAt(size_t _index) { return createItemChildTAt<MenuCtrl>(_index); }
00213
00215 MenuCtrl* createItemChild(MenuItem* _item) { return createItemChildAt(getItemIndex(_item)); }
00216
00218 void removeItemChildAt(size_t _index);
00219
00221 void removeItemChild(MenuItem* _item) { removeItemChildAt(getItemIndex(_item)); }
00222
00223
00225 MenuItemType getItemTypeAt(size_t _index);
00226
00228 MenuItemType getItemType(MenuItem* _item) { return getItemTypeAt(getItemIndex(_item)); }
00229
00231 void setItemTypeAt(size_t _index, MenuItemType _type);
00233 void setItemType(MenuItem* _item, MenuItemType _type) { setItemTypeAt(getItemIndex(_item), _type); }
00234
00236 void setPopupAccept(bool _value) { mPopupAccept = _value; }
00238 bool getPopupAccept() { return mPopupAccept; }
00239
00241 MenuItem* getMenuItemParent() { return mOwner; }
00242
00243
00244
00250 EventHandle_MenuCtrlPtrMenuItemPtr eventMenuCtrlAccept;
00251
00256 EventHandle_MenuCtrlPtr eventMenuCtrlClose;
00257
00258
00259
00260 void _notifyDeleteItem(MenuItem* _item);
00261 void _notifyUpdateName(MenuItem* _item);
00262 void _wrapItemChild(MenuItem* _item, MenuCtrl* _widget);
00263
00264 virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name);
00265
00266
00267 #ifndef MYGUI_DONT_USE_OBSOLETE
00268
00269 MYGUI_OBSOLETE("use : void Widget::setVisible(bool _value)")
00270 void showMenu() { setVisible(true); }
00271 MYGUI_OBSOLETE("use : void Widget::setVisible(bool _value)")
00272 void hideMenu() { setVisible(false); }
00273 MYGUI_OBSOLETE("use : bool Widget::isVisible()")
00274 bool isShowMenu() { return isVisible(); }
00275
00276 MYGUI_OBSOLETE("use : void setItemChildVisibleAt(size_t _index, bool _visible)")
00277 void showItemChildAt(size_t _index) { setItemChildVisibleAt(_index, true); }
00278 MYGUI_OBSOLETE("use : void setItemChildVisible(MenuItem* _item, bool _visible)")
00279 void showItemChild(MenuItem* _item) { setItemChildVisible(_item, true); }
00280 MYGUI_OBSOLETE("use : void setItemChildVisibleAt(size_t _index, bool _visible)")
00281 void hideItemChildAt(size_t _index) { setItemChildVisibleAt(_index, false); }
00282 MYGUI_OBSOLETE("use : void setItemChildVisible(MenuItem* _item, bool _visible)")
00283 void hideItemChild(MenuItem* _item) { setItemChildVisible(_item, false); }
00284
00285 #endif // MYGUI_DONT_USE_OBSOLETE
00286
00287 protected:
00288 virtual ~MenuCtrl();
00289
00290 void baseChangeWidgetSkin(ResourceSkin* _info);
00291
00292
00293 virtual 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);
00294
00295 virtual void onKeyChangeRootFocus(bool _focus);
00296
00297 private:
00298 void initialiseWidgetSkin(ResourceSkin* _info);
00299 void shutdownWidgetSkin();
00300
00301 void notifyRootKeyChangeFocus(Widget* _sender, bool _focus);
00302 void notifyMouseButtonClick(Widget* _sender);
00303 void notifyMouseSetFocus(Widget* _sender, Widget* _new);
00304
00305 const std::string& getSkinByType(MenuItemType _type)
00306 {
00307 return _type == MenuItemType::Separator ? mSeparatorSkin : mSkinLine;
00308 }
00309
00310 size_t getIconIndexByType(MenuItemType _type)
00311 {
00312 return _type == MenuItemType::Popup ? ItemImagePopup : ItemImageNone;
00313 }
00314
00315 void update();
00316
00317 void setButtonImageIndex(Button* _button, size_t _index);
00318
00319 MenuItemType getItemType(bool _submenu, bool _separator)
00320 {
00321 if (_submenu) return MenuItemType::Popup;
00322 else if (_separator) return MenuItemType::Separator;
00323 return MenuItemType::Normal;
00324 }
00325
00326 void notifyMenuCtrlAccept(MenuItem* _item);
00327
00328 Widget* createItemChildByType(size_t _index, const std::string& _type);
00329
00330 void _wrapItem(MenuItem* _item, size_t _index, const UString& _name, MenuItemType _type, const std::string& _id, Any _data);
00331
00332 ControllerFadeAlpha* createControllerFadeAlpha(float _alpha, float _coef, bool _enable);
00333
00334 Widget* _getClientWidget();
00335 const Widget* _getClientWidget() const;
00336
00337 protected:
00338 bool mHideByAccept;
00339
00340 bool mMenuDropMode;
00341 bool mIsMenuDrop;
00342 bool mHideByLostKey;
00343
00344 private:
00345 VectorMenuItemInfo mItemsInfo;
00346
00347 int mHeightLine;
00348 std::string mSkinLine;
00349
00350 int mSubmenuImageSize;
00351
00352 std::string mSubMenuSkin;
00353 std::string mSubMenuLayer;
00354
00355
00356 bool mShutdown;
00357
00358 int mSeparatorHeight;
00359 std::string mSeparatorSkin;
00360
00361 bool mAlignVert;
00362 int mDistanceButton;
00363 bool mPopupAccept;
00364 MenuItem* mOwner;
00365 bool mAnimateSmooth;
00366
00367 };
00368
00369 }
00370
00371 #endif // __MYGUI_MENU_CTRL_H__