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<MenuCtrlPtr, MenuItemPtr> EventHandle_MenuCtrlPtrMenuItemPtr;
00039 typedef delegates::CDelegate1<MenuCtrlPtr> 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(MenuItemPtr _item, const UString& _name, MenuItemType _type, MenuCtrlPtr _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 MenuItemPtr item;
00071 UString name;
00073 MenuItemType type;
00075 MenuCtrlPtr 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() { return mItemsInfo.size(); }
00098
00100 MenuItemPtr insertItemAt(size_t _index, const UString& _name, MenuItemType _type = MenuItemType::Normal, const std::string& _id = "", Any _data = Any::Null);
00102 MenuItemPtr insertItem(MenuItemPtr _to, const UString& _name, MenuItemType _type = MenuItemType::Normal, const std::string& _id = "", Any _data = Any::Null);
00103
00105 MenuItemPtr 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(MenuItemPtr _item);
00111
00113 void removeAllItems();
00114
00115
00117 MenuItemPtr getItemAt(size_t _index);
00118
00120 size_t getItemIndex(MenuItemPtr _item);
00121
00123 size_t findItemIndex(MenuItemPtr _item);
00124
00126 MenuItemPtr findItemWith(const UString& _name);
00127
00128
00129
00130
00132 void setItemDataAt(size_t _index, Any _data);
00134 void setItemData(MenuItemPtr _item, Any _data) { setItemDataAt(getItemIndex(_item), _data); }
00135
00137 void clearItemDataAt(size_t _index) { setItemDataAt(_index, Any::Null); }
00139 void clearItemData(MenuItemPtr _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(MenuItemPtr _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(MenuItemPtr _item, const std::string& _id) { setItemIdAt(getItemIndex(_item), _id); }
00159
00161 const std::string& getItemIdAt(size_t _index);
00163 const std::string& getItemId(MenuItemPtr _item) { return getItemIdAt(getItemIndex(_item)); }
00164
00166 MenuItemPtr 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(MenuItemPtr _item, const UString& _name) { setItemNameAt(getItemIndex(_item), _name); }
00177
00179 const UString& getItemNameAt(size_t _index);
00181 const UString& getItemName(MenuItemPtr _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(MenuItemPtr _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(MenuItemPtr _item) { return createItemChildTAt<Type>(getItemIndex(_item)); }
00204
00206 MenuCtrlPtr getItemChildAt(size_t _index);
00207
00209 MenuCtrlPtr getItemChild(MenuItemPtr _item) { return getItemChildAt(getItemIndex(_item)); }
00210
00212 MenuCtrlPtr createItemChildAt(size_t _index) { return createItemChildTAt<MenuCtrl>(_index); }
00213
00215 MenuCtrlPtr createItemChild(MenuItemPtr _item) { return createItemChildAt(getItemIndex(_item)); }
00216
00218 void removeItemChildAt(size_t _index);
00219
00221 void removeItemChild(MenuItemPtr _item) { removeItemChildAt(getItemIndex(_item)); }
00222
00223
00225 MenuItemType getItemTypeAt(size_t _index);
00226
00228 MenuItemType getItemType(MenuItemPtr _item) { return getItemTypeAt(getItemIndex(_item)); }
00229
00231 void setItemTypeAt(size_t _index, MenuItemType _type);
00233 void setItemType(MenuItemPtr _item, MenuItemType _type) { setItemTypeAt(getItemIndex(_item), _type); }
00234
00236 void setPopupAccept(bool _value) { mPopupAccept = _value; }
00238 bool getPopupAccept() { return mPopupAccept; }
00239
00241 MenuItemPtr getMenuItemParent() { return mOwner; }
00242
00243
00244
00250 EventHandle_MenuCtrlPtrMenuItemPtr eventMenuCtrlAccept;
00251
00256 EventHandle_MenuCtrlPtr eventMenuCtrlClose;
00257
00258
00259
00260 void _notifyDeleteItem(MenuItemPtr _item);
00261 void _notifyUpdateName(MenuItemPtr _item);
00262 void _wrapItemChild(MenuItemPtr _item, MenuCtrlPtr _widget);
00263
00264 virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, WidgetPtr _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(MenuItemPtr _item, bool _visible)")
00279 void showItemChild(MenuItemPtr _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(MenuItemPtr _item, bool _visible)")
00283 void hideItemChild(MenuItemPtr _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 WidgetPtr 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(WidgetPtr _sender, bool _focus);
00302 void notifyMouseButtonClick(WidgetPtr _sender);
00303 void notifyMouseSetFocus(WidgetPtr _sender, WidgetPtr _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(ButtonPtr _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(MenuItemPtr _item);
00327
00328 WidgetPtr createItemChildByType(size_t _index, const std::string& _type);
00329
00330 void _wrapItem(MenuItemPtr _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 protected:
00335 bool mHideByAccept;
00336
00337 bool mMenuDropMode;
00338 bool mIsMenuDrop;
00339 bool mHideByLostKey;
00340
00341 private:
00342 VectorMenuItemInfo mItemsInfo;
00343
00344 int mHeightLine;
00345 std::string mSkinLine;
00346
00347 int mSubmenuImageSize;
00348
00349 std::string mSubMenuSkin;
00350 std::string mSubMenuLayer;
00351
00352
00353 bool mShutdown;
00354
00355 int mSeparatorHeight;
00356 std::string mSeparatorSkin;
00357
00358 bool mAlignVert;
00359 int mDistanceButton;
00360 bool mPopupAccept;
00361 MenuItemPtr mOwner;
00362 bool mAnimateSmooth;
00363
00364 };
00365
00366 }
00367
00368 #endif // __MYGUI_MENU_CTRL_H__