From 7ac6c9b02b2bc244ef96330e1e69aa678ececc1b Mon Sep 17 00:00:00 2001 From: Insality Date: Sat, 30 Jan 2021 20:16:54 +0500 Subject: [PATCH] Add outside scroll vector, add correct check for is in view zone --- druid/base/scroll.lua | 33 ++++++++++++++++++++++++++++++-- druid/extended/infinity_list.lua | 2 ++ example/page/infinity_page.lua | 10 +++++----- 3 files changed, 38 insertions(+), 7 deletions(-) diff --git a/druid/base/scroll.lua b/druid/base/scroll.lua index 4c2c7d3..8f5cac9 100644 --- a/druid/base/scroll.lua +++ b/druid/base/scroll.lua @@ -155,6 +155,7 @@ function Scroll.init(self, view_node, content_node) self._is_vertical_scroll = true self._grid_on_change = nil self._grid_on_change_callback = nil + self._outside_offset_vector = vmath.vector3(0) self:_update_size() end @@ -166,6 +167,7 @@ end function Scroll.update(self, dt) + self:_update_params(dt) if self.drag.is_drag then self:_update_hand_scroll(dt) else @@ -362,13 +364,14 @@ function Scroll.set_vertical_scroll(self, state) end ---- Check node if it visible now on scroll +--- Check node if it visible now on scroll. +-- Extra border is not affected. Return true for elements in extra scroll zone -- @tparam Scroll self -- @tparma node node The node to check -- @treturn boolean True, if node in visible scroll area 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) + local view_border = helper.get_border(self.view_node, -(self.position - self._outside_offset_vector)) -- Check is vertical outside (Left or Right): if node_border.z < view_border.x or node_border.x > view_border.z then @@ -666,4 +669,30 @@ function Scroll._update_size(self) end +function Scroll._update_params(self, dt) + local t = self.target_position + local b = self.available_pos + + self._outside_offset_vector.x = 0 + self._outside_offset_vector.y = 0 + + -- Right border (minimum x) + if t.x < b.x then + self._outside_offset_vector.x = t.x - b.x + end + -- Left border (maximum x) + if t.x > b.z then + self._outside_offset_vector.x = t.x - b.z + end + -- Top border (minimum y) + if t.y < b.y then + self._outside_offset_vector.y = t.y - b.y + end + -- Bot border (maximum y) + if t.y > b.w then + self._outside_offset_vector.y = t.y - b.w + end +end + + return Scroll diff --git a/druid/extended/infinity_list.lua b/druid/extended/infinity_list.lua index e7e8e87..d439820 100644 --- a/druid/extended/infinity_list.lua +++ b/druid/extended/infinity_list.lua @@ -189,6 +189,8 @@ function M:_check_elements_from(index, step) is_outside = true -- remove nexts: + -- We add one more element, which is not in view to + -- check what it's always outside to stop spawning local remove_index = index + step while self._data_visual[remove_index] do self:_remove_at(remove_index) diff --git a/example/page/infinity_page.lua b/example/page/infinity_page.lua index 7988f88..b2f305e 100644 --- a/example/page/infinity_page.lua +++ b/example/page/infinity_page.lua @@ -11,7 +11,7 @@ local function create_infinity_instance(self, record, index) self.infinity_list:add(self.infinity_list:get_length() + 1) end) button.on_long_click:subscribe(function() - self.infinity_list:remove_by_data(record) + -- self.infinity_list:remove_by_data(record) end) return instance["infinity_prefab"], button @@ -25,7 +25,7 @@ local function create_infinity_instance_hor(self, record, index) local button = self.druid:new_button(instance["infinity_prefab"], function() print("Infinity click on", record) - self.infinity_list_hor:remove_by_data(record) + -- self.infinity_list_hor:remove_by_data(record) end) return instance["infinity_prefab"], button @@ -40,7 +40,7 @@ local function create_infinity_instance_small(self, record, index) local button = self.druid:new_button(instance["infinity_prefab_small"], function() print("Infinity click on", record) - self.infinity_list_small:remove_by_data(record) + -- self.infinity_list_small:remove_by_data(record) end) button:set_click_zone(self.infinity_scroll_3.view_node) @@ -56,7 +56,7 @@ local function create_infinity_instance_dynamic(self, record, index) gui.set_size(instance["infinity_prefab_dynamic"], vmath.vector3(200, 60 + index * 3, 0)) local button = self.druid:new_button(instance["infinity_prefab_dynamic"], function() print("Dynamic click on", record) - self.infinity_list_dynamic:remove_by_data(record) + -- self.infinity_list_dynamic:remove_by_data(record) end) button:set_click_zone(self.infinity_scroll_dynamic.view_node) @@ -72,7 +72,7 @@ local function create_infinity_instance_dynamic_hor(self, record, index) gui.set_size(instance["infinity_prefab_dynamic"], vmath.vector3(150 + 2 * index, 60, 0)) local button = self.druid:new_button(instance["infinity_prefab_dynamic"], function() print("Dynamic click on", record) - self.infinity_list_dynamic_hor:remove_by_data(record) + -- self.infinity_list_dynamic_hor:remove_by_data(record) end) button:set_click_zone(self.infinity_scroll_dynamic_hor.view_node)