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:
parent
3e05c83591
commit
68d5b39942
2 changed files with 12 additions and 11 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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&);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue