MyGUI
3.2.1
|
00001 /* 00002 * This source file is part of MyGUI. For the latest info, see http://mygui.info/ 00003 * Distributed under the MIT License 00004 * (See accompanying file COPYING.MIT or copy at http://opensource.org/licenses/MIT) 00005 */ 00006 00007 #ifndef __MYGUI_TAB_CONTROL_H__ 00008 #define __MYGUI_TAB_CONTROL_H__ 00009 00010 #include "MyGUI_Prerequest.h" 00011 #include "MyGUI_Widget.h" 00012 #include "MyGUI_Any.h" 00013 #include "MyGUI_EventPair.h" 00014 #include "MyGUI_ControllerFadeAlpha.h" 00015 #include "MyGUI_IItem.h" 00016 #include "MyGUI_IItemContainer.h" 00017 00018 namespace MyGUI 00019 { 00020 00021 typedef delegates::CMultiDelegate2<TabControl*, size_t> EventHandle_TabPtrSizeT; 00022 00026 class MYGUI_EXPORT TabControl : 00027 public Widget, 00028 public IItemContainer, 00029 public MemberObsolete<TabControl> 00030 { 00031 // для уведобления об удалении 00032 //FIXME 00033 friend class TabItem; 00034 00035 MYGUI_RTTI_DERIVED( TabControl ) 00036 00037 public: 00038 TabControl(); 00039 00040 struct TabItemInfo 00041 { 00042 TabItemInfo(int _width, const UString& _name, TabItem* _item, Any _data) : 00043 width(_width), 00044 name(_name), 00045 item(_item), 00046 data(_data) 00047 { 00048 } 00049 00050 int width; 00051 UString name; 00052 TabItem* item; 00053 Any data; 00054 }; 00055 00056 typedef std::vector<TabItemInfo> VectorTabItemInfo; 00057 00059 virtual void setPosition(const IntPoint& _value); 00061 virtual void setSize(const IntSize& _value); 00063 virtual void setCoord(const IntCoord& _value); 00064 00066 void setPosition(int _left, int _top); 00068 void setSize(int _width, int _height); 00070 void setCoord(int _left, int _top, int _width, int _height); 00071 00072 //------------------------------------------------------------------------------// 00073 // манипуляции айтемами 00074 00076 size_t getItemCount() const; 00077 00079 TabItem* insertItemAt(size_t _index, const UString& _name, Any _data = Any::Null); 00081 TabItem* insertItem(TabItem* _to, const UString& _name, Any _data = Any::Null); 00082 00084 TabItem* addItem(const UString& _name, Any _data = Any::Null); 00085 00087 void removeItemAt(size_t _index); 00089 void removeItem(TabItem* _item); 00090 00092 void removeAllItems(); 00093 00094 00096 TabItem* getItemAt(size_t _index); 00097 00099 size_t getItemIndex(TabItem* _item); 00100 00102 size_t findItemIndex(TabItem* _item); 00103 00105 size_t findItemIndexWith(const UString& _name); 00106 00108 TabItem* findItemWith(const UString& _name); 00109 00110 void swapItems(size_t _index1, size_t _index2); 00111 00112 //------------------------------------------------------------------------------// 00113 // манипуляции выделениями 00114 00116 size_t getIndexSelected() const; 00117 00119 TabItem* getItemSelected(); 00120 00122 void setIndexSelected(size_t _index); 00123 00125 void setItemSelected(TabItem* _item); 00126 00127 00128 //------------------------------------------------------------------------------// 00129 // манипуляции данными 00130 00132 void setItemDataAt(size_t _index, Any _data); 00134 void setItemData(TabItem* _item, Any _data); 00135 00137 void clearItemDataAt(size_t _index); 00139 void clearItemData(TabItem* _item); 00140 00142 template <typename ValueType> 00143 ValueType* getItemDataAt(size_t _index, bool _throw = true) 00144 { 00145 MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "TabControl::getItemDataAt"); 00146 return mItemsInfo[_index].data.castType<ValueType>(_throw); 00147 } 00149 template <typename ValueType> 00150 ValueType* getItemData(TabItem* _item, bool _throw = true) 00151 { 00152 return getItemDataAt<ValueType>(getItemIndex(_item), _throw); 00153 } 00154 00155 00156 //------------------------------------------------------------------------------// 00157 // манипуляции отображением 00158 00160 void setItemNameAt(size_t _index, const UString& _name); 00161 00163 void setItemName(TabItem* _item, const UString& _name); 00164 00166 const UString& getItemNameAt(size_t _index); 00167 00169 const UString& getItemName(TabItem* _item); 00170 00171 00172 //------------------------------------------------------------------------------// 00173 // манипуляции выдимостью 00174 00176 void beginToItemAt(size_t _index); 00177 00179 void beginToItem(TabItem* _item); 00181 void beginToItemFirst(); 00183 void beginToItemLast(); 00185 void beginToItemSelected(); 00186 00187 00188 //------------------------------------------------------------------------------// 00189 // остальные манипуляции 00190 00192 void setButtonWidthAt(size_t _index, int _width = DEFAULT); 00194 void setButtonWidth(TabItem* _item, int _width = DEFAULT); 00195 00197 int getButtonWidthAt(size_t _index); 00199 int getButtonWidth(TabItem* _item); 00200 00201 //------------------------------------------------------------------------------// 00202 00204 void setButtonDefaultWidth(int _value); 00206 int getButtonDefaultWidth() const; 00207 00209 void setButtonAutoWidth(bool _value); 00211 bool getButtonAutoWidth() const; 00212 00214 void setSmoothShow(bool _value); 00216 bool getSmoothShow() const; 00217 00218 /*events:*/ 00224 EventPair<EventHandle_WidgetSizeT, EventHandle_TabPtrSizeT> eventTabChangeSelect; 00225 00226 /*internal:*/ 00227 // IItemContainer impl 00228 virtual size_t _getItemCount(); 00229 virtual void _addItem(const MyGUI::UString& _name); 00230 virtual void _removeItemAt(size_t _index); 00231 virtual Widget* _getItemAt(size_t _index); 00232 virtual void _setItemNameAt(size_t _index, const UString& _name); 00233 virtual const UString& _getItemNameAt(size_t _index); 00234 00235 protected: 00236 virtual void initialiseOverride(); 00237 virtual void shutdownOverride(); 00238 00239 void updateBar(); 00240 00241 void notifyPressedButtonEvent(MyGUI::Widget* _sender); 00242 void notifyPressedBarButtonEvent(MyGUI::Widget* _sender); 00243 00244 int _getTextWidth(const UString& _text); 00245 00246 void _showItem(TabItem* _sheet, bool _show, bool _smooth); 00247 00248 void _createItemButton(); 00249 00250 void _insertItem(size_t _index, const UString& _name, TabItem* _sheet, Any _data); 00251 00252 // вкладка при удалении уведомляет таб 00253 void _notifyDeleteItem(TabItem* _item); 00254 00255 virtual void onWidgetCreated(Widget* _widget); 00256 00257 virtual void setPropertyOverride(const std::string& _key, const std::string& _value); 00258 00259 private: 00260 void actionWidgetHide(Widget* _widget, ControllerItem* _controller); 00261 00262 ControllerFadeAlpha* createControllerFadeAlpha(float _alpha, float _coef, bool _enable); 00263 00264 Widget* _getWidgetTemplate(); 00265 Widget* _getWidgetBar(); 00266 00267 Button* createButton(); 00268 void updateBarOld(); 00269 void updateBarNew(); 00270 00271 private: 00272 int mOffsetTab; // смещение бара при показе кнопок 00273 bool mButtonShow; 00274 int mWidthBar; // ширина в которую помещаються все кнопки 00275 std::vector<Button*> mItemButton; // список кнопок, не должно равно списку страниц 00276 std::string mButtonSkinName; 00277 std::string mEmptySkinName; 00278 00279 Widget* mWidgetBar; 00280 Button* mButtonLeft; 00281 Button* mButtonRight; 00282 Widget* mButtonDecor; 00283 VectorWidgetPtr mWidgetsPatch; // список виджетов которые нужно показать при показе кнопки 00284 Widget* mEmptyBarWidget; 00285 Widget* mItemTemplate; 00286 00287 // информация о вкладках 00288 VectorTabItemInfo mItemsInfo; 00289 size_t mStartIndex; 00290 size_t mIndexSelect; 00291 00292 int mButtonDefaultWidth; 00293 bool mSmoothShow; 00294 bool mButtonAutoWidth; 00295 00296 // флаг, чтобы отсеч уведомления от вкладок, при общем шутдауне виджета 00297 bool mShutdown; 00298 00299 Widget* mHeaderPlace; 00300 Widget* mControls; 00301 Widget* mEmpty; 00302 }; 00303 00304 } // namespace MyGUI 00305 00306 #endif // __MYGUI_TAB_CONTROL_H__