mirror of
https://github.com/PHIDIAS0303/ExpCluster.git
synced 2025-12-27 11:35:22 +09:00
Added Sliders
This commit is contained in:
@@ -33,7 +33,6 @@ function Gui.get_instances(self,category)
|
|||||||
return instances
|
return instances
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
function Gui._extend_prototype(tbl)
|
function Gui._extend_prototype(tbl)
|
||||||
for k,v in pairs(Gui._prototype) do
|
for k,v in pairs(Gui._prototype) do
|
||||||
if not tbl[k] then tbl[k] = v end
|
if not tbl[k] then tbl[k] = v end
|
||||||
@@ -105,6 +104,7 @@ end
|
|||||||
function Gui._prototype:debug_name(name)
|
function Gui._prototype:debug_name(name)
|
||||||
self.debug_name = name
|
self.debug_name = name
|
||||||
Gui.names[name] = self.name
|
Gui.names[name] = self.name
|
||||||
|
Gui.names[self.name] = name
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -31,11 +31,9 @@ function Dropdown.new_dropdown(name)
|
|||||||
if self.dynamic_options then
|
if self.dynamic_options then
|
||||||
local player = Game.get_player_by_index(element.player_index)
|
local player = Game.get_player_by_index(element.player_index)
|
||||||
local dynamic_options = self.dynamic_options(player,element)
|
local dynamic_options = self.dynamic_options(player,element)
|
||||||
local items = element.items
|
|
||||||
for _,v in pairs(dynamic_options) do
|
for _,v in pairs(dynamic_options) do
|
||||||
table.insert(items,v)
|
element.add_item(v)
|
||||||
end
|
end
|
||||||
element.items = items
|
|
||||||
end
|
end
|
||||||
if self.store then
|
if self.store then
|
||||||
local category = self.categorize and self.categorize(element) or nil
|
local category = self.categorize and self.categorize(element) or nil
|
||||||
|
|||||||
143
expcore/Gui/slider.lua
Normal file
143
expcore/Gui/slider.lua
Normal file
@@ -0,0 +1,143 @@
|
|||||||
|
local Gui = require './core'
|
||||||
|
local Game = require 'utils.game'
|
||||||
|
|
||||||
|
local function get_instances(define,element)
|
||||||
|
local function cat(e)
|
||||||
|
return e.player_index
|
||||||
|
end
|
||||||
|
|
||||||
|
local name = define.name..'-label'
|
||||||
|
if not Gui.instances[name] then return end
|
||||||
|
|
||||||
|
local categorize = define.categorize or not define.store and cat
|
||||||
|
local category = categorize and categorize(element) or nil
|
||||||
|
local instances = Gui.get_instances({
|
||||||
|
name=name,
|
||||||
|
categorize=categorize
|
||||||
|
},category)
|
||||||
|
|
||||||
|
return instances
|
||||||
|
end
|
||||||
|
|
||||||
|
local function update_instances(define,element)
|
||||||
|
local instances = get_instances(define,element)
|
||||||
|
local value = element.slider_value
|
||||||
|
if instances then
|
||||||
|
for k,instance in pairs(instances) do
|
||||||
|
if instance and instance.valid then
|
||||||
|
instance.caption = tostring(math.round(value,2))
|
||||||
|
else
|
||||||
|
instances[k]=nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local Slider = {
|
||||||
|
_prototype=Gui._extend_prototype{
|
||||||
|
on_change = Gui._new_event_adder('on_change'),
|
||||||
|
add_store = Gui._new_store_adder(function(self,element,value)
|
||||||
|
element.slider_value = value
|
||||||
|
local min,max = element.get_slider_minimum(),element.get_slider_maximum()
|
||||||
|
local delta = max-min
|
||||||
|
local percent = delta == 0 and 0 or (value-min)/delta
|
||||||
|
local player = Game.get_player_by_index(element.player_index)
|
||||||
|
if self.events.on_change then
|
||||||
|
self.events.on_change(player,element,value,percent)
|
||||||
|
end
|
||||||
|
update_instances(self,element)
|
||||||
|
end)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function Slider.new_slider(name)
|
||||||
|
|
||||||
|
local self = Gui._new_define(Slider._prototype)
|
||||||
|
self.draw_data.type = 'slider'
|
||||||
|
|
||||||
|
if name then
|
||||||
|
self:debug_name(name)
|
||||||
|
end
|
||||||
|
|
||||||
|
self.post_draw = function(element)
|
||||||
|
local player = Game.get_player_by_index(element.player_index)
|
||||||
|
local min,max = element.get_slider_minimum(),element.get_slider_maximum()
|
||||||
|
if type(self.min) == 'function' then
|
||||||
|
min = self.min(player,element)
|
||||||
|
end
|
||||||
|
if type(self.max) == 'function' then
|
||||||
|
max = self.max(player,element)
|
||||||
|
end
|
||||||
|
element.set_slider_minimum_maximum(min,max)
|
||||||
|
if self.store then
|
||||||
|
local category = self.categorize and self.categorize(element) or nil
|
||||||
|
local value = self:get_store(category)
|
||||||
|
if value then element.slider_value = value end
|
||||||
|
end
|
||||||
|
if self.auto_label then
|
||||||
|
self:draw_label(element.parent)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
Gui.on_value_changed(self.name,function(event)
|
||||||
|
local element = event.element
|
||||||
|
local value = element.slider_value
|
||||||
|
local min,max = element.get_slider_minimum(),element.get_slider_maximum()
|
||||||
|
local delta = max-min
|
||||||
|
local percent = delta == 0 and 0 or (value-min)/delta
|
||||||
|
local category = self.categorize and self.categorize(element) or value
|
||||||
|
|
||||||
|
if self.store then
|
||||||
|
self:set_store(category,value)
|
||||||
|
|
||||||
|
elseif self.events.on_change then
|
||||||
|
self.events.on_change(event.player,element,value,percent)
|
||||||
|
update_instances(self,element)
|
||||||
|
end
|
||||||
|
|
||||||
|
end)
|
||||||
|
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
function Slider._prototype:set_range(min,max)
|
||||||
|
self.min = min
|
||||||
|
self.max = max
|
||||||
|
if type(min) == 'number' then
|
||||||
|
self.draw_data.minimum_value = min
|
||||||
|
end
|
||||||
|
if type(max) == 'number' then
|
||||||
|
self.draw_data.maximum_value = max
|
||||||
|
end
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
function Slider._prototype:draw_label(element)
|
||||||
|
local name = self.name..'-label'
|
||||||
|
if element[name] then return end
|
||||||
|
local value = 0
|
||||||
|
if self.store then
|
||||||
|
local category = self.categorize and self.categorize(element) or value
|
||||||
|
value = self:get_store(category) or 0
|
||||||
|
end
|
||||||
|
local new_element = element.add{
|
||||||
|
name=name,
|
||||||
|
type='label',
|
||||||
|
caption=tostring(math.round(value,2))
|
||||||
|
}
|
||||||
|
if not Gui.instances[name] then Gui.instances[name] = {} end
|
||||||
|
local instances = get_instances(self,element)
|
||||||
|
table.insert(instances,new_element)
|
||||||
|
return new_element
|
||||||
|
end
|
||||||
|
|
||||||
|
function Slider._prototype:enable_auto_draw_label(state)
|
||||||
|
if state == false then
|
||||||
|
self.auto_label = false
|
||||||
|
else
|
||||||
|
self.auto_label = true
|
||||||
|
end
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
return Slider
|
||||||
@@ -3,7 +3,6 @@ local format_chat_colour,table_keys = ext_require('expcore.common','format_chat_
|
|||||||
local Colors = require 'resources.color_presets'
|
local Colors = require 'resources.color_presets'
|
||||||
local Game = require 'utils.game'
|
local Game = require 'utils.game'
|
||||||
local clean_stack_trace = ext_require('modules.commands.interface','clean_stack_trace')
|
local clean_stack_trace = ext_require('modules.commands.interface','clean_stack_trace')
|
||||||
local Store = require 'expcore.store'
|
|
||||||
|
|
||||||
local tests = {}
|
local tests = {}
|
||||||
|
|
||||||
@@ -48,7 +47,8 @@ end)
|
|||||||
local frame = player.gui.center.add{type='frame',caption='Gui Test',name='TestGui'}
|
local frame = player.gui.center.add{type='frame',caption='Gui Test',name='TestGui'}
|
||||||
frame = frame.add{type='table',column_count=5}
|
frame = frame.add{type='table',column_count=5}
|
||||||
for key,element in pairs(tests) do
|
for key,element in pairs(tests) do
|
||||||
local success,err = pcall(element.draw_to,element,frame)
|
local test_function = type(element) == 'function' and element or element.draw_to
|
||||||
|
local success,err = pcall(test_function,element,frame)
|
||||||
if success then
|
if success then
|
||||||
player.print('Drawing: '..key..format_chat_colour(' SUCCESS',Colors.green))
|
player.print('Drawing: '..key..format_chat_colour(' SUCCESS',Colors.green))
|
||||||
else
|
else
|
||||||
@@ -230,4 +230,60 @@ tests['List box player static general'] = Gui.new_list_box('test list box player
|
|||||||
:add_store(categozie_by_player)
|
:add_store(categozie_by_player)
|
||||||
:on_selection(function(player,element,value)
|
:on_selection(function(player,element,value)
|
||||||
player.print('Dropdown player static general: '..tostring(value))
|
player.print('Dropdown player static general: '..tostring(value))
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
tests['Slider local default'] = Gui.new_slider('test slider local default')
|
||||||
|
:set_tooltip('Silder Local Default')
|
||||||
|
:on_change(function(player,element,value,percent)
|
||||||
|
player.print('Slider local default: '..tostring(math.round(value))..' '..tostring(math.round(percent,2)))
|
||||||
|
end)
|
||||||
|
|
||||||
|
tests['Slider player default'] = Gui.new_slider('test slider player default')
|
||||||
|
:set_tooltip('Silder Player Default')
|
||||||
|
:add_store(categozie_by_player)
|
||||||
|
:on_change(function(player,element,value,percent)
|
||||||
|
player.print('Slider player default: '..tostring(math.round(value))..' '..tostring(math.round(percent,2)))
|
||||||
|
end)
|
||||||
|
|
||||||
|
tests['Slider static range'] = Gui.new_slider('test slider static range')
|
||||||
|
:set_tooltip('Silder Static Range')
|
||||||
|
:set_range(5,50)
|
||||||
|
:on_change(function(player,element,value,percent)
|
||||||
|
player.print('Slider static range: '..tostring(math.round(value))..' '..tostring(math.round(percent,2)))
|
||||||
|
end)
|
||||||
|
|
||||||
|
tests['Slider dynamic range'] = Gui.new_slider('test slider dynamic range')
|
||||||
|
:set_tooltip('Silder Dynamic Range')
|
||||||
|
:set_range(function(player,element)
|
||||||
|
return player.index - 5
|
||||||
|
end,function(player,element)
|
||||||
|
return player.index + 4
|
||||||
|
end)
|
||||||
|
:on_change(function(player,element,value,percent)
|
||||||
|
player.print('Slider static range: '..tostring(math.round(value))..' '..tostring(math.round(percent,2)))
|
||||||
|
end)
|
||||||
|
|
||||||
|
local label_slider = Gui.new_slider('test slider local lable')
|
||||||
|
:set_tooltip('Silder Local label')
|
||||||
|
:enable_auto_draw_label()
|
||||||
|
:on_change(function(player,element,value,percent)
|
||||||
|
player.print('Slider local label: '..tostring(math.round(value))..' '..tostring(math.round(percent,2)))
|
||||||
|
end)
|
||||||
|
|
||||||
|
tests['Slider local label'] = function(self,frame)
|
||||||
|
local flow = frame.add{type='flow'}
|
||||||
|
label_slider:draw_to(flow)
|
||||||
|
end
|
||||||
|
|
||||||
|
local label_slider_player = Gui.new_slider('test slider player lable')
|
||||||
|
:set_tooltip('Silder Player label')
|
||||||
|
:enable_auto_draw_label()
|
||||||
|
:add_store(categozie_by_player)
|
||||||
|
:on_change(function(player,element,value,percent)
|
||||||
|
player.print('Slider player label: '..tostring(math.round(value))..' '..tostring(math.round(percent,2)))
|
||||||
|
end)
|
||||||
|
|
||||||
|
tests['Slider player label'] = function(self,frame)
|
||||||
|
local flow = frame.add{type='flow'}
|
||||||
|
label_slider_player:draw_to(flow)
|
||||||
|
end
|
||||||
@@ -32,12 +32,13 @@ end
|
|||||||
function Toolbar.update(player)
|
function Toolbar.update(player)
|
||||||
local top = Gui.get_top_element_flow(player)
|
local top = Gui.get_top_element_flow(player)
|
||||||
if not top then return end
|
if not top then return end
|
||||||
|
local visible = top[Gui.top_toggle_button_name].caption == '<'
|
||||||
for _,button in pairs(Toolbar.buttons) do
|
for _,button in pairs(Toolbar.buttons) do
|
||||||
local element
|
local element
|
||||||
if top[button.name] then element = top[button.name]
|
if top[button.name] then element = top[button.name]
|
||||||
else element = button:draw_to(top) end
|
else element = button:draw_to(top) end
|
||||||
if button.post_authenticator(player,button.clean_name or button.name) then
|
if button.post_authenticator(player,button.clean_name or button.name) then
|
||||||
element.visible = true
|
element.visible = visible
|
||||||
element.enabled = true
|
element.enabled = true
|
||||||
else
|
else
|
||||||
element.visible = false
|
element.visible = false
|
||||||
|
|||||||
@@ -22,4 +22,8 @@ Gui.new_dropdown = Dropdown.new_dropdown
|
|||||||
Gui.new_list_box = Dropdown.new_list_box
|
Gui.new_list_box = Dropdown.new_list_box
|
||||||
Gui.classes.dropdown = Dropdown
|
Gui.classes.dropdown = Dropdown
|
||||||
|
|
||||||
|
local Slider = require('./gui/slider')
|
||||||
|
Gui.new_slider = Slider.new_slider
|
||||||
|
Gui.classes.slider = Slider
|
||||||
|
|
||||||
return Gui
|
return Gui
|
||||||
@@ -200,6 +200,7 @@ function Gui.get_top_element_flow(player)
|
|||||||
end
|
end
|
||||||
|
|
||||||
local toggle_button_name = Gui.uid_name()
|
local toggle_button_name = Gui.uid_name()
|
||||||
|
Gui.top_toggle_button_name = toggle_button_name
|
||||||
|
|
||||||
Event.add(
|
Event.add(
|
||||||
defines.events.on_player_created,
|
defines.events.on_player_created,
|
||||||
|
|||||||
Reference in New Issue
Block a user