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([=] {
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<not_null<QAction*>> &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);

View file

@ -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<DropdownMenu>;
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);

View file

@ -90,27 +90,24 @@ not_null<QAction*> Menu::addAction(not_null<QAction*> 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());

View file

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

View file

@ -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

View file

@ -32,8 +32,12 @@ void ItemBase::setSelected(
bool ItemBase::isSelected() const {
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 {
@ -51,10 +55,13 @@ void ItemBase::setClicked(TriggeredSource source) {
}
}
rpl::producer<> ItemBase::clicks() const {
rpl::producer<CallbackData> 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<int> ItemBase::contentWidthValue() const {

View file

@ -19,7 +19,7 @@ public:
TriggeredSource lastTriggeredSource() const;
rpl::producer<bool> selects() const;
rpl::producer<CallbackData> 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<CallbackData> clicks() const;
rpl::producer<int> contentWidthValue() const;
int contentWidth() const;

View file

@ -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;
}

View file

@ -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<PopupMenu>;
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);