glimmer-dsl-opal 0.0.5 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +41 -0
- data/README.md +1003 -58
- data/VERSION +1 -1
- data/lib/glimmer-dsl-opal.rb +26 -8
- data/lib/glimmer/data_binding/element_binding.rb +1 -1
- data/lib/glimmer/data_binding/ext/observable_model.rb +40 -0
- data/lib/glimmer/data_binding/list_selection_binding.rb +1 -1
- data/lib/glimmer/data_binding/table_items_binding.rb +70 -0
- data/lib/glimmer/dsl/opal/async_exec_expression.rb +17 -0
- data/lib/glimmer/dsl/opal/column_properties_expression.rb +22 -0
- data/lib/glimmer/dsl/opal/combo_selection_data_binding_expression.rb +2 -2
- data/lib/glimmer/dsl/opal/dsl.rb +10 -12
- data/lib/glimmer/dsl/opal/layout_data_expression.rb +2 -2
- data/lib/glimmer/dsl/opal/{text_expression.rb → layout_expression.rb} +5 -5
- data/lib/glimmer/dsl/opal/list_selection_data_binding_expression.rb +2 -3
- data/lib/glimmer/dsl/opal/message_box_expression.rb +20 -0
- data/lib/glimmer/dsl/opal/observe_expression.rb +32 -0
- data/lib/glimmer/dsl/opal/shell_expression.rb +2 -2
- data/lib/glimmer/dsl/opal/{composite_expression.rb → table_column_expression.rb} +3 -3
- data/lib/glimmer/dsl/opal/{list_expression.rb → table_expression.rb} +3 -3
- data/lib/glimmer/dsl/opal/table_items_data_binding_expression.rb +29 -0
- data/lib/glimmer/dsl/opal/widget_expression.rb +23 -0
- data/lib/glimmer/opal/display_proxy.rb +23 -0
- data/lib/glimmer/opal/element_proxy.rb +48 -13
- data/lib/glimmer/swt/browser_proxy.rb +27 -0
- data/lib/glimmer/swt/button_proxy.rb +40 -0
- data/lib/glimmer/{opal/select_proxy.rb → swt/combo_proxy.rb} +15 -11
- data/lib/glimmer/swt/composite_proxy.rb +31 -0
- data/lib/glimmer/{opal → swt}/event_listener_proxy.rb +1 -1
- data/lib/glimmer/{opal → swt}/grid_layout_proxy.rb +7 -18
- data/lib/glimmer/swt/label_proxy.rb +30 -0
- data/lib/glimmer/swt/layout_data_proxy.rb +52 -0
- data/lib/glimmer/swt/layout_proxy.rb +60 -0
- data/lib/glimmer/{opal → swt}/list_proxy.rb +18 -15
- data/lib/glimmer/swt/message_box_proxy.rb +146 -0
- data/lib/glimmer/{opal → swt}/point.rb +1 -1
- data/lib/glimmer/{opal → swt}/property_owner.rb +1 -1
- data/lib/glimmer/swt/shell_proxy.rb +235 -0
- data/lib/glimmer/swt/tab_folder_proxy.rb +52 -0
- data/lib/glimmer/swt/tab_item_proxy.rb +101 -0
- data/lib/glimmer/swt/table_column_proxy.rb +56 -0
- data/lib/glimmer/swt/table_item_proxy.rb +147 -0
- data/lib/glimmer/swt/table_proxy.rb +177 -0
- data/lib/glimmer/swt/text_proxy.rb +46 -0
- data/lib/glimmer/swt/widget_proxy.rb +389 -0
- data/lib/jquery.js +2 -0
- data/lib/samples/elaborate/contact_manager.rb +2 -3
- data/lib/samples/elaborate/login.rb +0 -1
- data/lib/samples/elaborate/tic_tac_toe.rb +5 -5
- data/lib/samples/hello/hello_computed.rb +19 -19
- data/lib/samples/hello/hello_tab.rb +2 -2
- metadata +92 -59
- data/lib/glimmer/config.rb +0 -22
- data/lib/glimmer/dsl/engine.rb +0 -193
- data/lib/glimmer/dsl/expression.rb +0 -42
- data/lib/glimmer/dsl/expression_handler.rb +0 -48
- data/lib/glimmer/dsl/opal/browser_expression.rb +0 -17
- data/lib/glimmer/dsl/opal/button_expression.rb +0 -18
- data/lib/glimmer/dsl/opal/combo_expression.rb +0 -17
- data/lib/glimmer/dsl/opal/grid_layout_expression.rb +0 -17
- data/lib/glimmer/dsl/opal/label_expression.rb +0 -17
- data/lib/glimmer/dsl/parent_expression.rb +0 -12
- data/lib/glimmer/dsl/static_expression.rb +0 -36
- data/lib/glimmer/dsl/top_level_expression.rb +0 -7
- data/lib/glimmer/error.rb +0 -6
- data/lib/glimmer/invalid_keyword_error.rb +0 -6
- data/lib/glimmer/opal/div_proxy.rb +0 -20
- data/lib/glimmer/opal/document_proxy.rb +0 -90
- data/lib/glimmer/opal/iframe_proxy.rb +0 -23
- data/lib/glimmer/opal/input_proxy.rb +0 -41
- data/lib/glimmer/opal/label_proxy.rb +0 -25
- data/lib/glimmer/opal/layout_data_proxy.rb +0 -31
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'glimmer/dsl/expression'
|
2
|
+
require 'glimmer/data_binding/model_binding'
|
3
|
+
require 'glimmer/data_binding/table_items_binding'
|
4
|
+
require 'glimmer/swt/table_proxy'
|
5
|
+
|
6
|
+
module Glimmer
|
7
|
+
module DSL
|
8
|
+
module Opal
|
9
|
+
#Depends on BindCommandHandler and TableColumnPropertiesDataBindingCommandHandler
|
10
|
+
class TableItemsDataBindingExpression < Expression
|
11
|
+
def can_interpret?(parent, keyword, *args, &block)
|
12
|
+
keyword == "items" and
|
13
|
+
block.nil? and
|
14
|
+
parent.is_a?(Glimmer::SWT::TableProxy) and
|
15
|
+
args.size == 2 and
|
16
|
+
args[0].is_a?(DataBinding::ModelBinding) and
|
17
|
+
args[0].evaluate_property.is_a?(Array) and
|
18
|
+
args[1].is_a?(Array)
|
19
|
+
end
|
20
|
+
|
21
|
+
def interpret(parent, keyword, *args, &block)
|
22
|
+
model_binding = args[0]
|
23
|
+
column_properties = args[1]
|
24
|
+
DataBinding::TableItemsBinding.new(parent, model_binding, column_properties)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'glimmer/dsl/expression'
|
2
|
+
require 'glimmer/dsl/parent_expression'
|
3
|
+
require 'glimmer/swt/widget_proxy'
|
4
|
+
|
5
|
+
module Glimmer
|
6
|
+
module DSL
|
7
|
+
module Opal
|
8
|
+
class WidgetExpression < Expression
|
9
|
+
include ParentExpression
|
10
|
+
EXCLUDED_KEYWORDS = %w[shell display]
|
11
|
+
|
12
|
+
def can_interpret?(parent, keyword, *args, &block)
|
13
|
+
!EXCLUDED_KEYWORDS.include?(keyword) and
|
14
|
+
parent.is_a?(Glimmer::SWT::WidgetProxy)
|
15
|
+
end
|
16
|
+
|
17
|
+
def interpret(parent, keyword, *args, &block)
|
18
|
+
Glimmer::SWT::WidgetProxy.for(keyword, parent, args)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Glimmer
|
2
|
+
module Opal
|
3
|
+
class DisplayProxy
|
4
|
+
class << self
|
5
|
+
def instance
|
6
|
+
@instance ||= new
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def async_exec(&block)
|
11
|
+
executer = lambda do
|
12
|
+
if Document.find('.modal').to_a.empty?
|
13
|
+
block.call
|
14
|
+
else
|
15
|
+
sleep(0.05)
|
16
|
+
Async::Task.new(&executer)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
Async::Task.new(&executer)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -1,25 +1,54 @@
|
|
1
|
-
require 'glimmer/
|
1
|
+
require 'glimmer/swt/property_owner'
|
2
2
|
|
3
3
|
module Glimmer
|
4
4
|
module Opal
|
5
5
|
class ElementProxy
|
6
6
|
include Glimmer
|
7
|
-
include PropertyOwner
|
8
|
-
attr_reader :parent, :args, :css_classes, :
|
7
|
+
include Glimmer::SWT::PropertyOwner
|
8
|
+
attr_reader :parent, :args, :css_classes, :css, :children, :enabled
|
9
|
+
|
10
|
+
class << self
|
11
|
+
def next_id_number_for(name)
|
12
|
+
@max_id_numbers[name] = max_id_number_for(name) + 1
|
13
|
+
end
|
14
|
+
|
15
|
+
def max_id_number_for(name)
|
16
|
+
@max_id_numbers[name] = max_id_numbers[name] || 0
|
17
|
+
end
|
18
|
+
|
19
|
+
def max_id_numbers
|
20
|
+
@max_id_numbers ||= reset_max_id_numbers!
|
21
|
+
end
|
22
|
+
|
23
|
+
def reset_max_id_numbers!
|
24
|
+
@max_id_numbers = {}
|
25
|
+
end
|
26
|
+
end
|
9
27
|
|
10
28
|
def initialize(parent, args)
|
11
29
|
@parent = parent
|
12
30
|
@args = args
|
13
|
-
@children =
|
14
|
-
@parent.add_child(self)
|
31
|
+
@children = Set.new
|
15
32
|
@css_classes = Set.new
|
33
|
+
@css = ''
|
34
|
+
@enabled = true
|
35
|
+
@parent.add_child(self)
|
36
|
+
end
|
37
|
+
|
38
|
+
def dispose
|
39
|
+
dom.remove
|
16
40
|
end
|
17
41
|
|
18
42
|
def add_child(child)
|
19
|
-
|
43
|
+
# return if @children.include?(child) # TODO consider adding an option to enable this if needed to prevent dom repetition
|
20
44
|
@children << child
|
21
45
|
dom << child.dom
|
22
46
|
end
|
47
|
+
|
48
|
+
def enabled=(value)
|
49
|
+
@enabled = value
|
50
|
+
redraw
|
51
|
+
end
|
23
52
|
|
24
53
|
def redraw
|
25
54
|
if @dom
|
@@ -29,6 +58,9 @@ module Glimmer
|
|
29
58
|
else
|
30
59
|
dom
|
31
60
|
end
|
61
|
+
@children.each do |child|
|
62
|
+
child.redraw
|
63
|
+
end
|
32
64
|
end
|
33
65
|
|
34
66
|
# Subclasses must override with their own mappings
|
@@ -41,9 +73,14 @@ module Glimmer
|
|
41
73
|
end
|
42
74
|
|
43
75
|
def id
|
44
|
-
"#{name}-#{
|
76
|
+
@id ||= "#{name}-#{ElementProxy.next_id_number_for(name)}"
|
45
77
|
end
|
46
|
-
|
78
|
+
|
79
|
+
# Sets id explicitly. Useful in cases of wanting to maintain a stable id
|
80
|
+
def id=(value)
|
81
|
+
@id = value
|
82
|
+
end
|
83
|
+
|
47
84
|
# Subclasses can override with their own selector
|
48
85
|
def selector
|
49
86
|
"#{name}##{id}"
|
@@ -74,10 +111,8 @@ module Glimmer
|
|
74
111
|
redraw
|
75
112
|
end
|
76
113
|
|
77
|
-
|
78
|
-
|
79
|
-
def style=(css)
|
80
|
-
@style = css
|
114
|
+
def css=(css)
|
115
|
+
@css = css
|
81
116
|
redraw
|
82
117
|
end
|
83
118
|
|
@@ -185,7 +220,7 @@ module Glimmer
|
|
185
220
|
# },
|
186
221
|
InputProxy => {
|
187
222
|
:text => lambda do |observer|
|
188
|
-
on_modify_text { |modify_event|
|
223
|
+
on_modify_text { |modify_event|
|
189
224
|
observer.call(text)
|
190
225
|
}
|
191
226
|
end,
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'glimmer/swt/widget_proxy'
|
2
|
+
|
3
|
+
module Glimmer
|
4
|
+
module SWT
|
5
|
+
class BrowserProxy < WidgetProxy
|
6
|
+
attr_reader :url
|
7
|
+
|
8
|
+
def url=(value)
|
9
|
+
@url = value
|
10
|
+
redraw
|
11
|
+
end
|
12
|
+
|
13
|
+
def element
|
14
|
+
'iframe'
|
15
|
+
end
|
16
|
+
|
17
|
+
def dom
|
18
|
+
iframe_id = id
|
19
|
+
iframe_url = url
|
20
|
+
@dom ||= html {
|
21
|
+
iframe(id: iframe_id, class: name, src: iframe_url, frameBorder: 0) {
|
22
|
+
}
|
23
|
+
}.to_s
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'glimmer/swt/widget_proxy'
|
2
|
+
|
3
|
+
module Glimmer
|
4
|
+
module SWT
|
5
|
+
class ButtonProxy < WidgetProxy
|
6
|
+
attr_reader :text
|
7
|
+
|
8
|
+
def text=(value)
|
9
|
+
@text = value
|
10
|
+
redraw
|
11
|
+
end
|
12
|
+
|
13
|
+
def element
|
14
|
+
'button'
|
15
|
+
end
|
16
|
+
|
17
|
+
def observation_request_to_event_mapping
|
18
|
+
{
|
19
|
+
'on_widget_selected' => {
|
20
|
+
event: 'click'
|
21
|
+
},
|
22
|
+
}
|
23
|
+
end
|
24
|
+
|
25
|
+
def dom
|
26
|
+
input_text = @text
|
27
|
+
input_id = id
|
28
|
+
input_style = css
|
29
|
+
input_args = {}
|
30
|
+
input_disabled = @enabled ? {} : {'disabled': 'disabled'}
|
31
|
+
input_args = input_args.merge(type: 'password') if has_style?(:password)
|
32
|
+
@dom ||= html {
|
33
|
+
button(input_args.merge(id: input_id, class: name, style: input_style, style: 'min-width: 27px;').merge(input_disabled)) {
|
34
|
+
input_text.to_s == '' ? ' ' : input_text
|
35
|
+
}
|
36
|
+
}.to_s
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -1,10 +1,9 @@
|
|
1
1
|
require 'glimmer/data_binding/observable_element'
|
2
|
-
require 'glimmer/
|
3
|
-
require 'glimmer/opal/element_proxy'
|
2
|
+
require 'glimmer/swt/widget_proxy'
|
4
3
|
|
5
4
|
module Glimmer
|
6
|
-
module
|
7
|
-
class
|
5
|
+
module SWT
|
6
|
+
class ComboProxy < WidgetProxy
|
8
7
|
include Glimmer::DataBinding::ObservableElement
|
9
8
|
attr_reader :text, :items
|
10
9
|
|
@@ -13,9 +12,13 @@ module Glimmer
|
|
13
12
|
@items = []
|
14
13
|
end
|
15
14
|
|
15
|
+
def element
|
16
|
+
'select'
|
17
|
+
end
|
18
|
+
|
16
19
|
def text=(value)
|
17
20
|
@text = value
|
18
|
-
|
21
|
+
Document.find(path).value = value
|
19
22
|
end
|
20
23
|
|
21
24
|
def items=(the_items)
|
@@ -23,12 +26,12 @@ module Glimmer
|
|
23
26
|
redraw
|
24
27
|
end
|
25
28
|
|
26
|
-
def observation_request_to_event_mapping
|
29
|
+
def observation_request_to_event_mapping
|
27
30
|
{
|
28
31
|
'on_widget_selected' => {
|
29
32
|
event: 'change',
|
30
33
|
event_handler: -> (event_listener) {
|
31
|
-
-> (event) {
|
34
|
+
-> (event) {
|
32
35
|
@text = event.target.value
|
33
36
|
event_listener.call(event)
|
34
37
|
}
|
@@ -41,9 +44,10 @@ module Glimmer
|
|
41
44
|
select_text = @text
|
42
45
|
items = @items
|
43
46
|
select_id = id
|
44
|
-
select_style =
|
45
|
-
|
46
|
-
|
47
|
+
select_style = css
|
48
|
+
select_class = name
|
49
|
+
@dom ||= html {
|
50
|
+
select(id: select_id, class: select_class, style: select_style) {
|
47
51
|
items.to_a.each do |item|
|
48
52
|
option_hash = {value: item}
|
49
53
|
option_hash[:selected] = 'selected' if select_text == item
|
@@ -52,7 +56,7 @@ module Glimmer
|
|
52
56
|
}
|
53
57
|
end
|
54
58
|
}
|
55
|
-
}
|
59
|
+
}.to_s
|
56
60
|
end
|
57
61
|
end
|
58
62
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'glimmer/swt/grid_layout_proxy'
|
2
|
+
require 'glimmer/swt/widget_proxy'
|
3
|
+
|
4
|
+
module Glimmer
|
5
|
+
module SWT
|
6
|
+
class CompositeProxy < WidgetProxy
|
7
|
+
attr_reader :layout
|
8
|
+
|
9
|
+
def initialize(parent, args)
|
10
|
+
super(parent, args)
|
11
|
+
@layout = GridLayoutProxy.new(self, [])
|
12
|
+
end
|
13
|
+
|
14
|
+
def redraw
|
15
|
+
super()
|
16
|
+
@children.each do |child|
|
17
|
+
add_child(child) # TODO think of impact of this on performance, and of other alternatives
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def dom
|
22
|
+
div_id = id
|
23
|
+
div_style = css
|
24
|
+
div_class = "#{name} grid-layout"
|
25
|
+
@dom ||= html {
|
26
|
+
div(id: div_id, class: div_class, style: div_style)
|
27
|
+
}.to_s
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -1,16 +1,15 @@
|
|
1
|
-
require 'glimmer/
|
1
|
+
require 'glimmer/swt/layout_proxy'
|
2
2
|
|
3
3
|
module Glimmer
|
4
|
-
module
|
5
|
-
class GridLayoutProxy
|
6
|
-
|
7
|
-
attr_reader :parent, :args, :num_columns, :make_columns_equal_width, :horizontal_spacing, :vertical_spacing
|
4
|
+
module SWT
|
5
|
+
class GridLayoutProxy < LayoutProxy
|
6
|
+
attr_reader :num_columns, :make_columns_equal_width, :horizontal_spacing, :vertical_spacing
|
8
7
|
|
9
8
|
def initialize(parent, args)
|
10
|
-
|
11
|
-
@
|
12
|
-
@parent.add_css_class('grid-layout')
|
9
|
+
super(parent, args)
|
10
|
+
@horizontal_spacing = 10
|
13
11
|
@vertical_spacing = 10
|
12
|
+
@num_columns = @args.first || 1
|
14
13
|
reapply
|
15
14
|
end
|
16
15
|
|
@@ -37,16 +36,6 @@ module Glimmer
|
|
37
36
|
# @parent.add_css_class("vertical-spacing-#{@vertical_spacing}")
|
38
37
|
reapply
|
39
38
|
end
|
40
|
-
|
41
|
-
def reapply
|
42
|
-
@parent.style = <<~CSS
|
43
|
-
display: grid;
|
44
|
-
grid-template-columns: #{'auto ' * @num_columns.to_i};
|
45
|
-
grid-row-gap: #{@vertical_spacing}px;
|
46
|
-
grid-column-gap: #{@horizontal_spacing}px;
|
47
|
-
justify-content: start;
|
48
|
-
CSS
|
49
|
-
end
|
50
39
|
end
|
51
40
|
end
|
52
41
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'glimmer/swt/widget_proxy'
|
2
|
+
|
3
|
+
module Glimmer
|
4
|
+
module SWT
|
5
|
+
class LabelProxy < WidgetProxy
|
6
|
+
attr_reader :text
|
7
|
+
|
8
|
+
def text=(value)
|
9
|
+
@text = value
|
10
|
+
redraw
|
11
|
+
end
|
12
|
+
|
13
|
+
def element
|
14
|
+
'label'
|
15
|
+
end
|
16
|
+
|
17
|
+
def dom
|
18
|
+
label_text = @text
|
19
|
+
label_id = id
|
20
|
+
label_style = css
|
21
|
+
label_class = name
|
22
|
+
@dom ||= html {
|
23
|
+
label(id: label_id, style: label_style, class: label_class) {
|
24
|
+
label_text
|
25
|
+
}
|
26
|
+
}.to_s
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'glimmer/swt/property_owner'
|
2
|
+
|
3
|
+
module Glimmer
|
4
|
+
module SWT
|
5
|
+
class LayoutDataProxy
|
6
|
+
include Glimmer::SWT::PropertyOwner
|
7
|
+
attr_reader :parent,
|
8
|
+
:args,
|
9
|
+
:horizontal_alignment,
|
10
|
+
:vertical_alignment,
|
11
|
+
:grab_excess_horizontal_space,
|
12
|
+
:grab_excess_vertical_space,
|
13
|
+
:height_hint
|
14
|
+
|
15
|
+
def initialize(parent, args)
|
16
|
+
@parent = parent
|
17
|
+
@args = args
|
18
|
+
reapply
|
19
|
+
end
|
20
|
+
|
21
|
+
def height_hint=(height_hint)
|
22
|
+
@height_hint = height_hint
|
23
|
+
reapply
|
24
|
+
end
|
25
|
+
|
26
|
+
def horizontal_alignment=(horizontal_alignment)
|
27
|
+
@horizontal_alignment = horizontal_alignment
|
28
|
+
reapply
|
29
|
+
end
|
30
|
+
|
31
|
+
def vertical_alignment=(vertical_alignment)
|
32
|
+
@vertical_alignment = vertical_alignment
|
33
|
+
reapply
|
34
|
+
end
|
35
|
+
|
36
|
+
def grab_excess_horizontal_space=(grab_excess_horizontal_space)
|
37
|
+
@grab_excess_horizontal_space = grab_excess_horizontal_space
|
38
|
+
reapply
|
39
|
+
end
|
40
|
+
|
41
|
+
def grab_excess_vertical_space=(grab_excess_vertical_space)
|
42
|
+
@grab_excess_vertical_space = grab_excess_vertical_space
|
43
|
+
reapply
|
44
|
+
end
|
45
|
+
|
46
|
+
def reapply
|
47
|
+
# @parent.css = <<~CSS
|
48
|
+
# CSS
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|