diff --git a/ui/widgets/menu/menu_action.cpp b/ui/widgets/menu/menu_action.cpp index cc723e4..f74a484 100644 --- a/ui/widgets/menu/menu_action.cpp +++ b/ui/widgets/menu/menu_action.cpp @@ -113,7 +113,8 @@ void Action::paint(Painter &p) { p.setPen(selected ? _st.itemFgOver : (enabled ? _st.itemFg : _st.itemFgDisabled)); paintText(p); if (hasSubmenu()) { - const auto left = width() - _st.itemPadding.right() - _st.arrow.width(); + const auto skip = _st.itemRightSkip; + const auto left = width() - skip - _st.arrow.width(); const auto top = (_height - _st.arrow.height()) / 2; if (enabled) { _st.arrow.paint(p, left, top, width()); @@ -159,14 +160,14 @@ void Action::processAction() { const auto &padding = _st.itemPadding; const auto additionalWidth = hasSubmenu() - ? padding.right() + _st.arrow.width() + ? (_st.itemRightSkip + _st.arrow.width()) : (!actionShortcut.isEmpty()) - ? (padding.right() + _st.itemStyle.font->width(actionShortcut)) + ? (_st.itemRightSkip + _st.itemStyle.font->width(actionShortcut)) : 0; const auto goodWidth = padding.left() + textWidth - + padding.right() - + additionalWidth; + + additionalWidth + + padding.right(); const auto w = std::clamp(goodWidth, _st.widthMin, _st.widthMax); _textWidth = w - (goodWidth - textWidth); diff --git a/ui/widgets/menu/menu_add_action_callback.h b/ui/widgets/menu/menu_add_action_callback.h index 368c066..8f9eff8 100644 --- a/ui/widgets/menu/menu_add_action_callback.h +++ b/ui/widgets/menu/menu_add_action_callback.h @@ -22,6 +22,7 @@ public: Fn handler; const style::icon *icon; Fn)> fillSubmenu; + int addTopShift = 0; bool isSeparator = false; bool isAttention = false; }; diff --git a/ui/widgets/menu/menu_add_action_callback_factory.cpp b/ui/widgets/menu/menu_add_action_callback_factory.cpp index 6b2ed64..6e1f231 100644 --- a/ui/widgets/menu/menu_add_action_callback_factory.cpp +++ b/ui/widgets/menu/menu_add_action_callback_factory.cpp @@ -15,8 +15,11 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL namespace Ui::Menu { MenuCallback CreateAddActionCallback(not_null menu) { - return MenuCallback([=](MenuCallback::Args a) { - if (a.fillSubmenu) { + return MenuCallback([=](MenuCallback::Args a) -> QAction* { + if (a.addTopShift) { + menu->setTopShift(a.addTopShift); + return nullptr; + } else if (a.fillSubmenu) { const auto action = menu->addAction( a.text, std::move(a.handler), diff --git a/ui/widgets/popup_menu.cpp b/ui/widgets/popup_menu.cpp index 7321e84..9f5709d 100644 --- a/ui/widgets/popup_menu.cpp +++ b/ui/widgets/popup_menu.cpp @@ -440,6 +440,10 @@ void PopupMenu::clearActions() { return _menu->clearActions(); } +void PopupMenu::setTopShift(int topShift) { + _topShift = topShift; +} + void PopupMenu::setForceWidth(int forceWidth) { _menu->setForceWidth(forceWidth); } @@ -993,7 +997,7 @@ bool PopupMenu::prepareGeometryFor(const QPoint &p, PopupMenu *parent) { std::max( _additionalMenuPadding.left() - _st.shadow.extend.left(), 0), - _padding.top()); + _padding.top() - _topShift); auto r = screen ? screen->availableGeometry() : QRect(); const auto parentWidth = _parent ? _parent->inner().width() : 0; if (style::RightToLeft()) { diff --git a/ui/widgets/popup_menu.h b/ui/widgets/popup_menu.h index 87bd105..751b20f 100644 --- a/ui/widgets/popup_menu.h +++ b/ui/widgets/popup_menu.h @@ -82,6 +82,7 @@ public: bool prepareGeometryFor(const QPoint &p); void popupPrepared(); void hideMenu(bool fast = false); + void setTopShift(int topShift); void setForceWidth(int forceWidth); void setForcedOrigin(PanelAnimation::Origin origin); void setForcedVerticalOrigin(VerticalOrigin origin); @@ -218,6 +219,7 @@ private: bool _reactivateParent = true; bool _grabbingForPanelAnimation = false; + int _topShift = 0; bool _clearLastSeparator = true; Fn _destroyedCallback; diff --git a/ui/widgets/widgets.style b/ui/widgets/widgets.style index b251073..5790f12 100644 --- a/ui/widgets/widgets.style +++ b/ui/widgets/widgets.style @@ -230,6 +230,7 @@ Menu { itemFgShortcutOver: color; itemFgShortcutDisabled: color; itemPadding: margins; + itemRightSkip: pixels; itemIconPosition: point; itemStyle: TextStyle; itemToggle: Toggle; @@ -823,6 +824,7 @@ defaultMenu: Menu { itemFgShortcutDisabled: menuFgDisabled; itemIconPosition: point(0px, 0px); itemPadding: margins(17px, 8px, 17px, 7px); + itemRightSkip: 6px; itemStyle: defaultTextStyle; itemToggle: defaultMenuToggle; itemToggleOver: defaultMenuToggleOver;