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([=] {
|
) | 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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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());
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue