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:
parent
ac42e6457a
commit
9de75988ba
|
@ -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(...)
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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");
|
||||||
|
|
Loading…
Reference in New Issue