glimmer-dsl-libui 0.1.4 → 0.1.8

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 (104) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +55 -0
  3. data/README.md +939 -255
  4. data/VERSION +1 -1
  5. data/examples/area_gallery.rb +72 -38
  6. data/examples/area_gallery2.rb +126 -92
  7. data/examples/area_gallery3.rb +74 -40
  8. data/examples/area_gallery4.rb +132 -98
  9. data/examples/basic_area2.rb +1 -1
  10. data/examples/basic_button.rb +2 -2
  11. data/examples/basic_entry.rb +2 -2
  12. data/examples/basic_transform.rb +27 -0
  13. data/examples/control_gallery.rb +3 -3
  14. data/examples/dynamic_area.rb +1 -1
  15. data/examples/form.rb +2 -2
  16. data/examples/histogram.rb +118 -0
  17. data/examples/meta_example.rb +71 -20
  18. data/examples/midi_player.rb +8 -10
  19. data/glimmer-dsl-libui.gemspec +0 -0
  20. data/lib/glimmer/dsl/libui/control_expression.rb +0 -2
  21. data/lib/glimmer/dsl/libui/file_expression.rb +5 -1
  22. data/lib/glimmer/dsl/libui/shape_expression.rb +2 -4
  23. data/lib/glimmer/dsl/libui/tab_item_expression.rb +2 -2
  24. data/lib/glimmer/libui/control_proxy/area_proxy.rb +166 -0
  25. data/lib/glimmer/libui/{menu_item_proxy.rb → control_proxy/box/horizontal_box_proxy.rb} +9 -12
  26. data/lib/glimmer/libui/{horizontal_box_proxy.rb → control_proxy/box/vertical_box_proxy.rb} +10 -6
  27. data/lib/glimmer/libui/{box.rb → control_proxy/box.rb} +31 -27
  28. data/lib/glimmer/libui/{button_proxy.rb → control_proxy/button_proxy.rb} +14 -12
  29. data/lib/glimmer/libui/{checkbox_proxy.rb → control_proxy/checkbox_proxy.rb} +14 -12
  30. data/lib/glimmer/libui/control_proxy/color_button_proxy.rb +118 -0
  31. data/lib/glimmer/libui/control_proxy/column/button_column_proxy.rb +76 -0
  32. data/lib/glimmer/libui/control_proxy/column/checkbox_column_proxy.rb +46 -0
  33. data/lib/glimmer/libui/control_proxy/column/checkbox_text_column_proxy.rb +80 -0
  34. data/lib/glimmer/libui/{radio_buttons_proxy.rb → control_proxy/column/image_column_proxy.rb} +14 -13
  35. data/lib/glimmer/libui/control_proxy/column/image_text_column_proxy.rb +48 -0
  36. data/lib/glimmer/libui/control_proxy/column/progress_bar_column_proxy.rb +44 -0
  37. data/lib/glimmer/libui/{checkbox_column_proxy.rb → control_proxy/column/text_column_proxy.rb} +17 -13
  38. data/lib/glimmer/libui/control_proxy/column.rb +55 -0
  39. data/lib/glimmer/libui/control_proxy/combobox_proxy.rb +45 -0
  40. data/lib/glimmer/libui/control_proxy/date_time_picker_proxy/date_picker_proxy.rb +43 -0
  41. data/lib/glimmer/libui/control_proxy/date_time_picker_proxy/time_picker_proxy.rb +43 -0
  42. data/lib/glimmer/libui/control_proxy/date_time_picker_proxy.rb +72 -0
  43. data/lib/glimmer/libui/control_proxy/dual_column.rb +40 -0
  44. data/lib/glimmer/libui/control_proxy/editable_column.rb +46 -0
  45. data/lib/glimmer/libui/control_proxy/editable_combobox_proxy.rb +45 -0
  46. data/lib/glimmer/libui/{dual_column.rb → control_proxy/enableable_column.rb} +18 -10
  47. data/lib/glimmer/libui/control_proxy/font_button_proxy.rb +70 -0
  48. data/lib/glimmer/libui/{form_proxy.rb → control_proxy/form_proxy.rb} +26 -24
  49. data/lib/glimmer/libui/{grid_proxy.rb → control_proxy/grid_proxy.rb} +29 -27
  50. data/lib/glimmer/libui/{group_proxy.rb → control_proxy/group_proxy.rb} +24 -22
  51. data/lib/glimmer/libui/{image_part_proxy.rb → control_proxy/image_part_proxy.rb} +20 -18
  52. data/lib/glimmer/libui/{image_proxy.rb → control_proxy/image_proxy.rb} +32 -30
  53. data/lib/glimmer/libui/{combobox_proxy.rb → control_proxy/label_proxy.rb} +13 -13
  54. data/lib/glimmer/libui/control_proxy/matrix_proxy.rb +147 -0
  55. data/lib/glimmer/libui/{editable_column.rb → control_proxy/menu_item_proxy/about_menu_item_proxy.rb} +13 -16
  56. data/lib/glimmer/libui/control_proxy/menu_item_proxy/check_menu_item_proxy.rb +41 -0
  57. data/lib/glimmer/libui/{date_picker_proxy.rb → control_proxy/menu_item_proxy/preferences_menu_item_proxy.rb} +10 -10
  58. data/lib/glimmer/libui/{quit_menu_item_proxy.rb → control_proxy/menu_item_proxy/quit_menu_item_proxy.rb} +33 -29
  59. data/lib/glimmer/libui/control_proxy/menu_item_proxy/separator_menu_item_proxy.rb +41 -0
  60. data/lib/glimmer/libui/control_proxy/menu_item_proxy.rb +45 -0
  61. data/lib/glimmer/libui/{editable_combobox_proxy.rb → control_proxy/menu_proxy.rb} +13 -13
  62. data/lib/glimmer/libui/{vertical_box_proxy.rb → control_proxy/message_box/msg_box_error_proxy.rb} +9 -6
  63. data/lib/glimmer/libui/{multiline_entry_proxy.rb → control_proxy/message_box/msg_box_proxy.rb} +8 -6
  64. data/lib/glimmer/libui/{time_picker_proxy.rb → control_proxy/message_box.rb} +9 -10
  65. data/lib/glimmer/libui/{rectangle.rb → control_proxy/multiline_entry_proxy/non_wrapping_multiline_entry_proxy.rb} +6 -8
  66. data/lib/glimmer/libui/{progress_bar_column_proxy.rb → control_proxy/multiline_entry_proxy.rb} +10 -11
  67. data/lib/glimmer/libui/control_proxy/path_proxy.rb +190 -0
  68. data/lib/glimmer/libui/control_proxy/radio_buttons_proxy.rb +45 -0
  69. data/lib/glimmer/libui/{button_column_proxy.rb → control_proxy/tab_item_proxy.rb} +37 -40
  70. data/lib/glimmer/libui/control_proxy/table_proxy.rb +182 -0
  71. data/lib/glimmer/libui/control_proxy/transformable.rb +74 -0
  72. data/lib/glimmer/libui/control_proxy/window_proxy.rb +128 -0
  73. data/lib/glimmer/libui/control_proxy.rb +72 -21
  74. data/lib/glimmer/libui/{enableable_column.rb → parent.rb} +7 -15
  75. data/lib/glimmer/libui/{arc.rb → shape/arc.rb} +13 -11
  76. data/lib/glimmer/libui/shape/bezier.rb +38 -0
  77. data/lib/glimmer/libui/{figure.rb → shape/figure.rb} +23 -21
  78. data/lib/glimmer/libui/{line.rb → shape/line.rb} +9 -7
  79. data/lib/glimmer/libui/{bezier.rb → shape/rectangle.rb} +9 -7
  80. data/lib/glimmer/libui/{square.rb → shape/square.rb} +9 -7
  81. data/lib/glimmer/libui/shape.rb +16 -15
  82. data/lib/glimmer/libui.rb +92 -0
  83. data/lib/glimmer-dsl-libui.rb +3 -0
  84. metadata +76 -53
  85. data/lib/glimmer/libui/about_menu_item_proxy.rb +0 -37
  86. data/lib/glimmer/libui/area_proxy.rb +0 -105
  87. data/lib/glimmer/libui/check_menu_item_proxy.rb +0 -37
  88. data/lib/glimmer/libui/checkbox_text_column_proxy.rb +0 -76
  89. data/lib/glimmer/libui/color_button_proxy.rb +0 -64
  90. data/lib/glimmer/libui/column.rb +0 -51
  91. data/lib/glimmer/libui/date_time_picker_proxy.rb +0 -68
  92. data/lib/glimmer/libui/font_button_proxy.rb +0 -68
  93. data/lib/glimmer/libui/image_column_proxy.rb +0 -40
  94. data/lib/glimmer/libui/image_text_column_proxy.rb +0 -44
  95. data/lib/glimmer/libui/label_proxy.rb +0 -41
  96. data/lib/glimmer/libui/menu_proxy.rb +0 -41
  97. data/lib/glimmer/libui/non_wrapping_multiline_entry_proxy.rb +0 -32
  98. data/lib/glimmer/libui/path_proxy.rb +0 -169
  99. data/lib/glimmer/libui/preferences_menu_item_proxy.rb +0 -37
  100. data/lib/glimmer/libui/separator_menu_item_proxy.rb +0 -37
  101. data/lib/glimmer/libui/tab_item_proxy.rb +0 -67
  102. data/lib/glimmer/libui/table_proxy.rb +0 -180
  103. data/lib/glimmer/libui/text_column_proxy.rb +0 -42
  104. data/lib/glimmer/libui/window_proxy.rb +0 -119
@@ -3,113 +3,147 @@ require 'glimmer-dsl-libui'
3
3
  include Glimmer
4
4
 
5
5
  window('Area Gallery', 400, 400) {
6
- vertical_box {
7
- area {
8
- on_draw do |area_draw_params|
9
- path(area_draw_params) { # a dynamic path is added semi-declaratively inside on_draw block
10
- square {
11
- x 0
12
- y 0
13
- length 100
14
- }
15
- square {
6
+ area {
7
+ on_draw do |area_draw_params|
8
+ path { # a dynamic path is added semi-declaratively inside on_draw block
9
+ square {
10
+ x 0
11
+ y 0
12
+ length 100
13
+ }
14
+ square {
15
+ x 100
16
+ y 100
17
+ length 400
18
+ }
19
+
20
+ fill r: 102, g: 102, b: 204
21
+ }
22
+ path { # a dynamic path is added semi-declaratively inside on_draw block
23
+ rectangle {
24
+ x 0
25
+ y 100
26
+ width 100
27
+ height 400
28
+ }
29
+ rectangle {
30
+ x 100
31
+ y 0
32
+ width 400
33
+ height 100
34
+ }
35
+
36
+ fill r: 204, g: 102, b: 204
37
+ }
38
+ path { # a dynamic path is added semi-declaratively inside on_draw block
39
+ figure {
40
+ x 100
41
+ y 100
42
+
43
+ line {
16
44
  x 100
17
- y 100
18
- length 400
45
+ y 400
19
46
  }
20
-
21
- fill r: 102, g: 102, b: 204
22
- }
23
- path(area_draw_params) { # a dynamic path is added semi-declaratively inside on_draw block
24
- rectangle {
25
- x 0
47
+ line {
48
+ x 400
26
49
  y 100
27
- width 100
28
- height 400
29
50
  }
30
- rectangle {
31
- x 100
32
- y 0
33
- width 400
34
- height 100
51
+ line {
52
+ x 400
53
+ y 400
35
54
  }
36
-
37
- fill r: 204, g: 102, b: 204
55
+
56
+ closed true
38
57
  }
39
- path(area_draw_params) { # a dynamic path is added semi-declaratively inside on_draw block
40
- figure {
41
- x 100
42
- y 100
43
-
44
- line {
45
- x 100
46
- y 400
47
- }
48
- line {
49
- x 400
50
- y 100
51
- }
52
- line {
53
- x 400
54
- y 400
55
- }
56
-
57
- closed true
58
+
59
+ fill r: 202, g: 102, b: 104, a: 0.5
60
+ stroke r: 0, g: 0, b: 0
61
+ }
62
+ path { # a dynamic path is added semi-declaratively inside on_draw block
63
+ figure {
64
+ x 0
65
+ y 0
66
+
67
+ bezier {
68
+ c1_x 200
69
+ c1_y 100
70
+ c2_x 100
71
+ c2_y 200
72
+ end_x 400
73
+ end_y 100
58
74
  }
59
-
60
- fill r: 202, g: 102, b: 104, a: 0.5
61
- stroke r: 0, g: 0, b: 0
62
- }
63
- path(area_draw_params) { # a dynamic path is added semi-declaratively inside on_draw block
64
- figure {
65
- x 0
66
- y 0
67
-
68
- bezier {
69
- c1_x 200
70
- c1_y 100
71
- c2_x 100
72
- c2_y 200
73
- end_x 400
74
- end_y 100
75
- }
76
- bezier {
77
- c1_x 300
78
- c1_y 100
79
- c2_x 100
80
- c2_y 300
81
- end_x 100
82
- end_y 400
83
- }
84
- bezier {
85
- c1_x 100
86
- c1_y 300
87
- c2_x 300
88
- c2_y 100
89
- end_x 400
90
- end_y 400
91
- }
92
-
93
- closed true
75
+ bezier {
76
+ c1_x 300
77
+ c1_y 100
78
+ c2_x 100
79
+ c2_y 300
80
+ end_x 100
81
+ end_y 400
94
82
  }
95
-
96
- fill r: 202, g: 102, b: 204, a: 0.5
97
- stroke thickness: 2, r: 0, g: 0, b: 0
98
- }
99
- path(area_draw_params) { # a dynamic path is added semi-declaratively inside on_draw block
100
- arc {
101
- x_center 200
102
- y_center 200
103
- radius 90
104
- start_angle 0
105
- sweep 360
106
- is_negative false
83
+ bezier {
84
+ c1_x 100
85
+ c1_y 300
86
+ c2_x 300
87
+ c2_y 100
88
+ end_x 400
89
+ end_y 400
107
90
  }
108
-
109
- fill r: 202, g: 102, b: 204, a: 0.5
110
- stroke thickness: 2, r: 0, g: 0, b: 0
91
+
92
+ closed true
111
93
  }
112
- end
113
- }
94
+
95
+ fill r: 202, g: 102, b: 204, a: 0.5
96
+ stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
97
+ }
98
+ path { # a dynamic path is added semi-declaratively inside on_draw block
99
+ arc {
100
+ x_center 200
101
+ y_center 200
102
+ radius 90
103
+ start_angle 0
104
+ sweep 360
105
+ is_negative false
106
+ }
107
+
108
+ fill r: 202, g: 102, b: 204, a: 0.5
109
+ stroke r: 0, g: 0, b: 0, thickness: 2
110
+ }
111
+ end
112
+
113
+ on_mouse_event do |area_mouse_event|
114
+ p area_mouse_event
115
+ end
116
+
117
+ on_mouse_moved do |area_mouse_event|
118
+ puts 'moved'
119
+ end
120
+
121
+ on_mouse_down do |area_mouse_event|
122
+ puts 'mouse down'
123
+ end
124
+
125
+ on_mouse_up do |area_mouse_event|
126
+ puts 'mouse up'
127
+ end
128
+
129
+ on_mouse_drag_started do |area_mouse_event|
130
+ puts 'drag started'
131
+ end
132
+
133
+ on_mouse_dragged do |area_mouse_event|
134
+ puts 'dragged'
135
+ end
136
+
137
+ on_mouse_dropped do |area_mouse_event|
138
+ puts 'dropped'
139
+ end
140
+
141
+ on_mouse_entered do
142
+ puts 'entered'
143
+ end
144
+
145
+ on_mouse_exited do
146
+ puts 'exited'
147
+ end
114
148
  }
115
149
  }.show
@@ -8,7 +8,7 @@ window('Basic Area', 400, 400) {
8
8
  vertical_box {
9
9
  area {
10
10
  on_draw do |area_draw_params|
11
- path(area_draw_params) { # a dynamic path is added semi-declaratively inside on_draw block
11
+ path { # a dynamic path is added semi-declaratively inside on_draw block
12
12
  rectangle(0, 0, 400, 400)
13
13
 
14
14
  fill r: 102, g: 102, b: 204, a: 1.0
@@ -4,10 +4,10 @@ require 'glimmer-dsl-libui'
4
4
 
5
5
  include Glimmer
6
6
 
7
- window('hello world', 300, 200) { |w|
7
+ window('hello world', 300, 200) {
8
8
  button('Button') {
9
9
  on_clicked do
10
- msg_box(w, 'Information', 'You clicked the button')
10
+ msg_box('Information', 'You clicked the button')
11
11
  end
12
12
  }
13
13
 
@@ -4,7 +4,7 @@ require 'glimmer-dsl-libui'
4
4
 
5
5
  include Glimmer
6
6
 
7
- window('Basic Entry', 300, 50) { |w|
7
+ window('Basic Entry', 300, 50) {
8
8
  horizontal_box {
9
9
  e = entry {
10
10
  # stretchy true # Smart default option for appending to horizontal_box
@@ -20,7 +20,7 @@ window('Basic Entry', 300, 50) { |w|
20
20
 
21
21
  on_clicked do
22
22
  text = e.text
23
- msg_box(w, 'You entered', text)
23
+ msg_box('You entered', text)
24
24
  end
25
25
  }
26
26
  }
@@ -0,0 +1,27 @@
1
+ require 'glimmer-dsl-libui'
2
+
3
+ include Glimmer
4
+
5
+ window('Basic Transform', 350, 350) {
6
+ area {
7
+ path {
8
+ square(0, 0, 350)
9
+
10
+ fill r: 255, g: 255, b: 0
11
+ }
12
+ 40.times do |n|
13
+ path {
14
+ square(0, 0, 100)
15
+
16
+ fill r: [255 - n*5, 0].max, g: [n*5, 255].min, b: 0, a: 0.5
17
+ stroke :black, thickness: 2
18
+ transform {
19
+ skew 0.15, 0.15
20
+ translate 50, 50
21
+ rotate 100, 100, -9 * n
22
+ scale 1.1, 1.1
23
+ }
24
+ }
25
+ end
26
+ }
27
+ }.show
@@ -7,14 +7,14 @@ include Glimmer
7
7
  menu('File') {
8
8
  menu_item('Open') {
9
9
  on_clicked do
10
- file = open_file(MAIN_WINDOW)
10
+ file = open_file
11
11
  puts file unless file.nil?
12
12
  end
13
13
  }
14
14
 
15
15
  menu_item('Save') {
16
16
  on_clicked do
17
- file = save_file(MAIN_WINDOW)
17
+ file = save_file
18
18
  puts file unless file.nil?
19
19
  end
20
20
  }
@@ -57,7 +57,7 @@ MAIN_WINDOW = window('Control Gallery', 600, 500) {
57
57
  stretchy false
58
58
 
59
59
  on_clicked do
60
- msg_box(MAIN_WINDOW, 'Information', 'You clicked the button')
60
+ msg_box('Information', 'You clicked the button')
61
61
  end
62
62
  }
63
63
 
@@ -88,7 +88,7 @@ window('Dynamic Area', 240, 600) {
88
88
 
89
89
  @area = area {
90
90
  on_draw do |area_draw_params|
91
- path(area_draw_params) { # a dynamic path is added semi-declaratively inside on_draw block
91
+ path { # a dynamic path is added semi-declaratively inside on_draw block
92
92
  rectangle(@x_spinbox.value, @y_spinbox.value, @width_spinbox.value, @height_spinbox.value)
93
93
 
94
94
  fill r: @red_spinbox.value, g: @green_spinbox.value, b: @blue_spinbox.value, a: @alpha_spinbox.value / 100.0
data/examples/form.rb CHANGED
@@ -4,7 +4,7 @@ require 'glimmer-dsl-libui'
4
4
 
5
5
  include Glimmer
6
6
 
7
- window('Form') { |w|
7
+ window('Form') {
8
8
  margined true
9
9
 
10
10
  vertical_box {
@@ -20,7 +20,7 @@ window('Form') { |w|
20
20
 
21
21
  button('Display Name') {
22
22
  on_clicked do
23
- msg_box(w, 'Name', "#{@first_name_entry.text} #{@last_name_entry.text}")
23
+ msg_box('Name', "#{@first_name_entry.text} #{@last_name_entry.text}")
24
24
  end
25
25
  }
26
26
  }
@@ -0,0 +1,118 @@
1
+ # https://github.com/jamescook/libui-ruby/blob/master/example/histogram.rb
2
+
3
+ require 'glimmer-dsl-libui'
4
+
5
+ include Glimmer
6
+
7
+ X_OFF_LEFT = 20
8
+ Y_OFF_TOP = 20
9
+ X_OFF_RIGHT = 20
10
+ Y_OFF_BOTTOM = 20
11
+ POINT_RADIUS = 5
12
+ COLOR_BLUE = 0x1E90FF
13
+
14
+ @datapoints = 10.times.map {Random.new.rand(90)}
15
+
16
+ def graph_size(area_width, area_height)
17
+ graph_width = area_width - X_OFF_LEFT - X_OFF_RIGHT
18
+ graph_height = area_height - Y_OFF_TOP - Y_OFF_BOTTOM
19
+ [graph_width, graph_height]
20
+ end
21
+
22
+ def point_locations(width, height)
23
+ xincr = width / 9.0 # 10 - 1 to make the last point be at the end
24
+ yincr = height / 100.0
25
+
26
+ @datapoints.each_with_index.map do |value, i|
27
+ val = 100 - value
28
+ [xincr * i, yincr * val]
29
+ end
30
+ end
31
+
32
+ # method-based custom control representing a graph path
33
+ def graph_path(width, height, should_extend, &block)
34
+ locations = point_locations(width, height)
35
+ path {
36
+ first_location = locations[0] # x and y
37
+ figure(first_location[0], first_location[1]) {
38
+ locations.each do |loc|
39
+ line(loc[0], loc[1])
40
+ end
41
+ if should_extend
42
+ line(width, height)
43
+ line(0, height)
44
+
45
+ closed true
46
+ end
47
+ }
48
+
49
+ # apply a transform to the coordinate space for this path so (0, 0) is the top-left corner of the graph
50
+ transform {
51
+ translate X_OFF_LEFT, Y_OFF_TOP
52
+ }
53
+
54
+ block.call
55
+ }
56
+ end
57
+
58
+ window('histogram example', 640, 480) {
59
+ margined true
60
+
61
+ horizontal_box {
62
+ vertical_box {
63
+ stretchy false
64
+
65
+ 10.times do |i|
66
+ spinbox(0, 100) { |sb|
67
+ stretchy false
68
+ value @datapoints[i]
69
+
70
+ on_changed do
71
+ @datapoints[i] = sb.value
72
+ @area.queue_redraw_all
73
+ end
74
+ }
75
+ end
76
+
77
+ @color_button = color_button {
78
+ stretchy false
79
+ color COLOR_BLUE
80
+
81
+ on_changed do
82
+ @area.queue_redraw_all
83
+ end
84
+ }
85
+ }
86
+
87
+ @area = area {
88
+ on_draw do |area_draw_params|
89
+ path {
90
+ rectangle(0, 0, area_draw_params[:area_width], area_draw_params[:area_height])
91
+
92
+ fill 0xFFFFFF
93
+ }
94
+
95
+ graph_width, graph_height = *graph_size(area_draw_params[:area_width], area_draw_params[:area_height])
96
+
97
+ path {
98
+ figure(X_OFF_LEFT, Y_OFF_TOP) {
99
+ line(X_OFF_LEFT, Y_OFF_TOP + graph_height)
100
+ line(X_OFF_LEFT + graph_width, Y_OFF_TOP + graph_height)
101
+ }
102
+
103
+ stroke 0x000000, thickness: 2, miter_limit: 10
104
+ }
105
+
106
+ # now create the fill for the graph below the graph line
107
+ graph_path(graph_width, graph_height, true) {
108
+ fill @color_button.color.merge(a: 0.5)
109
+ }
110
+
111
+ # now draw the histogram line
112
+ graph_path(graph_width, graph_height, false) {
113
+ stroke @color_button.color.merge(thickness: 2, miter_limit: 10)
114
+ }
115
+ end
116
+ }
117
+ }
118
+ }.show
@@ -6,59 +6,110 @@ require 'facets'
6
6
  class MetaExample
7
7
  include Glimmer
8
8
 
9
+ def initialize
10
+ @selected_example_index = 0
11
+ end
12
+
9
13
  def examples
10
14
  if @examples.nil?
11
15
  example_files = Dir.glob(File.join(File.expand_path('.', __dir__), '**', '*.rb'))
12
16
  example_file_names = example_files.map { |f| File.basename(f, '.rb') }
13
- example_file_names = example_file_names.reject { |f| f == 'meta_example' }
17
+ example_file_names = example_file_names.reject { |f| f == 'meta_example' || f.match(/\d$/) }
14
18
  @examples = example_file_names.map { |f| f.underscore.titlecase }
15
19
  end
16
20
  @examples
17
21
  end
18
22
 
23
+ def examples_with_versions
24
+ examples.map do |example|
25
+ version_count_for(example) > 1 ? "#{example} (#{version_count_for(example)} versions)" : example
26
+ end
27
+ end
28
+
19
29
  def file_path_for(example)
20
30
  File.join(File.expand_path('.', __dir__), "#{example.underscore}.rb")
21
31
  end
22
32
 
33
+ def version_count_for(example)
34
+ Dir.glob(File.join(File.expand_path('.', __dir__), "#{example.underscore}*.rb")).select {|file| file.match(/\d\.rb$/)}.count + 1
35
+ end
36
+
23
37
  def glimmer_dsl_libui_file
24
38
  File.expand_path('../lib/glimmer-dsl-libui', __dir__)
25
39
  end
26
40
 
41
+ def selected_example
42
+ examples[@selected_example_index]
43
+ end
44
+
27
45
  def launch
28
- window('Meta-Example', 700, 500) { |w|
46
+ window('Meta-Example', 700, 500) {
29
47
  margined true
30
48
 
31
49
  horizontal_box {
32
50
  vertical_box {
51
+ stretchy false
52
+
33
53
  @rbs = radio_buttons {
34
54
  stretchy false
35
- items examples
36
- selected 0
55
+ items examples_with_versions
56
+ selected @selected_example_index
37
57
 
38
58
  on_selected do
39
- @nwme.text = File.read(file_path_for(@examples[@rbs.selected]))
59
+ @selected_example_index = @rbs.selected
60
+ example = selected_example
61
+ @nwme.text = File.read(file_path_for(example))
62
+ @sb.value = 1
40
63
  end
41
64
  }
42
- button('Launch') {
65
+
66
+ horizontal_box {
67
+ label('Version') {
68
+ stretchy false
69
+ }
70
+
71
+ @sb = spinbox(1, 100) {
72
+ value 1
73
+
74
+ on_changed do
75
+ example = selected_example
76
+ if @sb.value > version_count_for(example)
77
+ @sb.value -= 1
78
+ else
79
+ version_number = @sb.value == 1 ? '' : @sb.value
80
+ example = "#{selected_example}#{version_number}"
81
+ @nwme.text = File.read(file_path_for(example))
82
+ end
83
+ end
84
+ }
85
+ }
86
+
87
+ horizontal_box {
43
88
  stretchy false
44
89
 
45
- on_clicked do
46
- begin
47
- meta_example_file = File.join(Dir.home, '.meta_example.rb')
48
- File.write(meta_example_file, @nwme.text)
49
- result = `ruby -r #{glimmer_dsl_libui_file} #{meta_example_file} 2>&1`
50
- msg_box(w, 'Error Running Example', result) if result.include?('error')
51
- rescue => e
52
- puts 'Unable to write code changes! Running original example...'
53
- system "ruby -r #{glimmer_dsl_libui_file} #{file_path_for(@examples[@rbs.selected])}"
90
+ button('Launch') {
91
+ on_clicked do
92
+ begin
93
+ meta_example_file = File.join(Dir.home, '.meta_example.rb')
94
+ File.write(meta_example_file, @nwme.text)
95
+ result = `ruby -r #{glimmer_dsl_libui_file} #{meta_example_file} 2>&1`
96
+ msg_box('Error Running Example', result) if result.include?('error')
97
+ rescue => e
98
+ puts 'Unable to write code changes! Running original example...'
99
+ system "ruby -r #{glimmer_dsl_libui_file} #{file_path_for(selected_example)}"
100
+ end
54
101
  end
55
- end
102
+ }
103
+ button('Reset') {
104
+ on_clicked do
105
+ @nwme.text = File.read(file_path_for(selected_example))
106
+ end
107
+ }
56
108
  }
57
109
  }
58
- vertical_box {
59
- @nwme = non_wrapping_multiline_entry {
60
- text File.read(file_path_for(@examples[@rbs.selected]))
61
- }
110
+
111
+ @nwme = non_wrapping_multiline_entry {
112
+ text File.read(file_path_for(selected_example))
62
113
  }
63
114
  }
64
115
  }.show
@@ -40,23 +40,22 @@ class TinyMidiPlayer
40
40
  end
41
41
  end
42
42
 
43
- def show_version(main_window)
44
- msg_box(main_window,
45
- 'Tiny Midi Player',
46
- "Written in Ruby\n" \
47
- "https://github.com/kojix2/libui\n" \
48
- "Version #{VERSION}")
43
+ def show_version
44
+ msg_box('Tiny Midi Player',
45
+ "Written in Ruby\n" \
46
+ "https://github.com/kojix2/libui\n" \
47
+ "Version #{VERSION}")
49
48
  end
50
49
 
51
50
  def create_gui
52
51
  menu('Help') { |m|
53
52
  menu_item('Version') {
54
53
  on_clicked do
55
- show_version(@main_window)
54
+ show_version
56
55
  end
57
56
  }
58
57
  }
59
- @main_window = window('Tiny Midi Player', 200, 50) {
58
+ window('Tiny Midi Player', 200, 50) {
60
59
  horizontal_box {
61
60
  vertical_box {
62
61
  stretchy false
@@ -82,8 +81,7 @@ class TinyMidiPlayer
82
81
  end
83
82
  }
84
83
  }
85
- }
86
- @main_window.show
84
+ }.show
87
85
  end
88
86
  end
89
87
 
Binary file
@@ -46,6 +46,4 @@ module Glimmer
46
46
  end
47
47
  end
48
48
 
49
- # TODO Consider moving all controls underneath Control namespace
50
49
  require 'glimmer/libui/control_proxy'
51
- Dir[File.expand_path('../../libui/*.rb', __dir__)].each {|f| require f}
@@ -19,12 +19,16 @@
19
19
  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
20
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
21
 
22
+ require 'glimmer/libui/control_proxy'
23
+
22
24
  module Glimmer
23
25
  module DSL
24
26
  module Libui
25
27
  module FileExpression
26
28
  def interpret(parent, keyword, *args, &block)
27
- file_pointer = ::LibUI.send(self.class.name.underscore.split('::').last.sub(/_expression$/, ''), args.first.libui)
29
+ window = args.empty? ? Glimmer::LibUI::ControlProxy.main_window_proxy : args.first
30
+ window = window.libui if window.respond_to?(:libui)
31
+ file_pointer = ::LibUI.send(self.class.name.underscore.split('::').last.sub(/_expression$/, ''), window)
28
32
  file_pointer.to_s unless file_pointer.null?
29
33
  end
30
34
  end