diff --git a/expcore/gui/styles/expstyle/alignment.lua b/expcore/gui/styles/expstyle/alignment.lua index a00c325f..23477684 100644 --- a/expcore/gui/styles/expstyle/alignment.lua +++ b/expcore/gui/styles/expstyle/alignment.lua @@ -7,6 +7,7 @@ local Gui = require 'expcore.gui' --- @dep expcore.gui Gui.require_concept 'flow' --- @dep gui.concept.flow --[[-- A flow which can be used to align text and other elements +@see flow @element alignment @usage-- Concept Structure -- Root diff --git a/expcore/gui/styles/expstyle/container.lua b/expcore/gui/styles/expstyle/container.lua index c475c95d..ca1a62bb 100644 --- a/expcore/gui/styles/expstyle/container.lua +++ b/expcore/gui/styles/expstyle/container.lua @@ -7,6 +7,7 @@ local Gui = require 'expcore.gui' --- @dep expcore.gui Gui.require_concept 'frame' --- @dep gui.concept.frame --[[-- A container frame that can be used to add a boader around your content +@see frame @element container @usage-- Concept Structure -- Root diff --git a/expcore/gui/styles/expstyle/data_label.lua b/expcore/gui/styles/expstyle/data_label.lua new file mode 100644 index 00000000..c6ca002c --- /dev/null +++ b/expcore/gui/styles/expstyle/data_label.lua @@ -0,0 +1,89 @@ +--[[-- Core Module - ExpStyle + @module ExpStyle +]] + +local Gui = require 'expcore.gui' --- @dep expcore.gui + +Gui.require_concept 'label' --- @dep gui.concept.frame + +local right_align = +Gui.new_concept('alignment') + +--[[-- A label pair which has a static label and a data label which can be changed +@see label +@element data_label +@usage-- Concept Structure +-- Root +--> [data_label] - the static label +--> [properties.data_name] - the data label which can be updated +Gui.new_concept('data_label') +:set_data_label_name('game_ticks') +:set_data_caption('0') +:set_data_format(function(concept,element,data,...) + -- This is used with update_data_element and update_from_parent + local caption = tostirng('data') + local tooltip = 'This game has beeing running for: '..caption..' ticks' + return caption, tooltip +end) +]] + +local data_label = +Gui.new_concept('label') +:save_as('data_label') +:new_property('data_label_name') +:new_property('data_caption') +:new_property('data_tooltip') +:new_property('data_format',nil,function(concept,element,data,...) + return tostring(data) +end) + +-- Draw +:define_draw(function(properties,parent,element) + -- Make the label right aligned + local data_name = properties.data_label_name or properties.name..'_data' + local right_align_element = right_align:draw(parent,data_name) + + -- Add a new label + local data_label_element = + right_align_element.add{ + name = 'data_label' + } + + -- Get the data caption + local caption = Gui.resolve_property(properties.data_caption,element) + if caption then + data_label_element.caption = caption + end + + -- Get the data tooltip + local tooltip = Gui.resolve_property(properties.data_tooltip,element) + if tooltip then + data_label_element.tooltip = tooltip + end + + return data_label_element +end) + +function data_label:update_data_element(element,data,...) + local caption, tooltip = self.properties.data_format(self,element,data,...) + if caption then + element.caption = caption + end + if tooltip then + element.tooltip = tooltip + end +end + +function data_label:update_from_parent(parent,data,...) + local properties = self.properties + local data_name = properties.data_label_name or properties.name..'_data' + local element = parent[data_name] and parent[data_name].data_label or error('Data label is not a child of this element element',2) + + local caption, tooltip = properties.data_format(self,element,data,...) + if caption then + element.caption = caption + end + if tooltip then + element.tooltip = tooltip + end +end \ No newline at end of file diff --git a/expcore/gui/styles/expstyle/footer.lua b/expcore/gui/styles/expstyle/footer.lua new file mode 100644 index 00000000..3497832b --- /dev/null +++ b/expcore/gui/styles/expstyle/footer.lua @@ -0,0 +1,52 @@ +--[[-- Core Module - ExpStyle + @module ExpStyle +]] + +local Gui = require 'expcore.gui' --- @dep expcore.gui + +Gui.require_concept 'frame' --- @dep gui.concept.table + +local right_align = +Gui.new_concept('alignment') + +--[[-- A frame that acts as a footer to a section of content +@see frame +@element footer +@tparam string tooltip the tooltip to show on the title +@usage-- Concept Structure +-- Root +--> [footer] - the footer frame +-->> footer_caption - the lable with the title in it +-->> footer_content - the area to contain butons +Gui.new_concept('footer') +:set_title('Example Footer') +]] + +Gui.new_concept('frame') +:save_as('footer') +:new_property('tooltip') + +-- Draw +:define_draw(function(properties,parent,element) + -- Update the table style + Gui.set_padding(element,2,2,4,4) + element.style = 'subfooter_frame' + element.caption = nil + + local style = element.style + style.horizontally_stretchable = true + style.use_header_filler = false + + -- Add the caption to the frame + element.add{ + type = 'label', + name = 'footer_caption', + caption = properties.title, + tooltip = properties.tooltip + } + + -- Add the right align area + local align = right_align:draw(element,'footer_content') + + return align +end) \ No newline at end of file diff --git a/expcore/gui/styles/expstyle/scroll_table.lua b/expcore/gui/styles/expstyle/scroll_table.lua index 0c1473d5..411851b7 100644 --- a/expcore/gui/styles/expstyle/scroll_table.lua +++ b/expcore/gui/styles/expstyle/scroll_table.lua @@ -13,12 +13,16 @@ Gui.new_concept('scroll') :set_horizontal_scroll('never') --[[-- A table that is inside a vertical scroll area +@see table @element scroll_table @tparam number hight the max hight of the scroll area @usage-- Concept Structure -- Root --> [scroll_table] - the scroll area -->> table - the table area +Gui.new_concept('scroll_table') +:set_height(200) +:set_column_count(2) ]] Gui.new_concept('table') diff --git a/expcore/gui/styles/expstyle/time_label.lua b/expcore/gui/styles/expstyle/time_label.lua index efa7fd1f..64f5f6b7 100644 --- a/expcore/gui/styles/expstyle/time_label.lua +++ b/expcore/gui/styles/expstyle/time_label.lua @@ -46,6 +46,12 @@ end @usage-- Concept Structure -- Root --> [time_label] - the label with the time +local time_label = +Gui.new_concept('time_label') +:set_use_hours(true) +:set_time(game.tick) + +time_label:update_time(element,game.tick) ]] local time_label = diff --git a/expcore/gui/styles/expstyle/toggle_button.lua b/expcore/gui/styles/expstyle/toggle_button.lua new file mode 100644 index 00000000..06adc602 --- /dev/null +++ b/expcore/gui/styles/expstyle/toggle_button.lua @@ -0,0 +1,49 @@ +--[[-- Core Module - ExpStyle + @module ExpStyle +]] + +local Gui = require 'expcore.gui' --- @dep expcore.gui + +Gui.require_concept 'button' --- @dep gui.concept.table + +--[[-- A button that will toggle its caption each time it is pressed +@see button +@element toggle_button +@tparam string alt_caption the caption to show on the button in its true state +@tparam string alt_tooltip the tooltip to show on the button in its true state +@usage-- Concept Structure +-- Root +--> [toggle_button] - the header button +Gui.new_concept('toggle_button') +:set_caption('<') +:set_tooltip('Press to close.') +:set_alt_caption('>') +:set_alt_tooltip('Press to open.') +:on_click(function(event) + local state = event.state and 'close' or 'open' + event.player.print('Toggle button is now: '..state) +end) +]] + +Gui.new_concept('button') +:save_as('toggle_button') +:new_property('alt_caption') +:new_property('alt_tooltip') + +-- Events +:on_click(function(event) + local concept = event.concept + local properties = concept.properties + local element = event.element + if element.caption == properties.caption then + element.caption = properties.alt_caption + element.tooltip = properties.alt_tooltip or properties.tooltip + event.state = true + + else + element.caption = properties.caption + element.tooltip = properties.tooltip or properties.alt_tooltip + event.state = false + + end +end) \ No newline at end of file diff --git a/expcore/gui/styles/expstyle/unit_label.lua b/expcore/gui/styles/expstyle/unit_label.lua new file mode 100644 index 00000000..3295997a --- /dev/null +++ b/expcore/gui/styles/expstyle/unit_label.lua @@ -0,0 +1,95 @@ +--[[-- Core Module - ExpStyle + @module ExpStyle +]] + +local Gui = require 'expcore.gui' --- @dep expcore.gui + +Gui.require_concept 'label' --- @dep gui.concept.frame + +local right_align = +Gui.new_concept('alignment') + +--[[-- A label triplet which has a static label, a data label which can be changed, and a unit label +@see label +@see data_label +@element unit_label +@usage-- Concept Structure +-- Root +--> [unit_label] - the static label +--> [properties.data_name] - the data label which can be updated +--> [properties.data_name..'_unit'] - the data label unit which can be updated +Gui.new_concept('unit_label') +:set_data_label_name('game_ticks') +:set_data_caption('0') +:set_data_unit('ticks') +:set_data_format(function(concept,element,data,...) + -- This is used with update_data_element and update_from_parent + local caption = tostirng(data) + local unit = data > 1 and 'ticks' or 'tick' + local tooltip = 'This game has beeing running for: '..caption..' ticks' + return caption, unit, tooltip +end) +]] + +local unit_label = +Gui.new_concept('data_label') +:save_as('unit_label') +:new_property('data_label_name') +:new_property('data_caption') +:new_property('data_tooltip') +:new_property('data_unit') +:new_property('data_format',nil,function(concept,element,data,...) + local base_unit = concept.properties.data_unit + local caption = tostring(data) + local unit = data == 1 and base_unit or base_unit..'s' + return caption, unit +end) + +-- Draw +:define_draw(function(properties,parent,element) + -- Get the unit data + local unit = Gui.resolve_property(properties.data_unit,element) + + -- Add the unit label + parent.add{ + name = element.name..'_unit', + caption = unit or '', + tooltip = element.tooltip + } + + return element +end) + +function unit_label:update_data_element(element,data,...) + local caption, unit, tooltip = self.properties.data_format(self,element,data,...) + local unit_element = element.parent.parent[element.name..'_unit'] + if caption then + element.caption = caption + end + if tooltip then + element.tooltip = tooltip + unit_element.tooltip = tooltip + end + if unit then + unit_element.caption = unit + end +end + +function unit_label:update_from_parent(parent,data,...) + local properties = self.properties + local data_name = properties.data_label_name or properties.name..'_data' + local element = parent[data_name] and parent[data_name].data_label or error('Data label is not a child of this element element',2) + local unit_element = parent[data_name..'_unit'] + + local caption, unit, tooltip = properties.data_format(self,element,data,...) + if caption then + element.caption = caption + end + if tooltip then + element.tooltip = tooltip + unit_element.tooltip = tooltip + end + if unit then + unit_element.caption = unit + end +end \ No newline at end of file