MyGUI  3.0.1
MyGUI_Tab.h
Go to the documentation of this file.
1 
7 /*
8  This file is part of MyGUI.
9 
10  MyGUI is free software: you can redistribute it and/or modify
11  it under the terms of the GNU Lesser General Public License as published by
12  the Free Software Foundation, either version 3 of the License, or
13  (at your option) any later version.
14 
15  MyGUI is distributed in the hope that it will be useful,
16  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  GNU Lesser General Public License for more details.
19 
20  You should have received a copy of the GNU Lesser General Public License
21  along with MyGUI. If not, see <http://www.gnu.org/licenses/>.
22 */
23 #ifndef __MYGUI_TAB_H__
24 #define __MYGUI_TAB_H__
25 
26 #include "MyGUI_Prerequest.h"
27 #include "MyGUI_Widget.h"
28 #include "MyGUI_Any.h"
29 #include "MyGUI_EventPair.h"
31 
32 namespace MyGUI
33 {
34 
36 
37  class MYGUI_EXPORT Tab :
38  public Widget
39  {
40  // для уведобления об удалении
41  //FIXME
42  friend class TabItem;
43 
45 
46  public:
47  Tab();
48 
49  struct TabItemInfo
50  {
51  TabItemInfo(int _width, const UString& _name, TabItem* _item, Any _data) :
52  width(_width),
53  name(_name),
54  item(_item),
55  data(_data)
56  {
57  }
58 
59  int width;
63  };
64 
65  typedef std::vector<TabItemInfo> VectorTabItemInfo;
66 
68  virtual void setPosition(const IntPoint& _value);
70  virtual void setSize(const IntSize& _value);
72  virtual void setCoord(const IntCoord& _value);
73 
75  void setPosition(int _left, int _top) { setPosition(IntPoint(_left, _top)); }
77  void setSize(int _width, int _height) { setSize(IntSize(_width, _height)); }
79  void setCoord(int _left, int _top, int _width, int _height) { setCoord(IntCoord(_left, _top, _width, _height)); }
80 
81  //------------------------------------------------------------------------------//
82  // манипуляции айтемами
83 
85  size_t getItemCount() const { return mItemsInfo.size(); }
86 
88  TabItem* insertItemAt(size_t _index, const UString& _name, Any _data = Any::Null);
90  TabItem* insertItem(TabItem* _to, const UString& _name, Any _data = Any::Null)
91  {
92  return insertItemAt(getItemIndex(_to), _name, _data);
93  }
94 
96  TabItem* addItem(const UString& _name, Any _data = Any::Null)
97  {
98  return insertItemAt(ITEM_NONE, _name, _data);
99  }
100 
102  void removeItemAt(size_t _index);
104  void removeItem(TabItem* _item) { removeItemAt(getItemIndex(_item)); }
105 
107  void removeAllItems();
108 
109 
111  TabItem* getItemAt(size_t _index);
112 
114  size_t getItemIndex(TabItem* _item);
115 
117  size_t findItemIndex(TabItem* _item);
118 
120  size_t findItemIndexWith(const UString& _name);
121 
123  TabItem* findItemWith(const UString& _name);
124 
125 
126  //------------------------------------------------------------------------------//
127  // манипуляции выделениями
128 
130  size_t getIndexSelected() { return mIndexSelect; }
131 
133  TabItem* getItemSelected();
134 
136  void setIndexSelected(size_t _index);
137 
139  void setItemSelected(TabItem* _item) { setIndexSelected(getItemIndex(_item)); }
140 
141 
142  //------------------------------------------------------------------------------//
143  // манипуляции данными
144 
146  void setItemDataAt(size_t _index, Any _data);
148  void setItemData(TabItem* _item, Any _data) { setItemDataAt(getItemIndex(_item), _data); }
149 
151  void clearItemDataAt(size_t _index) { setItemDataAt(_index, Any::Null); }
153  void clearItemData(TabItem* _item) { clearItemDataAt(getItemIndex(_item)); }
154 
156  template <typename ValueType>
157  ValueType * getItemDataAt(size_t _index, bool _throw = true)
158  {
159  MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "Tab::getItemDataAt");
160  return mItemsInfo[_index].data.castType<ValueType>(_throw);
161  }
163  template <typename ValueType>
164  ValueType * getItemData(TabItem* _item, bool _throw = true)
165  {
166  return getItemDataAt<ValueType>(getItemIndex(_item), _throw);
167  }
168 
169 
170  //------------------------------------------------------------------------------//
171  // манипуляции отображением
172 
174  void setItemNameAt(size_t _index, const UString& _name);
175 
177  void setItemName(TabItem* _item, const UString& _name) { setItemNameAt(getItemIndex(_item), _name); }
178 
180  const UString& getItemNameAt(size_t _index);
181 
183  const UString& getItemName(TabItem* _item) { return getItemNameAt(getItemIndex(_item)); }
184 
185 
186  //------------------------------------------------------------------------------//
187  // манипуляции выдимостью
188 
190  void beginToItemAt(size_t _index);
191 
193  void beginToItem(TabItem* _item) { beginToItemAt(getItemIndex(_item)); }
194 
196  void beginToItemFirst() { if (getItemCount()) beginToItemAt(0); }
197 
199  void beginToItemLast() { if (getItemCount()) beginToItemAt(getItemCount() - 1); }
200 
202  void beginToItemSelected() { if (getIndexSelected() != ITEM_NONE) beginToItemAt(getIndexSelected()); }
203 
204 
205  //------------------------------------------------------------------------------//
206  // остальные манипуляции
207 
209  void setButtonWidthAt(size_t _index, int _width = DEFAULT);
211  void setButtonWidth(TabItem* _item, int _width = DEFAULT) { setButtonWidthAt(getItemIndex(_item), _width); }
212 
214  int getButtonWidthAt(size_t _index);
216  int getButtonWidth(TabItem* _item) { return getButtonWidthAt(getItemIndex(_item)); }
217 
218  //------------------------------------------------------------------------------//
219 
221  void setButtonDefaultWidth(int _value);
223  int getButtonDefaultWidth() { return mButtonDefaultWidth; }
224 
226  void setButtonAutoWidth(bool _value);
228  bool getButtonAutoWidth() { return mButtonAutoWidth; }
229 
231  void setSmoothShow(bool _value) { mSmoothShow = _value; }
233  bool getSmoothShow() { return mSmoothShow; }
234 
236  virtual void setProperty(const std::string& _key, const std::string& _value);
237 
238  /*event:*/
245 
246  /*internal:*/
247  virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name);
248 
249  /*obsolete:*/
250 #ifndef MYGUI_DONT_USE_OBSOLETE
251 
252  MYGUI_OBSOLETE("use : void Widget::setCoord(const IntCoord& _coord)")
253  void setPosition(const IntCoord& _coord) { setCoord(_coord); }
254  MYGUI_OBSOLETE("use : void Widget::setCoord(int _left, int _top, int _width, int _height)")
255  void setPosition(int _left, int _top, int _width, int _height) { setCoord(_left, _top, _width, _height); }
256 
257  MYGUI_OBSOLETE("use : int Tab::getButtonWidthAt(size_t _index)")
258  int getSheetButtonWidthIndex(size_t _index) { return getButtonWidthAt(_index); }
259  MYGUI_OBSOLETE("use : int Tab::getButtonWidth(TabItem* _item)")
260  int getSheetButtonWidth(TabItem* _sheet) { return getButtonWidth(_sheet); }
261  MYGUI_OBSOLETE("use : void Tab::setButtonWidthAt(size_t _index, int _width)")
262  void setSheetButtonWidthIndex(size_t _index, int _width = DEFAULT) { setButtonWidthAt(_index, _width); }
263  MYGUI_OBSOLETE("use : void Tab::setButtonWidth(TabItem* _item, int _width)")
264  void setSheetButtonWidth(TabItem* _sheet, int _width = DEFAULT) { setButtonWidth(_sheet, _width); }
265  MYGUI_OBSOLETE("use : void Tab::beginToItemAt(size_t _index)")
266  void showBarButton(size_t _index) { beginToItemAt(_index); }
267  MYGUI_OBSOLETE("use : void Tab::beginToItemSelected()")
268  void showBarSelectButton() { beginToItemSelected(); }
269  MYGUI_OBSOLETE("use : size_t Tab::getItemCount()")
270  size_t getSheetCount() { return getItemCount(); }
271  MYGUI_OBSOLETE("use : const UString& Tab::getItemName(TabItem* _item)")
272  const UString& getSheetName(TabItem* _sheet) { return getItemName(_sheet); }
273  MYGUI_OBSOLETE("use : const UString& Tab::getItemNameAt(size_t _index)")
274  const UString& getSheetNameIndex(size_t _index) { return getItemNameAt(_index); }
275  MYGUI_OBSOLETE("use : TabItem* Tab::getItemAt(size_t _index)")
276  TabItem* getSheet(size_t _index) { return getItemAt(_index); }
277  MYGUI_OBSOLETE("use : void Tab::setItemNameAt(size_t _index, const UString& _name)")
278  void setSheetNameIndex(size_t _index, const UString& _name, int _width = DEFAULT) { setItemNameAt(_index, _name); }
279  MYGUI_OBSOLETE("use : void Tab::setItemName(TabItem* _item, const UString& _name)")
280  void setSheetName(TabItem* _sheet, const UString& _name, int _width = DEFAULT) { setItemName(_sheet, _name); }
281  MYGUI_OBSOLETE("use : TabItem* Tab::addItem(const UString& _name, Any _data)")
282  TabItem* addSheet(const UString& _name, int _width = DEFAULT) { return addItem(_name, _width); }
283  MYGUI_OBSOLETE("use : TabItem* Tab::insertItemAt(size_t _index, const UString& _name, Any _data)")
284  TabItem* insertSheet(size_t _index, const UString& _name, int _width = DEFAULT) { return insertItemAt(_index, _name); }
285  MYGUI_OBSOLETE("use : void Tab::removeItemAt(size_t _index)")
286  void removeSheetIndex(size_t _index) { removeItemAt(_index); }
287  MYGUI_OBSOLETE("use : void Tab::removeItem(TabItem* _item)")
288  void removeSheet(TabItem* _sheet) { removeItem(_sheet); }
289  MYGUI_OBSOLETE("use : void Tab::setIndexSelected(size_t _index)")
290  void selectSheetIndex(size_t _index, bool _smooth = true) { setIndexSelected(_index); }
291  MYGUI_OBSOLETE("use : void Tab::setItemSelected(TabItem* _item)")
292  void selectSheet(TabItem* _sheet, bool _smooth = true) { setItemSelected(_sheet); }
293  MYGUI_OBSOLETE("use : size_t Tab::getIndexSelected()")
294  size_t getSelectSheetIndex() { return getIndexSelected(); }
295 
296  MYGUI_OBSOLETE("use : size_t Widget::getIndexSelected()")
297  size_t getItemIndexSelected() { return getIndexSelected(); }
298  MYGUI_OBSOLETE("use : void Widget::setIndexSelected(size_t _index)")
299  void setItemSelectedAt(size_t _index) { setIndexSelected(_index); }
300 
301 #endif // MYGUI_DONT_USE_OBSOLETE
302 
303  protected:
304  virtual ~Tab();
305 
306  void baseChangeWidgetSkin(ResourceSkin* _info);
307 
308  // переопределяем для особого обслуживания страниц
309  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);
310 
311  void updateBar();
312 
313  void notifyPressedButtonEvent(MyGUI::Widget* _sender);
314  void notifyPressedBarButtonEvent(MyGUI::Widget* _sender);
315 
316  int _getTextWidth(const UString& _text);
317 
318  void _showItem(TabItem* _sheet, bool _show, bool _smooth);
319 
320  void _createItemButton();
321 
322  void _insertItem(size_t _index, const UString& _name, TabItem* _sheet, Any _data);
323 
324  // вкладка при удалении уведомляет таб
325  void _notifyDeleteItem(TabItem* _item);
326 
327  private:
328  void initialiseWidgetSkin(ResourceSkin* _info);
329  void shutdownWidgetSkin();
330  void actionWidgetHide(Widget* _widget);
331 
332  ControllerFadeAlpha* createControllerFadeAlpha(float _alpha, float _coef, bool _enable);
333 
334  Widget* _getWidgetTemplate();
335  Widget* _getWidgetBar();
336 
337  private:
338  int mOffsetTab; // смещение бара при показе кнопок
339  bool mButtonShow;
340  int mWidthBar; // ширина в которую помещаються все кнопки
341  VectorWidgetPtr mItemButton; // список кнопок, не должно равно списку страниц
342  std::string mButtonSkinName, mEmptySkinName;
343 
344  Widget* mWidgetBar;
345  Button* mButtonLeft;
346  Button* mButtonRight;
347  Button* mButtonList;
348  Widget* mButtonDecor;
349  VectorWidgetPtr mWidgetsPatch; // список виджетов которые нужно показать при показе кнопки
350  Widget* mEmptyBarWidget;
351  Widget* mItemTemplate;
352 
353  // информация о вкладках
354  VectorTabItemInfo mItemsInfo;
355  size_t mStartIndex;
356  size_t mIndexSelect;
357 
358  int mButtonDefaultWidth;
359  bool mSmoothShow;
360  bool mButtonAutoWidth;
361 
362  // флаг, чтобы отсеч уведомления от вкладок, при общем шутдауне виджета
363  bool mShutdown;
364 
365  };
366 
367 } // namespace MyGUI
368 
369 #endif // __MYGUI_TAB_H__