Added radio buttons to extent check boxs

This commit is contained in:
Cooldude2606
2019-05-11 21:00:43 +01:00
parent 0559bade9c
commit 35a3d11f58
5 changed files with 138 additions and 44 deletions

View File

@@ -7,9 +7,12 @@ local Checkbox = {
config={},
clean_names={},
instances={},
option_mapping={},
option_categorize={},
_prototype_checkbox=Gui._extend_prototype{},
_prototype_radiobutton=Gui._extend_prototype{}
}
setmetatable(Checkbox._prototype_radiobutton,{__index=Checkbox._prototype_checkbox})
Global.register(Checkbox.instances,function(tbl)
Checkbox.instances = tbl
end)
@@ -19,7 +22,7 @@ local function get_config(name)
if not config and Checkbox.clean_names[name] then
return Checkbox.config[Checkbox.clean_names[name]]
elseif not config then
return error('Invalid name for checkbox, name not found.',3)
return error('Invalid name for checkbox, name not found.',3) or nil
end
return config
end
@@ -38,6 +41,15 @@ local function get_instances(checkbox,category)
return instances
end
local function set_store(config,location,element,value)
if config.categorize then
local child = type(element) == 'string' and element or config.categorize(element)
Store.set_child(location,child,value)
else
Store.set(location,value)
end
end
function Checkbox.new_checkbox(name)
local uid = Gui.uid_name()
@@ -49,7 +61,10 @@ function Checkbox.new_checkbox(name)
type='checkbox',
state=false
}
},{__index=Checkbox._prototype_checkbox})
},{
__index=Checkbox._prototype_checkbox,
__call=function(element) return Checkbox.config[uid]:draw_to(element) end
})
self._post_draw = function(element)
local category = self.categorize and self.categorize(element) or nil
@@ -70,12 +85,10 @@ function Checkbox.new_checkbox(name)
Gui.on_checked_state_changed(self.name,function(event)
local element = event.element
if self.store then
if self.categorize then
Store.set_child(self.store,self.categorize(element),element.state)
else
Store.set(self.store,element.state)
end
if self.share_store_location then
set_store(self,self.share_store_location,element,Checkbox.option_mapping[self.share_store_location][element.name])
elseif self.store then
set_store(self,self.store,element,element.state)
elseif self._on_state_change then
self._on_state_change(event.player,element)
end
@@ -105,7 +118,7 @@ function Checkbox._prototype_checkbox:add_store(categorize)
self._on_state_change(player,element)
end
else
table.remove(instances,k)
instances[k] = nil
end
end
end
@@ -125,11 +138,7 @@ end
function Checkbox._prototype_checkbox:set_store_state(category,state)
if not self.store then return end
state = not not state
if self.categorize then
return Store.set_child(self.store,category,state)
else
return Store.set(self.store,category)
end
set_store(self,self.store,category,state)
end
function Checkbox._prototype_checkbox:on_state_change(callback)
@@ -140,51 +149,82 @@ function Checkbox._prototype_checkbox:on_state_change(callback)
return self
end
function Checkbox.reset_radiobutton(element,exclude)
function Checkbox.reset_radiobutton(element,exclude,recursive)
if not element or not element.valid then return end
exclude = type(exclude) == 'table' and exclude or exclude ~= nil and {[exclude]=true} or {}
for _,child in pairs(element.children) do
if child and child.valid and child.type == 'radiobutton' then
child.state = exclude[child.name] or false
local config = Checkbox.config[child.name]
if config then
set_store(config,config.store,child,exclude[child.name] or false)
end
elseif child.children and (type(recursive) == 'number' and recursive > 0 or recursive == true) then
Checkbox.reset_radiobutton(child,exclude,recursive)
end
end
return true
end
function Checkbox.new_radiobutton(name)
local self = Checkbox.new_checkbox(name)
local uid = self.name
self._draw.type = 'radiobutton'
setmetatable(self,{
__index=Checkbox._prototype_radiobutton,
__call=function(element) return Checkbox.config[uid]:draw_to(element) end
})
return self
end
function Checkbox.new_share_store(location,callback,categorize)
Store.register(location,function(value,category)
local options = Checkbox.option_mapping[location]
for opt_name,name in pairs(options) do
if Checkbox.config[name] then
get_config(name):set_store_state(category,opt_name == value)
end
end
callback(value,category)
end)
Checkbox.option_categorize[location] = categorize
Checkbox.option_mapping[location] = {}
return location
end
Checkbox.draw_radiobutton = Checkbox.draw_checkbox
function Checkbox._prototype_radiobutton:draw_to(element)
function Checkbox._prototype_radiobutton:share_store(location,option_name)
self.share_store_location = location
self.option_name = option_name or self.clean_name or self.name
end
Checkbox.option_mapping[location][self.option_name] = self.name
Checkbox.option_mapping[location][self.name] = self.option_name
function Checkbox._prototype_radiobutton:add_store(categorize)
end
function Checkbox._prototype_radiobutton:get_store_state(category)
end
function Checkbox._prototype_radiobutton:set_store_state(category,value)
end
function Checkbox._prototype_radiobutton:enable_single_select(state)
end
function Checkbox._prototype_radiobutton:add_option(name)
end
function Checkbox._prototype_radiobutton:on_state_change(callback)
self:add_store(Checkbox.option_categorize[location])
return self
end
function Checkbox.get_stored_state(name,category)
local checkbox = get_config(name)
if checkbox.share_store_location then
if checkbox.categorize then
return Store.get_child(checkbox.share_store_location,category)
else
return Store.get(checkbox.share_store_location)
end
end
return checkbox:get_store_state(category)
end
function Checkbox.set_stored_state(name,category,value)
local checkbox = get_config(name)
if checkbox.share_store_location then
set_store(checkbox,checkbox.share_store_location,category,value)
end
return checkbox:set_store_state(category,value)
end