Send `mouseleft` event when the mouse leaves the window (#928)

* Send `mouseleft` event when the mouse leaves the window

* Call `View:on_mouse_left` when the mouse leaves the `View`

Previously `View:on_mouse_left` was called only when the mouse left the
window, and it was called on every visible `View`.

Now it gets also called when the mouse "changes" `View`, and only the
last `View` the mouse was on will receive the event.
This commit is contained in:
Guldoman 2022-04-29 03:50:34 +02:00 committed by GitHub
parent ac42e6457a
commit 9de75988ba
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 36 additions and 0 deletions

View File

@ -1136,6 +1136,8 @@ function core.on_event(type, ...)
end end
elseif type == "mousereleased" then elseif type == "mousereleased" then
core.root_view:on_mouse_released(...) core.root_view:on_mouse_released(...)
elseif type == "mouseleft" then
core.root_view:on_mouse_left()
elseif type == "mousewheel" then elseif type == "mousewheel" then
if not core.root_view:on_mouse_wheel(...) then if not core.root_view:on_mouse_wheel(...) then
did_keymap = keymap.on_mouse_wheel(...) did_keymap = keymap.on_mouse_wheel(...)

View File

@ -51,6 +51,15 @@ function Node:on_mouse_released(...)
end end
function Node:on_mouse_left()
if self.type == "leaf" then
self.active_view:on_mouse_left()
else
self:propagate("on_mouse_left")
end
end
function Node:consume(node) function Node:consume(node)
for k, _ in pairs(self) do self[k] = nil end for k, _ in pairs(self) do self[k] = nil end
for k, v in pairs(node) do self[k] = v end for k, v in pairs(node) do self[k] = v end
@ -160,8 +169,12 @@ end
function Node:set_active_view(view) function Node:set_active_view(view)
assert(self.type == "leaf", "Tried to set active view on non-leaf node") assert(self.type == "leaf", "Tried to set active view on non-leaf node")
local last_active_view = self.active_view
self.active_view = view self.active_view = view
core.set_active_view(view) core.set_active_view(view)
if last_active_view and last_active_view ~= view then
last_active_view:on_mouse_left()
end
end end

View File

@ -256,8 +256,13 @@ function RootView:on_mouse_moved(x, y, dx, dy)
self.root_node:on_mouse_moved(x, y, dx, dy) self.root_node:on_mouse_moved(x, y, dx, dy)
local last_overlapping_node = self.overlapping_node
self.overlapping_node = self.root_node:get_child_overlapping_point(x, y) self.overlapping_node = self.root_node:get_child_overlapping_point(x, y)
if last_overlapping_node and last_overlapping_node ~= self.overlapping_node then
last_overlapping_node:on_mouse_left()
end
local div = self.root_node:get_divider_overlapping_point(x, y) local div = self.root_node:get_divider_overlapping_point(x, y)
local tab_index = self.overlapping_node and self.overlapping_node:get_tab_overlapping_point(x, y) local tab_index = self.overlapping_node and self.overlapping_node:get_tab_overlapping_point(x, y)
if self.overlapping_node and self.overlapping_node:get_scroll_button_index(x, y) then if self.overlapping_node and self.overlapping_node:get_scroll_button_index(x, y) then
@ -272,6 +277,13 @@ function RootView:on_mouse_moved(x, y, dx, dy)
end end
function RootView:on_mouse_left()
if self.overlapping_node then
self.overlapping_node:on_mouse_left()
end
end
function RootView:on_file_dropped(filename, x, y) function RootView:on_file_dropped(filename, x, y)
local node = self.root_node:get_child_overlapping_point(x, y) local node = self.root_node:get_child_overlapping_point(x, y)
return node and node.active_view:on_file_dropped(filename, x, y) return node and node.active_view:on_file_dropped(filename, x, y)

View File

@ -144,6 +144,12 @@ function View:on_mouse_moved(x, y, dx, dy)
end end
function View:on_mouse_left()
self.hovered_scrollbar = false
self.hovered_scrollbar_track = false
end
function View:on_file_dropped(filename, x, y) function View:on_file_dropped(filename, x, y)
return false return false
end end

View File

@ -161,6 +161,9 @@ top:
} else if (e.window.event == SDL_WINDOWEVENT_RESTORED) { } else if (e.window.event == SDL_WINDOWEVENT_RESTORED) {
lua_pushstring(L, "restored"); lua_pushstring(L, "restored");
return 1; return 1;
} else if (e.window.event == SDL_WINDOWEVENT_LEAVE) {
lua_pushstring(L, "mouseleft");
return 1;
} }
if (e.window.event == SDL_WINDOWEVENT_FOCUS_LOST) { if (e.window.event == SDL_WINDOWEVENT_FOCUS_LOST) {
lua_pushstring(L, "focuslost"); lua_pushstring(L, "focuslost");