This commit is contained in:
Insality 2024-10-14 11:32:53 +03:00
parent 3c9f539376
commit d11aeb6b18
5 changed files with 62 additions and 17 deletions

View File

@ -1580,10 +1580,11 @@ local druid_instance = {}
function druid_instance.final(self) end function druid_instance.final(self) end
--- Create new component. --- Create new component.
---@generic T
---@param self druid_instance ---@param self druid_instance
---@param component druid.base_component Component module ---@param component T Component module
---@param ... any Other component params to pass it to component:init function ---@param ... any Other component params to pass it to component:init function
---@return druid.base_component Component instance ---@return T Component instance
function druid_instance.new(self, component, ...) end function druid_instance.new(self, component, ...) end
--- Create @{BackHandler} component --- Create @{BackHandler} component

View File

@ -365,6 +365,17 @@ function Scroll.set_view_size(self, size)
end end
--- Refresh scroll view size
-- @tparam Scroll self @{Scroll}
function Scroll.update_view_size(self)
self.view_size = helper.get_scaled_size(self.view_node)
self.view_border = helper.get_border(self.view_node)
self:_update_size()
return self
end
--- Enable or disable scroll inert. --- Enable or disable scroll inert.
-- If disabled, scroll through points (if exist) -- If disabled, scroll through points (if exist)
-- If no points, just simple drag without inertion -- If no points, just simple drag without inertion

View File

@ -61,6 +61,8 @@ function DataList.init(self, scroll, grid, create_function)
self.scroll_progress = 0 self.scroll_progress = 0
self._create_function = create_function self._create_function = create_function
self._is_use_cache = false
self._cache = {}
self._data = {} self._data = {}
self._data_visual = {} self._data_visual = {}
@ -80,6 +82,14 @@ function DataList.on_remove(self)
end end
--- Set refresh function for DataList component
-- @tparam DataList self @{DataList}
function DataList.set_use_cache(self, is_use_cache)
self._is_use_cache = is_use_cache
return self
end
--- Set new data set for DataList component --- Set new data set for DataList component
-- @tparam DataList self @{DataList} -- @tparam DataList self @{DataList}
-- @tparam table data The new data array -- @tparam table data The new data array
@ -199,7 +209,7 @@ function DataList.scroll_to_index(self, index)
end end
--- Add element at passed index --- Add element at passed index using cache or create new
-- @tparam DataList self @{DataList} -- @tparam DataList self @{DataList}
-- @tparam number index -- @tparam number index
-- @local -- @local
@ -208,19 +218,32 @@ function DataList._add_at(self, index)
self:_remove_at(index) self:_remove_at(index)
end end
local node, instance = self._create_function(self:get_context(), self._data[index], index, self) local data = self._data[index]
local node, instance
-- Use cache if available and is_use_cache is set
if #self._cache > 0 and self._is_use_cache then
local cached = table.remove(self._cache)
node = cached.node
instance = cached.component
gui.set_enabled(node, true)
else
-- Create a new element if no cache or refresh function is not set
node, instance = self._create_function(self:get_context(), data, index, self)
end
self._data_visual[index] = { self._data_visual[index] = {
data = self._data[index], data = data,
node = node, node = node,
component = instance, component = instance,
} }
self.grid:add(node, index, const.SHIFT.NO_SHIFT) self.grid:add(node, index, const.SHIFT.NO_SHIFT)
self.on_element_add:trigger(self:get_context(), index, node, instance) self.on_element_add:trigger(self:get_context(), index, node, instance, data)
end end
--- Remove element from passed index --- Remove element from passed index and add it to cache if applicable
-- @tparam DataList self @{DataList} -- @tparam DataList self @{DataList}
-- @tparam number index -- @tparam number index
-- @local -- @local
@ -230,17 +253,26 @@ function DataList._remove_at(self, index)
local visual_data = self._data_visual[index] local visual_data = self._data_visual[index]
local node = visual_data.node local node = visual_data.node
local instance = visual_data.component local instance = visual_data.component
local data = visual_data.data
self.on_element_remove:trigger(self:get_context(), index, node, instance, data)
if self._is_use_cache then
-- Disable the node and add it to the cache instead of deleting it
gui.set_enabled(node, false)
table.insert(self._cache, visual_data) -- Cache the removed element
else
-- If no refresh function, delete the node and component as usual
gui.delete_node(node) gui.delete_node(node)
if instance then if instance then
-- We should remove instance from druid that spawned component
instance._meta.druid:remove(instance) instance._meta.druid:remove(instance)
end end
self._data_visual[index] = nil
self.on_element_remove:trigger(self:get_context(), index)
end end
self._data_visual[index] = nil
end
--- Refresh all elements in DataList --- Refresh all elements in DataList
-- @tparam DataList self @{DataList} -- @tparam DataList self @{DataList}

View File

@ -52,7 +52,7 @@ end
local function setup_slider(self) local function setup_slider(self)
local slider = self.druid:new_slider("slider_pin", vmath.vector3(95, 0, 0), function(_, value) local slider = self.druid:new_slider("slider_pin", vmath.vector3(95, 0, 0), function(_, value)
gui.set_text(gui.get_node("text_progress_slider"), math.ceil(value * 100) .. "%") gui.set_text(gui.get_node("text_progress_slider"), math.ceil(value * 100) .. "%")
end) end) --[[@as druid.slider]]
slider:set(0.2) slider:set(0.2)
end end

View File

@ -54,9 +54,10 @@ function init(self)
self.druid:new_scroll("children_scroll_3", "children_scroll_content_3") self.druid:new_scroll("children_scroll_3", "children_scroll_content_3")
-- Content with less size than view -- Content with less size than view
self.druid:new_scroll("scroll_smaller_view", "scroll_smaller_content") local small_scroll = self.druid:new_scroll("scroll_smaller_view", "scroll_smaller_content") --[[@as druid.scroll]]
:set_extra_stretch_size(0) small_scroll.style.SMALL_CONTENT_SCROLL = true
:set_inert(false) small_scroll:set_extra_stretch_size(0) -- it also update scroll size due the change of SMALL_CONTENT_SCROLL
small_scroll:set_inert(false)
-- Scroll with points of interests -- Scroll with points of interests
self.druid:new_scroll("scroll_with_points", "scroll_with_points_content") self.druid:new_scroll("scroll_with_points", "scroll_with_points_content")