diff --git a/druid/base/scroll.lua b/druid/base/scroll.lua index d286f0c..c9a3465 100644 --- a/druid/base/scroll.lua +++ b/druid/base/scroll.lua @@ -359,6 +359,23 @@ function Scroll.set_vertical_scroll(self, state) end +function Scroll.is_node_in_view(self, node) + local node_border = helper.get_border(node, gui.get_position(node)) + local view_border = helper.get_border(self.view_node, -self.position) + + -- Check is vertical outside (Left or Right): + if node_border.z < view_border.x or node_border.x > view_border.z then + return false + end + + -- Check is horizontal outside (Up or Down): + if node_border.w > view_border.y or node_border.y < view_border.w then + return false + end + + return true +end + --- Bind the grid component (Static or Dynamic) to recalculate -- scroll size on grid changes diff --git a/druid/helper.lua b/druid/helper.lua index c4c0041..4cf245a 100644 --- a/druid/helper.lua +++ b/druid/helper.lua @@ -186,16 +186,25 @@ end --- Distance from node to size border -- @function helper.get_border -- @return vector4 (left, top, right, down) -function M.get_border(node) +function M.get_border(node, offset) local pivot = gui.get_pivot(node) local pivot_offset = M.get_pivot_offset(pivot) local size = vmath.mul_per_elem(gui.get_size(node), gui.get_scale(node)) - return vmath.vector4( + local border = vmath.vector4( -size.x*(0.5 + pivot_offset.x), size.y*(0.5 - pivot_offset.y), size.x*(0.5 - pivot_offset.x), -size.y*(0.5 + pivot_offset.y) ) + + if offset then + border.x = border.x + offset.x + border.y = border.y + offset.y + border.z = border.z + offset.x + border.w = border.w + offset.y + end + + return border end diff --git a/example/page/grid_page.lua b/example/page/grid_page.lua index 4eba0c1..41ed7d5 100644 --- a/example/page/grid_page.lua +++ b/example/page/grid_page.lua @@ -25,6 +25,7 @@ local function add_node(self, index) local prefab = gui.get_node("grid_nodes_prefab") local cloned = gui.clone_tree(prefab) gui.set_enabled(cloned["grid_nodes_prefab"], true) + gui.set_text(cloned["grid_nodes_text"], index) local button = self.druid:new_button(cloned["grid_nodes_prefab"], function(_, params, button) remove_node(self, button, true)