MyGUI 3.0.1
|
00001 00007 /* 00008 This file is part of MyGUI. 00009 00010 MyGUI is free software: you can redistribute it and/or modify 00011 it under the terms of the GNU Lesser General Public License as published by 00012 the Free Software Foundation, either version 3 of the License, or 00013 (at your option) any later version. 00014 00015 MyGUI is distributed in the hope that it will be useful, 00016 but WITHOUT ANY WARRANTY; without even the implied warranty of 00017 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00018 GNU Lesser General Public License for more details. 00019 00020 You should have received a copy of the GNU Lesser General Public License 00021 along with MyGUI. If not, see <http://www.gnu.org/licenses/>. 00022 */ 00023 #ifndef __MYGUI_TAB_H__ 00024 #define __MYGUI_TAB_H__ 00025 00026 #include "MyGUI_Prerequest.h" 00027 #include "MyGUI_Widget.h" 00028 #include "MyGUI_Any.h" 00029 #include "MyGUI_EventPair.h" 00030 #include "MyGUI_ControllerFadeAlpha.h" 00031 00032 namespace MyGUI 00033 { 00034 00035 typedef delegates::CDelegate2<Tab*, size_t> EventHandle_TabPtrSizeT; 00036 00037 class MYGUI_EXPORT Tab : 00038 public Widget 00039 { 00040 // для уведобления об удалении 00041 //FIXME 00042 friend class TabItem; 00043 00044 MYGUI_RTTI_DERIVED( Tab ) 00045 00046 public: 00047 Tab(); 00048 00049 struct TabItemInfo 00050 { 00051 TabItemInfo(int _width, const UString& _name, TabItem* _item, Any _data) : 00052 width(_width), 00053 name(_name), 00054 item(_item), 00055 data(_data) 00056 { 00057 } 00058 00059 int width; 00060 UString name; 00061 TabItem* item; 00062 Any data; 00063 }; 00064 00065 typedef std::vector<TabItemInfo> VectorTabItemInfo; 00066 00068 virtual void setPosition(const IntPoint& _value); 00070 virtual void setSize(const IntSize& _value); 00072 virtual void setCoord(const IntCoord& _value); 00073 00075 void setPosition(int _left, int _top) { setPosition(IntPoint(_left, _top)); } 00077 void setSize(int _width, int _height) { setSize(IntSize(_width, _height)); } 00079 void setCoord(int _left, int _top, int _width, int _height) { setCoord(IntCoord(_left, _top, _width, _height)); } 00080 00081 //------------------------------------------------------------------------------// 00082 // манипуляции айтемами 00083 00085 size_t getItemCount() const { return mItemsInfo.size(); } 00086 00088 TabItem* insertItemAt(size_t _index, const UString& _name, Any _data = Any::Null); 00090 TabItem* insertItem(TabItem* _to, const UString& _name, Any _data = Any::Null) 00091 { 00092 return insertItemAt(getItemIndex(_to), _name, _data); 00093 } 00094 00096 TabItem* addItem(const UString& _name, Any _data = Any::Null) 00097 { 00098 return insertItemAt(ITEM_NONE, _name, _data); 00099 } 00100 00102 void removeItemAt(size_t _index); 00104 void removeItem(TabItem* _item) { removeItemAt(getItemIndex(_item)); } 00105 00107 void removeAllItems(); 00108 00109 00111 TabItem* getItemAt(size_t _index); 00112 00114 size_t getItemIndex(TabItem* _item); 00115 00117 size_t findItemIndex(TabItem* _item); 00118 00120 size_t findItemIndexWith(const UString& _name); 00121 00123 TabItem* findItemWith(const UString& _name); 00124 00125 00126 //------------------------------------------------------------------------------// 00127 // манипуляции выделениями 00128 00130 size_t getIndexSelected() { return mIndexSelect; } 00131 00133 TabItem* getItemSelected(); 00134 00136 void setIndexSelected(size_t _index); 00137 00139 void setItemSelected(TabItem* _item) { setIndexSelected(getItemIndex(_item)); } 00140 00141 00142 //------------------------------------------------------------------------------// 00143 // манипуляции данными 00144 00146 void setItemDataAt(size_t _index, Any _data); 00148 void setItemData(TabItem* _item, Any _data) { setItemDataAt(getItemIndex(_item), _data); } 00149 00151 void clearItemDataAt(size_t _index) { setItemDataAt(_index, Any::Null); } 00153 void clearItemData(TabItem* _item) { clearItemDataAt(getItemIndex(_item)); } 00154 00156 template <typename ValueType> 00157 ValueType * getItemDataAt(size_t _index, bool _throw = true) 00158 { 00159 MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "Tab::getItemDataAt"); 00160 return mItemsInfo[_index].data.castType<ValueType>(_throw); 00161 } 00163 template <typename ValueType> 00164 ValueType * getItemData(TabItem* _item, bool _throw = true) 00165 { 00166 return getItemDataAt<ValueType>(getItemIndex(_item), _throw); 00167 } 00168 00169 00170 //------------------------------------------------------------------------------// 00171 // манипуляции отображением 00172 00174 void setItemNameAt(size_t _index, const UString& _name); 00175 00177 void setItemName(TabItem* _item, const UString& _name) { setItemNameAt(getItemIndex(_item), _name); } 00178 00180 const UString& getItemNameAt(size_t _index); 00181 00183 const UString& getItemName(TabItem* _item) { return getItemNameAt(getItemIndex(_item)); } 00184 00185 00186 //------------------------------------------------------------------------------// 00187 // манипуляции выдимостью 00188 00190 void beginToItemAt(size_t _index); 00191 00193 void beginToItem(TabItem* _item) { beginToItemAt(getItemIndex(_item)); } 00194 00196 void beginToItemFirst() { if (getItemCount()) beginToItemAt(0); } 00197 00199 void beginToItemLast() { if (getItemCount()) beginToItemAt(getItemCount() - 1); } 00200 00202 void beginToItemSelected() { if (getIndexSelected() != ITEM_NONE) beginToItemAt(getIndexSelected()); } 00203 00204 00205 //------------------------------------------------------------------------------// 00206 // остальные манипуляции 00207 00209 void setButtonWidthAt(size_t _index, int _width = DEFAULT); 00211 void setButtonWidth(TabItem* _item, int _width = DEFAULT) { setButtonWidthAt(getItemIndex(_item), _width); } 00212 00214 int getButtonWidthAt(size_t _index); 00216 int getButtonWidth(TabItem* _item) { return getButtonWidthAt(getItemIndex(_item)); } 00217 00218 //------------------------------------------------------------------------------// 00219 00221 void setButtonDefaultWidth(int _value); 00223 int getButtonDefaultWidth() { return mButtonDefaultWidth; } 00224 00226 void setButtonAutoWidth(bool _value); 00228 bool getButtonAutoWidth() { return mButtonAutoWidth; } 00229 00231 void setSmoothShow(bool _value) { mSmoothShow = _value; } 00233 bool getSmoothShow() { return mSmoothShow; } 00234 00236 virtual void setProperty(const std::string& _key, const std::string& _value); 00237 00238 /*event:*/ 00244 EventPair<EventHandle_WidgetSizeT, EventHandle_TabPtrSizeT> eventTabChangeSelect; 00245 00246 /*internal:*/ 00247 virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name); 00248 00249 /*obsolete:*/ 00250 #ifndef MYGUI_DONT_USE_OBSOLETE 00251 00252 MYGUI_OBSOLETE("use : void Widget::setCoord(const IntCoord& _coord)") 00253 void setPosition(const IntCoord& _coord) { setCoord(_coord); } 00254 MYGUI_OBSOLETE("use : void Widget::setCoord(int _left, int _top, int _width, int _height)") 00255 void setPosition(int _left, int _top, int _width, int _height) { setCoord(_left, _top, _width, _height); } 00256 00257 MYGUI_OBSOLETE("use : int Tab::getButtonWidthAt(size_t _index)") 00258 int getSheetButtonWidthIndex(size_t _index) { return getButtonWidthAt(_index); } 00259 MYGUI_OBSOLETE("use : int Tab::getButtonWidth(TabItem* _item)") 00260 int getSheetButtonWidth(TabItem* _sheet) { return getButtonWidth(_sheet); } 00261 MYGUI_OBSOLETE("use : void Tab::setButtonWidthAt(size_t _index, int _width)") 00262 void setSheetButtonWidthIndex(size_t _index, int _width = DEFAULT) { setButtonWidthAt(_index, _width); } 00263 MYGUI_OBSOLETE("use : void Tab::setButtonWidth(TabItem* _item, int _width)") 00264 void setSheetButtonWidth(TabItem* _sheet, int _width = DEFAULT) { setButtonWidth(_sheet, _width); } 00265 MYGUI_OBSOLETE("use : void Tab::beginToItemAt(size_t _index)") 00266 void showBarButton(size_t _index) { beginToItemAt(_index); } 00267 MYGUI_OBSOLETE("use : void Tab::beginToItemSelected()") 00268 void showBarSelectButton() { beginToItemSelected(); } 00269 MYGUI_OBSOLETE("use : size_t Tab::getItemCount()") 00270 size_t getSheetCount() { return getItemCount(); } 00271 MYGUI_OBSOLETE("use : const UString& Tab::getItemName(TabItem* _item)") 00272 const UString& getSheetName(TabItem* _sheet) { return getItemName(_sheet); } 00273 MYGUI_OBSOLETE("use : const UString& Tab::getItemNameAt(size_t _index)") 00274 const UString& getSheetNameIndex(size_t _index) { return getItemNameAt(_index); } 00275 MYGUI_OBSOLETE("use : TabItem* Tab::getItemAt(size_t _index)") 00276 TabItem* getSheet(size_t _index) { return getItemAt(_index); } 00277 MYGUI_OBSOLETE("use : void Tab::setItemNameAt(size_t _index, const UString& _name)") 00278 void setSheetNameIndex(size_t _index, const UString& _name, int _width = DEFAULT) { setItemNameAt(_index, _name); } 00279 MYGUI_OBSOLETE("use : void Tab::setItemName(TabItem* _item, const UString& _name)") 00280 void setSheetName(TabItem* _sheet, const UString& _name, int _width = DEFAULT) { setItemName(_sheet, _name); } 00281 MYGUI_OBSOLETE("use : TabItem* Tab::addItem(const UString& _name, Any _data)") 00282 TabItem* addSheet(const UString& _name, int _width = DEFAULT) { return addItem(_name, _width); } 00283 MYGUI_OBSOLETE("use : TabItem* Tab::insertItemAt(size_t _index, const UString& _name, Any _data)") 00284 TabItem* insertSheet(size_t _index, const UString& _name, int _width = DEFAULT) { return insertItemAt(_index, _name); } 00285 MYGUI_OBSOLETE("use : void Tab::removeItemAt(size_t _index)") 00286 void removeSheetIndex(size_t _index) { removeItemAt(_index); } 00287 MYGUI_OBSOLETE("use : void Tab::removeItem(TabItem* _item)") 00288 void removeSheet(TabItem* _sheet) { removeItem(_sheet); } 00289 MYGUI_OBSOLETE("use : void Tab::setIndexSelected(size_t _index)") 00290 void selectSheetIndex(size_t _index, bool _smooth = true) { setIndexSelected(_index); } 00291 MYGUI_OBSOLETE("use : void Tab::setItemSelected(TabItem* _item)") 00292 void selectSheet(TabItem* _sheet, bool _smooth = true) { setItemSelected(_sheet); } 00293 MYGUI_OBSOLETE("use : size_t Tab::getIndexSelected()") 00294 size_t getSelectSheetIndex() { return getIndexSelected(); } 00295 00296 MYGUI_OBSOLETE("use : size_t Widget::getIndexSelected()") 00297 size_t getItemIndexSelected() { return getIndexSelected(); } 00298 MYGUI_OBSOLETE("use : void Widget::setIndexSelected(size_t _index)") 00299 void setItemSelectedAt(size_t _index) { setIndexSelected(_index); } 00300 00301 #endif // MYGUI_DONT_USE_OBSOLETE 00302 00303 protected: 00304 virtual ~Tab(); 00305 00306 void baseChangeWidgetSkin(ResourceSkin* _info); 00307 00308 // переопределяем для особого обслуживания страниц 00309 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); 00310 00311 void updateBar(); 00312 00313 void notifyPressedButtonEvent(MyGUI::Widget* _sender); 00314 void notifyPressedBarButtonEvent(MyGUI::Widget* _sender); 00315 00316 int _getTextWidth(const UString& _text); 00317 00318 void _showItem(TabItem* _sheet, bool _show, bool _smooth); 00319 00320 void _createItemButton(); 00321 00322 void _insertItem(size_t _index, const UString& _name, TabItem* _sheet, Any _data); 00323 00324 // вкладка при удалении уведомляет таб 00325 void _notifyDeleteItem(TabItem* _item); 00326 00327 private: 00328 void initialiseWidgetSkin(ResourceSkin* _info); 00329 void shutdownWidgetSkin(); 00330 void actionWidgetHide(Widget* _widget); 00331 00332 ControllerFadeAlpha* createControllerFadeAlpha(float _alpha, float _coef, bool _enable); 00333 00334 Widget* _getWidgetTemplate(); 00335 Widget* _getWidgetBar(); 00336 00337 private: 00338 int mOffsetTab; // смещение бара при показе кнопок 00339 bool mButtonShow; 00340 int mWidthBar; // ширина в которую помещаються все кнопки 00341 VectorWidgetPtr mItemButton; // список кнопок, не должно равно списку страниц 00342 std::string mButtonSkinName, mEmptySkinName; 00343 00344 Widget* mWidgetBar; 00345 Button* mButtonLeft; 00346 Button* mButtonRight; 00347 Button* mButtonList; 00348 Widget* mButtonDecor; 00349 VectorWidgetPtr mWidgetsPatch; // список виджетов которые нужно показать при показе кнопки 00350 Widget* mEmptyBarWidget; 00351 Widget* mItemTemplate; 00352 00353 // информация о вкладках 00354 VectorTabItemInfo mItemsInfo; 00355 size_t mStartIndex; 00356 size_t mIndexSelect; 00357 00358 int mButtonDefaultWidth; 00359 bool mSmoothShow; 00360 bool mButtonAutoWidth; 00361 00362 // флаг, чтобы отсеч уведомления от вкладок, при общем шутдауне виджета 00363 bool mShutdown; 00364 00365 }; 00366 00367 } // namespace MyGUI 00368 00369 #endif // __MYGUI_TAB_H__