App info in init now

This commit is contained in:
G. Gibson 2022-06-04 11:30:06 -07:00
parent 7dd91a2018
commit 736390876a
6 changed files with 177 additions and 105 deletions

View file

@ -438,6 +438,10 @@ module GxG
end
end
#
def menu_item_select(data=nil)
# override this in your object script.
end
#
def run(data={})
# override this in your object script.
if data.is_a?(::Hash)

View file

@ -235,7 +235,31 @@ module GxG
def download_file(the_vfs_path="", error_handler=nil, &the_handler)
if self.open?
if the_vfs_path.is_a?(::String) && the_handler
self.pull_data({:download_file => {:path => the_vfs_path}},error_handler, &the_handler)
the_message = new_message({:download_file => {:path => the_vfs_path}})
the_message[:sender] = @uuid
the_message[:to] = @remote_uuid
if error_handler.respond_to?(:call)
the_message.on(:fail,&error_handler)
end
the_message.on(:success) do |response|
if response.is_a?(::Hash)
file_name = response[:result][:file_name].to_s
file_data = response[:result][:file_data].decode64
%x{
const streamSaver = window.streamSaver
const fileStream = streamSaver.createWriteStream(#{file_name}, {})
const writer = fileStream.getWriter()
const uInt8 = new TextEncoder().encode(#{file_data})
writer.write(uInt8)
writer.close()
}
the_handler.call(true)
else
the_handler.call(false)
end
end
GxG::CONNECTION.pull(the_message)
#
true
else
false
@ -321,7 +345,9 @@ module GxG
if response_code < 300
begin
the_message.succeed(::JSON.parse(`#{the_xhr}.response`,{:symbolize_names => true}))
# log_info "got data"
rescue Exception => the_error
# log_warn "Parse Error"
log_error({:error => the_error, :parameters => `#{the_xhr}.response`})
end
else

View file

@ -1523,6 +1523,13 @@ module GxG
::GxG::Gui::register_component_class(:"org.gxg.gui.dropdown.menu", ::GxG::Gui::DropdownMenu)
#
class MenuBar < ::GxG::Gui::DropdownMenu
def set_application(the_application=nil)
@application = the_application
end
#
def application()
@application
end
end
::GxG::Gui::register_component_class(:"org.gxg.gui.menu.bar", ::GxG::Gui::MenuBar)
#
@ -1536,15 +1543,19 @@ module GxG
end
#
def add_menu_item(label=nil, data=nil)
the_item = ::GxG::Database::DetachedHash.new
the_item[:component] = "org.gxg.gui.menu.item"
the_item = new_component(:"org.gxg.gui.menu.item")
the_item[:settings] = {:label => label, :data => data}
the_item[:options] = {}
the_item[:script] = ""
the_item[:content] = []
page.build_components(self, [(the_item)])
true
end
#
def set_application(the_application=nil)
@application = the_application
end
#
def application()
@application
end
end
::GxG::Gui::register_component_class(:"org.gxg.gui.menu", ::GxG::Gui::Menu)
#
@ -1562,23 +1573,15 @@ module GxG
#
def cascade
#
label = ::GxG::Database::DetachedHash.new
label = new_component(:"org.gxg.gui.link.anchor")
label.title = "label #{@uuid.to_s}"
label[:component] = "anchor"
label[:settings] = {}
# label[:options] = {:href => "#0", :content => (@settings[:label] || "Untitled").to_s}
label[:options] = {:content => (@settings[:label] || "Untitled").to_s}
label[:script] = "
on(:mouseup) do |event|
menu_item = self.find_parent_type(::GxG::Gui::MenuItem)
if menu_item
unless menu_item.get_state(:disabled) == true
menu_item.select()
end
end
@parent.selecct()
end
"
label[:content] = []
#
page.build_components(self, [(label)])
the_object = page.find_object_by("label #{@uuid.to_s}")
@ -1599,7 +1602,10 @@ module GxG
end
#
def select(data=nil)
# override in object script
application = @parent.application()
if application
application.menu_item_select(@settings[:data])
end
end
#
end
@ -2034,7 +2040,7 @@ module GxG
@tab_content = self.add_child({:component => "org.gxg.gui.block", :title => ("tab_content" + @uuid.to_s), :settings => {}, :options => {:"data-tabs-content" => (@tabs.uuid.to_s), :states => ["tabs-content"]}, :script =>"", :content => []})
`$(document).foundation()`
end
def add_child(options={})
def add_child(options={}, other_data={})
new_child = nil
if options[:component].to_s.downcase.to_sym == :tab_content
new_child = @tab_content.add_child(options)

View file

@ -1,5 +1,54 @@
module GxG
module Gui
class ApplicationViewport < ::GxG::Gui::Vdom::BaseElement
#
def _before_create
@domtype = :div
super()
end
#
def set_application(the_application)
@application = the_application
end
#
def application()
@application
end
#
def find_child(the_reference=nil)
result = nil
if the_reference
search_queue = [(self)]
while search_queue.size > 0 do
entry = search_queue.shift
if entry
if GxG::valid_uuid?(the_reference)
if entry.children[(object_source.uuid())]
result = entry.children[(object_source.uuid())]
break
else
entry.each_child do |the_child|
search_queue << the_child
end
end
else
entry.each_child do |the_child|
if the_child.title == the_reference
result = the_child
break
else
search_queue << the_child
end
end
end
end
end
end
result
end
end
::GxG::Gui::register_component_class(:"org.gxg.gui.application.viewport", ::GxG::Gui::ApplicationViewport)
#
class Tree < ::GxG::Gui::Vdom::BaseElement
#
alias :original_add_child :add_child
@ -68,13 +117,9 @@ module GxG
#
def cascade()
#
interior_component = ::GxG::Database::DetachedHash.new
interior_component = new_component(:"org.gxg.gui.list")
interior_component.title = "content #{@uuid.to_s}"
interior_component[:component] = "org.gxg.gui.list"
interior_component[:settings] = {}
interior_component[:options] = {:style => {:"white-space" => "nowrap", :width => "auto", :height => "auto", :"list-style" => "none", :margin => "0px", :padding => "0px"}}
interior_component[:script] = ""
interior_component[:content] = []
#
@content = nil
page.build_components(self,[(interior_component)])
@ -86,7 +131,7 @@ module GxG
#
end
#
def update_appearance()
def update_appearance(data=nil)
# TODO ??
end
# Selection / Processing:
@ -272,7 +317,7 @@ module GxG
result
end
#
def update_appearance()
def update_appearance(data=nil)
if @appearance.is_any?(::Hash, ::GxG::Database::DetachedHash)
#
# TODO: update icon and label if different ??
@ -325,24 +370,16 @@ module GxG
end
#
def cascade()
# ???
node_frame = new_component(:"org.gxg.gui.block.table")
# FIXME: can app access node settings ??
node_frame[:settings][:nodepath] = self.node_path()
# node_frame[:options] = {:nodepath => (self.node_path()), :style => {}}
#
node_frame = ::GxG::Database::DetachedHash.new
node_frame[:component] = "org.gxg.gui.block.table"
node_frame[:settings] = {}
node_frame[:options] = {:nodepath => (self.node_path()), :style => {}}
node_frame[:script] = ""
frame_row_one = new_component(:"org.gxg.gui.block.table")
#
frame_row_one = ::GxG::Database::DetachedHash.new
frame_row_one[:component] = "org.gxg.gui.block.table"
frame_row_one[:settings] = {}
frame_row_one[:options] = {}
frame_row_one[:script] = ""
frame_row_one[:content] = []
#
expander = ::GxG::Database::DetachedHash.new
expander = new_component(:"org.gxg.gui.image")
expander.title = "expander #{@uuid.to_s}"
expander[:component] = "org.gxg.gui.image"
expander[:settings] = {}
expander[:options] = {:src=>(theme_widget("collapse.svg")), :width=>32, :height=>32, :style => {:clear => "both", :'vertical-align' => 'middle'}}
expander[:script] = "
on(:mouseup) do |event|
@ -362,19 +399,14 @@ module GxG
end
end
"
expander[:content] = []
#
node_expander_cell = ::GxG::Database::DetachedHash.new
node_expander_cell[:component] = "org.gxg.gui.block.table.cell"
node_expander_cell[:settings] = {}
node_expander_cell = new_component(:"org.gxg.gui.block.table.cell")
node_expander_cell[:options] = {:style => {:float => "left", :width => "32px", :'vertical-align' => 'middle'}}
node_expander_cell[:script] = ""
node_expander_cell[:content] = [(expander)]
node_expander_cell[:content] << expander
#
icon = ::GxG::Database::DetachedHash.new
icon = new_component(:"org.gxg.gui.block.table.cell")
icon.title = "icon #{@uuid.to_s}"
icon[:component] = "org.gxg.gui.image"
icon[:settings] = {}
icon[:options] = {:src=>@appearance[:icon], :style => {:clear => "both", :width=>"32px", :height=>"32px", :'vertical-align' => 'middle'}}
icon[:script] = "
on(:mouseup) do |event|
@ -387,19 +419,14 @@ module GxG
end
end
"
icon[:content] = []
#
node_icon_cell = ::GxG::Database::DetachedHash.new
node_icon_cell[:component] = "org.gxg.gui.block.table.cell"
node_icon_cell[:settings] = {}
node_icon_cell = new_component(:"org.gxg.gui.block.table.cell")
node_icon_cell[:options] = {:style => {:float => "left", :width => "32px", :'vertical-align' => 'middle'}}
node_icon_cell[:script] = ""
node_icon_cell[:content] = [(icon)]
node_icon_cell[:content] << icon
#
the_title = ::GxG::Database::DetachedHash.new
the_title = new_component(:"org.gxg.gui.label")
the_title.title = "title #{@uuid.to_s}"
the_title[:component] = "org.gxg.gui.label"
the_title[:settings] = {}
the_title[:options] = {:content => @appearance[:label], :style => {:float => "left", :'font-size' => '16px', :'vertical-align' => 'middle', :'text-align' => 'left', :margin => "2px", :padding => "2px"}}
the_title[:script] = "
on(:mouseup) do |event|
@ -412,19 +439,12 @@ module GxG
end
end
"
the_title[:content] = []
#
node_label_cell = ::GxG::Database::DetachedHash.new
node_label_cell[:component] = "org.gxg.gui.block.table.cell"
node_label_cell[:settings] = {}
node_label_cell = new_component(:"org.gxg.gui.block.table.cell")
node_label_cell[:options] = {:style => {:float => "left", :'vertical-align' => 'middle'}}
node_label_cell[:script] = ""
node_label_cell[:content] = [(the_title)]
node_label_cell[:content] << the_title
#
frame_row_one = ::GxG::Database::DetachedHash.new
frame_row_one[:component] = "org.gxg.gui.block.table.row"
frame_row_one[:settings] = {}
frame_row_one[:options] = {}
frame_row_one = new_component(:"org.gxg.gui.block.table.row")
frame_row_one[:script] = "
on(:mouseenter) do |event|
the_node = self.tree_node()
@ -439,31 +459,22 @@ module GxG
end
end
"
frame_row_one[:content] = [(node_expander_cell), (node_icon_cell), (node_label_cell)]
frame_row_one[:content] << node_expander_cell
frame_row_one[:content] << node_icon_cell
frame_row_one[:content] << node_label_cell
#
sublist = ::GxG::Database::DetachedHash.new
sublist = new_component(:"org.gxg.gui.list" )
sublist.title = "content #{@uuid.to_s}"
sublist[:component] = "list"
sublist[:settings] = {}
sublist[:options] = {:width => "100%", :height => "100%", :style => {:"list-style" => "none"}}
sublist[:script] = ""
sublist[:content] = []
#
subnodes_frame_cell = ::GxG::Database::DetachedHash.new
subnodes_frame_cell[:component] = "org.gxg.gui.block.table.cell"
subnodes_frame_cell[:settings] = {}
subnodes_frame_cell[:options] = {}
subnodes_frame_cell[:script] = ""
subnodes_frame_cell[:content] = [(sublist)]
subnodes_frame_cell = new_component(:"org.gxg.gui.block.table.cell" )
subnodes_frame_cell[:content] << sublist
#
frame_row_two = ::GxG::Database::DetachedHash.new
frame_row_two[:component] = "org.gxg.gui.block.table.row"
frame_row_two[:settings] = {}
frame_row_two[:options] = {}
frame_row_two[:script] = ""
frame_row_two[:content] = [(subnodes_frame_cell)]
frame_row_two = new_component(:"org.gxg.gui.block.table.row" )
frame_row_two[:content] << subnodes_frame_cell
#
node_frame[:content] = [(frame_row_one),(frame_row_two)]
node_frame[:content] << frame_row_one
node_frame[:content] << frame_row_two
#
@content = nil
page.build_components(self, [(node_frame)])
@ -506,7 +517,7 @@ module GxG
@content.show(transition_parameters)
self.set_state(:expanded, true)
if @expander
@expander.set_attribute(:src,GxG::DISPLAY_DETAILS[:object].theme_widget("expand.svg"))
@expander.set_attribute(:src, page.theme_widget("expand.svg"))
end
the_tree = self.tree()
if the_tree
@ -518,7 +529,7 @@ module GxG
@content.hide(transition_parameters)
self.set_state(:expanded, false)
if @expander
@expander.set_attribute(:src,GxG::DISPLAY_DETAILS[:object].theme_widget("collapse.svg"))
@expander.set_attribute(:src, page.theme_widget("collapse.svg"))
end
the_tree = self.tree()
if the_tree
@ -1045,7 +1056,7 @@ module GxG
end
end
#
def update_appearance()
def update_appearance(data=nil)
the_window = self.find_parent_type(::GxG::Gui::DialogBox)
if the_window
dialog_type = (the_window.settings[:type] || :folder)

View file

@ -350,14 +350,14 @@ module GxG
# Recognized keys are:
# prepend Prepend the new element before this DOM element
# content Add the value of content as a textnode to the DOM element
def add_child(options={})
def add_child(options={},other_data={})
new_child = nil
if options[:component].to_s.downcase.to_sym == :unknown
raise "Unknown Component Type"
else
element_class = GxG::Gui::component_class(options[:component].to_s.downcase.to_sym)
if element_class.is_a?(::Class)
new_child = element_class.new(self,options)
new_child = element_class.new(self,options,other_data)
@children[(new_child.title.to_s.to_sym)] = new_child
# Register Object with Page
::GxG::DISPLAY_DETAILS[:object].register_object(new_child.title, new_child)
@ -1916,25 +1916,44 @@ module GxG
#
# @param [String] parent The parent Ruby element
# @param [Hash] options Any options for the creation process
def initialize(parent, options = {})
def initialize(parent, options={}, other_data={})
if options.is_a?(GxG::Database::DetachedHash)
@uuid = options.uuid.to_s.to_sym
@title = options.title.to_s
if options[:title].to_s.size > 0
@title = options[:title].to_s
else
@title = options.title.to_s
end
else
@uuid = (options[:uuid] || ::GxG::uuid_generate()).to_s.to_sym
@title = (options[:title] || "Untitled Component #{@uuid.to_s}").to_s
end
@component = (options[:component] || :unknown).to_s.downcase.to_sym
@parent = parent
@settings = options[:settings]
#
if options[:settings].is_a?(GxG::Database::DetachedHash)
@settings = options[:settings].unpersist
else
if options[:settings].is_a?(::Hash)
@settings = options[:settings]
else
@settings = {}
end
end
#
if other_data[:application]
@application = other_data[:application]
else
@application = nil
end
@children = {}
@element = nil
@domtype = :div
# ### CSS states
@states = {}
@states[(@component.to_s.gsub(".","-").to_sym)] = true
if options[:options].is_a?(::Hash, GxG::Database::DetachedHash)
if options[:options][:states].is_a?(::Array, GxG::Database::DetachedArray)
if options[:options].is_any?(::Hash, GxG::Database::DetachedHash)
if options[:options][:states].is_any?(::Array, GxG::Database::DetachedArray)
options[:options][:states].each do |the_state|
@states[(the_state.to_s.to_sym)] = true
end
@ -2294,26 +2313,32 @@ module GxG
record = build_queue.shift
if record
record[:content].each do |the_entry|
new_object = record[:parent].add_child(the_entry)
new_object = record[:parent].add_child(the_entry, options)
if the_entry[:content].size > 0
build_queue << {:parent => new_object, :content => the_entry[:content]}
end
# Embed new object settings
# new_object.set_settings(the_entry[:settings])
# Link viewport to provided application
if the_entry[:component].to_s.downcase.to_sym == :application_viewport && options[:application]
if the_entry[:component].to_s.downcase.to_sym == :"org.gxg.gui.application.viewport" && options[:application]
new_object.set_application(options[:application])
unless options[:application].get_viewport(new_object.uuid)
options[:application].link_viewport(new_object)
end
end
# Link window to provided application
if the_entry[:component].to_s.downcase.to_sym == :window && options[:application]
if the_entry[:component].to_s.downcase.to_sym == :"org.gxg.gui.window" && options[:application]
options[:application].link_window(new_object)
new_object.set_application(options[:application])
end
# Link dialog_box to provided application
if the_entry[:component].to_s.downcase.to_sym == :dialog_box && options[:application]
if the_entry[:component].to_s.downcase.to_sym == :"org.gxg.gui.window.dialog" && options[:application]
new_object.set_application(options[:application])
end
# Link org.gxg.gui.menu.bar to provided application
if the_entry[:component].to_s.downcase.to_sym == :"org.gxg.gui.menu.bar" && options[:application]
new_object.set_application(options[:application])
end
# Link org.gxg.gui.menu to provided application
if the_entry[:component].to_s.downcase.to_sym == :"org.gxg.gui.menu" && options[:application]
new_object.set_application(options[:application])
end
# Window Content Tracking

View file

@ -349,7 +349,7 @@ module GxG
end
end
# Initialization and Setup
def initialize(the_parent,the_options)
def initialize(the_parent,the_options,other_data={})
# FIXME: work around for strange bug in layout_refresh
::GxG::DISPLAY_DETAILS[:object].layout_refresh
bounds = GxG::DISPLAY_DETAILS[:object].layout_content_area()
@ -468,7 +468,7 @@ module GxG
@menu_margin = 0
end
#
super(the_parent,the_options)
super(the_parent,the_options, other_data)
#
# self.gxg_set_attribute(:draggable,true)
#
@ -1367,7 +1367,7 @@ module GxG
end
#
# Initialization and Setup
def initialize(the_parent, the_options)
def initialize(the_parent, the_options, other_data={})
# FIXME: work around for strange bug in layout_refresh
# ::GxG::DISPLAY_DETAILS[:object].layout_refresh
# bounds = GxG::DISPLAY_DETAILS[:object].layout_content_area()
@ -1466,7 +1466,7 @@ module GxG
@responder = nil
@data = {}
#
super(the_parent, the_options)
super(the_parent, the_options,other_data)
#
self.set_attribute(:draggable,false)
#