diff --git a/ui/widgets/menu/menu.cpp b/ui/widgets/menu/menu.cpp index e73d344..925abfa 100644 --- a/ui/widgets/menu/menu.cpp +++ b/ui/widgets/menu/menu.cpp @@ -218,6 +218,24 @@ void Menu::clearActions() { resizeFromInner(_forceWidth ? _forceWidth : _st.widthMin, _st.skip * 2); } +void Menu::clearLastSeparator() { + if (_actionWidgets.empty() || _actions.empty()) { + return; + } + if (_actionWidgets.back()->action() == _actions.back()) { + if (_actions.back()->isSeparator()) { + resizeFromInner( + width(), + height() - _actionWidgets.back()->height()); + _actionWidgets.pop_back(); + if (_actions.back()->parent() == this) { + delete _actions.back(); + _actions.pop_back(); + } + } + } +} + void Menu::finishAnimating() { for (const auto &widget : _actionWidgets) { widget->finishAnimating(); diff --git a/ui/widgets/menu/menu.h b/ui/widgets/menu/menu.h index b4bb56d..c471ac9 100644 --- a/ui/widgets/menu/menu.h +++ b/ui/widgets/menu/menu.h @@ -57,6 +57,7 @@ public: int position, base::unique_qptr widget); void clearActions(); + void clearLastSeparator(); void finishAnimating(); bool empty() const; diff --git a/ui/widgets/popup_menu.cpp b/ui/widgets/popup_menu.cpp index 1b6b66b..0968190 100644 --- a/ui/widgets/popup_menu.cpp +++ b/ui/widgets/popup_menu.cpp @@ -888,6 +888,12 @@ void PopupMenu::deleteOnHide(bool del) { } void PopupMenu::popup(const QPoint &p) { + if (_clearLastSeparator) { + _menu->clearLastSeparator(); + for (const auto &[action, submenu] : _submenus) { + submenu->menu()->clearLastSeparator(); + } + } if (prepareGeometryFor(p)) { popupPrepared(); return; @@ -1046,6 +1052,10 @@ void PopupMenu::showPrepared(TriggeredSource source) { activateWindow(); } +void PopupMenu::setClearLastSeparator(bool clear) { + _clearLastSeparator = clear; +} + PopupMenu::~PopupMenu() { for (const auto &[action, submenu] : base::take(_submenus)) { delete submenu; diff --git a/ui/widgets/popup_menu.h b/ui/widgets/popup_menu.h index 0eb0a7c..170c1de 100644 --- a/ui/widgets/popup_menu.h +++ b/ui/widgets/popup_menu.h @@ -101,6 +101,8 @@ public: }; [[nodiscard]] rpl::producer showStateValue() const; + void setClearLastSeparator(bool clear); + protected: void paintEvent(QPaintEvent *e) override; void focusOutEvent(QFocusEvent *e) override; @@ -202,6 +204,8 @@ private: bool _reactivateParent = true; bool _grabbingForPanelAnimation = false; + bool _clearLastSeparator = true; + Fn _destroyedCallback; };