glimmer-dsl-libui 0.4.1 → 0.4.5
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 +32 -1
- data/README.md +1628 -204
- data/VERSION +1 -1
- data/examples/basic_entry.rb +27 -24
- data/examples/basic_entry2.rb +31 -0
- data/examples/button_counter.rb +27 -0
- data/examples/dynamic_area.rb +77 -90
- data/examples/dynamic_area2.rb +14 -12
- data/examples/dynamic_area3.rb +90 -0
- data/examples/dynamic_area4.rb +95 -0
- data/examples/form.rb +42 -30
- data/examples/form2.rb +37 -0
- data/examples/form_table.rb +100 -87
- data/examples/form_table2.rb +93 -0
- data/examples/histogram.rb +98 -91
- data/examples/histogram2.rb +109 -0
- data/examples/login.rb +45 -39
- data/examples/login2.rb +55 -0
- data/examples/login3.rb +65 -0
- data/examples/login4.rb +61 -0
- data/examples/login5.rb +43 -0
- data/examples/meta_example.rb +10 -7
- data/examples/method_based_custom_keyword.rb +8 -15
- data/examples/method_based_custom_keyword2.rb +97 -0
- data/examples/snake.rb +1 -1
- data/examples/timer.rb +28 -31
- data/examples/timer2.rb +129 -0
- data/glimmer-dsl-libui.gemspec +0 -0
- data/lib/glimmer/dsl/libui/data_binding_expression.rb +4 -6
- data/lib/glimmer/libui/attributed_string.rb +3 -0
- data/lib/glimmer/libui/control_proxy/area_proxy.rb +52 -46
- data/lib/glimmer/libui/control_proxy/entry_proxy.rb +5 -0
- data/lib/glimmer/libui/control_proxy/image_proxy.rb +4 -5
- data/lib/glimmer/libui/control_proxy/multiline_entry_proxy.rb +5 -0
- data/lib/glimmer/libui/control_proxy/spinbox_proxy.rb +38 -0
- data/lib/glimmer/libui/control_proxy/table_proxy.rb +1 -1
- data/lib/glimmer/libui/control_proxy.rb +8 -1
- data/lib/glimmer/libui/data_bindable.rb +39 -0
- data/lib/glimmer/libui/shape.rb +7 -2
- metadata +17 -2
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.4.
|
1
|
+
0.4.5
|
data/examples/basic_entry.rb
CHANGED
@@ -2,30 +2,33 @@
|
|
2
2
|
|
3
3
|
require 'glimmer-dsl-libui'
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
5
|
+
class BasicEntry
|
6
|
+
include Glimmer
|
7
|
+
|
8
|
+
attr_accessor :entry_text
|
9
|
+
|
10
|
+
def launch
|
11
|
+
window('Basic Entry', 300, 50) {
|
12
|
+
horizontal_box {
|
13
|
+
entry {
|
14
|
+
# stretchy true # Smart default option for appending to horizontal_box
|
15
|
+
text <=> [self, :entry_text, after_write: ->(text) {puts text; $stdout.flush}] # bidirectional data-binding between text property and entry_text attribute, printing after write to model.
|
16
|
+
}
|
17
|
+
|
18
|
+
button('Button') {
|
19
|
+
stretchy false # stretchy property is available when control is nested under horizontal_box
|
20
|
+
|
21
|
+
on_clicked do
|
22
|
+
msg_box('You entered', entry_text)
|
23
|
+
end
|
24
|
+
}
|
25
|
+
}
|
20
26
|
|
21
|
-
|
22
|
-
|
23
|
-
msg_box('You entered', text)
|
27
|
+
on_closing do
|
28
|
+
puts 'Bye Bye'
|
24
29
|
end
|
25
|
-
}
|
26
|
-
}
|
27
|
-
|
28
|
-
on_closing do
|
29
|
-
puts 'Bye Bye'
|
30
|
+
}.show
|
30
31
|
end
|
31
|
-
|
32
|
+
end
|
33
|
+
|
34
|
+
BasicEntry.new.launch
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'glimmer-dsl-libui'
|
4
|
+
|
5
|
+
include Glimmer
|
6
|
+
|
7
|
+
window('Basic Entry', 300, 50) {
|
8
|
+
horizontal_box {
|
9
|
+
e = entry {
|
10
|
+
# stretchy true # Smart default option for appending to horizontal_box
|
11
|
+
|
12
|
+
on_changed do
|
13
|
+
puts e.text
|
14
|
+
$stdout.flush # For Windows
|
15
|
+
end
|
16
|
+
}
|
17
|
+
|
18
|
+
button('Button') {
|
19
|
+
stretchy false # stretchy property is available when control is nested under horizontal_box
|
20
|
+
|
21
|
+
on_clicked do
|
22
|
+
text = e.text
|
23
|
+
msg_box('You entered', text)
|
24
|
+
end
|
25
|
+
}
|
26
|
+
}
|
27
|
+
|
28
|
+
on_closing do
|
29
|
+
puts 'Bye Bye'
|
30
|
+
end
|
31
|
+
}.show
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'glimmer-dsl-libui'
|
2
|
+
|
3
|
+
class ButtonCounter
|
4
|
+
include Glimmer
|
5
|
+
|
6
|
+
attr_accessor :count
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@count = 0
|
10
|
+
end
|
11
|
+
|
12
|
+
def launch
|
13
|
+
window('Hello, Button!', 190, 20) {
|
14
|
+
vertical_box {
|
15
|
+
button {
|
16
|
+
text <= [self, :count, on_read: ->(count) {"Count: #{count}"}] # data-bind button text to self count, converting to string on read.
|
17
|
+
|
18
|
+
on_clicked do
|
19
|
+
self.count += 1
|
20
|
+
end
|
21
|
+
}
|
22
|
+
}
|
23
|
+
}.show
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
ButtonCounter.new.launch
|
data/examples/dynamic_area.rb
CHANGED
@@ -1,97 +1,84 @@
|
|
1
1
|
require 'glimmer-dsl-libui'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
window('Dynamic Area', 240, 600) {
|
6
|
-
margined true
|
3
|
+
class DynamicArea
|
4
|
+
include Glimmer
|
7
5
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
@y_spinbox = spinbox(0, 1000) {
|
26
|
-
label 'y'
|
27
|
-
value 25
|
28
|
-
|
29
|
-
on_changed do
|
30
|
-
@area.queue_redraw_all
|
31
|
-
end
|
32
|
-
}
|
33
|
-
|
34
|
-
@width_spinbox = spinbox(0, 1000) {
|
35
|
-
label 'width'
|
36
|
-
value 150
|
37
|
-
|
38
|
-
on_changed do
|
39
|
-
@area.queue_redraw_all
|
40
|
-
end
|
41
|
-
}
|
42
|
-
|
43
|
-
@height_spinbox = spinbox(0, 1000) {
|
44
|
-
label 'height'
|
45
|
-
value 150
|
46
|
-
|
47
|
-
on_changed do
|
48
|
-
@area.queue_redraw_all
|
49
|
-
end
|
50
|
-
}
|
51
|
-
|
52
|
-
@red_spinbox = spinbox(0, 255) {
|
53
|
-
label 'red'
|
54
|
-
value 102
|
55
|
-
|
56
|
-
on_changed do
|
57
|
-
@area.queue_redraw_all
|
58
|
-
end
|
59
|
-
}
|
60
|
-
|
61
|
-
@green_spinbox = spinbox(0, 255) {
|
62
|
-
label 'green'
|
63
|
-
value 102
|
64
|
-
|
65
|
-
on_changed do
|
66
|
-
@area.queue_redraw_all
|
67
|
-
end
|
68
|
-
}
|
6
|
+
attr_accessor :rectangle_x, :rectangle_y, :rectangle_width, :rectangle_height, :rectangle_red, :rectangle_green, :rectangle_blue, :rectangle_alpha
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@rectangle_x = 25
|
10
|
+
@rectangle_y = 25
|
11
|
+
@rectangle_width = 150
|
12
|
+
@rectangle_height = 150
|
13
|
+
@rectangle_red = 102
|
14
|
+
@rectangle_green = 102
|
15
|
+
@rectangle_blue = 204
|
16
|
+
@rectangle_alpha = 100
|
17
|
+
end
|
18
|
+
|
19
|
+
def launch
|
20
|
+
window('Dynamic Area', 240, 600) {
|
21
|
+
margined true
|
69
22
|
|
70
|
-
|
71
|
-
label '
|
72
|
-
|
23
|
+
vertical_box {
|
24
|
+
label('Rectangle Properties') {
|
25
|
+
stretchy false
|
26
|
+
}
|
73
27
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
28
|
+
form {
|
29
|
+
stretchy false
|
30
|
+
|
31
|
+
spinbox(0, 1000) {
|
32
|
+
label 'x'
|
33
|
+
value <=> [self, :rectangle_x, after_write: -> {@area.queue_redraw_all}]
|
34
|
+
}
|
35
|
+
|
36
|
+
spinbox(0, 1000) {
|
37
|
+
label 'y'
|
38
|
+
value <=> [self, :rectangle_y, after_write: -> {@area.queue_redraw_all}]
|
39
|
+
}
|
40
|
+
|
41
|
+
spinbox(0, 1000) {
|
42
|
+
label 'width'
|
43
|
+
value <=> [self, :rectangle_width, after_write: -> {@area.queue_redraw_all}]
|
44
|
+
}
|
45
|
+
|
46
|
+
spinbox(0, 1000) {
|
47
|
+
label 'height'
|
48
|
+
value <=> [self, :rectangle_height, after_write: -> {@area.queue_redraw_all}]
|
49
|
+
}
|
50
|
+
|
51
|
+
spinbox(0, 255) {
|
52
|
+
label 'red'
|
53
|
+
value <=> [self, :rectangle_red, after_write: -> {@area.queue_redraw_all}]
|
54
|
+
}
|
55
|
+
|
56
|
+
spinbox(0, 255) {
|
57
|
+
label 'green'
|
58
|
+
value <=> [self, :rectangle_green, after_write: -> {@area.queue_redraw_all}]
|
59
|
+
}
|
60
|
+
|
61
|
+
spinbox(0, 255) {
|
62
|
+
label 'blue'
|
63
|
+
value <=> [self, :rectangle_blue, after_write: -> {@area.queue_redraw_all}]
|
64
|
+
}
|
65
|
+
|
66
|
+
spinbox(0, 100) {
|
67
|
+
label 'alpha'
|
68
|
+
value <=> [self, :rectangle_alpha, after_write: -> {@area.queue_redraw_all}]
|
69
|
+
}
|
70
|
+
}
|
82
71
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
@area = area {
|
90
|
-
on_draw do |area_draw_params|
|
91
|
-
rectangle(@x_spinbox.value, @y_spinbox.value, @width_spinbox.value, @height_spinbox.value) { # a dynamic path is added semi-declaratively inside on_draw block
|
92
|
-
fill r: @red_spinbox.value, g: @green_spinbox.value, b: @blue_spinbox.value, a: @alpha_spinbox.value / 100.0
|
72
|
+
@area = area {
|
73
|
+
on_draw do |area_draw_params|
|
74
|
+
rectangle(rectangle_x, rectangle_y, rectangle_width, rectangle_height) { # a dynamic path is added semi-declaratively inside on_draw block
|
75
|
+
fill r: rectangle_red, g: rectangle_green, b: rectangle_blue, a: rectangle_alpha / 100.0
|
76
|
+
}
|
77
|
+
end
|
93
78
|
}
|
94
|
-
|
95
|
-
}
|
96
|
-
|
97
|
-
|
79
|
+
}
|
80
|
+
}.show
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
DynamicArea.new.launch
|
data/examples/dynamic_area2.rb
CHANGED
@@ -18,7 +18,7 @@ window('Dynamic Area', 240, 600) {
|
|
18
18
|
value 25
|
19
19
|
|
20
20
|
on_changed do
|
21
|
-
@
|
21
|
+
@area.queue_redraw_all
|
22
22
|
end
|
23
23
|
}
|
24
24
|
|
@@ -27,7 +27,7 @@ window('Dynamic Area', 240, 600) {
|
|
27
27
|
value 25
|
28
28
|
|
29
29
|
on_changed do
|
30
|
-
@
|
30
|
+
@area.queue_redraw_all
|
31
31
|
end
|
32
32
|
}
|
33
33
|
|
@@ -36,7 +36,7 @@ window('Dynamic Area', 240, 600) {
|
|
36
36
|
value 150
|
37
37
|
|
38
38
|
on_changed do
|
39
|
-
@
|
39
|
+
@area.queue_redraw_all
|
40
40
|
end
|
41
41
|
}
|
42
42
|
|
@@ -45,7 +45,7 @@ window('Dynamic Area', 240, 600) {
|
|
45
45
|
value 150
|
46
46
|
|
47
47
|
on_changed do
|
48
|
-
@
|
48
|
+
@area.queue_redraw_all
|
49
49
|
end
|
50
50
|
}
|
51
51
|
|
@@ -54,7 +54,7 @@ window('Dynamic Area', 240, 600) {
|
|
54
54
|
value 102
|
55
55
|
|
56
56
|
on_changed do
|
57
|
-
@
|
57
|
+
@area.queue_redraw_all
|
58
58
|
end
|
59
59
|
}
|
60
60
|
|
@@ -63,7 +63,7 @@ window('Dynamic Area', 240, 600) {
|
|
63
63
|
value 102
|
64
64
|
|
65
65
|
on_changed do
|
66
|
-
@
|
66
|
+
@area.queue_redraw_all
|
67
67
|
end
|
68
68
|
}
|
69
69
|
|
@@ -72,7 +72,7 @@ window('Dynamic Area', 240, 600) {
|
|
72
72
|
value 204
|
73
73
|
|
74
74
|
on_changed do
|
75
|
-
@
|
75
|
+
@area.queue_redraw_all
|
76
76
|
end
|
77
77
|
}
|
78
78
|
|
@@ -81,15 +81,17 @@ window('Dynamic Area', 240, 600) {
|
|
81
81
|
value 100
|
82
82
|
|
83
83
|
on_changed do
|
84
|
-
@
|
84
|
+
@area.queue_redraw_all
|
85
85
|
end
|
86
86
|
}
|
87
87
|
}
|
88
88
|
|
89
|
-
area {
|
90
|
-
|
91
|
-
|
92
|
-
|
89
|
+
@area = area {
|
90
|
+
on_draw do |area_draw_params|
|
91
|
+
rectangle(@x_spinbox.value, @y_spinbox.value, @width_spinbox.value, @height_spinbox.value) { # a dynamic path is added semi-declaratively inside on_draw block
|
92
|
+
fill r: @red_spinbox.value, g: @green_spinbox.value, b: @blue_spinbox.value, a: @alpha_spinbox.value / 100.0
|
93
|
+
}
|
94
|
+
end
|
93
95
|
}
|
94
96
|
}
|
95
97
|
}.show
|
@@ -0,0 +1,90 @@
|
|
1
|
+
require 'glimmer-dsl-libui'
|
2
|
+
|
3
|
+
class DynamicArea
|
4
|
+
include Glimmer
|
5
|
+
|
6
|
+
attr_accessor :rectangle_x, :rectangle_y, :rectangle_width, :rectangle_height, :rectangle_red, :rectangle_green, :rectangle_blue, :rectangle_alpha
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@rectangle_x = 25
|
10
|
+
@rectangle_y = 25
|
11
|
+
@rectangle_width = 150
|
12
|
+
@rectangle_height = 150
|
13
|
+
@rectangle_red = 102
|
14
|
+
@rectangle_green = 102
|
15
|
+
@rectangle_blue = 204
|
16
|
+
@rectangle_alpha = 100
|
17
|
+
end
|
18
|
+
|
19
|
+
def rectangle_fill
|
20
|
+
{ r: rectangle_red, g: rectangle_green, b: rectangle_blue, a: rectangle_alpha / 100.0 }
|
21
|
+
end
|
22
|
+
|
23
|
+
def launch
|
24
|
+
window('Dynamic Area', 240, 600) {
|
25
|
+
margined true
|
26
|
+
|
27
|
+
vertical_box {
|
28
|
+
label('Rectangle Properties') {
|
29
|
+
stretchy false
|
30
|
+
}
|
31
|
+
|
32
|
+
form {
|
33
|
+
stretchy false
|
34
|
+
|
35
|
+
@x_spinbox = spinbox(0, 1000) {
|
36
|
+
label 'x'
|
37
|
+
value <=> [self, :rectangle_x]
|
38
|
+
}
|
39
|
+
|
40
|
+
@y_spinbox = spinbox(0, 1000) {
|
41
|
+
label 'y'
|
42
|
+
value <=> [self, :rectangle_y]
|
43
|
+
}
|
44
|
+
|
45
|
+
@width_spinbox = spinbox(0, 1000) {
|
46
|
+
label 'width'
|
47
|
+
value <=> [self, :rectangle_width]
|
48
|
+
}
|
49
|
+
|
50
|
+
@height_spinbox = spinbox(0, 1000) {
|
51
|
+
label 'height'
|
52
|
+
value <=> [self, :rectangle_height]
|
53
|
+
}
|
54
|
+
|
55
|
+
@red_spinbox = spinbox(0, 255) {
|
56
|
+
label 'red'
|
57
|
+
value <=> [self, :rectangle_red]
|
58
|
+
}
|
59
|
+
|
60
|
+
@green_spinbox = spinbox(0, 255) {
|
61
|
+
label 'green'
|
62
|
+
value <=> [self, :rectangle_green]
|
63
|
+
}
|
64
|
+
|
65
|
+
@blue_spinbox = spinbox(0, 255) {
|
66
|
+
label 'blue'
|
67
|
+
value <=> [self, :rectangle_blue]
|
68
|
+
}
|
69
|
+
|
70
|
+
@alpha_spinbox = spinbox(0, 100) {
|
71
|
+
label 'alpha'
|
72
|
+
value <=> [self, :rectangle_alpha]
|
73
|
+
}
|
74
|
+
}
|
75
|
+
|
76
|
+
area {
|
77
|
+
@rectangle = rectangle { # stable implicit path shape
|
78
|
+
x <= [self, :rectangle_x]
|
79
|
+
y <= [self, :rectangle_y]
|
80
|
+
width <= [self, :rectangle_width]
|
81
|
+
height <= [self, :rectangle_height]
|
82
|
+
fill <= [self, :rectangle_fill, computed_by: [:rectangle_red, :rectangle_green, :rectangle_blue, :rectangle_alpha]]
|
83
|
+
}
|
84
|
+
}
|
85
|
+
}
|
86
|
+
}.show
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
DynamicArea.new.launch
|
@@ -0,0 +1,95 @@
|
|
1
|
+
require 'glimmer-dsl-libui'
|
2
|
+
|
3
|
+
include Glimmer
|
4
|
+
|
5
|
+
window('Dynamic Area', 240, 600) {
|
6
|
+
margined true
|
7
|
+
|
8
|
+
vertical_box {
|
9
|
+
label('Rectangle Properties') {
|
10
|
+
stretchy false
|
11
|
+
}
|
12
|
+
|
13
|
+
form {
|
14
|
+
stretchy false
|
15
|
+
|
16
|
+
@x_spinbox = spinbox(0, 1000) {
|
17
|
+
label 'x'
|
18
|
+
value 25
|
19
|
+
|
20
|
+
on_changed do
|
21
|
+
@rectangle.x = @x_spinbox.value # updating properties automatically triggers area.queue_redraw_all
|
22
|
+
end
|
23
|
+
}
|
24
|
+
|
25
|
+
@y_spinbox = spinbox(0, 1000) {
|
26
|
+
label 'y'
|
27
|
+
value 25
|
28
|
+
|
29
|
+
on_changed do
|
30
|
+
@rectangle.y = @y_spinbox.value # updating properties automatically triggers area.queue_redraw_all
|
31
|
+
end
|
32
|
+
}
|
33
|
+
|
34
|
+
@width_spinbox = spinbox(0, 1000) {
|
35
|
+
label 'width'
|
36
|
+
value 150
|
37
|
+
|
38
|
+
on_changed do
|
39
|
+
@rectangle.width = @width_spinbox.value # updating properties automatically triggers area.queue_redraw_all
|
40
|
+
end
|
41
|
+
}
|
42
|
+
|
43
|
+
@height_spinbox = spinbox(0, 1000) {
|
44
|
+
label 'height'
|
45
|
+
value 150
|
46
|
+
|
47
|
+
on_changed do
|
48
|
+
@rectangle.height = @height_spinbox.value # updating properties automatically triggers area.queue_redraw_all
|
49
|
+
end
|
50
|
+
}
|
51
|
+
|
52
|
+
@red_spinbox = spinbox(0, 255) {
|
53
|
+
label 'red'
|
54
|
+
value 102
|
55
|
+
|
56
|
+
on_changed do
|
57
|
+
@rectangle.fill[:r] = @red_spinbox.value # updating hash properties automatically triggers area.queue_redraw_all
|
58
|
+
end
|
59
|
+
}
|
60
|
+
|
61
|
+
@green_spinbox = spinbox(0, 255) {
|
62
|
+
label 'green'
|
63
|
+
value 102
|
64
|
+
|
65
|
+
on_changed do
|
66
|
+
@rectangle.fill[:g] = @green_spinbox.value # updating hash properties automatically triggers area.queue_redraw_all
|
67
|
+
end
|
68
|
+
}
|
69
|
+
|
70
|
+
@blue_spinbox = spinbox(0, 255) {
|
71
|
+
label 'blue'
|
72
|
+
value 204
|
73
|
+
|
74
|
+
on_changed do
|
75
|
+
@rectangle.fill[:b] = @blue_spinbox.value # updating hash properties automatically triggers area.queue_redraw_all
|
76
|
+
end
|
77
|
+
}
|
78
|
+
|
79
|
+
@alpha_spinbox = spinbox(0, 100) {
|
80
|
+
label 'alpha'
|
81
|
+
value 100
|
82
|
+
|
83
|
+
on_changed do
|
84
|
+
@rectangle.fill[:a] = @alpha_spinbox.value / 100.0 # updating hash properties automatically triggers area.queue_redraw_all
|
85
|
+
end
|
86
|
+
}
|
87
|
+
}
|
88
|
+
|
89
|
+
area {
|
90
|
+
@rectangle = rectangle(@x_spinbox.value, @y_spinbox.value, @width_spinbox.value, @height_spinbox.value) { # stable implicit path shape
|
91
|
+
fill r: @red_spinbox.value, g: @green_spinbox.value, b: @blue_spinbox.value, a: @alpha_spinbox.value / 100.0
|
92
|
+
}
|
93
|
+
}
|
94
|
+
}
|
95
|
+
}.show
|
data/examples/form.rb
CHANGED
@@ -2,36 +2,48 @@
|
|
2
2
|
|
3
3
|
require 'glimmer-dsl-libui'
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
window('Form') {
|
8
|
-
margined true
|
5
|
+
class Form
|
6
|
+
include Glimmer
|
9
7
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
@last_name_entry = entry {
|
17
|
-
label 'Last Name' # label property is available when control is nested under form
|
18
|
-
}
|
19
|
-
|
20
|
-
@phone_entry = entry {
|
21
|
-
label 'Phone' # label property is available when control is nested under form
|
22
|
-
}
|
8
|
+
attr_accessor :first_name, :last_name, :phone, :email
|
9
|
+
|
10
|
+
def launch
|
11
|
+
window('Form') {
|
12
|
+
margined true
|
23
13
|
|
24
|
-
|
25
|
-
|
14
|
+
vertical_box {
|
15
|
+
form {
|
16
|
+
entry {
|
17
|
+
label 'First Name' # label property is available when control is nested under form
|
18
|
+
text <=> [self, :first_name] # bidirectional data-binding of entry text property to self first_name attribute
|
19
|
+
}
|
20
|
+
|
21
|
+
entry {
|
22
|
+
label 'Last Name' # label property is available when control is nested under form
|
23
|
+
text <=> [self, :last_name]
|
24
|
+
}
|
25
|
+
|
26
|
+
entry {
|
27
|
+
label 'Phone' # label property is available when control is nested under form
|
28
|
+
text <=> [self, :phone]
|
29
|
+
}
|
30
|
+
|
31
|
+
entry {
|
32
|
+
label 'Email' # label property is available when control is nested under form
|
33
|
+
text <=> [self, :email]
|
34
|
+
}
|
35
|
+
}
|
36
|
+
|
37
|
+
button('Display Info') {
|
38
|
+
stretchy false
|
39
|
+
|
40
|
+
on_clicked do
|
41
|
+
msg_box('Info', "#{first_name} #{last_name} has phone #{phone} and email #{email}")
|
42
|
+
end
|
43
|
+
}
|
26
44
|
}
|
27
|
-
}
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
on_clicked do
|
33
|
-
msg_box('Info', "#{@first_name_entry.text} #{@last_name_entry.text} has phone #{@phone_entry.text} and email #{@email_entry.text}")
|
34
|
-
end
|
35
|
-
}
|
36
|
-
}
|
37
|
-
}.show
|
45
|
+
}.show
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
Form.new.launch
|
data/examples/form2.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'glimmer-dsl-libui'
|
4
|
+
|
5
|
+
include Glimmer
|
6
|
+
|
7
|
+
window('Form') {
|
8
|
+
margined true
|
9
|
+
|
10
|
+
vertical_box {
|
11
|
+
form {
|
12
|
+
@first_name_entry = entry {
|
13
|
+
label 'First Name' # label property is available when control is nested under form
|
14
|
+
}
|
15
|
+
|
16
|
+
@last_name_entry = entry {
|
17
|
+
label 'Last Name' # label property is available when control is nested under form
|
18
|
+
}
|
19
|
+
|
20
|
+
@phone_entry = entry {
|
21
|
+
label 'Phone' # label property is available when control is nested under form
|
22
|
+
}
|
23
|
+
|
24
|
+
@email_entry = entry {
|
25
|
+
label 'Email' # label property is available when control is nested under form
|
26
|
+
}
|
27
|
+
}
|
28
|
+
|
29
|
+
button('Display Info') {
|
30
|
+
stretchy false
|
31
|
+
|
32
|
+
on_clicked do
|
33
|
+
msg_box('Info', "#{@first_name_entry.text} #{@last_name_entry.text} has phone #{@phone_entry.text} and email #{@email_entry.text}")
|
34
|
+
end
|
35
|
+
}
|
36
|
+
}
|
37
|
+
}.show
|