MyGUI
3.2.0
|
00001 00006 /* 00007 This file is part of MyGUI. 00008 00009 MyGUI is free software: you can redistribute it and/or modify 00010 it under the terms of the GNU Lesser General Public License as published by 00011 the Free Software Foundation, either version 3 of the License, or 00012 (at your option) any later version. 00013 00014 MyGUI is distributed in the hope that it will be useful, 00015 but WITHOUT ANY WARRANTY; without even the implied warranty of 00016 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00017 GNU Lesser General Public License for more details. 00018 00019 You should have received a copy of the GNU Lesser General Public License 00020 along with MyGUI. If not, see <http://www.gnu.org/licenses/>. 00021 */ 00022 #ifndef __MYGUI_TAB_CONTROL_H__ 00023 #define __MYGUI_TAB_CONTROL_H__ 00024 00025 #include "MyGUI_Prerequest.h" 00026 #include "MyGUI_Widget.h" 00027 #include "MyGUI_Any.h" 00028 #include "MyGUI_EventPair.h" 00029 #include "MyGUI_ControllerFadeAlpha.h" 00030 #include "MyGUI_IItem.h" 00031 #include "MyGUI_IItemContainer.h" 00032 00033 namespace MyGUI 00034 { 00035 00036 typedef delegates::CMultiDelegate2<TabControl*, size_t> EventHandle_TabPtrSizeT; 00037 00038 class MYGUI_EXPORT TabControl : 00039 public Widget, 00040 public IItemContainer, 00041 public MemberObsolete<TabControl> 00042 { 00043 // для уведобления об удалении 00044 //FIXME 00045 friend class TabItem; 00046 00047 MYGUI_RTTI_DERIVED( TabControl ) 00048 00049 public: 00050 TabControl(); 00051 00052 struct TabItemInfo 00053 { 00054 TabItemInfo(int _width, const UString& _name, TabItem* _item, Any _data) : 00055 width(_width), 00056 name(_name), 00057 item(_item), 00058 data(_data) 00059 { 00060 } 00061 00062 int width; 00063 UString name; 00064 TabItem* item; 00065 Any data; 00066 }; 00067 00068 typedef std::vector<TabItemInfo> VectorTabItemInfo; 00069 00071 virtual void setPosition(const IntPoint& _value); 00073 virtual void setSize(const IntSize& _value); 00075 virtual void setCoord(const IntCoord& _value); 00076 00078 void setPosition(int _left, int _top); 00080 void setSize(int _width, int _height); 00082 void setCoord(int _left, int _top, int _width, int _height); 00083 00084 //------------------------------------------------------------------------------// 00085 // манипуляции айтемами 00086 00088 size_t getItemCount() const; 00089 00091 TabItem* insertItemAt(size_t _index, const UString& _name, Any _data = Any::Null); 00093 TabItem* insertItem(TabItem* _to, const UString& _name, Any _data = Any::Null); 00094 00096 TabItem* addItem(const UString& _name, Any _data = Any::Null); 00097 00099 void removeItemAt(size_t _index); 00101 void removeItem(TabItem* _item); 00102 00104 void removeAllItems(); 00105 00106 00108 TabItem* getItemAt(size_t _index); 00109 00111 size_t getItemIndex(TabItem* _item); 00112 00114 size_t findItemIndex(TabItem* _item); 00115 00117 size_t findItemIndexWith(const UString& _name); 00118 00120 TabItem* findItemWith(const UString& _name); 00121 00122 void swapItems(size_t _index1, size_t _index2); 00123 00124 //------------------------------------------------------------------------------// 00125 // манипуляции выделениями 00126 00128 size_t getIndexSelected() const; 00129 00131 TabItem* getItemSelected(); 00132 00134 void setIndexSelected(size_t _index); 00135 00137 void setItemSelected(TabItem* _item); 00138 00139 00140 //------------------------------------------------------------------------------// 00141 // манипуляции данными 00142 00144 void setItemDataAt(size_t _index, Any _data); 00146 void setItemData(TabItem* _item, Any _data); 00147 00149 void clearItemDataAt(size_t _index); 00151 void clearItemData(TabItem* _item); 00152 00154 template <typename ValueType> 00155 ValueType* getItemDataAt(size_t _index, bool _throw = true) 00156 { 00157 MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "TabControl::getItemDataAt"); 00158 return mItemsInfo[_index].data.castType<ValueType>(_throw); 00159 } 00161 template <typename ValueType> 00162 ValueType* getItemData(TabItem* _item, bool _throw = true) 00163 { 00164 return getItemDataAt<ValueType>(getItemIndex(_item), _throw); 00165 } 00166 00167 00168 //------------------------------------------------------------------------------// 00169 // манипуляции отображением 00170 00172 void setItemNameAt(size_t _index, const UString& _name); 00173 00175 void setItemName(TabItem* _item, const UString& _name); 00176 00178 const UString& getItemNameAt(size_t _index); 00179 00181 const UString& getItemName(TabItem* _item); 00182 00183 00184 //------------------------------------------------------------------------------// 00185 // манипуляции выдимостью 00186 00188 void beginToItemAt(size_t _index); 00189 00191 void beginToItem(TabItem* _item); 00193 void beginToItemFirst(); 00195 void beginToItemLast(); 00197 void beginToItemSelected(); 00198 00199 00200 //------------------------------------------------------------------------------// 00201 // остальные манипуляции 00202 00204 void setButtonWidthAt(size_t _index, int _width = DEFAULT); 00206 void setButtonWidth(TabItem* _item, int _width = DEFAULT); 00207 00209 int getButtonWidthAt(size_t _index); 00211 int getButtonWidth(TabItem* _item); 00212 00213 //------------------------------------------------------------------------------// 00214 00216 void setButtonDefaultWidth(int _value); 00218 int getButtonDefaultWidth() const; 00219 00221 void setButtonAutoWidth(bool _value); 00223 bool getButtonAutoWidth() const; 00224 00226 void setSmoothShow(bool _value); 00228 bool getSmoothShow() const; 00229 00230 /*events:*/ 00236 EventPair<EventHandle_WidgetSizeT, EventHandle_TabPtrSizeT> 00237 eventTabChangeSelect; 00238 00239 /*internal:*/ 00240 // IItemContainer impl 00241 virtual size_t _getItemCount(); 00242 virtual void _addItem(const MyGUI::UString& _name); 00243 virtual void _removeItemAt(size_t _index); 00244 virtual Widget* _getItemAt(size_t _index); 00245 virtual void _setItemNameAt(size_t _index, const UString& _name); 00246 virtual const UString& _getItemNameAt(size_t _index); 00247 00248 protected: 00249 virtual void initialiseOverride(); 00250 virtual void shutdownOverride(); 00251 00252 void updateBar(); 00253 00254 void notifyPressedButtonEvent(MyGUI::Widget* _sender); 00255 void notifyPressedBarButtonEvent(MyGUI::Widget* _sender); 00256 00257 int _getTextWidth(const UString& _text); 00258 00259 void _showItem(TabItem* _sheet, bool _show, bool _smooth); 00260 00261 void _createItemButton(); 00262 00263 void _insertItem(size_t _index, const UString& _name, TabItem* _sheet, Any _data); 00264 00265 // вкладка при удалении уведомляет таб 00266 void _notifyDeleteItem(TabItem* _item); 00267 00268 virtual void onWidgetCreated(Widget* _widget); 00269 00270 virtual void setPropertyOverride(const std::string& _key, const std::string& _value); 00271 00272 private: 00273 void actionWidgetHide(Widget* _widget); 00274 00275 ControllerFadeAlpha* createControllerFadeAlpha(float _alpha, float _coef, bool _enable); 00276 00277 Widget* _getWidgetTemplate(); 00278 Widget* _getWidgetBar(); 00279 00280 Button* createButton(); 00281 void updateBarOld(); 00282 void updateBarNew(); 00283 00284 private: 00285 int mOffsetTab; // смещение бара при показе кнопок 00286 bool mButtonShow; 00287 int mWidthBar; // ширина в которую помещаються все кнопки 00288 std::vector<Button*> mItemButton; // список кнопок, не должно равно списку страниц 00289 std::string mButtonSkinName; 00290 std::string mEmptySkinName; 00291 00292 Widget* mWidgetBar; 00293 Button* mButtonLeft; 00294 Button* mButtonRight; 00295 Widget* mButtonDecor; 00296 VectorWidgetPtr mWidgetsPatch; // список виджетов которые нужно показать при показе кнопки 00297 Widget* mEmptyBarWidget; 00298 Widget* mItemTemplate; 00299 00300 // информация о вкладках 00301 VectorTabItemInfo mItemsInfo; 00302 size_t mStartIndex; 00303 size_t mIndexSelect; 00304 00305 int mButtonDefaultWidth; 00306 bool mSmoothShow; 00307 bool mButtonAutoWidth; 00308 00309 // флаг, чтобы отсеч уведомления от вкладок, при общем шутдауне виджета 00310 bool mShutdown; 00311 00312 Widget* mHeaderPlace; 00313 Widget* mControls; 00314 Widget* mEmpty; 00315 }; 00316 00317 } // namespace MyGUI 00318 00319 #endif // __MYGUI_TAB_CONTROL_H__