Replaced passing of numerous arguments with struct in menu.
This commit is contained in:
parent
4cbe5fc464
commit
ec988db6c7
9 changed files with 61 additions and 49 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue