Scroll to the item selected by keyboard.
This commit is contained in:
parent
40c0a11705
commit
52718aa5db
3 changed files with 30 additions and 2 deletions
|
|
@ -9,6 +9,7 @@
|
||||||
#include "ui/widgets/menu/menu_action.h"
|
#include "ui/widgets/menu/menu_action.h"
|
||||||
#include "ui/widgets/menu/menu_item_base.h"
|
#include "ui/widgets/menu/menu_item_base.h"
|
||||||
#include "ui/widgets/menu/menu_separator.h"
|
#include "ui/widgets/menu/menu_separator.h"
|
||||||
|
#include "ui/widgets/scroll_area.h"
|
||||||
|
|
||||||
#include <QtGui/QtEvents>
|
#include <QtGui/QtEvents>
|
||||||
|
|
||||||
|
|
@ -212,6 +213,10 @@ rpl::producer<> Menu::resizesFromInner() const {
|
||||||
return _resizesFromInner.events();
|
return _resizesFromInner.events();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rpl::producer<ScrollToRequest> Menu::scrollToRequests() const {
|
||||||
|
return _scrollToRequests.events();
|
||||||
|
}
|
||||||
|
|
||||||
void Menu::setShowSource(TriggeredSource source) {
|
void Menu::setShowSource(TriggeredSource source) {
|
||||||
const auto mouseSelection = (source == TriggeredSource::Mouse);
|
const auto mouseSelection = (source == TriggeredSource::Mouse);
|
||||||
setSelected(
|
setSelected(
|
||||||
|
|
@ -314,6 +319,13 @@ void Menu::setSelected(int selected, bool isMouseSelection) {
|
||||||
const auto source = isMouseSelection
|
const auto source = isMouseSelection
|
||||||
? TriggeredSource::Mouse
|
? TriggeredSource::Mouse
|
||||||
: TriggeredSource::Keyboard;
|
: TriggeredSource::Keyboard;
|
||||||
|
if (selected >= 0 && source == TriggeredSource::Keyboard) {
|
||||||
|
const auto widget = _actionWidgets[selected].get();
|
||||||
|
_scrollToRequests.fire({
|
||||||
|
widget->y(),
|
||||||
|
widget->y() + widget->height(),
|
||||||
|
});
|
||||||
|
}
|
||||||
if (const auto selectedItem = findSelectedAction()) {
|
if (const auto selectedItem = findSelectedAction()) {
|
||||||
if (selectedItem->index() == selected) {
|
if (selectedItem->index() == selected) {
|
||||||
return;
|
return;
|
||||||
|
|
@ -321,7 +333,7 @@ void Menu::setSelected(int selected, bool isMouseSelection) {
|
||||||
selectedItem->setSelected(false, source);
|
selectedItem->setSelected(false, source);
|
||||||
}
|
}
|
||||||
if (selected >= 0) {
|
if (selected >= 0) {
|
||||||
_actionWidgets[selected]->setSelected(true, source);
|
_actionWidgets[selected].get()->setSelected(true, source);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,10 @@
|
||||||
|
|
||||||
#include <QtWidgets/QMenu>
|
#include <QtWidgets/QMenu>
|
||||||
|
|
||||||
|
namespace Ui {
|
||||||
|
struct ScrollToRequest;
|
||||||
|
} // namespace Ui
|
||||||
|
|
||||||
namespace Ui::Menu {
|
namespace Ui::Menu {
|
||||||
|
|
||||||
class ItemBase;
|
class ItemBase;
|
||||||
|
|
@ -82,7 +86,8 @@ public:
|
||||||
}
|
}
|
||||||
void handleMouseRelease(QPoint globalPosition);
|
void handleMouseRelease(QPoint globalPosition);
|
||||||
|
|
||||||
rpl::producer<> resizesFromInner() const;
|
[[nodiscard]] rpl::producer<> resizesFromInner() const;
|
||||||
|
[[nodiscard]] rpl::producer<ScrollToRequest> scrollToRequests() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void keyPressEvent(QKeyEvent *e) override;
|
void keyPressEvent(QKeyEvent *e) override;
|
||||||
|
|
@ -125,6 +130,7 @@ private:
|
||||||
QPointer<QAction> _childShownAction;
|
QPointer<QAction> _childShownAction;
|
||||||
|
|
||||||
rpl::event_stream<> _resizesFromInner;
|
rpl::event_stream<> _resizesFromInner;
|
||||||
|
rpl::event_stream<ScrollToRequest> _scrollToRequests;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -222,6 +222,16 @@ void PopupMenu::init() {
|
||||||
}
|
}
|
||||||
}, paddingWrap->lifetime());
|
}, paddingWrap->lifetime());
|
||||||
|
|
||||||
|
_menu->scrollToRequests(
|
||||||
|
) | rpl::start_with_next([=](ScrollToRequest request) {
|
||||||
|
_scroll->scrollTo({
|
||||||
|
request.ymin ? (_st.scrollPadding.top() + request.ymin) : 0,
|
||||||
|
(request.ymax == _menu->height()
|
||||||
|
? paddingWrap->height()
|
||||||
|
: (_st.scrollPadding.top() + request.ymax)),
|
||||||
|
});
|
||||||
|
}, _menu->lifetime());
|
||||||
|
|
||||||
_menu->resizesFromInner(
|
_menu->resizesFromInner(
|
||||||
) | rpl::start_with_next([=] {
|
) | rpl::start_with_next([=] {
|
||||||
handleMenuResize();
|
handleMenuResize();
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue