From ec988db6c7398583123ae53dea9f621114f95efe Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Wed, 13 Jan 2021 02:21:49 +0300 Subject: [PATCH] Replaced passing of numerous arguments with struct in menu. --- ui/widgets/dropdown_menu.cpp | 22 +++++++++++----------- ui/widgets/dropdown_menu.h | 6 +++--- ui/widgets/menu/menu.cpp | 15 ++++++--------- ui/widgets/menu/menu.h | 8 ++++---- ui/widgets/menu/menu_common.h | 8 ++++++++ ui/widgets/menu/menu_item_base.cpp | 15 +++++++++++---- ui/widgets/menu/menu_item_base.h | 4 ++-- ui/widgets/popup_menu.cpp | 26 +++++++++++++------------- ui/widgets/popup_menu.h | 6 +++--- 9 files changed, 61 insertions(+), 49 deletions(-) diff --git a/ui/widgets/dropdown_menu.cpp b/ui/widgets/dropdown_menu.cpp index 5380f4a..c3a3d64 100644 --- a/ui/widgets/dropdown_menu.cpp +++ b/ui/widgets/dropdown_menu.cpp @@ -37,11 +37,11 @@ void DropdownMenu::init() { ) | rpl::start_with_next([=] { resizeToContent(); }, _menu->lifetime()); - _menu->setActivatedCallback([this](QAction *action, int actionTop, TriggeredSource source) { - handleActivated(action, actionTop, source); + _menu->setActivatedCallback([this](const Menu::CallbackData &data) { + handleActivated(data); }); - _menu->setTriggeredCallback([this](QAction *action, int actionTop, TriggeredSource source) { - handleTriggered(action, actionTop, source); + _menu->setTriggeredCallback([this](const Menu::CallbackData &data) { + handleTriggered(data); }); _menu->setKeyPressDelegate([this](int key) { return handleKeyPress(key); }); _menu->setMouseMoveDelegate([this](QPoint globalPosition) { handleMouseMove(globalPosition); }); @@ -72,9 +72,9 @@ const std::vector> &DropdownMenu::actions() const { return _menu->actions(); } -void DropdownMenu::handleActivated(QAction *action, int actionTop, TriggeredSource source) { - if (source == TriggeredSource::Mouse) { - if (!popupSubmenuFromAction(action, actionTop, source)) { +void DropdownMenu::handleActivated(const Menu::CallbackData &data) { + if (data.source == TriggeredSource::Mouse) { + if (!popupSubmenuFromAction(data)) { if (auto currentSubmenu = base::take(_activeSubmenu)) { currentSubmenu->hideMenu(true); } @@ -82,11 +82,11 @@ void DropdownMenu::handleActivated(QAction *action, int actionTop, TriggeredSour } } -void DropdownMenu::handleTriggered(QAction *action, int actionTop, TriggeredSource source) { - if (!popupSubmenuFromAction(action, actionTop, source)) { +void DropdownMenu::handleTriggered(const Menu::CallbackData &data) { + if (!popupSubmenuFromAction(data)) { hideMenu(); _triggering = true; - emit action->trigger(); + emit data.action->trigger(); _triggering = false; if (_deleteLater) { _deleteLater = false; @@ -96,7 +96,7 @@ void DropdownMenu::handleTriggered(QAction *action, int actionTop, TriggeredSour } // Not ready with submenus yet. -bool DropdownMenu::popupSubmenuFromAction(QAction *action, int actionTop, TriggeredSource source) { +bool DropdownMenu::popupSubmenuFromAction(const Menu::CallbackData &data) { //if (auto submenu = _submenus.value(action)) { // if (_activeSubmenu == submenu) { // submenu->hideMenu(true); diff --git a/ui/widgets/dropdown_menu.h b/ui/widgets/dropdown_menu.h index 1c283ff..0b03a06 100644 --- a/ui/widgets/dropdown_menu.h +++ b/ui/widgets/dropdown_menu.h @@ -55,8 +55,8 @@ private: void hideFinish(); using TriggeredSource = Menu::TriggeredSource; - void handleActivated(QAction *action, int actionTop, TriggeredSource source); - void handleTriggered(QAction *action, int actionTop, TriggeredSource source); + void handleActivated(const Menu::CallbackData &data); + void handleTriggered(const Menu::CallbackData &data); void forwardKeyPress(int key); bool handleKeyPress(int key); void forwardMouseMove(QPoint globalPosition) { @@ -73,7 +73,7 @@ private: void handleMouseRelease(QPoint globalPosition); using SubmenuPointer = QPointer; - bool popupSubmenuFromAction(QAction *action, int actionTop, TriggeredSource source); + bool popupSubmenuFromAction(const Menu::CallbackData &data); void popupSubmenu(SubmenuPointer submenu, int actionTop, TriggeredSource source); void showMenu(const QPoint &p, DropdownMenu *parent, TriggeredSource source); diff --git a/ui/widgets/menu/menu.cpp b/ui/widgets/menu/menu.cpp index bf76367..964ff2a 100644 --- a/ui/widgets/menu/menu.cpp +++ b/ui/widgets/menu/menu.cpp @@ -90,27 +90,24 @@ not_null Menu::addAction(not_null action, const style::icon widget->show(); widget->selects( - ) | rpl::start_with_next([=, w = widget.get()](bool selected) { - if (!selected) { + ) | rpl::start_with_next([=](const CallbackData &data) { + if (!data.selected) { return; } for (auto i = 0; i < _actionWidgets.size(); i++) { - if (_actionWidgets[i].get() != w) { + if (i != data.index) { _actionWidgets[i]->setSelected(false); } } if (_activatedCallback) { - _activatedCallback( - w->action(), - w->y(), - w->lastTriggeredSource()); + _activatedCallback(data); } }, widget->lifetime()); widget->clicks( - ) | rpl::start_with_next([=, w = widget.get()]() { + ) | rpl::start_with_next([=](const CallbackData &data) { if (_triggeredCallback) { - _triggeredCallback(w->action(), w->y(), w->lastTriggeredSource()); + _triggeredCallback(data); } }, widget->lifetime()); diff --git a/ui/widgets/menu/menu.h b/ui/widgets/menu/menu.h index c7aea23..b90eda3 100644 --- a/ui/widgets/menu/menu.h +++ b/ui/widgets/menu/menu.h @@ -41,10 +41,10 @@ public: const std::vector> &actions() const; - void setActivatedCallback(Fn callback) { + void setActivatedCallback(Fn callback) { _activatedCallback = std::move(callback); } - void setTriggeredCallback(Fn callback) { + void setTriggeredCallback(Fn callback) { _triggeredCallback = std::move(callback); } @@ -89,8 +89,8 @@ private: const style::Menu &_st; - Fn _activatedCallback; - Fn _triggeredCallback; + Fn _activatedCallback; + Fn _triggeredCallback; Fn _keyPressDelegate; Fn _mouseMoveDelegate; Fn _mousePressDelegate; diff --git a/ui/widgets/menu/menu_common.h b/ui/widgets/menu/menu_common.h index ebebfe7..e1d19f4 100644 --- a/ui/widgets/menu/menu_common.h +++ b/ui/widgets/menu/menu_common.h @@ -13,4 +13,12 @@ enum class TriggeredSource { Keyboard, }; +struct CallbackData { + QAction *action; + int actionTop = 0; + TriggeredSource source; + int index = 0; + bool selected = false; +}; + } // namespace Ui::Menu diff --git a/ui/widgets/menu/menu_item_base.cpp b/ui/widgets/menu/menu_item_base.cpp index 7f09b95..9340e6b 100644 --- a/ui/widgets/menu/menu_item_base.cpp +++ b/ui/widgets/menu/menu_item_base.cpp @@ -32,8 +32,12 @@ void ItemBase::setSelected( bool ItemBase::isSelected() const { return _selected.current(); } -rpl::producer ItemBase::selects() const { - return _selected.changes(); + +rpl::producer ItemBase::selects() const { + return _selected.changes( + ) | rpl::map([=](bool selected) -> CallbackData { + return { action(), y(), _lastTriggeredSource, _index, selected }; + }); } TriggeredSource ItemBase::lastTriggeredSource() const { @@ -51,10 +55,13 @@ void ItemBase::setClicked(TriggeredSource source) { } } -rpl::producer<> ItemBase::clicks() const { +rpl::producer ItemBase::clicks() const { return rpl::merge( AbstractButton::clicks() | rpl::to_empty, - _clicks.events()); + _clicks.events() + ) | rpl::map([=]() -> CallbackData { + return { action(), y(), _lastTriggeredSource, _index, true }; + });; } rpl::producer ItemBase::contentWidthValue() const { diff --git a/ui/widgets/menu/menu_item_base.h b/ui/widgets/menu/menu_item_base.h index e470bc0..efcc7da 100644 --- a/ui/widgets/menu/menu_item_base.h +++ b/ui/widgets/menu/menu_item_base.h @@ -19,7 +19,7 @@ public: TriggeredSource lastTriggeredSource() const; - rpl::producer selects() const; + rpl::producer selects() const; void setSelected( bool selected, TriggeredSource source = TriggeredSource::Mouse); @@ -29,7 +29,7 @@ public: void setClicked(TriggeredSource source = TriggeredSource::Mouse); - rpl::producer<> clicks() const; + rpl::producer clicks() const; rpl::producer contentWidthValue() const; int contentWidth() const; diff --git a/ui/widgets/popup_menu.cpp b/ui/widgets/popup_menu.cpp index 41f9a22..814cc06 100644 --- a/ui/widgets/popup_menu.cpp +++ b/ui/widgets/popup_menu.cpp @@ -56,11 +56,11 @@ void PopupMenu::init() { ) | rpl::start_with_next([=] { handleMenuResize(); }, _menu->lifetime()); - _menu->setActivatedCallback([this](QAction *action, int actionTop, TriggeredSource source) { - handleActivated(action, actionTop, source); + _menu->setActivatedCallback([this](const Menu::CallbackData &data) { + handleActivated(data); }); - _menu->setTriggeredCallback([this](QAction *action, int actionTop, TriggeredSource source) { - handleTriggered(action, actionTop, source); + _menu->setTriggeredCallback([this](const Menu::CallbackData &data) { + handleTriggered(data); }); _menu->setKeyPressDelegate([this](int key) { return handleKeyPress(key); }); _menu->setMouseMoveDelegate([this](QPoint globalPosition) { handleMouseMove(globalPosition); }); @@ -152,9 +152,9 @@ void PopupMenu::paintBg(QPainter &p) { } } -void PopupMenu::handleActivated(QAction *action, int actionTop, TriggeredSource source) { - if (source == TriggeredSource::Mouse) { - if (!popupSubmenuFromAction(action, actionTop, source)) { +void PopupMenu::handleActivated(const Menu::CallbackData &data) { + if (data.source == TriggeredSource::Mouse) { + if (!popupSubmenuFromAction(data)) { if (auto currentSubmenu = base::take(_activeSubmenu)) { currentSubmenu->hideMenu(true); } @@ -162,11 +162,11 @@ void PopupMenu::handleActivated(QAction *action, int actionTop, TriggeredSource } } -void PopupMenu::handleTriggered(QAction *action, int actionTop, TriggeredSource source) { - if (!popupSubmenuFromAction(action, actionTop, source)) { +void PopupMenu::handleTriggered(const Menu::CallbackData &data) { + if (!popupSubmenuFromAction(data)) { _triggering = true; hideMenu(); - emit action->trigger(); + emit data.action->trigger(); _triggering = false; if (_deleteLater) { _deleteLater = false; @@ -175,12 +175,12 @@ void PopupMenu::handleTriggered(QAction *action, int actionTop, TriggeredSource } } -bool PopupMenu::popupSubmenuFromAction(QAction *action, int actionTop, TriggeredSource source) { - if (auto submenu = _submenus.value(action)) { +bool PopupMenu::popupSubmenuFromAction(const Menu::CallbackData &data) { + if (auto submenu = _submenus.value(data.action)) { if (_activeSubmenu == submenu) { submenu->hideMenu(true); } else { - popupSubmenu(submenu, actionTop, source); + popupSubmenu(submenu, data.actionTop, data.source); } return true; } diff --git a/ui/widgets/popup_menu.h b/ui/widgets/popup_menu.h index 304a9ec..f7c7bd5 100644 --- a/ui/widgets/popup_menu.h +++ b/ui/widgets/popup_menu.h @@ -74,8 +74,8 @@ private: using TriggeredSource = Menu::TriggeredSource; void handleCompositingUpdate(); void handleMenuResize(); - void handleActivated(QAction *action, int actionTop, TriggeredSource source); - void handleTriggered(QAction *action, int actionTop, TriggeredSource source); + void handleActivated(const Menu::CallbackData &data); + void handleTriggered(const Menu::CallbackData &data); void forwardKeyPress(int key); bool handleKeyPress(int key); void forwardMouseMove(QPoint globalPosition) { @@ -92,7 +92,7 @@ private: void handleMouseRelease(QPoint globalPosition); using SubmenuPointer = QPointer; - bool popupSubmenuFromAction(QAction *action, int actionTop, TriggeredSource source); + bool popupSubmenuFromAction(const Menu::CallbackData &data); void popupSubmenu(SubmenuPointer submenu, int actionTop, TriggeredSource source); void showMenu(const QPoint &p, PopupMenu *parent, TriggeredSource source);