glimmer-dsl-libui 0.2.24 → 0.3.3
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 +34 -0
- data/README.md +1153 -921
- data/VERSION +1 -1
- data/examples/area_gallery.rb +19 -19
- data/examples/area_gallery2.rb +91 -89
- data/examples/area_gallery3.rb +19 -19
- data/examples/area_gallery4.rb +91 -89
- data/examples/basic_image.rb +19 -0
- data/examples/basic_image2.rb +13 -0
- data/examples/basic_image3.rb +23 -0
- data/examples/basic_image4.rb +17 -0
- data/examples/basic_image5.rb +75 -0
- data/examples/basic_table_color.rb +1 -11
- data/examples/basic_table_color2.rb +39 -0
- data/examples/basic_table_image.rb +2 -14
- data/examples/basic_table_image2.rb +44 -0
- data/examples/basic_table_image_text.rb +2 -13
- data/examples/basic_table_image_text2.rb +44 -0
- data/examples/basic_transform.rb +3 -6
- data/examples/basic_transform2.rb +34 -0
- data/examples/color_the_circles.rb +1 -3
- data/examples/dynamic_area.rb +1 -3
- data/examples/dynamic_area2.rb +5 -7
- data/examples/form_table.rb +4 -0
- data/examples/grid.rb +4 -4
- data/examples/histogram.rb +4 -8
- data/examples/meta_example.rb +50 -10
- data/examples/snake.rb +1 -3
- data/examples/tetris.rb +15 -18
- data/examples/tic_tac_toe/board.rb +4 -2
- data/examples/tic_tac_toe.rb +1 -3
- data/glimmer-dsl-libui.gemspec +0 -0
- data/lib/glimmer/dsl/libui/control_expression.rb +1 -1
- data/lib/glimmer/dsl/libui/shape_expression.rb +6 -1
- data/lib/glimmer/libui/control_proxy/area_proxy.rb +1 -0
- data/lib/glimmer/libui/control_proxy/column.rb +2 -2
- data/lib/glimmer/libui/control_proxy/image_part_proxy.rb +0 -1
- data/lib/glimmer/libui/control_proxy/image_proxy.rb +159 -12
- data/lib/glimmer/libui/control_proxy/table_proxy.rb +15 -2
- data/lib/glimmer/libui/control_proxy/window_proxy.rb +1 -1
- data/lib/glimmer/libui/control_proxy.rb +7 -7
- data/lib/glimmer/libui/image_path_renderer.rb +30 -0
- data/lib/glimmer/libui/shape.rb +44 -1
- metadata +29 -19
@@ -0,0 +1,75 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# This is the manual way of rendering an image unto an area control.
|
4
|
+
# It could come in handy in special situations.
|
5
|
+
# Otherwise, it is recommended to simply utilize the `image` control that
|
6
|
+
# can be nested under area or area on_draw listener to automate all this work.
|
7
|
+
|
8
|
+
require 'glimmer-dsl-libui'
|
9
|
+
require 'chunky_png'
|
10
|
+
|
11
|
+
include Glimmer
|
12
|
+
|
13
|
+
puts 'Parsing image...'; $stdout.flush
|
14
|
+
|
15
|
+
f = File.open(File.expand_path('../icons/glimmer.png', __dir__))
|
16
|
+
canvas = ChunkyPNG::Canvas.from_io(f)
|
17
|
+
f.close
|
18
|
+
canvas.resample_nearest_neighbor!(96, 96)
|
19
|
+
data = canvas.to_rgba_stream
|
20
|
+
width = canvas.width
|
21
|
+
height = canvas.height
|
22
|
+
puts "Image width: #{width}"
|
23
|
+
puts "Image height: #{height}"
|
24
|
+
|
25
|
+
puts 'Parsing colors...'; $stdout.flush
|
26
|
+
|
27
|
+
color_maps = height.times.map do |y|
|
28
|
+
width.times.map do |x|
|
29
|
+
r = data[(y*width + x)*4].ord
|
30
|
+
g = data[(y*width + x)*4 + 1].ord
|
31
|
+
b = data[(y*width + x)*4 + 2].ord
|
32
|
+
a = data[(y*width + x)*4 + 3].ord
|
33
|
+
{x: x, y: y, color: {r: r, g: g, b: b, a: a}}
|
34
|
+
end
|
35
|
+
end.flatten
|
36
|
+
puts "#{color_maps.size} pixels to render..."; $stdout.flush
|
37
|
+
|
38
|
+
puts 'Parsing shapes...'; $stdout.flush
|
39
|
+
|
40
|
+
shape_maps = []
|
41
|
+
original_color_maps = color_maps.dup
|
42
|
+
indexed_original_color_maps = Hash[original_color_maps.each_with_index.to_a]
|
43
|
+
color_maps.each do |color_map|
|
44
|
+
index = indexed_original_color_maps[color_map]
|
45
|
+
@rectangle_start_x ||= color_map[:x]
|
46
|
+
@rectangle_width ||= 1
|
47
|
+
if color_map[:x] < width - 1 && color_map[:color] == original_color_maps[index + 1][:color]
|
48
|
+
@rectangle_width += 1
|
49
|
+
else
|
50
|
+
if color_map[:x] > 0 && color_map[:color] == original_color_maps[index - 1][:color]
|
51
|
+
shape_maps << {x: @rectangle_start_x, y: color_map[:y], width: @rectangle_width, height: 1, color: color_map[:color]}
|
52
|
+
else
|
53
|
+
shape_maps << {x: color_map[:x], y: color_map[:y], width: 1, height: 1, color: color_map[:color]}
|
54
|
+
end
|
55
|
+
@rectangle_width = 1
|
56
|
+
@rectangle_start_x = color_map[:x] == width - 1 ? 0 : color_map[:x] + 1
|
57
|
+
end
|
58
|
+
end
|
59
|
+
puts "#{shape_maps.size} shapes to render..."; $stdout.flush
|
60
|
+
|
61
|
+
puts 'Rendering image...'; $stdout.flush
|
62
|
+
|
63
|
+
window('Basic Image', 96, 96) {
|
64
|
+
area {
|
65
|
+
on_draw do |area_draw_params|
|
66
|
+
shape_maps.each do |shape_map|
|
67
|
+
path {
|
68
|
+
rectangle(shape_map[:x], shape_map[:y], shape_map[:width], shape_map[:height])
|
69
|
+
|
70
|
+
fill shape_map[:color]
|
71
|
+
}
|
72
|
+
end
|
73
|
+
end
|
74
|
+
}
|
75
|
+
}.show
|
@@ -1,20 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'glimmer-dsl-libui'
|
4
|
-
require 'chunky_png'
|
5
4
|
|
6
5
|
include Glimmer
|
7
6
|
|
8
|
-
|
9
|
-
canvas = ChunkyPNG::Canvas.from_io(f)
|
10
|
-
f.close
|
11
|
-
canvas.resample_nearest_neighbor!(24, 24)
|
12
|
-
data = canvas.to_rgba_stream
|
13
|
-
width = canvas.width
|
14
|
-
height = canvas.height
|
15
|
-
img = image {
|
16
|
-
image_part(data, width, height, width * 4)
|
17
|
-
}
|
7
|
+
img = image(File.expand_path('../icons/glimmer.png', __dir__), 24, 24)
|
18
8
|
|
19
9
|
data = [
|
20
10
|
[['cat', :red] , ['meow', :blue] , [true, 'mammal', :green], [img, 'Glimmer', :dark_blue], {r: 255, g: 120, b: 0, a: 0.5}],
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'glimmer-dsl-libui'
|
4
|
+
require 'chunky_png'
|
5
|
+
|
6
|
+
include Glimmer
|
7
|
+
|
8
|
+
f = File.open(File.expand_path('../icons/glimmer.png', __dir__))
|
9
|
+
canvas = ChunkyPNG::Canvas.from_io(f)
|
10
|
+
f.close
|
11
|
+
canvas.resample_nearest_neighbor!(24, 24)
|
12
|
+
data = canvas.to_rgba_stream
|
13
|
+
width = canvas.width
|
14
|
+
height = canvas.height
|
15
|
+
img = image {
|
16
|
+
image_part(data, width, height, width * 4)
|
17
|
+
}
|
18
|
+
|
19
|
+
data = [
|
20
|
+
[['cat', :red] , ['meow', :blue] , [true, 'mammal', :green], [img, 'Glimmer', :dark_blue], {r: 255, g: 120, b: 0, a: 0.5}],
|
21
|
+
[['dog', :yellow] , ['woof', {r: 240, g: 32, b: 32}] , [true, 'mammal', :green], [img, 'Glimmer', :dark_blue], :skyblue],
|
22
|
+
[['chicken', :beige], ['cock-a-doodle-doo', :blue] , [false, 'mammal', :red] , [img, 'Glimmer', :beige], {r: 5, g: 120, b: 110}],
|
23
|
+
[['horse', :purple] , ['neigh', {r: 240, g: 32, b: 32}], [true, 'mammal', :green], [img, 'Glimmer', :dark_blue], '13a1fb'],
|
24
|
+
[['cow', :gray] , ['moo', :blue] , [true, 'mammal', :green], [img, 'Glimmer', :brown], 0x12ff02]
|
25
|
+
]
|
26
|
+
|
27
|
+
window('Animals', 500, 200) {
|
28
|
+
horizontal_box {
|
29
|
+
table {
|
30
|
+
text_color_column('Animal')
|
31
|
+
text_color_column('Sound')
|
32
|
+
checkbox_text_color_column('Description')
|
33
|
+
image_text_color_column('GUI')
|
34
|
+
background_color_column('Mammal')
|
35
|
+
|
36
|
+
cell_rows data
|
37
|
+
}
|
38
|
+
}
|
39
|
+
}.show
|
@@ -4,8 +4,6 @@
|
|
4
4
|
# This example displays images that can be freely downloaded from the Studio Ghibli website.
|
5
5
|
|
6
6
|
require 'glimmer-dsl-libui'
|
7
|
-
require 'chunky_png'
|
8
|
-
require 'open-uri'
|
9
7
|
|
10
8
|
include Glimmer
|
11
9
|
|
@@ -13,18 +11,8 @@ IMAGE_ROWS = []
|
|
13
11
|
|
14
12
|
50.times do |i|
|
15
13
|
url = format('https://www.ghibli.jp/gallery/thumb-redturtle%03d.png', (i + 1))
|
16
|
-
puts "Processing Image: #{url}"
|
17
|
-
|
18
|
-
f = URI.open(url)
|
19
|
-
canvas = ChunkyPNG::Canvas.from_io(f)
|
20
|
-
f.close
|
21
|
-
data = canvas.to_rgba_stream
|
22
|
-
width = canvas.width
|
23
|
-
height = canvas.height
|
24
|
-
img = image {
|
25
|
-
image_part(data, width, height, width * 4)
|
26
|
-
}
|
27
|
-
IMAGE_ROWS << [img] # array of one column cell
|
14
|
+
puts "Processing Image: #{url}"; $stdout.flush # for Windows
|
15
|
+
IMAGE_ROWS << [image(url)] # array of one column cell
|
28
16
|
rescue StandardError => e
|
29
17
|
warn url, e.message
|
30
18
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# NOTE:
|
4
|
+
# This example displays images that can be freely downloaded from the Studio Ghibli website.
|
5
|
+
|
6
|
+
require 'glimmer-dsl-libui'
|
7
|
+
require 'chunky_png'
|
8
|
+
require 'open-uri'
|
9
|
+
|
10
|
+
include Glimmer
|
11
|
+
|
12
|
+
IMAGE_ROWS = []
|
13
|
+
|
14
|
+
50.times do |i|
|
15
|
+
url = format('https://www.ghibli.jp/gallery/thumb-redturtle%03d.png', (i + 1))
|
16
|
+
puts "Processing Image: #{url}"
|
17
|
+
$stdout.flush # for Windows
|
18
|
+
f = URI.open(url)
|
19
|
+
canvas = ChunkyPNG::Canvas.from_io(f)
|
20
|
+
f.close
|
21
|
+
data = canvas.to_rgba_stream
|
22
|
+
width = canvas.width
|
23
|
+
height = canvas.height
|
24
|
+
img = image {
|
25
|
+
image_part(data, width, height, width * 4)
|
26
|
+
}
|
27
|
+
IMAGE_ROWS << [img] # array of one column cell
|
28
|
+
rescue StandardError => e
|
29
|
+
warn url, e.message
|
30
|
+
end
|
31
|
+
|
32
|
+
window('The Red Turtle', 310, 350, false) {
|
33
|
+
horizontal_box {
|
34
|
+
table {
|
35
|
+
image_column('www.ghibli.jp/works/red-turtle')
|
36
|
+
|
37
|
+
cell_rows IMAGE_ROWS
|
38
|
+
}
|
39
|
+
}
|
40
|
+
|
41
|
+
on_closing do
|
42
|
+
puts 'Bye Bye'
|
43
|
+
end
|
44
|
+
}.show
|
@@ -4,8 +4,6 @@
|
|
4
4
|
# This example displays images that can be freely downloaded from the Studio Ghibli website.
|
5
5
|
|
6
6
|
require 'glimmer-dsl-libui'
|
7
|
-
require 'chunky_png'
|
8
|
-
require 'open-uri'
|
9
7
|
|
10
8
|
include Glimmer
|
11
9
|
|
@@ -13,18 +11,9 @@ IMAGE_ROWS = []
|
|
13
11
|
|
14
12
|
5.times do |i|
|
15
13
|
url = format('https://www.ghibli.jp/gallery/thumb-redturtle%03d.png', (i + 1))
|
16
|
-
puts "Processing Image: #{url}"
|
17
|
-
$stdout.flush # for Windows
|
18
|
-
f = URI.open(url)
|
19
|
-
canvas = ChunkyPNG::Canvas.from_io(f)
|
20
|
-
f.close
|
21
|
-
data = canvas.to_rgba_stream
|
22
|
-
width = canvas.width
|
23
|
-
height = canvas.height
|
24
|
-
img = image {
|
25
|
-
image_part(data, width, height, width * 4)
|
26
|
-
}
|
14
|
+
puts "Processing Image: #{url}"; $stdout.flush # for Windows
|
27
15
|
text = url.sub('https://www.ghibli.jp/gallery/thumb-redturtle', '').sub('.png', '')
|
16
|
+
img = image(url)
|
28
17
|
IMAGE_ROWS << [[img, text], [img, text]] # cell values are dual-element arrays
|
29
18
|
rescue StandardError => e
|
30
19
|
warn url, e.message
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# NOTE:
|
4
|
+
# This example displays images that can be freely downloaded from the Studio Ghibli website.
|
5
|
+
|
6
|
+
require 'glimmer-dsl-libui'
|
7
|
+
require 'chunky_png'
|
8
|
+
require 'open-uri'
|
9
|
+
|
10
|
+
include Glimmer
|
11
|
+
|
12
|
+
IMAGE_ROWS = []
|
13
|
+
|
14
|
+
5.times do |i|
|
15
|
+
url = format('https://www.ghibli.jp/gallery/thumb-redturtle%03d.png', (i + 1))
|
16
|
+
puts "Processing Image: #{url}"
|
17
|
+
$stdout.flush # for Windows
|
18
|
+
f = URI.open(url)
|
19
|
+
canvas = ChunkyPNG::Canvas.from_io(f)
|
20
|
+
f.close
|
21
|
+
data = canvas.to_rgba_stream
|
22
|
+
width = canvas.width
|
23
|
+
height = canvas.height
|
24
|
+
img = image {
|
25
|
+
image_part(data, width, height, width * 4)
|
26
|
+
}
|
27
|
+
text = url.sub('https://www.ghibli.jp/gallery/thumb-redturtle', '').sub('.png', '')
|
28
|
+
IMAGE_ROWS << [[img, text], [img, text]] # cell values are dual-element arrays
|
29
|
+
rescue StandardError => e
|
30
|
+
warn url, e.message
|
31
|
+
end
|
32
|
+
|
33
|
+
window('The Red Turtle', 670, 350) {
|
34
|
+
horizontal_box {
|
35
|
+
table {
|
36
|
+
image_text_column('image/number')
|
37
|
+
image_text_column('image/number (editable)') {
|
38
|
+
editable true
|
39
|
+
}
|
40
|
+
|
41
|
+
cell_rows IMAGE_ROWS
|
42
|
+
}
|
43
|
+
}
|
44
|
+
}.show
|
data/examples/basic_transform.rb
CHANGED
@@ -4,17 +4,14 @@ include Glimmer
|
|
4
4
|
|
5
5
|
window('Basic Transform', 350, 350) {
|
6
6
|
area {
|
7
|
-
|
8
|
-
square(0, 0, 350)
|
9
|
-
|
7
|
+
square(0, 0, 350) {
|
10
8
|
fill r: 255, g: 255, b: 0
|
11
9
|
}
|
12
10
|
40.times do |n|
|
13
|
-
|
14
|
-
square(0, 0, 100)
|
15
|
-
|
11
|
+
square(0, 0, 100) {
|
16
12
|
fill r: [255 - n*5, 0].max, g: [n*5, 255].min, b: 0, a: 0.5
|
17
13
|
stroke :black, thickness: 2
|
14
|
+
|
18
15
|
transform {
|
19
16
|
unless OS.windows?
|
20
17
|
skew 0.15, 0.15
|
@@ -0,0 +1,34 @@
|
|
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
|
+
|
19
|
+
transform {
|
20
|
+
unless OS.windows?
|
21
|
+
skew 0.15, 0.15
|
22
|
+
translate 50, 50
|
23
|
+
end
|
24
|
+
rotate 100, 100, -9 * n
|
25
|
+
scale 1.1, 1.1
|
26
|
+
if OS.windows?
|
27
|
+
skew 0.15, 0.15
|
28
|
+
translate 50, 50
|
29
|
+
end
|
30
|
+
}
|
31
|
+
}
|
32
|
+
end
|
33
|
+
}
|
34
|
+
}.show
|
@@ -201,9 +201,7 @@ class ColorTheCircles
|
|
201
201
|
}
|
202
202
|
|
203
203
|
@circles_data.each do |circle_data|
|
204
|
-
|
205
|
-
circle_data[:circle] = circle(*circle_data[:args])
|
206
|
-
|
204
|
+
circle_data[:circle] = circle(*circle_data[:args]) {
|
207
205
|
fill circle_data[:fill]
|
208
206
|
stroke circle_data[:stroke]
|
209
207
|
}
|
data/examples/dynamic_area.rb
CHANGED
@@ -88,9 +88,7 @@ window('Dynamic Area', 240, 600) {
|
|
88
88
|
|
89
89
|
@area = area {
|
90
90
|
on_draw do |area_draw_params|
|
91
|
-
|
92
|
-
rectangle(@x_spinbox.value, @y_spinbox.value, @width_spinbox.value, @height_spinbox.value)
|
93
|
-
|
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
|
94
92
|
fill r: @red_spinbox.value, g: @green_spinbox.value, b: @blue_spinbox.value, a: @alpha_spinbox.value / 100.0
|
95
93
|
}
|
96
94
|
end
|
data/examples/dynamic_area2.rb
CHANGED
@@ -54,7 +54,7 @@ window('Dynamic Area', 240, 600) {
|
|
54
54
|
value 102
|
55
55
|
|
56
56
|
on_changed do
|
57
|
-
@
|
57
|
+
@rectangle.fill[:r] = @red_spinbox.value # updating hash properties automatically triggers 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
|
+
@rectangle.fill[:g] = @green_spinbox.value # updating hash properties automatically triggers 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
|
+
@rectangle.fill[:b] = @blue_spinbox.value # updating hash properties automatically triggers area.queue_redraw_all
|
76
76
|
end
|
77
77
|
}
|
78
78
|
|
@@ -81,15 +81,13 @@ window('Dynamic Area', 240, 600) {
|
|
81
81
|
value 100
|
82
82
|
|
83
83
|
on_changed do
|
84
|
-
@
|
84
|
+
@rectangle.fill[:a] = @alpha_spinbox.value / 100.0 # updating hash properties automatically triggers area.queue_redraw_all
|
85
85
|
end
|
86
86
|
}
|
87
87
|
}
|
88
88
|
|
89
89
|
area {
|
90
|
-
@
|
91
|
-
@rectangle = rectangle(@x_spinbox.value, @y_spinbox.value, @width_spinbox.value, @height_spinbox.value)
|
92
|
-
|
90
|
+
@rectangle = rectangle(@x_spinbox.value, @y_spinbox.value, @width_spinbox.value, @height_spinbox.value) { # stable path
|
93
91
|
fill r: @red_spinbox.value, g: @green_spinbox.value, b: @blue_spinbox.value, a: @alpha_spinbox.value / 100.0
|
94
92
|
}
|
95
93
|
}
|
data/examples/form_table.rb
CHANGED
@@ -22,15 +22,19 @@ window('Contacts', 600, 600) { |w|
|
|
22
22
|
@name_entry = entry {
|
23
23
|
label 'Name'
|
24
24
|
}
|
25
|
+
|
25
26
|
@email_entry = entry {
|
26
27
|
label 'Email'
|
27
28
|
}
|
29
|
+
|
28
30
|
@phone_entry = entry {
|
29
31
|
label 'Phone'
|
30
32
|
}
|
33
|
+
|
31
34
|
@city_entry = entry {
|
32
35
|
label 'City'
|
33
36
|
}
|
37
|
+
|
34
38
|
@state_entry = entry {
|
35
39
|
label 'State'
|
36
40
|
}
|
data/examples/grid.rb
CHANGED
@@ -8,16 +8,16 @@ window('Grid') {
|
|
8
8
|
tab {
|
9
9
|
tab_item('Span') {
|
10
10
|
grid {
|
11
|
-
4.times
|
12
|
-
4.times
|
11
|
+
4.times do |top_value|
|
12
|
+
4.times do |left_value|
|
13
13
|
label("(#{left_value}, #{top_value}) xspan1\nyspan1") {
|
14
14
|
left left_value
|
15
15
|
top top_value
|
16
16
|
hexpand true
|
17
17
|
vexpand true
|
18
18
|
}
|
19
|
-
|
20
|
-
|
19
|
+
end
|
20
|
+
end
|
21
21
|
label("(0, 4) xspan2\nyspan1 more text fits horizontally") {
|
22
22
|
left 0
|
23
23
|
top 4
|
data/examples/histogram.rb
CHANGED
@@ -79,19 +79,15 @@ window('histogram example', 640, 480) {
|
|
79
79
|
|
80
80
|
@area = area {
|
81
81
|
on_draw do |area_draw_params|
|
82
|
-
|
83
|
-
rectangle(0, 0, area_draw_params[:area_width], area_draw_params[:area_height])
|
84
|
-
|
82
|
+
rectangle(0, 0, area_draw_params[:area_width], area_draw_params[:area_height]) {
|
85
83
|
fill 0xFFFFFF
|
86
84
|
}
|
87
85
|
|
88
86
|
graph_width, graph_height = *graph_size(area_draw_params[:area_width], area_draw_params[:area_height])
|
89
87
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
line(X_OFF_LEFT + graph_width, Y_OFF_TOP + graph_height)
|
94
|
-
}
|
88
|
+
figure(X_OFF_LEFT, Y_OFF_TOP) {
|
89
|
+
line(X_OFF_LEFT, Y_OFF_TOP + graph_height)
|
90
|
+
line(X_OFF_LEFT + graph_width, Y_OFF_TOP + graph_height)
|
95
91
|
|
96
92
|
stroke 0x000000, thickness: 2, miter_limit: 10
|
97
93
|
}
|
data/examples/meta_example.rb
CHANGED
@@ -5,8 +5,10 @@ require 'fileutils'
|
|
5
5
|
class MetaExample
|
6
6
|
include Glimmer
|
7
7
|
|
8
|
+
ADDITIONAL_BASIC_EXAMPLES = ['Color Button', 'Font Button', 'Form', 'Date Time Picker', 'Simple Notepad']
|
9
|
+
|
8
10
|
def initialize
|
9
|
-
@selected_example_index =
|
11
|
+
@selected_example_index = examples_with_versions.index(basic_examples_with_versions.first)
|
10
12
|
end
|
11
13
|
|
12
14
|
def examples
|
@@ -25,6 +27,14 @@ class MetaExample
|
|
25
27
|
end
|
26
28
|
end
|
27
29
|
|
30
|
+
def basic_examples_with_versions
|
31
|
+
examples_with_versions.select {|example| example.start_with?('Basic') || ADDITIONAL_BASIC_EXAMPLES.include?(example) }
|
32
|
+
end
|
33
|
+
|
34
|
+
def advanced_examples_with_versions
|
35
|
+
examples_with_versions - basic_examples_with_versions
|
36
|
+
end
|
37
|
+
|
28
38
|
def file_path_for(example)
|
29
39
|
File.join(File.expand_path('.', __dir__), "#{example.underscore}.rb")
|
30
40
|
end
|
@@ -66,17 +76,47 @@ class MetaExample
|
|
66
76
|
vertical_box {
|
67
77
|
stretchy false
|
68
78
|
|
69
|
-
|
79
|
+
tab {
|
70
80
|
stretchy false
|
71
|
-
items examples_with_versions
|
72
|
-
selected @selected_example_index
|
73
81
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
82
|
+
tab_item('Basic') {
|
83
|
+
vertical_box {
|
84
|
+
@basic_example_radio_buttons = radio_buttons {
|
85
|
+
stretchy false
|
86
|
+
items basic_examples_with_versions
|
87
|
+
selected basic_examples_with_versions.index(examples_with_versions[@selected_example_index])
|
88
|
+
|
89
|
+
on_selected do
|
90
|
+
@selected_example_index = examples_with_versions.index(basic_examples_with_versions[@basic_example_radio_buttons.selected])
|
91
|
+
example = selected_example
|
92
|
+
@code_entry.text = File.read(file_path_for(example))
|
93
|
+
@version_spinbox.value = 1
|
94
|
+
end
|
95
|
+
}
|
96
|
+
|
97
|
+
label # filler
|
98
|
+
label # filler
|
99
|
+
}
|
100
|
+
}
|
101
|
+
|
102
|
+
tab_item('Advanced') {
|
103
|
+
vertical_box {
|
104
|
+
@advanced_example_radio_buttons = radio_buttons {
|
105
|
+
stretchy false
|
106
|
+
items advanced_examples_with_versions
|
107
|
+
|
108
|
+
on_selected do
|
109
|
+
@selected_example_index = examples_with_versions.index(advanced_examples_with_versions[@advanced_example_radio_buttons.selected])
|
110
|
+
example = selected_example
|
111
|
+
@code_entry.text = File.read(file_path_for(example))
|
112
|
+
@version_spinbox.value = 1
|
113
|
+
end
|
114
|
+
}
|
115
|
+
|
116
|
+
label # filler
|
117
|
+
label # filler
|
118
|
+
}
|
119
|
+
}
|
80
120
|
}
|
81
121
|
|
82
122
|
horizontal_box {
|
data/examples/snake.rb
CHANGED
data/examples/tetris.rb
CHANGED
@@ -203,34 +203,31 @@ class Tetris
|
|
203
203
|
bevel_pixel_size = 0.16 * block_size.to_f
|
204
204
|
color = Glimmer::LibUI.interpret_color(Model::Block::COLOR_CLEAR)
|
205
205
|
area {
|
206
|
-
block[:background_square] =
|
207
|
-
square(0, 0, block_size)
|
208
|
-
|
206
|
+
block[:background_square] = square(0, 0, block_size) {
|
209
207
|
fill color
|
210
208
|
}
|
211
|
-
|
212
|
-
|
213
|
-
|
209
|
+
|
210
|
+
block[:top_bevel_edge] = polygon {
|
211
|
+
point_array 0, 0, block_size, 0, block_size - bevel_pixel_size, bevel_pixel_size, bevel_pixel_size, bevel_pixel_size
|
214
212
|
fill r: color[:r] + 4*BEVEL_CONSTANT, g: color[:g] + 4*BEVEL_CONSTANT, b: color[:b] + 4*BEVEL_CONSTANT
|
215
213
|
}
|
216
|
-
|
217
|
-
|
218
|
-
|
214
|
+
|
215
|
+
block[:right_bevel_edge] = polygon {
|
216
|
+
point_array block_size, 0, block_size - bevel_pixel_size, bevel_pixel_size, block_size - bevel_pixel_size, block_size - bevel_pixel_size, block_size, block_size
|
219
217
|
fill r: color[:r] - BEVEL_CONSTANT, g: color[:g] - BEVEL_CONSTANT, b: color[:b] - BEVEL_CONSTANT
|
220
218
|
}
|
221
|
-
|
222
|
-
|
223
|
-
|
219
|
+
|
220
|
+
block[:bottom_bevel_edge] = polygon {
|
221
|
+
point_array block_size, block_size, 0, block_size, bevel_pixel_size, block_size - bevel_pixel_size, block_size - bevel_pixel_size, block_size - bevel_pixel_size
|
224
222
|
fill r: color[:r] - BEVEL_CONSTANT, g: color[:g] - BEVEL_CONSTANT, b: color[:b] - BEVEL_CONSTANT
|
225
223
|
}
|
226
|
-
|
227
|
-
|
228
|
-
|
224
|
+
|
225
|
+
block[:left_bevel_edge] = polygon {
|
226
|
+
point_array 0, 0, 0, block_size, bevel_pixel_size, block_size - bevel_pixel_size, bevel_pixel_size, bevel_pixel_size
|
229
227
|
fill r: color[:r] - BEVEL_CONSTANT, g: color[:g] - BEVEL_CONSTANT, b: color[:b] - BEVEL_CONSTANT
|
230
228
|
}
|
231
|
-
|
232
|
-
|
233
|
-
|
229
|
+
|
230
|
+
block[:border_square] = square(0, 0, block_size) {
|
234
231
|
stroke COLOR_GRAY
|
235
232
|
}
|
236
233
|
|
@@ -38,8 +38,10 @@ class TicTacToe
|
|
38
38
|
|
39
39
|
#row and column numbers are 1-based
|
40
40
|
def mark(row, column)
|
41
|
-
self[row, column].
|
42
|
-
|
41
|
+
if self[row, column].empty
|
42
|
+
self[row, column].mark(current_sign)
|
43
|
+
game_over? #updates winning sign
|
44
|
+
end
|
43
45
|
end
|
44
46
|
|
45
47
|
def current_sign
|
data/examples/tic_tac_toe.rb
CHANGED
data/glimmer-dsl-libui.gemspec
CHANGED
Binary file
|