glimmer-dsl-libui 0.1.2 → 0.1.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 (103) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +55 -0
  3. data/README.md +1127 -65
  4. data/VERSION +1 -1
  5. data/examples/area_gallery.rb +50 -0
  6. data/examples/area_gallery2.rb +111 -0
  7. data/examples/area_gallery3.rb +52 -0
  8. data/examples/area_gallery4.rb +113 -0
  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_table_progress_bar.rb +13 -3
  13. data/examples/basic_transform.rb +27 -0
  14. data/examples/control_gallery.rb +3 -3
  15. data/examples/dynamic_area.rb +1 -1
  16. data/examples/form.rb +2 -2
  17. data/examples/histogram.rb +118 -0
  18. data/examples/meta_example.rb +71 -20
  19. data/examples/midi_player.rb +8 -10
  20. data/glimmer-dsl-libui.gemspec +0 -0
  21. data/lib/glimmer/dsl/libui/control_expression.rb +1 -3
  22. data/lib/glimmer/dsl/libui/dsl.rb +1 -0
  23. data/lib/glimmer/dsl/libui/file_expression.rb +5 -1
  24. data/lib/glimmer/dsl/libui/property_expression.rb +5 -1
  25. data/lib/glimmer/{libui/box.rb → dsl/libui/shape_expression.rb} +26 -29
  26. data/lib/glimmer/dsl/libui/tab_item_expression.rb +2 -2
  27. data/lib/glimmer/libui/control_proxy/area_proxy.rb +117 -0
  28. data/lib/glimmer/libui/{menu_item_proxy.rb → control_proxy/box/horizontal_box_proxy.rb} +9 -12
  29. data/lib/glimmer/libui/{vertical_box_proxy.rb → control_proxy/box/vertical_box_proxy.rb} +10 -6
  30. data/lib/glimmer/libui/control_proxy/box.rb +61 -0
  31. data/lib/glimmer/libui/{button_proxy.rb → control_proxy/button_proxy.rb} +14 -12
  32. data/lib/glimmer/libui/{checkbox_proxy.rb → control_proxy/checkbox_proxy.rb} +14 -12
  33. data/lib/glimmer/libui/control_proxy/color_button_proxy.rb +118 -0
  34. data/lib/glimmer/libui/control_proxy/column/button_column_proxy.rb +76 -0
  35. data/lib/glimmer/libui/control_proxy/column/checkbox_column_proxy.rb +46 -0
  36. data/lib/glimmer/libui/control_proxy/column/checkbox_text_column_proxy.rb +80 -0
  37. data/lib/glimmer/libui/{radio_buttons_proxy.rb → control_proxy/column/image_column_proxy.rb} +14 -13
  38. data/lib/glimmer/libui/control_proxy/column/image_text_column_proxy.rb +48 -0
  39. data/lib/glimmer/libui/{progress_bar_column_proxy.rb → control_proxy/column/progress_bar_column_proxy.rb} +14 -10
  40. data/lib/glimmer/libui/control_proxy/column/text_column_proxy.rb +46 -0
  41. data/lib/glimmer/libui/control_proxy/column.rb +55 -0
  42. data/lib/glimmer/libui/{checkbox_column_proxy.rb → control_proxy/combobox_proxy.rb} +16 -13
  43. data/lib/glimmer/libui/control_proxy/date_time_picker_proxy/date_picker_proxy.rb +43 -0
  44. data/lib/glimmer/libui/control_proxy/date_time_picker_proxy/time_picker_proxy.rb +43 -0
  45. data/lib/glimmer/libui/control_proxy/date_time_picker_proxy.rb +72 -0
  46. data/lib/glimmer/libui/control_proxy/dual_column.rb +40 -0
  47. data/lib/glimmer/libui/control_proxy/editable_column.rb +46 -0
  48. data/lib/glimmer/libui/control_proxy/editable_combobox_proxy.rb +45 -0
  49. data/lib/glimmer/libui/{dual_column.rb → control_proxy/enableable_column.rb} +18 -10
  50. data/lib/glimmer/libui/control_proxy/font_button_proxy.rb +70 -0
  51. data/lib/glimmer/libui/{form_proxy.rb → control_proxy/form_proxy.rb} +26 -24
  52. data/lib/glimmer/libui/{grid_proxy.rb → control_proxy/grid_proxy.rb} +29 -27
  53. data/lib/glimmer/libui/{group_proxy.rb → control_proxy/group_proxy.rb} +24 -22
  54. data/lib/glimmer/libui/{image_part_proxy.rb → control_proxy/image_part_proxy.rb} +20 -18
  55. data/lib/glimmer/libui/{image_proxy.rb → control_proxy/image_proxy.rb} +32 -30
  56. data/lib/glimmer/libui/{combobox_proxy.rb → control_proxy/label_proxy.rb} +13 -13
  57. data/lib/glimmer/libui/control_proxy/matrix_proxy.rb +147 -0
  58. data/lib/glimmer/libui/{editable_column.rb → control_proxy/menu_item_proxy/about_menu_item_proxy.rb} +13 -16
  59. data/lib/glimmer/libui/control_proxy/menu_item_proxy/check_menu_item_proxy.rb +41 -0
  60. data/lib/glimmer/libui/{preferences_menu_item_proxy.rb → control_proxy/menu_item_proxy/preferences_menu_item_proxy.rb} +11 -9
  61. data/lib/glimmer/libui/control_proxy/menu_item_proxy/quit_menu_item_proxy.rb +66 -0
  62. data/lib/glimmer/libui/control_proxy/menu_item_proxy/separator_menu_item_proxy.rb +41 -0
  63. data/lib/glimmer/libui/control_proxy/menu_item_proxy.rb +45 -0
  64. data/lib/glimmer/libui/{editable_combobox_proxy.rb → control_proxy/menu_proxy.rb} +13 -13
  65. data/lib/glimmer/libui/{horizontal_box_proxy.rb → control_proxy/message_box/msg_box_error_proxy.rb} +9 -6
  66. data/lib/glimmer/libui/{multiline_entry_proxy.rb → control_proxy/message_box/msg_box_proxy.rb} +8 -6
  67. data/lib/glimmer/libui/{check_menu_item_proxy.rb → control_proxy/message_box.rb} +11 -10
  68. data/lib/glimmer/libui/control_proxy/multiline_entry_proxy/non_wrapping_multiline_entry_proxy.rb +34 -0
  69. data/lib/glimmer/libui/{image_column_proxy.rb → control_proxy/multiline_entry_proxy.rb} +10 -11
  70. data/lib/glimmer/libui/control_proxy/path_proxy.rb +169 -0
  71. data/lib/glimmer/libui/control_proxy/radio_buttons_proxy.rb +45 -0
  72. data/lib/glimmer/libui/{button_column_proxy.rb → control_proxy/tab_item_proxy.rb} +37 -40
  73. data/lib/glimmer/libui/control_proxy/table_proxy.rb +182 -0
  74. data/lib/glimmer/libui/control_proxy/transformable.rb +74 -0
  75. data/lib/glimmer/libui/control_proxy/window_proxy.rb +128 -0
  76. data/lib/glimmer/libui/control_proxy.rb +41 -22
  77. data/lib/glimmer/libui/{enableable_column.rb → parent.rb} +7 -15
  78. data/lib/glimmer/libui/shape/arc.rb +43 -0
  79. data/lib/glimmer/libui/{date_picker_proxy.rb → shape/bezier.rb} +8 -9
  80. data/lib/glimmer/libui/{quit_menu_item_proxy.rb → shape/figure.rb} +24 -32
  81. data/lib/glimmer/libui/{non_wrapping_multiline_entry_proxy.rb → shape/line.rb} +11 -5
  82. data/lib/glimmer/libui/{time_picker_proxy.rb → shape/rectangle.rb} +8 -9
  83. data/lib/glimmer/libui/{about_menu_item_proxy.rb → shape/square.rb} +9 -8
  84. data/lib/glimmer/libui/shape.rb +145 -0
  85. data/lib/glimmer/libui.rb +92 -0
  86. data/lib/glimmer-dsl-libui.rb +2 -0
  87. metadata +82 -48
  88. data/lib/glimmer/libui/area_proxy.rb +0 -105
  89. data/lib/glimmer/libui/checkbox_text_column_proxy.rb +0 -76
  90. data/lib/glimmer/libui/color_button_proxy.rb +0 -64
  91. data/lib/glimmer/libui/column.rb +0 -51
  92. data/lib/glimmer/libui/date_time_picker_proxy.rb +0 -68
  93. data/lib/glimmer/libui/font_button_proxy.rb +0 -68
  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/path_proxy.rb +0 -167
  98. data/lib/glimmer/libui/rectangle_proxy.rb +0 -100
  99. data/lib/glimmer/libui/separator_menu_item_proxy.rb +0 -37
  100. data/lib/glimmer/libui/tab_item_proxy.rb +0 -67
  101. data/lib/glimmer/libui/table_proxy.rb +0 -180
  102. data/lib/glimmer/libui/text_column_proxy.rb +0 -42
  103. data/lib/glimmer/libui/window_proxy.rb +0 -119
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.2
1
+ 0.1.6
@@ -0,0 +1,50 @@
1
+ require 'glimmer-dsl-libui'
2
+
3
+ include Glimmer
4
+
5
+ window('Area Gallery', 400, 400) {
6
+ area {
7
+ path { # declarative stable path
8
+ square(0, 0, 100)
9
+ square(100, 100, 400)
10
+
11
+ fill r: 102, g: 102, b: 204
12
+ }
13
+ path { # declarative stable path
14
+ rectangle(0, 100, 100, 400)
15
+ rectangle(100, 0, 400, 100)
16
+
17
+ fill r: 204, g: 102, b: 204
18
+ }
19
+ path { # declarative stable path
20
+ figure(100, 100) {
21
+ line(100, 400)
22
+ line(400, 100)
23
+ line(400, 400)
24
+
25
+ closed true
26
+ }
27
+
28
+ fill r: 202, g: 102, b: 104, a: 0.5
29
+ stroke r: 0, g: 0, b: 0
30
+ }
31
+ path { # declarative stable path
32
+ figure(0, 0) {
33
+ bezier(200, 100, 100, 200, 400, 100)
34
+ bezier(300, 100, 100, 300, 100, 400)
35
+ bezier(100, 300, 300, 100, 400, 400)
36
+
37
+ closed true
38
+ }
39
+
40
+ fill r: 202, g: 102, b: 204, a: 0.5
41
+ stroke thickness: 2, r: 0, g: 0, b: 0
42
+ }
43
+ path { # declarative stable path
44
+ arc(200, 200, 90, 0, 360, false)
45
+
46
+ fill r: 202, g: 102, b: 204, a: 0.5
47
+ stroke thickness: 2, r: 0, g: 0, b: 0
48
+ }
49
+ }
50
+ }.show
@@ -0,0 +1,111 @@
1
+ require 'glimmer-dsl-libui'
2
+
3
+ include Glimmer
4
+
5
+ window('Area Gallery', 400, 400) {
6
+ area {
7
+ path { # declarative stable path
8
+ square {
9
+ x 0
10
+ y 0
11
+ length 100
12
+ }
13
+ square {
14
+ x 100
15
+ y 100
16
+ length 400
17
+ }
18
+
19
+ fill r: 102, g: 102, b: 204
20
+ }
21
+ path { # declarative stable path
22
+ rectangle {
23
+ x 0
24
+ y 100
25
+ width 100
26
+ height 400
27
+ }
28
+ rectangle {
29
+ x 100
30
+ y 0
31
+ width 400
32
+ height 100
33
+ }
34
+
35
+ fill r: 204, g: 102, b: 204
36
+ }
37
+ path { # declarative stable path
38
+ figure {
39
+ x 100
40
+ y 100
41
+
42
+ line {
43
+ x 100
44
+ y 400
45
+ }
46
+ line {
47
+ x 400
48
+ y 100
49
+ }
50
+ line {
51
+ x 400
52
+ y 400
53
+ }
54
+
55
+ closed true
56
+ }
57
+
58
+ fill r: 202, g: 102, b: 104, a: 0.5
59
+ stroke r: 0, g: 0, b: 0
60
+ }
61
+ path { # declarative stable path
62
+ figure {
63
+ x 0
64
+ y 0
65
+
66
+ bezier {
67
+ c1_x 200
68
+ c1_y 100
69
+ c2_x 100
70
+ c2_y 200
71
+ end_x 400
72
+ end_y 100
73
+ }
74
+ bezier {
75
+ c1_x 300
76
+ c1_y 100
77
+ c2_x 100
78
+ c2_y 300
79
+ end_x 100
80
+ end_y 400
81
+ }
82
+ bezier {
83
+ c1_x 100
84
+ c1_y 300
85
+ c2_x 300
86
+ c2_y 100
87
+ end_x 400
88
+ end_y 400
89
+ }
90
+
91
+ closed true
92
+ }
93
+
94
+ fill r: 202, g: 102, b: 204, a: 0.5
95
+ stroke thickness: 2, r: 0, g: 0, b: 0
96
+ }
97
+ path { # declarative stable path
98
+ arc {
99
+ x_center 200
100
+ y_center 200
101
+ radius 90
102
+ start_angle 0
103
+ sweep 360
104
+ is_negative false
105
+ }
106
+
107
+ fill r: 202, g: 102, b: 204, a: 0.5
108
+ stroke thickness: 2, r: 0, g: 0, b: 0
109
+ }
110
+ }
111
+ }.show
@@ -0,0 +1,52 @@
1
+ require 'glimmer-dsl-libui'
2
+
3
+ include Glimmer
4
+
5
+ window('Area Gallery', 400, 400) {
6
+ area {
7
+ on_draw do |area_draw_params|
8
+ path { # a dynamic path is added semi-declaratively inside on_draw block
9
+ square(0, 0, 100)
10
+ square(100, 100, 400)
11
+
12
+ fill r: 102, g: 102, b: 204
13
+ }
14
+ path { # a dynamic path is added semi-declaratively inside on_draw block
15
+ rectangle(0, 100, 100, 400)
16
+ rectangle(100, 0, 400, 100)
17
+
18
+ fill r: 204, g: 102, b: 204
19
+ }
20
+ path { # a dynamic path is added semi-declaratively inside on_draw block
21
+ figure(100, 100) {
22
+ line(100, 400)
23
+ line(400, 100)
24
+ line(400, 400)
25
+
26
+ closed true
27
+ }
28
+
29
+ fill r: 202, g: 102, b: 104, a: 0.5
30
+ stroke r: 0, g: 0, b: 0
31
+ }
32
+ path { # a dynamic path is added semi-declaratively inside on_draw block
33
+ figure(0, 0) {
34
+ bezier(200, 100, 100, 200, 400, 100)
35
+ bezier(300, 100, 100, 300, 100, 400)
36
+ bezier(100, 300, 300, 100, 400, 400)
37
+
38
+ closed true
39
+ }
40
+
41
+ fill r: 202, g: 102, b: 204, a: 0.5
42
+ stroke thickness: 2, r: 0, g: 0, b: 0
43
+ }
44
+ path { # a dynamic path is added semi-declaratively inside on_draw block
45
+ arc(200, 200, 90, 0, 360, false)
46
+
47
+ fill r: 202, g: 102, b: 204, a: 0.5
48
+ stroke thickness: 2, r: 0, g: 0, b: 0
49
+ }
50
+ end
51
+ }
52
+ }.show
@@ -0,0 +1,113 @@
1
+ require 'glimmer-dsl-libui'
2
+
3
+ include Glimmer
4
+
5
+ window('Area Gallery', 400, 400) {
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 {
44
+ x 100
45
+ y 400
46
+ }
47
+ line {
48
+ x 400
49
+ y 100
50
+ }
51
+ line {
52
+ x 400
53
+ y 400
54
+ }
55
+
56
+ closed true
57
+ }
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
74
+ }
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
82
+ }
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
90
+ }
91
+
92
+ closed true
93
+ }
94
+
95
+ fill r: 202, g: 102, b: 204, a: 0.5
96
+ stroke thickness: 2, r: 0, g: 0, b: 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 thickness: 2, r: 0, g: 0, b: 0
110
+ }
111
+ end
112
+ }
113
+ }.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
  }
@@ -12,13 +12,23 @@ data = [
12
12
  ['task 5', -1],
13
13
  ]
14
14
 
15
- window('Task progress', 300, 200) {
16
- horizontal_box {
15
+ window('Task Progress', 300, 200) {
16
+ vertical_box {
17
17
  table {
18
18
  text_column('Task')
19
19
  progress_bar_column('Progress')
20
20
 
21
- cell_rows data
21
+ cell_rows data # implicit data-binding
22
+ }
23
+
24
+ button('Mark All As Done') {
25
+ stretchy false
26
+
27
+ on_clicked do
28
+ data.each_with_index do |row_data, row|
29
+ data[row] = [row_data[0], 100] # automatically updates table due to implicit data-binding
30
+ end
31
+ end
22
32
  }
23
33
  }
24
34
  }.show
@@ -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