44 mHideByLostKey(false),
59 Base::_initialise(_style, _coord, _align, _info, _parent, _croppedParent, _creator, _name);
77 initialiseWidgetSkin(_info);
90 initialiseWidgetSkin(_info);
100 if (*(*iter)->_getInternalData<std::string>() ==
"Client")
110 MapString::const_iterator iterS = properties.find(
"SkinLine");
111 if (iterS != properties.end()) mSkinLine = iterS->second;
114 iterS = properties.find(
"HeightLine");
118 MYGUI_LOG(Warning,
"MenuCtrl HeightLine can't be less thah 1. Set to 1.");
122 iterS = properties.find(
"SeparatorHeight");
123 if (iterS != properties.end()) mSeparatorHeight =
utility::parseInt(iterS->second);
124 iterS = properties.find(
"SeparatorSkin");
125 if (iterS != properties.end()) mSeparatorSkin = iterS->second;
127 iterS = properties.find(
"SubmenuImageSize");
128 if (iterS != properties.end()) mSubmenuImageSize =
utility::parseInt(iterS->second);
130 iterS = properties.find(
"SubMenuSkin");
131 if (iterS != properties.end()) mSubMenuSkin = iterS->second;
134 iterS = properties.find(
"SubMenuLayer");
135 if (iterS != properties.end()) mSubMenuLayer = iterS->second;
138 iterS = properties.find(
"AlignVert");
140 iterS = properties.find(
"DistanceButton");
141 if (iterS != properties.end()) mDistanceButton =
utility::parseInt(iterS->second);
143 if (mSeparatorHeight < 1) mSeparatorHeight = mHeightLine;
146 void MenuCtrl::shutdownWidgetSkin()
170 if (_index ==
ITEM_NONE) _index = mItemsInfo.size();
173 _wrapItem(item, _index, _name, _type, _id, _data);
182 if ( mItemsInfo[_index].submenu )
191 while (mItemsInfo.size() > 0)
193 if ( mItemsInfo.back().submenu )
204 return mItemsInfo[_index].name;
207 void MenuCtrl::setButtonImageIndex(
Button* _button,
size_t _index)
210 if (
nullptr == image )
return;
213 static const size_t CountIcons = 2;
214 static const char * IconNames[CountIcons + 1] = {
"None",
"Popup",
"" };
215 if (_index >= CountIcons) _index = CountIcons;
224 void MenuCtrl::update()
230 for (VectorMenuItemInfo::iterator iter=mItemsInfo.begin(); iter!=mItemsInfo.end(); ++iter)
233 iter->item->setCoord(0, size.height, _getClientWidget()->
getWidth(), height);
234 size.height += height + mDistanceButton;
236 int width = iter->width;
237 if (width > size.width) size.width = width;
243 for (VectorMenuItemInfo::iterator iter=mItemsInfo.begin(); iter!=mItemsInfo.end(); ++iter)
246 iter->item->setCoord(size.width, 0, width, mHeightLine);
247 size.width += width + mDistanceButton;
249 size.height = mHeightLine;
259 mItemsInfo[_index].data = _data;
265 return mItemsInfo[_index].submenu;
272 if (mItemsInfo[_index].submenu !=
nullptr)
275 mItemsInfo[_index].submenu =
nullptr;
285 mItemsInfo[_index].name = _name;
286 MenuItem* item = mItemsInfo[_index].item;
295 mItemsInfo[_index].id = _id;
301 return mItemsInfo[_index].id;
307 if (mShutdown)
return;
310 mItemsInfo.erase(mItemsInfo.begin() + index);
327 return mItemsInfo[_index].type;
333 ItemInfo& info = mItemsInfo[_index];
334 if (info.type == _type)
return;
338 info.item->changeWidgetSkin(getSkinByType(_type));
339 setButtonImageIndex(info.item, getIconIndexByType(_type ));
340 info.item->setCaption(info.name);
345 void MenuCtrl::notifyMenuCtrlAccept(
MenuItem* _item)
354 if (sender ==
nullptr)
return;
364 parent_ctrl->notifyMenuCtrlAccept(_item);
371 if (sender ==
nullptr)
return;
390 if (mItemsInfo[_index].submenu && mItemsInfo[_index].submenu->getItemCount())
393 int offset = mItemsInfo[0].item->getAbsoluteTop() - this->
getAbsoluteTop();
395 const IntCoord& coord = mItemsInfo[_index].item->getAbsoluteCoord();
398 MenuCtrl* menu = mItemsInfo[_index].submenu;
400 if (this->mAlignVert)
409 point.
set(coord.
left, this->getAbsoluteRect().bottom);
418 if (mItemsInfo[_index].submenu)
420 mItemsInfo[_index].submenu->setVisibleSmooth(
false);
425 void MenuCtrl::notifyRootKeyChangeFocus(
Widget* _sender,
bool _focus)
446 Widget* MenuCtrl::createItemChildByType(
size_t _index,
const std::string& _type)
455 void MenuCtrl::notifyMouseButtonClick(Widget* _sender)
457 MenuItem* item = _sender->
castType<MenuItem>();
464 item->setButtonPressed(
false);
465 item->setItemChildVisible(
false);
474 item->setButtonPressed(
true);
475 item->setItemChildVisible(
true);
485 notifyMenuCtrlAccept(item);
505 void MenuCtrl::notifyMouseSetFocus(
Widget* _sender,
Widget* _new)
514 if (mItemsInfo[index].submenu !=
nullptr)
518 mItemsInfo[index].submenu = _widget;
520 mItemsInfo[index].submenu->setVisible(
false);
533 setButtonImageIndex(_item, getIconIndexByType(_type ));
537 ItemInfo info = ItemInfo(_item, _name, _type, submenu, _id, _data);
539 mItemsInfo.insert(mItemsInfo.begin() + _index, info);
555 mAnimateSmooth =
false;
571 mAnimateSmooth =
true;
597 ControllerFadeAlpha* MenuCtrl::createControllerFadeAlpha(
float _alpha,
float _coef,
bool _enable)
627 return mItemsInfo[_index].item;
632 for (
size_t pos=0; pos<mItemsInfo.size(); pos++)
634 if (mItemsInfo[pos].item == _item)
return pos;
636 MYGUI_EXCEPT(
"item (" << _item <<
") not found, source 'MenuCtrl::getItemIndex'");
641 for (
size_t pos=0; pos<mItemsInfo.size(); pos++)
643 if (mItemsInfo[pos].name == _name)
return mItemsInfo[pos].item;
650 for (
size_t pos=0; pos<mItemsInfo.size(); pos++)
652 if (mItemsInfo[pos].
id == _id)
return mItemsInfo[pos].item;
654 MYGUI_EXCEPT(
"item id (" << _id <<
") not found, source 'MenuCtrl::getItemById'");
659 for (
size_t pos=0; pos<mItemsInfo.size(); pos++)
661 if (mItemsInfo[pos].
id == _id)
return pos;
663 MYGUI_EXCEPT(
"item id (" << _id <<
") not found, source 'MenuCtrl::getItemById'");
668 for (
size_t pos=0; pos<mItemsInfo.size(); pos++)
670 if (mItemsInfo[pos].name == _name)
return pos;
677 for (
size_t pos=0; pos<mItemsInfo.size(); pos++)
679 if (mItemsInfo[pos].item == _item)
return pos;
684 Widget* MenuCtrl::_getClientWidget()
689 const Widget* MenuCtrl::_getClientWidget()
const