1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 06:17:35 +00:00

WindowServer: Simplify WSMenu MouseWheel event

A mouse move event needs to do a bit more work than what a mouse wheel event
does. Mouse wheel just needs to update the hovered item, and update for a new
hovered item. This also stops us from calling redraw() twice on a wheel event.
This commit is contained in:
Shannon Booth 2020-01-20 22:03:57 +13:00 committed by Andreas Kling
parent 3e05c83591
commit 68d5b39942
2 changed files with 12 additions and 11 deletions

View file

@ -300,11 +300,9 @@ void WSMenu::decend_into_submenu_at_hovered_item()
m_in_submenu = true; m_in_submenu = true;
} }
void WSMenu::handle_hover_event(const WSMouseEvent& event) void WSMenu::handle_mouse_move_event(const WSMouseEvent& mouse_event)
{ {
ASSERT(menu_window()); ASSERT(menu_window());
auto mouse_event = static_cast<const WSMouseEvent&>(event);
if (hovered_item() && hovered_item()->is_submenu()) { if (hovered_item() && hovered_item()->is_submenu()) {
auto item = *hovered_item(); auto item = *hovered_item();
@ -333,7 +331,7 @@ void WSMenu::handle_hover_event(const WSMouseEvent& event)
void WSMenu::event(CEvent& event) void WSMenu::event(CEvent& event)
{ {
if (event.type() == WSEvent::MouseMove) { if (event.type() == WSEvent::MouseMove) {
handle_hover_event(static_cast<const WSMouseEvent&>(event)); handle_mouse_move_event(static_cast<const WSMouseEvent&>(event));
return; return;
} }
@ -343,14 +341,17 @@ void WSMenu::event(CEvent& event)
} }
if (event.type() == WSEvent::MouseWheel && is_scrollable()) { if (event.type() == WSEvent::MouseWheel && is_scrollable()) {
ASSERT(menu_window());
auto& mouse_event = static_cast<const WSMouseEvent&>(event); auto& mouse_event = static_cast<const WSMouseEvent&>(event);
m_scroll_offset += mouse_event.wheel_delta(); m_scroll_offset += mouse_event.wheel_delta();
if (m_scroll_offset < 0) m_scroll_offset = clamp(m_scroll_offset, 0, m_max_scroll_offset);
m_scroll_offset = 0;
if (m_scroll_offset >= m_max_scroll_offset) int index = item_index_at(mouse_event.position());
m_scroll_offset = m_max_scroll_offset; if (m_hovered_item_index == index)
handle_hover_event(mouse_event); return;
redraw();
m_hovered_item_index = index;
update_for_new_hovered_item();
return; return;
} }

View file

@ -117,7 +117,7 @@ public:
private: private:
virtual void event(CEvent&) override; virtual void event(CEvent&) override;
void handle_hover_event(const WSMouseEvent&); void handle_mouse_move_event(const WSMouseEvent&);
int visible_item_count() const; int visible_item_count() const;
int item_index_at(const Point&); int item_index_at(const Point&);