Module: OMF::Web::Widget

Defined in:
lib/omf_web.rb,
lib/omf-web/widget.rb,
lib/omf-web/widget/layout.rb,
lib/omf-web/widget/code_widget.rb,
lib/omf-web/widget/data_widget.rb,
lib/omf-web/widget/abstract_widget.rb,
lib/omf-web/widget/UNUSED/code/code.rb,
lib/omf-web/widget/text/text_widget.rb

Defined Under Namespace

Modules: Code, Graph, Layout, Log, Text Classes: AbstractWidget, CodeWidget, DataWidget, TextWidget

Constant Summary collapse

@@widgets =
{}
@@descriptions =
{}

Class Method Summary collapse

Class Method Details

._initObject



91
92
93
# File 'lib/omf-web/widget.rb', line 91

def self._init()
  register_widget
end

.create_widget(name) ⇒ Object



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/omf-web/widget.rb', line 46

def self.create_widget(name)
  if name.is_a? Array
    # this is  short notation for a stacked widget
    #
    wdescr = { :type => 'layout/stacked', :widgets => name} 
  elsif name.is_a? Hash
    wdescr = name
  else
    unless wdescr = @@descriptions[name.to_sym]
      raise "Can't create unknown widget '#{name}':(#{@@descriptions.keys.inspect})"
    end
  end
  # Let's check if this actually extends another widget description
  if (id_ref = wdescr[:id_ref])
    unless wd = @@descriptions[id_ref.to_sym]
      raise "Can't find referenced widget '#{id_ref}':(#{@@descriptions.keys.inspect})"
    end
    wdescr = wd.dup.merge(wdescr) # TODO: This should really be a DEEP copy and merge
    wdescr.delete(:id_ref)
  end
  unless wdescr.key? :id
    wdescr[:id] = "wid_#{wdescr.object_id}"
  end
  if w = @@widgets[wdescr[:id]]
    return w
  end
  case type = (wdescr[:type] || wdescr['type']).to_s
  when /^data/
    require 'omf-web/widget/data_widget'
    w = OMF::Web::Widget::DataWidget.new(wdescr)
  when /^layout/
    require 'omf-web/widget/layout'
    w =  OMF::Web::Widget::Layout.create_layout_widget(type, wdescr)        
  when /^text/
    require 'omf-web/widget/text/text_widget'
    w =  OMF::Web::Widget::TextWidget.create_text_widget(type, wdescr)        
  when /^code/
    require 'omf-web/widget/code_widget'
    w =  OMF::Web::Widget::CodeWidget.create_code_widget(type, wdescr)        
  else
    raise "Unknown widget type '#{type}' (#{wdescr.inspect})"
  end
  @@widgets[wdescr[:id]] = w
end

.register_widget(wdescr) ⇒ Object



10
11
12
13
14
15
16
17
18
19
# File 'lib/omf-web/widget.rb', line 10

def self.register_widget(wdescr)
  unless id = wdescr[:id]
    raise "Missing 'id' for widget '#{wdescr.inspect}'"
  end
  id = id.to_sym
  if (@@descriptions.key? id)
    raise "Repeated try to register widget '#{id}'"
  end  
  @@descriptions[id] = wdescr
end

.registered_widgetsObject



21
22
23
# File 'lib/omf-web/widget.rb', line 21

def self.registered_widgets()
  @@descriptions
end

.toplevel_widgets(restrict_to = nil) ⇒ Object

Return the number of top level widgets. If ‘restrict_to’ is an array, only return those.



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/omf-web/widget.rb', line 28

def self.toplevel_widgets(restrict_to = nil)
  if restrict_to
    wa = restrict_to.map do |name|
      unless w = @@descriptions[name.to_sym]
        raise "Unknown top level widget '#{name}'"
      end
      w
    end
  else
    wa = @@descriptions.map do |id, w|
      w[:top_level] ? w : nil
    end.compact
  end
  wa.sort do |a, b|
    (b[:priority] || 100) <=> (a[:priority] || 100) 
  end
end