52 mItemPopupSkin = mItemNormalSkin;
81 if (mOwner !=
nullptr)
82 mOwner->getMenuCtrlParent()->_notifyDeletePopup(mOwner);
92 if (child !=
nullptr && !mInternalCreateChild)
102 std::string_view _id,
107 _index = mItemsInfo.size();
109 mInternalCreateChild =
true;
111 mInternalCreateChild =
false;
112 _wrapItem(item, _index, _name, _type, _id, _data);
121 if (mItemsInfo[_index].submenu)
124 mItemsInfo[_index].submenu =
nullptr;
131 while (!mItemsInfo.empty())
133 if (mItemsInfo.back().submenu)
136 mItemsInfo.back().submenu =
nullptr;
145 return mItemsInfo[_index].name;
148 void MenuControl::update()
152 if (mVerticalAlignment)
154 for (
auto& iter : mItemsInfo)
156 IntSize contentSize = iter.item->_getContentSize();
163 if (!mItemsInfo.empty())
164 size.
height -= mDistanceButton;
169 for (
const auto& iter : mItemsInfo)
171 IntSize contentSize = iter.item->_getContentSize();
172 if (maxHeight < contentSize.height)
173 maxHeight = contentSize.
height;
176 for (
auto& iter : mItemsInfo)
178 IntSize contentSize = iter.item->_getContentSize();
179 iter.item->setCoord(size.
width, 0, contentSize.width, maxHeight);
180 size.
width += contentSize.width + mDistanceButton;
183 if (!mItemsInfo.empty())
184 size.
width -= mDistanceButton;
194 mItemsInfo[_index].data = std::move(_data);
200 return mItemsInfo[_index].submenu;
207 if (mItemsInfo[_index].submenu !=
nullptr)
210 mItemsInfo[_index].submenu =
nullptr;
220 mItemsInfo[_index].name = _name;
221 MenuItem* item = mItemsInfo[_index].item;
230 mItemsInfo[_index].id = _id;
236 return mItemsInfo[_index].id;
242 if (mChangeChildSkin)
250 mItemsInfo.erase(mItemsInfo.begin() + index);
257 mItemsInfo[index].submenu =
nullptr;
273 return mItemsInfo[_index].type;
279 ItemInfo& info = mItemsInfo[_index];
280 if (info.
type == _type)
287 mChangeChildSkin =
true;
289 mChangeChildSkin =
false;
297 void MenuControl::notifyMenuCtrlAccept(
MenuItem* _item)
311 MenuControl* parent_ctrl = parent_item->getMenuCtrlParent();
314 parent_ctrl->notifyMenuCtrlAccept(_item);
323 _setItemChildVisibleAt(_index, _visible,
true);
326 void MenuControl::_setItemChildVisibleAt(
size_t _index,
bool _visible,
bool _smooth)
332 if (mItemsInfo[_index].submenu && mItemsInfo[_index].submenu->getItemCount())
334 int offset = mItemsInfo[0].item->getAbsoluteTop() -
getAbsoluteTop();
336 const IntCoord& coord = mItemsInfo[_index].item->getAbsoluteCoord();
341 if (mVerticalAlignment)
380 if (mItemsInfo[_index].submenu)
383 mItemsInfo[_index].submenu->setVisibleSmooth(
false);
385 mItemsInfo[_index].submenu->setVisible(
false);
390 void MenuControl::notifyRootKeyChangeFocus(
Widget* _sender,
bool _focus)
const
392 MenuItem* item = _sender->castType<MenuItem>();
399 item->setItemChildVisible(
true);
400 item->setStateSelected(
true);
405 item->setItemChildVisible(
false);
406 item->setStateSelected(
false);
411 Widget* MenuControl::createItemChildByType(
size_t _index, std::string_view _type)
415 Widget* child = mItemsInfo[_index].item->createWidgetT(
422 MYGUI_ASSERT(child->isType<MenuControl>(),
"child must have MenuControl base type");
426 void MenuControl::notifyMouseButtonClick(
Widget* _sender)
428 MenuItem* item = _sender->castType<MenuItem>();
435 item->setStateSelected(
false);
436 item->setItemChildVisible(
false);
445 item->setStateSelected(
true);
446 item->setItemChildVisible(
true);
456 notifyMenuCtrlAccept(item);
475 void MenuControl::notifyMouseSetFocus(
Widget* _sender,
Widget* _new)
484 if (mItemsInfo[index].submenu !=
nullptr)
487 mItemsInfo[index].submenu =
nullptr;
489 mItemsInfo[index].submenu = _widget;
496 void MenuControl::_wrapItem(
501 std::string_view _id,
513 ItemInfo info = ItemInfo(_item, _name, _type, submenu, _id, _data);
515 mItemsInfo.insert(mItemsInfo.begin() + _index, std::move(info));
517 mChangeChildSkin =
true;
519 mChangeChildSkin =
false;
534 mAnimateSmooth =
false;
550 mAnimateSmooth =
true;
576 ControllerFadeAlpha* MenuControl::createControllerFadeAlpha(
float _alpha,
float _coef,
bool _enable)
592 std::string_view _id,
611 return mItemsInfo[_index].item;
616 for (
size_t pos = 0; pos < mItemsInfo.size(); pos++)
618 if (mItemsInfo[pos].item == _item)
621 MYGUI_EXCEPT(
"item (" << _item <<
") not found, source 'MenuControl::getItemIndex'");
626 for (
const auto& info : mItemsInfo)
628 if (info.name == _name)
636 for (
const auto& info : mItemsInfo)
641 MYGUI_EXCEPT(
"item id (" << _id <<
") not found, source 'MenuControl::getItemById'");
646 for (
size_t index = 0; index < mItemsInfo.size(); index++)
648 if (mItemsInfo[index].
id == _id)
651 MYGUI_EXCEPT(
"item id (" << _id <<
") not found, source 'MenuControl::getItemById'");
656 for (
const auto& info : mItemsInfo)
661 if (_recursive && info.submenu !=
nullptr)
663 MenuItem* find = info.submenu->findItemById(_id, _recursive);
673 for (
size_t index = 0; index < mItemsInfo.size(); index++)
675 if (mItemsInfo[index].name == _name)
683 for (
size_t index = 0; index < mItemsInfo.size(); index++)
685 if (mItemsInfo[index].item == _item)
693 return mItemsInfo.size();
768 mPopupAccept = _value;
781 const std::string& MenuControl::getSkinByType(
MenuItemType _type)
const
784 return mItemPopupSkin;
786 return mItemSeparatorSkin;
787 return mItemNormalSkin;
790 std::string_view MenuControl::getIconIndexByType(MenuItemType _type)
const
841 for (
auto& iter : mItemsInfo)
845 iter.item->setStateSelected(
false);
847 if (iter.submenu !=
nullptr)
848 iter.submenu->setVisible(
false);
857 _setItemChildVisibleAt(index,
true,
false);
865 if (mItemsInfo[_index].submenu !=
nullptr)
866 mItemsInfo[_index].submenu->_updateSizeForEmpty();
871 if (mItemsInfo.empty())
877 mVerticalAlignment = _value;
884 return mVerticalAlignment;
890 if (_key ==
"VerticalAlignment")
#define MYGUI_ASSERT(exp, dest)
#define MYGUI_EXCEPT(dest)
#define MYGUI_ASSERT_RANGE_INSERT(index, size, owner)
#define MYGUI_ASSERT_RANGE(index, size, owner)
static std::string_view getClassTypeName()
void setAlpha(float _value)
void setCoef(float _value)
void setEnabled(bool _value)
EventPairAddParameter< EventHandle_WidgetPtr, EventHandle_WidgetPtrControllerItemPtr > eventPostAction
ControllerItem * createItem(std::string_view _type)
static ControllerManager & getInstance()
void removeItem(Widget *_widget)
void addItem(Widget *_widget, ControllerItem *_item)
IntRect getAbsoluteRect() const
int getAbsoluteTop() const
Type * castType(bool _throw=true)
virtual IntSize getTextSize() const
void upLayerItem(Widget *_item)
static LayerManager & getInstance()
ISubWidgetText * getSubWidgetText() const
virtual const UString & getCaption() const
A UTF-16 string with implicit conversion to/from std::string and std::wstring.
bool isUserString(std::string_view _key) const
std::string_view getUserString(std::string_view _key) const
void actionWidgetHide(Widget *_widget, ControllerItem *_controller)
void actionWidgetShow(Widget *_widget, ControllerItem *_controller)
T parseValue(std::string_view _value)
constexpr float ALPHA_MAX
types::TPoint< int > IntPoint
constexpr float ALPHA_MIN
constexpr size_t ITEM_NONE
const float POPUP_MENU_SPEED_COEF
types::TCoord< int > IntCoord
types::TSize< int > IntSize
delegates::DelegateFunction< Args... > * newDelegate(void(*_func)(Args... args))