Replaced passing of numerous arguments with struct in menu.

This commit is contained in:
23rd 2021-01-13 02:21:49 +03:00
parent 4cbe5fc464
commit ec988db6c7
9 changed files with 61 additions and 49 deletions

View file

@ -37,11 +37,11 @@ void DropdownMenu::init() {
) | rpl::start_with_next([=] { ) | rpl::start_with_next([=] {
resizeToContent(); resizeToContent();
}, _menu->lifetime()); }, _menu->lifetime());
_menu->setActivatedCallback([this](QAction *action, int actionTop, TriggeredSource source) { _menu->setActivatedCallback([this](const Menu::CallbackData &data) {
handleActivated(action, actionTop, source); handleActivated(data);
}); });
_menu->setTriggeredCallback([this](QAction *action, int actionTop, TriggeredSource source) { _menu->setTriggeredCallback([this](const Menu::CallbackData &data) {
handleTriggered(action, actionTop, source); handleTriggered(data);
}); });
_menu->setKeyPressDelegate([this](int key) { return handleKeyPress(key); }); _menu->setKeyPressDelegate([this](int key) { return handleKeyPress(key); });
_menu->setMouseMoveDelegate([this](QPoint globalPosition) { handleMouseMove(globalPosition); }); _menu->setMouseMoveDelegate([this](QPoint globalPosition) { handleMouseMove(globalPosition); });
@ -72,9 +72,9 @@ const std::vector<not_null<QAction*>> &DropdownMenu::actions() const {
return _menu->actions(); return _menu->actions();
} }
void DropdownMenu::handleActivated(QAction *action, int actionTop, TriggeredSource source) { void DropdownMenu::handleActivated(const Menu::CallbackData &data) {
if (source == TriggeredSource::Mouse) { if (data.source == TriggeredSource::Mouse) {
if (!popupSubmenuFromAction(action, actionTop, source)) { if (!popupSubmenuFromAction(data)) {
if (auto currentSubmenu = base::take(_activeSubmenu)) { if (auto currentSubmenu = base::take(_activeSubmenu)) {
currentSubmenu->hideMenu(true); currentSubmenu->hideMenu(true);
} }
@ -82,11 +82,11 @@ void DropdownMenu::handleActivated(QAction *action, int actionTop, TriggeredSour
} }
} }
void DropdownMenu::handleTriggered(QAction *action, int actionTop, TriggeredSource source) { void DropdownMenu::handleTriggered(const Menu::CallbackData &data) {
if (!popupSubmenuFromAction(action, actionTop, source)) { if (!popupSubmenuFromAction(data)) {
hideMenu(); hideMenu();
_triggering = true; _triggering = true;
emit action->trigger(); emit data.action->trigger();
_triggering = false; _triggering = false;
if (_deleteLater) { if (_deleteLater) {
_deleteLater = false; _deleteLater = false;
@ -96,7 +96,7 @@ void DropdownMenu::handleTriggered(QAction *action, int actionTop, TriggeredSour
} }
// Not ready with submenus yet. // 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 (auto submenu = _submenus.value(action)) {
// if (_activeSubmenu == submenu) { // if (_activeSubmenu == submenu) {
// submenu->hideMenu(true); // submenu->hideMenu(true);

View file

@ -55,8 +55,8 @@ private:
void hideFinish(); void hideFinish();
using TriggeredSource = Menu::TriggeredSource; using TriggeredSource = Menu::TriggeredSource;
void handleActivated(QAction *action, int actionTop, TriggeredSource source); void handleActivated(const Menu::CallbackData &data);
void handleTriggered(QAction *action, int actionTop, TriggeredSource source); void handleTriggered(const Menu::CallbackData &data);
void forwardKeyPress(int key); void forwardKeyPress(int key);
bool handleKeyPress(int key); bool handleKeyPress(int key);
void forwardMouseMove(QPoint globalPosition) { void forwardMouseMove(QPoint globalPosition) {
@ -73,7 +73,7 @@ private:
void handleMouseRelease(QPoint globalPosition); void handleMouseRelease(QPoint globalPosition);
using SubmenuPointer = QPointer<DropdownMenu>; using SubmenuPointer = QPointer<DropdownMenu>;
bool popupSubmenuFromAction(QAction *action, int actionTop, TriggeredSource source); bool popupSubmenuFromAction(const Menu::CallbackData &data);
void popupSubmenu(SubmenuPointer submenu, int actionTop, TriggeredSource source); void popupSubmenu(SubmenuPointer submenu, int actionTop, TriggeredSource source);
void showMenu(const QPoint &p, DropdownMenu *parent, TriggeredSource source); void showMenu(const QPoint &p, DropdownMenu *parent, TriggeredSource source);

View file

@ -90,27 +90,24 @@ not_null<QAction*> Menu::addAction(not_null<QAction*> action, const style::icon
widget->show(); widget->show();
widget->selects( widget->selects(
) | rpl::start_with_next([=, w = widget.get()](bool selected) { ) | rpl::start_with_next([=](const CallbackData &data) {
if (!selected) { if (!data.selected) {
return; return;
} }
for (auto i = 0; i < _actionWidgets.size(); i++) { for (auto i = 0; i < _actionWidgets.size(); i++) {
if (_actionWidgets[i].get() != w) { if (i != data.index) {
_actionWidgets[i]->setSelected(false); _actionWidgets[i]->setSelected(false);
} }
} }
if (_activatedCallback) { if (_activatedCallback) {
_activatedCallback( _activatedCallback(data);
w->action(),
w->y(),
w->lastTriggeredSource());
} }
}, widget->lifetime()); }, widget->lifetime());
widget->clicks( widget->clicks(
) | rpl::start_with_next([=, w = widget.get()]() { ) | rpl::start_with_next([=](const CallbackData &data) {
if (_triggeredCallback) { if (_triggeredCallback) {
_triggeredCallback(w->action(), w->y(), w->lastTriggeredSource()); _triggeredCallback(data);
} }
}, widget->lifetime()); }, widget->lifetime());

View file

@ -41,10 +41,10 @@ public:
const std::vector<not_null<QAction*>> &actions() const; const std::vector<not_null<QAction*>> &actions() const;
void setActivatedCallback(Fn<void(QAction *action, int actionTop, TriggeredSource source)> callback) { void setActivatedCallback(Fn<void(const CallbackData &data)> callback) {
_activatedCallback = std::move(callback); _activatedCallback = std::move(callback);
} }
void setTriggeredCallback(Fn<void(QAction *action, int actionTop, TriggeredSource source)> callback) { void setTriggeredCallback(Fn<void(const CallbackData &data)> callback) {
_triggeredCallback = std::move(callback); _triggeredCallback = std::move(callback);
} }
@ -89,8 +89,8 @@ private:
const style::Menu &_st; const style::Menu &_st;
Fn<void(QAction *action, int actionTop, TriggeredSource source)> _activatedCallback; Fn<void(const CallbackData &data)> _activatedCallback;
Fn<void(QAction *action, int actionTop, TriggeredSource source)> _triggeredCallback; Fn<void(const CallbackData &data)> _triggeredCallback;
Fn<bool(int key)> _keyPressDelegate; Fn<bool(int key)> _keyPressDelegate;
Fn<void(QPoint globalPosition)> _mouseMoveDelegate; Fn<void(QPoint globalPosition)> _mouseMoveDelegate;
Fn<void(QPoint globalPosition)> _mousePressDelegate; Fn<void(QPoint globalPosition)> _mousePressDelegate;

View file

@ -13,4 +13,12 @@ enum class TriggeredSource {
Keyboard, Keyboard,
}; };
struct CallbackData {
QAction *action;
int actionTop = 0;
TriggeredSource source;
int index = 0;
bool selected = false;
};
} // namespace Ui::Menu } // namespace Ui::Menu

View file

@ -32,8 +32,12 @@ void ItemBase::setSelected(
bool ItemBase::isSelected() const { bool ItemBase::isSelected() const {
return _selected.current(); return _selected.current();
} }
rpl::producer<bool> ItemBase::selects() const {
return _selected.changes(); rpl::producer<CallbackData> ItemBase::selects() const {
return _selected.changes(
) | rpl::map([=](bool selected) -> CallbackData {
return { action(), y(), _lastTriggeredSource, _index, selected };
});
} }
TriggeredSource ItemBase::lastTriggeredSource() const { TriggeredSource ItemBase::lastTriggeredSource() const {
@ -51,10 +55,13 @@ void ItemBase::setClicked(TriggeredSource source) {
} }
} }
rpl::producer<> ItemBase::clicks() const { rpl::producer<CallbackData> ItemBase::clicks() const {
return rpl::merge( return rpl::merge(
AbstractButton::clicks() | rpl::to_empty, AbstractButton::clicks() | rpl::to_empty,
_clicks.events()); _clicks.events()
) | rpl::map([=]() -> CallbackData {
return { action(), y(), _lastTriggeredSource, _index, true };
});;
} }
rpl::producer<int> ItemBase::contentWidthValue() const { rpl::producer<int> ItemBase::contentWidthValue() const {

View file

@ -19,7 +19,7 @@ public:
TriggeredSource lastTriggeredSource() const; TriggeredSource lastTriggeredSource() const;
rpl::producer<bool> selects() const; rpl::producer<CallbackData> selects() const;
void setSelected( void setSelected(
bool selected, bool selected,
TriggeredSource source = TriggeredSource::Mouse); TriggeredSource source = TriggeredSource::Mouse);
@ -29,7 +29,7 @@ public:
void setClicked(TriggeredSource source = TriggeredSource::Mouse); void setClicked(TriggeredSource source = TriggeredSource::Mouse);
rpl::producer<> clicks() const; rpl::producer<CallbackData> clicks() const;
rpl::producer<int> contentWidthValue() const; rpl::producer<int> contentWidthValue() const;
int contentWidth() const; int contentWidth() const;

View file

@ -56,11 +56,11 @@ void PopupMenu::init() {
) | rpl::start_with_next([=] { ) | rpl::start_with_next([=] {
handleMenuResize(); handleMenuResize();
}, _menu->lifetime()); }, _menu->lifetime());
_menu->setActivatedCallback([this](QAction *action, int actionTop, TriggeredSource source) { _menu->setActivatedCallback([this](const Menu::CallbackData &data) {
handleActivated(action, actionTop, source); handleActivated(data);
}); });
_menu->setTriggeredCallback([this](QAction *action, int actionTop, TriggeredSource source) { _menu->setTriggeredCallback([this](const Menu::CallbackData &data) {
handleTriggered(action, actionTop, source); handleTriggered(data);
}); });
_menu->setKeyPressDelegate([this](int key) { return handleKeyPress(key); }); _menu->setKeyPressDelegate([this](int key) { return handleKeyPress(key); });
_menu->setMouseMoveDelegate([this](QPoint globalPosition) { handleMouseMove(globalPosition); }); _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) { void PopupMenu::handleActivated(const Menu::CallbackData &data) {
if (source == TriggeredSource::Mouse) { if (data.source == TriggeredSource::Mouse) {
if (!popupSubmenuFromAction(action, actionTop, source)) { if (!popupSubmenuFromAction(data)) {
if (auto currentSubmenu = base::take(_activeSubmenu)) { if (auto currentSubmenu = base::take(_activeSubmenu)) {
currentSubmenu->hideMenu(true); currentSubmenu->hideMenu(true);
} }
@ -162,11 +162,11 @@ void PopupMenu::handleActivated(QAction *action, int actionTop, TriggeredSource
} }
} }
void PopupMenu::handleTriggered(QAction *action, int actionTop, TriggeredSource source) { void PopupMenu::handleTriggered(const Menu::CallbackData &data) {
if (!popupSubmenuFromAction(action, actionTop, source)) { if (!popupSubmenuFromAction(data)) {
_triggering = true; _triggering = true;
hideMenu(); hideMenu();
emit action->trigger(); emit data.action->trigger();
_triggering = false; _triggering = false;
if (_deleteLater) { if (_deleteLater) {
_deleteLater = false; _deleteLater = false;
@ -175,12 +175,12 @@ void PopupMenu::handleTriggered(QAction *action, int actionTop, TriggeredSource
} }
} }
bool PopupMenu::popupSubmenuFromAction(QAction *action, int actionTop, TriggeredSource source) { bool PopupMenu::popupSubmenuFromAction(const Menu::CallbackData &data) {
if (auto submenu = _submenus.value(action)) { if (auto submenu = _submenus.value(data.action)) {
if (_activeSubmenu == submenu) { if (_activeSubmenu == submenu) {
submenu->hideMenu(true); submenu->hideMenu(true);
} else { } else {
popupSubmenu(submenu, actionTop, source); popupSubmenu(submenu, data.actionTop, data.source);
} }
return true; return true;
} }

View file

@ -74,8 +74,8 @@ private:
using TriggeredSource = Menu::TriggeredSource; using TriggeredSource = Menu::TriggeredSource;
void handleCompositingUpdate(); void handleCompositingUpdate();
void handleMenuResize(); void handleMenuResize();
void handleActivated(QAction *action, int actionTop, TriggeredSource source); void handleActivated(const Menu::CallbackData &data);
void handleTriggered(QAction *action, int actionTop, TriggeredSource source); void handleTriggered(const Menu::CallbackData &data);
void forwardKeyPress(int key); void forwardKeyPress(int key);
bool handleKeyPress(int key); bool handleKeyPress(int key);
void forwardMouseMove(QPoint globalPosition) { void forwardMouseMove(QPoint globalPosition) {
@ -92,7 +92,7 @@ private:
void handleMouseRelease(QPoint globalPosition); void handleMouseRelease(QPoint globalPosition);
using SubmenuPointer = QPointer<PopupMenu>; using SubmenuPointer = QPointer<PopupMenu>;
bool popupSubmenuFromAction(QAction *action, int actionTop, TriggeredSource source); bool popupSubmenuFromAction(const Menu::CallbackData &data);
void popupSubmenu(SubmenuPointer submenu, int actionTop, TriggeredSource source); void popupSubmenu(SubmenuPointer submenu, int actionTop, TriggeredSource source);
void showMenu(const QPoint &p, PopupMenu *parent, TriggeredSource source); void showMenu(const QPoint &p, PopupMenu *parent, TriggeredSource source);