52 mItemPopupSkin = mItemNormalSkin;
65 mDistanceButton = utility::parseValue<int>(
getUserString(
"DistanceButton"));
81 if (mOwner !=
nullptr)
92 if (
child !=
nullptr && !mInternalCreateChild)
102 std::string_view
_id,
107 _index = mItemsInfo.size();
109 mInternalCreateChild =
true;
111 mInternalCreateChild =
false;
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)
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;
200 return mItemsInfo[
_index].submenu;
207 if (mItemsInfo[
_index].submenu !=
nullptr)
210 mItemsInfo[
_index].submenu =
nullptr;
236 return mItemsInfo[
_index].id;
242 if (mChangeChildSkin)
250 mItemsInfo.erase(mItemsInfo.begin() + index);
257 mItemsInfo[index].submenu =
nullptr;
263 mItemsInfo[index].name =
_item->getCaption();
273 return mItemsInfo[
_index].type;
287 mChangeChildSkin =
true;
288 info.item->changeWidgetSkin(getSkinByType(
_type));
289 mChangeChildSkin =
false;
291 info.item->setImageName(getIconIndexByType(
_type));
311 MenuControl* parent_ctrl = parent_item->getMenuCtrlParent();
314 parent_ctrl->notifyMenuCtrlAccept(_item);
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)
344 if (point.left +
menu->getWidth() >
menu->getParentSize().width)
351 point.left =
menu->getParentSize().width -
menu->getWidth();
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);
484 if (mItemsInfo[index].submenu !=
nullptr)
487 mItemsInfo[index].submenu =
nullptr;
489 mItemsInfo[index].submenu =
_widget;
491 mItemsInfo[index].submenu->setVisible(
false);
496 void MenuControl::_wrapItem(
501 std::string_view
_id,
505 _item->eventRootKeyChangeFocus +=
newDelegate(
this, &MenuControl::notifyRootKeyChangeFocus);
506 _item->eventMouseButtonClick +=
newDelegate(
this, &MenuControl::notifyMouseButtonClick);
507 _item->eventMouseSetFocus +=
newDelegate(
this, &MenuControl::notifyMouseSetFocus);
509 _item->setImageName(getIconIndexByType(
_type));
515 mItemsInfo.insert(mItemsInfo.begin() +
_index, std::move(
info));
517 mChangeChildSkin =
true;
518 _item->changeWidgetSkin(getSkinByType(
_type));
519 mChangeChildSkin =
false;
534 mAnimateSmooth =
false;
550 mAnimateSmooth =
true;
592 std::string_view
_id,
611 return mItemsInfo[
_index].item;
616 for (
size_t pos = 0;
pos < mItemsInfo.size();
pos++)
621 MYGUI_EXCEPT(
"item (" <<
_item <<
") not found, source 'MenuControl::getItemIndex'");
626 for (
const auto&
info : mItemsInfo)
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)
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();
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()
static ControllerManager & getInstance()
IntRect getAbsoluteRect() const
int getAbsoluteTop() const
Type * castType(bool _throw=true)
virtual IntSize getTextSize() const
static LayerManager & getInstance()
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)
constexpr float ALPHA_MAX
constexpr float ALPHA_MIN
constexpr size_t ITEM_NONE
types::TCoord< int > IntCoord
const float POPUP_MENU_SPEED_COEF
types::TSize< int > IntSize
delegates::DelegateFunction< Args... > * newDelegate(void(*_func)(Args... args))