glimmer-dsl-libui 0.4.2 → 0.4.6

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.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +33 -0
  3. data/README.md +1359 -200
  4. data/VERSION +1 -1
  5. data/examples/basic_entry.rb +27 -24
  6. data/examples/basic_entry2.rb +31 -0
  7. data/examples/color_button.rb +18 -13
  8. data/examples/color_button2.rb +14 -0
  9. data/examples/dynamic_area.rb +77 -90
  10. data/examples/dynamic_area2.rb +14 -12
  11. data/examples/dynamic_area3.rb +90 -0
  12. data/examples/dynamic_area4.rb +95 -0
  13. data/examples/font_button.rb +17 -12
  14. data/examples/font_button2.rb +18 -0
  15. data/examples/form.rb +42 -30
  16. data/examples/form2.rb +37 -0
  17. data/examples/form_table.rb +100 -87
  18. data/examples/form_table2.rb +93 -0
  19. data/examples/histogram.rb +93 -91
  20. data/examples/histogram2.rb +109 -0
  21. data/examples/login.rb +45 -39
  22. data/examples/login2.rb +55 -0
  23. data/examples/login3.rb +65 -0
  24. data/examples/login4.rb +61 -0
  25. data/examples/login5.rb +43 -0
  26. data/examples/meta_example.rb +9 -6
  27. data/examples/method_based_custom_keyword.rb +8 -15
  28. data/examples/method_based_custom_keyword2.rb +97 -0
  29. data/examples/timer.rb +28 -31
  30. data/examples/timer2.rb +129 -0
  31. data/glimmer-dsl-libui.gemspec +0 -0
  32. data/lib/glimmer/dsl/libui/data_binding_expression.rb +4 -6
  33. data/lib/glimmer/libui/attributed_string.rb +3 -0
  34. data/lib/glimmer/libui/control_proxy/color_button_proxy.rb +5 -0
  35. data/lib/glimmer/libui/control_proxy/entry_proxy.rb +5 -0
  36. data/lib/glimmer/libui/control_proxy/font_button_proxy.rb +4 -0
  37. data/lib/glimmer/libui/control_proxy/multiline_entry_proxy.rb +5 -0
  38. data/lib/glimmer/libui/control_proxy/slider_proxy.rb +38 -0
  39. data/lib/glimmer/libui/control_proxy/spinbox_proxy.rb +38 -0
  40. data/lib/glimmer/libui/control_proxy.rb +4 -0
  41. data/lib/glimmer/libui/data_bindable.rb +39 -0
  42. data/lib/glimmer/libui/shape.rb +2 -0
  43. metadata +19 -2
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.2
1
+ 0.4.6
@@ -2,30 +2,33 @@
2
2
 
3
3
  require 'glimmer-dsl-libui'
4
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
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
- on_clicked do
22
- text = e.text
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
- }.show
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
@@ -1,16 +1,21 @@
1
- # frozen_string_literal: true
2
-
3
1
  require 'glimmer-dsl-libui'
4
2
 
5
- include Glimmer
3
+ class ColorButton
4
+ include Glimmer
5
+
6
+ attr_accessor :selected_color
7
+
8
+ def initialize
9
+ @selected_color = :blue
10
+ end
11
+
12
+ def launch
13
+ window('color button', 240) {
14
+ color_button {
15
+ color <=> [self, :selected_color, after_write: ->(color) {p color}]
16
+ }
17
+ }.show
18
+ end
19
+ end
6
20
 
7
- window('color button', 240) {
8
- color_button { |cb|
9
- color :blue
10
-
11
- on_changed do
12
- rgba = cb.color
13
- p rgba
14
- end
15
- }
16
- }.show
21
+ ColorButton.new.launch
@@ -0,0 +1,14 @@
1
+ require 'glimmer-dsl-libui'
2
+
3
+ include Glimmer
4
+
5
+ window('color button', 240) {
6
+ color_button { |cb|
7
+ color :blue
8
+
9
+ on_changed do
10
+ rgba = cb.color
11
+ p rgba
12
+ end
13
+ }
14
+ }.show
@@ -1,97 +1,84 @@
1
1
  require 'glimmer-dsl-libui'
2
2
 
3
- include Glimmer
4
-
5
- window('Dynamic Area', 240, 600) {
6
- margined true
3
+ class DynamicArea
4
+ include Glimmer
7
5
 
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
- @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
- @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
- @blue_spinbox = spinbox(0, 255) {
71
- label 'blue'
72
- value 204
23
+ vertical_box {
24
+ label('Rectangle Properties') {
25
+ stretchy false
26
+ }
73
27
 
74
- on_changed do
75
- @area.queue_redraw_all
76
- end
77
- }
78
-
79
- @alpha_spinbox = spinbox(0, 100) {
80
- label 'alpha'
81
- value 100
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
- on_changed do
84
- @area.queue_redraw_all
85
- end
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
- end
95
- }
96
- }
97
- }.show
79
+ }
80
+ }.show
81
+ end
82
+ end
83
+
84
+ DynamicArea.new.launch
@@ -18,7 +18,7 @@ window('Dynamic Area', 240, 600) {
18
18
  value 25
19
19
 
20
20
  on_changed do
21
- @rectangle.x = @x_spinbox.value # updating properties automatically triggers area.queue_redraw_all
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
- @rectangle.y = @y_spinbox.value # updating properties automatically triggers area.queue_redraw_all
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
- @rectangle.width = @width_spinbox.value # updating properties automatically triggers area.queue_redraw_all
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
- @rectangle.height = @height_spinbox.value # updating properties automatically triggers area.queue_redraw_all
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
- @rectangle.fill[:r] = @red_spinbox.value # updating hash properties automatically triggers area.queue_redraw_all
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
- @rectangle.fill[:g] = @green_spinbox.value # updating hash properties automatically triggers area.queue_redraw_all
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
- @rectangle.fill[:b] = @blue_spinbox.value # updating hash properties automatically triggers area.queue_redraw_all
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
- @rectangle.fill[:a] = @alpha_spinbox.value / 100.0 # updating hash properties automatically triggers area.queue_redraw_all
84
+ @area.queue_redraw_all
85
85
  end
86
86
  }
87
87
  }
88
88
 
89
- area {
90
- @rectangle = rectangle(@x_spinbox.value, @y_spinbox.value, @width_spinbox.value, @height_spinbox.value) { # stable path
91
- fill r: @red_spinbox.value, g: @green_spinbox.value, b: @blue_spinbox.value, a: @alpha_spinbox.value / 100.0
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
@@ -2,17 +2,22 @@
2
2
 
3
3
  require 'glimmer-dsl-libui'
4
4
 
5
- include Glimmer
6
-
7
- window('hello world', 300, 200) {
8
- font_button { |fb|
9
- on_changed do
10
- font_descriptor = fb.font
11
- p font_descriptor
12
- end
13
- }
5
+ class FontButton
6
+ include Glimmer
7
+
8
+ attr_accessor :font_descriptor
14
9
 
15
- on_closing do
16
- puts 'Bye Bye'
10
+ def launch
11
+ window('hello world', 300, 200) {
12
+ font_button {
13
+ font <=> [self, :font_descriptor, after_write: -> { p font_descriptor }]
14
+ }
15
+
16
+ on_closing do
17
+ puts 'Bye Bye'
18
+ end
19
+ }.show
17
20
  end
18
- }.show
21
+ end
22
+
23
+ FontButton.new.launch
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'glimmer-dsl-libui'
4
+
5
+ include Glimmer
6
+
7
+ window('hello world', 300, 200) {
8
+ font_button { |fb|
9
+ on_changed do
10
+ font_descriptor = fb.font
11
+ p font_descriptor
12
+ end
13
+ }
14
+
15
+ on_closing do
16
+ puts 'Bye Bye'
17
+ end
18
+ }.show