MyGUI  3.0.1
MyGUI_Tab.cpp
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 #include "MyGUI_Precompiled.h"
24 #include "MyGUI_Tab.h"
26 #include "MyGUI_WidgetManager.h"
27 #include "MyGUI_Button.h"
28 #include "MyGUI_TabItem.h"
29 #include "MyGUI_ResourceSkin.h"
30 
31 namespace MyGUI
32 {
33 
34  const float TAB_SPEED_FADE_COEF = 5.0f;
35 
37  mOffsetTab(0),
38  mButtonShow(false),
39  mWidthBar(0),
40  mWidgetBar(nullptr),
41  mButtonLeft(nullptr),
42  mButtonRight(nullptr),
43  mButtonList(nullptr),
44  mButtonDecor(nullptr),
45  mEmptyBarWidget(nullptr),
46  mItemTemplate(nullptr),
47  mStartIndex(0),
48  mIndexSelect(ITEM_NONE),
49  mButtonDefaultWidth(1),
50  mSmoothShow(true),
51  mButtonAutoWidth(true),
52  mShutdown(false)
53  {
54  }
55 
56  void Tab::_initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name)
57  {
58  Base::_initialise(_style, _coord, _align, _info, _parent, _croppedParent, _creator, _name);
59 
60  initialiseWidgetSkin(_info);
61  }
62 
64  {
65  mShutdown = true;
66  shutdownWidgetSkin();
67  }
68 
70  {
71  shutdownWidgetSkin();
73  initialiseWidgetSkin(_info);
74  }
75 
76  void Tab::initialiseWidgetSkin(ResourceSkin* _info)
77  {
78  // парсим свойства
79  const MapString& properties = _info->getProperties();
80  if (!properties.empty())
81  {
82  MapString::const_iterator iter = properties.find("OffsetBar");
83  if (iter != properties.end()) mOffsetTab = utility::parseInt(iter->second);
84 
85  iter = properties.find("ButtonSkin");
86  if (iter != properties.end()) mButtonSkinName = iter->second;
87  iter = properties.find("EmptyBarSkin");
88  if (iter != properties.end()) mEmptySkinName = iter->second;
89  }
90 
91  for (VectorWidgetPtr::iterator iter=mWidgetChildSkin.begin(); iter!=mWidgetChildSkin.end(); ++iter)
92  {
93  if (*(*iter)->_getInternalData<std::string>() == "Bar")
94  {
95  MYGUI_DEBUG_ASSERT( ! mWidgetBar, "widget already assigned");
96  mWidgetBar = (*iter);
97  }
98  else if (*(*iter)->_getInternalData<std::string>() == "Left")
99  {
100  MYGUI_DEBUG_ASSERT( ! mButtonLeft, "widget already assigned");
101  mButtonLeft = (*iter)->castType<Button>();
102  mButtonLeft->setVisible(false);
104  }
105  else if (*(*iter)->_getInternalData<std::string>() == "Right")
106  {
107  MYGUI_DEBUG_ASSERT( ! mButtonRight, "widget already assigned");
108  mButtonRight = (*iter)->castType<Button>();
109  mButtonRight->setVisible(false);
111  }
112  else if (*(*iter)->_getInternalData<std::string>() == "List")
113  {
114  MYGUI_DEBUG_ASSERT( ! mButtonList, "widget already assigned");
115  mButtonList = (*iter)->castType<Button>();
116  mButtonList->setVisible(false);
118  }
119  else if (*(*iter)->_getInternalData<std::string>() == "ButtonDecor")
120  {
121  MYGUI_DEBUG_ASSERT( ! mButtonDecor, "widget already assigned");
122  mButtonDecor = *iter;
123  mButtonDecor->setVisible(false);
124  }
125  else if (*(*iter)->_getInternalData<std::string>() == "ShowPatch")
126  {
127  mWidgetsPatch.push_back((*iter));
128  (*iter)->setVisible(false);
129  }
130  else if ((*(*iter)->_getInternalData<std::string>() == "Sheet") || (*(*iter)->_getInternalData<std::string>() == "TabItem"))
131  {
132  MYGUI_DEBUG_ASSERT( ! mItemTemplate, "widget already assigned");
133  mItemTemplate = (*iter);
134  mItemTemplate->setVisible(false);
135  }
136  }
137  //MYGUI_ASSERT(nullptr != mWidgetBar, "Child Widget Bar not found in skin (Tab must have Bar)");
138  //MYGUI_ASSERT(nullptr != mItemTemplate, "Child Widget TabItem not found in skin (Tab must have TabItem (Sheet) )");
139 
140  // создаем виджет, носитель скина пустоты бара
141  mEmptyBarWidget = _getWidgetBar()->createWidget<Widget>(mEmptySkinName, IntCoord(), Align::Left | Align::Top);
142 
143  updateBar();
144  }
145 
146  void Tab::shutdownWidgetSkin()
147  {
148  mWidgetsPatch.clear();
149  mWidgetBar = nullptr;
150  mButtonLeft = nullptr;
151  mButtonRight = nullptr;
152  mButtonList = nullptr;
153  mButtonDecor = nullptr;
154  mItemTemplate = nullptr;
155  mEmptyBarWidget = nullptr;
156  }
157 
158 
159  // переопределяем для особого обслуживания страниц
160  Widget* Tab::baseCreateWidget(WidgetStyle _style, const std::string& _type, const std::string& _skin, const IntCoord& _coord, Align _align, const std::string& _layer, const std::string& _name)
161  {
162  if ((TabItem::getClassTypeName() == _type) || ("Sheet" == _type))
163  {
164  TabItem* sheet = static_cast<TabItem*>(Base::baseCreateWidget(_style, TabItem::getClassTypeName(), "Default", _getWidgetTemplate()->getCoord(), _getWidgetTemplate()->getAlign(), "", _name));
165  _insertItem(ITEM_NONE, _name, sheet, Any::Null);
166 
167  return sheet;
168  }
169  return Base::baseCreateWidget(_style, _type, _skin, _coord, _align, _layer, _name);
170  }
171 
172  TabItem* Tab::insertItemAt(size_t _index, const UString& _name, Any _data)
173  {
174  MYGUI_ASSERT_RANGE_INSERT(_index, mItemsInfo.size(), "Tab::insertItem");
175 
176  TabItem* sheet = static_cast<TabItem*>(Base::baseCreateWidget(WidgetStyle::Child, TabItem::getClassTypeName(), "Default", _getWidgetTemplate()->getCoord(), _getWidgetTemplate()->getAlign(), "", ""));
177  _insertItem(_index, _name, sheet, _data);
178 
179  return sheet;
180  }
181 
182  void Tab::setPosition(const IntPoint& _point)
183  {
184  Base::setPosition(_point);
185 
186  updateBar();
187  }
188 
189  void Tab::setSize(const IntSize& _size)
190  {
191  Base::setSize(_size);
192 
193  updateBar();
194  }
195 
196  void Tab::setCoord(const IntCoord& _coord)
197  {
198  Base::setCoord(_coord);
199 
200  updateBar();
201  }
202 
204  {
205  // подстраховка
206  if (_getWidgetBar()->getWidth() < 1) return;
207 
208  if ((_getWidgetBar()->getWidth() < mWidthBar) && (1 < mItemsInfo.size()))
209  {
210  if (!mButtonShow)
211  {
212  mButtonShow = true;
213  if (nullptr != mButtonLeft) mButtonLeft->setVisible(true);
214  if (nullptr != mButtonRight) mButtonRight->setVisible(true);
215  if (nullptr != mButtonList) mButtonList->setVisible(true);
216  if (nullptr != mButtonDecor) mButtonDecor->setVisible(true);
217  for (VectorWidgetPtr::iterator iter=mWidgetsPatch.begin(); iter!=mWidgetsPatch.end(); ++iter) (*iter)->setVisible(true);
218  if (mWidgetBar != nullptr)
219  mWidgetBar->setSize(mWidgetBar->getWidth() - mOffsetTab, mWidgetBar->getHeight());
220  }
221  }
222  else
223  {
224  if (mButtonShow)
225  {
226  mButtonShow = false;
227  if (nullptr != mButtonLeft) mButtonLeft->setVisible(false);
228  if (nullptr != mButtonRight) mButtonRight->setVisible(false);
229  if (nullptr != mButtonList) mButtonList->setVisible(false);
230  if (nullptr != mButtonDecor) mButtonDecor->setVisible(false);
231  for (VectorWidgetPtr::iterator iter=mWidgetsPatch.begin(); iter!=mWidgetsPatch.end(); ++iter) (*iter)->setVisible(false);
232  if (mWidgetBar != nullptr)
233  mWidgetBar->setSize(mWidgetBar->getWidth() + mOffsetTab, mWidgetBar->getHeight());
234  }
235  }
236 
237  // проверяем правильность стартового индекса
238  if (mStartIndex > 0)
239  {
240  // считаем длинну видимых кнопок
241  int width = 0;
242  for (size_t pos=mStartIndex; pos<mItemsInfo.size(); pos++) width += mItemsInfo[pos].width;
243 
244  // уменьшаем индекс до тех пор пока кнопка до индекста полностью не влезет в бар
245  while ((mStartIndex > 0) && ((width + mItemsInfo[mStartIndex-1].width) <= _getWidgetBar()->getWidth()))
246  {
247  mStartIndex--;
248  width += mItemsInfo[mStartIndex].width;
249  }
250  }
251 
252  // проверяем и обновляем бар
253  int width = 0;
254  size_t count = 0;
255  size_t pos=mStartIndex;
256  for (; pos<mItemsInfo.size(); pos++)
257  {
258  // текущая кнопка не влазиет
259  if (width > _getWidgetBar()->getWidth()) break;
260 
261  // следующая не влазиет
262  TabItemInfo& info = mItemsInfo[pos];
263  if ((width + info.width) > _getWidgetBar()->getWidth())
264  {
265  break;
266  }
267 
268  // проверяем физическое наличие кнопки
269  if (count >= mItemButton.size()) _createItemButton();
270 
271  // если кнопка не соответствует, то изменяем ее
272  Button* button = mItemButton[count]->castType<Button>();
273  button->setVisible(true);
274 
275  // корректируем нажатость кнопки
276  button->setButtonPressed(pos == mIndexSelect);
277 
278  if (button->getCaption() != info.name)
279  button->setCaption(info.name);
280  // положение кнопки
281  IntCoord coord(width, 0, info.width, _getWidgetBar()->getHeight());
282  if (coord != button->getCoord())
283  button->setCoord(coord);
284 
285  width += info.width;
286  count ++;
287  }
288 
289  // скрываем кнопки что были созданны, но не видны
290  while (count < mItemButton.size())
291  {
292  mItemButton[count]->setVisible(false);
293  count ++;
294  }
295 
296  bool right = true;
297  if (pos == mItemsInfo.size()) right = false;
298 
299  // корректируем виджет для пустоты
300  if (width < _getWidgetBar()->getWidth())
301  {
302  mEmptyBarWidget->setVisible(true);
303  mEmptyBarWidget->setCoord(width, 0, _getWidgetBar()->getWidth() - width, _getWidgetBar()->getHeight());
304  }
305  else
306  {
307  mEmptyBarWidget->setVisible(false);
308  }
309 
310  // корректируем доступность стрелок
311  if (mStartIndex == 0)
312  {
313  if (nullptr != mButtonLeft) mButtonLeft->setEnabled(false);
314  }
315  else
316  {
317  if (nullptr != mButtonLeft) mButtonLeft->setEnabled(true);
318  }
319 
320  if (right)
321  {
322  if (nullptr != mButtonRight) mButtonRight->setEnabled(true);
323  }
324  else
325  {
326  if (nullptr != mButtonRight) mButtonRight->setEnabled(false);
327  }
328 
329  }
330 
332  {
333  if (_sender == mButtonLeft)
334  {
335  if (mStartIndex > 0)
336  {
337  mStartIndex --;
338  updateBar();
339  }
340  }
341  else if (_sender == mButtonRight)
342  {
343  if ((mStartIndex+1) < mItemsInfo.size())
344  {
345  mStartIndex ++;
346  // в updateBar() будет подкорректированно если что
347  updateBar();
348  }
349  }
350  else if (_sender == mButtonList)
351  {
352  }
353  }
354 
356  {
357  size_t select = *_sender->_getInternalData<size_t>() + mStartIndex;
358  // щелкнули по той же кнопке
359  if (select == mIndexSelect)
360  {
361  // стараемся показать выделенную кнопку
363  return;
364  }
365  size_t old = mIndexSelect;
366  mIndexSelect = select;
367 
368  size_t count = 0;
369  for (size_t pos=0; pos<mItemButton.size(); pos++)
370  {
371  Button* button = mItemButton[count]->castType<Button>();
372  if (button->isVisible())
373  {
374  // корректируем нажатость кнопки
375  button->setButtonPressed((pos + mStartIndex) == mIndexSelect);
376  }
377  count ++;
378  }
379 
380  // стараемся показать выделенную кнопку
382 
383  // поднимаем страницу для пикинга
384  _forcePeek(mItemsInfo[mIndexSelect].item);
385 
386  _showItem(mItemsInfo[mIndexSelect].item, true, mSmoothShow);
387  _showItem(mItemsInfo[old].item, false, mSmoothShow);
388 
389  eventTabChangeSelect(this, mIndexSelect);
390  }
391 
392  void Tab::beginToItemAt(size_t _index)
393  {
394  MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "Tab::beginToItemAt");
395 
396  // подстраховка
397  if (_getWidgetBar()->getWidth() < 1) return;
398 
399  if (_index == mStartIndex) return;
400  else if (_index < mStartIndex)
401  {
402  mStartIndex = _index;
403  updateBar();
404  }
405  else
406  {
407  // длинна бара от старт индекса до нужной включительно
408  int width = 0;
409  for (size_t pos=mStartIndex; pos<=_index; pos++)
410  {
411  width += mItemsInfo[pos].width;
412  }
413 
414  // уменьшем старт индекс пока не появиться нужная
415  bool change = false;
416  while ((mStartIndex < _index) && (width > _getWidgetBar()->getWidth()))
417  {
418  width -= mItemsInfo[mStartIndex].width;
419  mStartIndex ++;
420  change = true;
421  }
422  if (change) updateBar();
423 
424  }
425  }
426 
427  void Tab::setButtonDefaultWidth(int _width)
428  {
429  mButtonDefaultWidth = _width;
430  if (mButtonDefaultWidth < 1) mButtonDefaultWidth = 1;
431  setButtonAutoWidth(false);
432  }
433 
434  void Tab::setButtonAutoWidth(bool _auto)
435  {
436  mButtonAutoWidth = _auto;
437 
438  for (size_t pos=0; pos<mItemsInfo.size(); pos++)
439  {
440  int width;
441  if (mButtonAutoWidth) width = _getTextWidth(mItemsInfo[pos].name);
442  else width = mButtonDefaultWidth;
443 
444  mWidthBar += width - mItemsInfo[pos].width;
445  mItemsInfo[pos].width = width;
446  }
447 
448  updateBar();
449  }
450 
451  void Tab::setButtonWidthAt(size_t _index, int _width)
452  {
453  MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "Tab::setButtonWidthAt");
454 
455  if (_width <= 0)
456  {
457  if (mButtonAutoWidth) _width = _getTextWidth(mItemsInfo[_index].name);
458  else _width = mButtonDefaultWidth;
459  }
460 
461  mWidthBar += _width - mItemsInfo[_index].width;
462  mItemsInfo[_index].width = _width;
463 
464  updateBar();
465  }
466 
467  void Tab::setItemNameAt(size_t _index, const UString& _name)
468  {
469  MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "Tab::setItemNameAt");
470  mItemsInfo[_index].name = _name;
471 
472  int width;
473  if (mButtonAutoWidth) width = _getTextWidth(_name);
474  else width = mButtonDefaultWidth;
475 
476  mWidthBar += width - mItemsInfo[_index].width;
477  mItemsInfo[_index].width = width;
478 
479  updateBar();
480  }
481 
482  void Tab::setIndexSelected(size_t _index)
483  {
484  MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "Tab::setIndexSelected");
485  if (mIndexSelect == _index) return;
486  size_t old = mIndexSelect;
487  mIndexSelect = _index;
488  updateBar();
489 
490  // поднимаем страницу для пикинга
491  if (mSmoothShow) _forcePeek(mItemsInfo[mIndexSelect].item);
492 
493  _showItem(mItemsInfo[mIndexSelect].item, true, mSmoothShow);
494  _showItem(mItemsInfo[old].item, false, mSmoothShow);
495 
497  }
498 
499  void Tab::actionWidgetHide(Widget* _widget)
500  {
501  _widget->setVisible(false);
502  _widget->setEnabled(true);
503  }
504 
505  void Tab::_showItem(TabItem* _item, bool _show, bool _smooth)
506  {
507  if (!_smooth)
508  {
510  _item->setAlpha(ALPHA_MAX);
511 
512  _item->setVisible(_show);
513 
514  return;
515  }
516 
517  if (_show)
518  {
519  ControllerFadeAlpha* controller = createControllerFadeAlpha(ALPHA_MAX, TAB_SPEED_FADE_COEF, true);
520  ControllerManager::getInstance().addItem(_item, controller);
521  }
522  else
523  {
524  ControllerFadeAlpha* controller = createControllerFadeAlpha(ALPHA_MIN, TAB_SPEED_FADE_COEF, false);
525  controller->eventPostAction = newDelegate(this, &Tab::actionWidgetHide);
526  ControllerManager::getInstance().addItem(_item, controller);
527  }
528  }
529 
531  {
532  Button* button = _getWidgetBar()->createWidget<Button>(mButtonSkinName, IntCoord(), Align::Left | Align::Top);
534  button->_setInternalData(mItemButton.size()); // порядковый номер
535  mItemButton.push_back(button);
536  }
537 
538  int Tab::_getTextWidth(const UString& _text)
539  {
540  if (0 == mItemButton.size()) _createItemButton();
541 
542  UString save = mItemButton[0]->getCaption();
543  mItemButton[0]->setCaption(_text);
544 
545  ISubWidgetText* text = mItemButton[0]->getSubWidgetText();
546  const IntSize& size = text ? text->getTextSize() : IntSize();
547  const IntCoord& coord = text ? text->getCoord() : IntCoord();
548 
549  mItemButton[0]->setCaption(save);
550 
551  return size.width + mItemButton[0]->getWidth() - coord.width;
552  }
553 
555  {
556  // общий шутдаун виджета
557  if (mShutdown) return;
558 
559  size_t index = getItemIndex(_sheet);
560 
561  mWidthBar -= mItemsInfo[index].width;
562  mItemsInfo.erase(mItemsInfo.begin() + index);
563 
564  if (0 == mItemsInfo.size()) mIndexSelect = ITEM_NONE;
565  else
566  {
567  if (index < mIndexSelect) mIndexSelect --;
568  else if (index == mIndexSelect)
569  {
570  if (mIndexSelect == mItemsInfo.size()) mIndexSelect --;
571  mItemsInfo[mIndexSelect].item->setVisible(true);
572  mItemsInfo[mIndexSelect].item->setAlpha(ALPHA_MAX);
573  }
574  }
575 
576  updateBar();
577  }
578 
579  void Tab::_insertItem(size_t _index, const UString& _name, TabItem* _sheet, Any _data)
580  {
581  if (_index == ITEM_NONE) _index = mItemsInfo.size();
582 
583  // добавляем инфу о вкладке
584  int width = (mButtonAutoWidth ? _getTextWidth(_name) : mButtonDefaultWidth);
585  mWidthBar += width;
586 
587  mItemsInfo.insert(mItemsInfo.begin() + _index, TabItemInfo(width, _name, _sheet, _data));
588 
589  // первая вкладка
590  if (1 == mItemsInfo.size()) mIndexSelect = 0;
591  else
592  {
593  _sheet->setVisible(false);
594  if (_index <= mIndexSelect) mIndexSelect ++;
595  }
596 
597  updateBar();
598  }
599 
600  void Tab::setItemDataAt(size_t _index, Any _data)
601  {
602  MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "Tab::setItemDataAt");
603  mItemsInfo[_index].data = _data;
604  }
605 
606  int Tab::getButtonWidthAt(size_t _index)
607  {
608  MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "Tab::getButtonWidthAt");
609  return mItemsInfo[_index].width;
610  }
611 
612  const UString& Tab::getItemNameAt(size_t _index)
613  {
614  MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "Tab::getItemNameAt");
615  return mItemsInfo[_index].name;
616  }
617 
618  TabItem* Tab::getItemAt(size_t _index)
619  {
620  MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "Tab::getItemAt");
621  return mItemsInfo[_index].item;
622  }
623 
624  void Tab::removeItemAt(size_t _index)
625  {
626  MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "Tab::removeItemAt");
627  this->_destroyChildWidget(mItemsInfo[_index].item);
628  }
629 
631  {
632  while (mItemsInfo.size() > 0)
633  {
634  this->_destroyChildWidget(mItemsInfo.back().item);
635  }
636  }
637 
638  ControllerFadeAlpha* Tab::createControllerFadeAlpha(float _alpha, float _coef, bool _enable)
639  {
641  ControllerFadeAlpha* controller = item->castType<ControllerFadeAlpha>();
642 
643  controller->setAlpha(_alpha);
644  controller->setCoef(_coef);
645  controller->setEnabled(_enable);
646 
647  return controller;
648  }
649 
650  size_t Tab::getItemIndex(TabItem* _item)
651  {
652  for (size_t pos=0; pos<mItemsInfo.size(); pos++)
653  {
654  if (mItemsInfo[pos].item == _item) return pos;
655  }
656  MYGUI_EXCEPT("item (" << _item << ") not found, source 'Tab::getItemIndex'");
657  }
658 
660  {
661  for (size_t pos=0; pos<mItemsInfo.size(); pos++)
662  {
663  if (mItemsInfo[pos].item == _item) return pos;
664  }
665  return ITEM_NONE;
666  }
667 
668  size_t Tab::findItemIndexWith(const UString& _name)
669  {
670  for (size_t pos=0; pos<mItemsInfo.size(); pos++)
671  {
672  if (mItemsInfo[pos].name == _name) return pos;
673  }
674  return ITEM_NONE;
675  }
676 
678  {
679  for (size_t pos=0; pos<mItemsInfo.size(); pos++)
680  {
681  if (mItemsInfo[pos].name == _name) return mItemsInfo[pos].item;
682  }
683  return nullptr;
684  }
685 
687  {
688  return getIndexSelected() != ITEM_NONE ? getItemAt(getIndexSelected()) : nullptr;
689  }
690 
691  void Tab::setProperty(const std::string& _key, const std::string& _value)
692  {
693  if (_key == "Tab_ButtonWidth") setButtonDefaultWidth(utility::parseValue<int>(_value));
694  else if (_key == "Tab_ButtonAutoWidth") setButtonAutoWidth(utility::parseValue<bool>(_value));
695  else if (_key == "Tab_SmoothShow") setSmoothShow(utility::parseValue<bool>(_value));
696  else if (_key == "Tab_AddItem") addItem(_value);
697  else if (_key == "Tab_SelectItem") setIndexSelected(utility::parseValue<size_t>(_value));
698 
699 #ifndef MYGUI_DONT_USE_OBSOLETE
700  else if (_key == "Tab_AddSheet")
701  {
702  MYGUI_LOG(Warning, "Tab_AddSheet is obsolete, use Tab_AddItem");
703  addItem(_value);
704  }
705  else if (_key == "Tab_SelectSheet")
706  {
707  MYGUI_LOG(Warning, "Tab_SelectSheet is obsolete, use Tab_SelectItem");
708  setIndexSelected(utility::parseValue<size_t>(_value));
709  }
710 #endif // MYGUI_DONT_USE_OBSOLETE
711 
712  else
713  {
714  Base::setProperty(_key, _value);
715  return;
716  }
717  eventChangeProperty(this, _key, _value);
718  }
719 
720  Widget* Tab::_getWidgetTemplate()
721  {
722  return mItemTemplate == nullptr ? this : mItemTemplate;
723  }
724 
725  Widget* Tab::_getWidgetBar()
726  {
727  return mWidgetBar == nullptr ? this : mWidgetBar;
728  }
729 
730 } // namespace MyGUI