44 mHideByLostKey(false),
45 mResizeToContent(true),
47 mVerticalAlignment(true),
51 mAnimateSmooth(false),
52 mChangeChildSkin(false),
81 if (mClient !=
nullptr)
90 mItemPopupSkin = mItemNormalSkin;
103 mDistanceButton = utility::parseValue<int>(
getUserString(
"DistanceButton"));
118 if (mOwner !=
nullptr)
129 if (child !=
nullptr)
138 if (_index ==
ITEM_NONE) _index = mItemsInfo.size();
141 _wrapItem(item, _index, _name, _type, _id, _data);
150 if (mItemsInfo[_index].submenu)
153 mItemsInfo[_index].submenu =
nullptr;
160 while (!mItemsInfo.empty())
162 if (mItemsInfo.back().submenu)
165 mItemsInfo.back().submenu =
nullptr;
174 return mItemsInfo[_index].name;
177 void MenuControl::update()
181 if (mVerticalAlignment)
183 for (VectorMenuItemInfo::iterator iter = mItemsInfo.begin(); iter != mItemsInfo.end(); ++iter)
185 IntSize contentSize = iter->item->_getContentSize();
192 if (!mItemsInfo.empty())
193 size.
height -= mDistanceButton;
198 for (VectorMenuItemInfo::iterator iter = mItemsInfo.begin(); iter != mItemsInfo.end(); ++iter)
200 IntSize contentSize = iter->item->_getContentSize();
201 if (maxHeight < contentSize.height)
202 maxHeight = contentSize.
height;
205 for (VectorMenuItemInfo::iterator iter = mItemsInfo.begin(); iter != mItemsInfo.end(); ++iter)
207 IntSize contentSize = iter->item->_getContentSize();
208 iter->item->setCoord(size.
width, 0, contentSize.width, maxHeight);
209 size.
width += contentSize.width + mDistanceButton;
212 if (!mItemsInfo.empty())
213 size.
width -= mDistanceButton;
223 mItemsInfo[_index].data = _data;
229 return mItemsInfo[_index].submenu;
236 if (mItemsInfo[_index].submenu !=
nullptr)
239 mItemsInfo[_index].submenu =
nullptr;
249 mItemsInfo[_index].name = _name;
250 MenuItem* item = mItemsInfo[_index].item;
259 mItemsInfo[_index].id = _id;
265 return mItemsInfo[_index].id;
271 if (mChangeChildSkin)
279 mItemsInfo.erase(mItemsInfo.begin() + index);
286 mItemsInfo[index].submenu =
nullptr;
302 return mItemsInfo[_index].type;
308 ItemInfo& info = mItemsInfo[_index];
309 if (info.type == _type)
316 mChangeChildSkin =
true;
317 info.item->changeWidgetSkin(getSkinByType(_type));
318 mChangeChildSkin =
false;
320 info.item->setImageName(getIconIndexByType(_type ));
321 info.item->setCaption(info.name);
326 void MenuControl::notifyMenuCtrlAccept(
MenuItem* _item)
340 MenuControl* parent_ctrl = parent_item->getMenuCtrlParent();
343 parent_ctrl->notifyMenuCtrlAccept(_item);
352 _setItemChildVisibleAt(_index, _visible,
true);
355 void MenuControl::_setItemChildVisibleAt(
size_t _index,
bool _visible,
bool _smooth)
361 if (mItemsInfo[_index].submenu && mItemsInfo[_index].submenu->getItemCount())
363 int offset = mItemsInfo[0].item->getAbsoluteTop() -
getAbsoluteTop();
365 const IntCoord& coord = mItemsInfo[_index].item->getAbsoluteCoord();
370 if (mVerticalAlignment)
409 if (mItemsInfo[_index].submenu)
412 mItemsInfo[_index].submenu->setVisibleSmooth(
false);
414 mItemsInfo[_index].submenu->setVisible(
false);
419 void MenuControl::notifyRootKeyChangeFocus(Widget* _sender,
bool _focus)
421 MenuItem* item = _sender->castType<MenuItem>();
428 item->setItemChildVisible(
true);
429 item->setStateSelected(
true);
434 item->setItemChildVisible(
false);
435 item->setStateSelected(
false);
440 Widget* MenuControl::createItemChildByType(
size_t _index,
const std::string& _type)
449 void MenuControl::notifyMouseButtonClick(Widget* _sender)
451 MenuItem* item = _sender->castType<MenuItem>();
458 item->setStateSelected(
false);
459 item->setItemChildVisible(
false);
468 item->setStateSelected(
true);
469 item->setItemChildVisible(
true);
479 notifyMenuCtrlAccept(item);
498 void MenuControl::notifyMouseSetFocus(
Widget* _sender,
Widget* _new)
507 if (mItemsInfo[index].submenu !=
nullptr)
510 mItemsInfo[index].submenu =
nullptr;
512 mItemsInfo[index].submenu = _widget;
514 mItemsInfo[index].submenu->setVisible(
false);
530 ItemInfo info = ItemInfo(_item, _name, _type, submenu, _id, _data);
532 mItemsInfo.insert(mItemsInfo.begin() + _index, info);
534 mChangeChildSkin =
true;
536 mChangeChildSkin =
false;
551 mAnimateSmooth =
false;
567 mAnimateSmooth =
true;
593 ControllerFadeAlpha* MenuControl::createControllerFadeAlpha(
float _alpha,
float _coef,
bool _enable)
623 return mItemsInfo[_index].item;
628 for (
size_t pos = 0; pos < mItemsInfo.size(); pos++)
630 if (mItemsInfo[pos].item == _item)
633 MYGUI_EXCEPT(
"item (" << _item <<
") not found, source 'MenuControl::getItemIndex'");
638 for (
size_t pos = 0; pos < mItemsInfo.size(); pos++)
640 if (mItemsInfo[pos].name == _name)
641 return mItemsInfo[pos].item;
648 for (
size_t index = 0; index < mItemsInfo.size(); index++)
650 if (mItemsInfo[index].
id == _id)
651 return mItemsInfo[index].item;
653 MYGUI_EXCEPT(
"item id (" << _id <<
") not found, source 'MenuControl::getItemById'");
658 for (
size_t index = 0; index < mItemsInfo.size(); index++)
660 if (mItemsInfo[index].
id == _id)
663 MYGUI_EXCEPT(
"item id (" << _id <<
") not found, source 'MenuControl::getItemById'");
668 for (
size_t index = 0; index < mItemsInfo.size(); index++)
670 if (mItemsInfo[index].
id == _id)
671 return mItemsInfo[index].item;
673 if (_recursive && mItemsInfo[index].submenu !=
nullptr)
675 MenuItem* find = mItemsInfo[index].submenu->findItemById(_id, _recursive);
685 for (
size_t index = 0; index < mItemsInfo.size(); index++)
687 if (mItemsInfo[index].name == _name)
695 for (
size_t index = 0; index < mItemsInfo.size(); index++)
697 if (mItemsInfo[index].item == _item)
703 Widget* MenuControl::_getClientWidget()
705 return mClient ==
nullptr ?
this : mClient;
710 return mItemsInfo.size();
760 return createItemChildTAt<MenuControl>(_index);
785 mPopupAccept = _value;
798 const std::string& MenuControl::getSkinByType(
MenuItemType _type)
const
801 return mItemPopupSkin;
803 return mItemSeparatorSkin;
804 return mItemNormalSkin;
807 std::string MenuControl::getIconIndexByType(MenuItemType _type)
const
858 for (VectorMenuItemInfo::iterator iter = mItemsInfo.begin(); iter != mItemsInfo.end(); ++iter)
864 if ((*iter).submenu !=
nullptr)
865 (*iter).submenu->setVisible(
false);
874 _setItemChildVisibleAt(index,
true,
false);
882 if (mItemsInfo[_index].submenu !=
nullptr)
883 mItemsInfo[_index].submenu->_updateSizeForEmpty();
888 if (mItemsInfo.empty())
894 mVerticalAlignment = _value;
901 return mVerticalAlignment;
906 if (_key ==
"VerticalAlignment")