glimmer-dsl-libui 0.2.15 → 0.2.19
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 +22 -0
- data/README.md +597 -92
- data/VERSION +1 -1
- data/bin/girb +0 -0
- data/examples/area_gallery.rb +11 -18
- data/examples/area_gallery2.rb +31 -7
- data/examples/area_gallery3.rb +14 -21
- data/examples/area_gallery4.rb +34 -10
- data/examples/basic_transform.rb +8 -2
- data/examples/color_button.rb +1 -1
- data/examples/histogram.rb +6 -13
- data/examples/meta_example.rb +3 -1
- data/examples/tetris/model/block.rb +48 -0
- data/examples/tetris/model/game.rb +306 -0
- data/examples/tetris/model/past_game.rb +39 -0
- data/examples/tetris/model/tetromino.rb +329 -0
- data/examples/tetris.rb +262 -0
- data/glimmer-dsl-libui.gemspec +0 -0
- data/lib/glimmer/dsl/libui/shape_expression.rb +1 -0
- data/lib/glimmer/libui/control_proxy/area_proxy.rb +25 -0
- data/lib/glimmer/libui/control_proxy/path_proxy.rb +19 -7
- data/lib/glimmer/libui/shape/figure.rb +4 -2
- data/lib/glimmer/libui/shape/polybezier.rb +45 -0
- data/lib/glimmer/libui/shape/polygon.rb +46 -0
- data/lib/glimmer/libui/shape/polyline.rb +45 -0
- data/lib/glimmer/libui/shape.rb +9 -3
- metadata +10 -2
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# [<img src="https://raw.githubusercontent.com/AndyObtiva/glimmer/master/images/glimmer-logo-hi-res.png" height=85 />](https://github.com/AndyObtiva/glimmer) Glimmer DSL for LibUI 0.2.
|
1
|
+
# [<img src="https://raw.githubusercontent.com/AndyObtiva/glimmer/master/images/glimmer-logo-hi-res.png" height=85 />](https://github.com/AndyObtiva/glimmer) Glimmer DSL for LibUI 0.2.19
|
2
2
|
## Prerequisite-Free Ruby Desktop Development GUI Library
|
3
3
|
[](http://badge.fury.io/rb/glimmer-dsl-libui)
|
4
4
|
[](https://gitter.im/AndyObtiva/glimmer?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
@@ -28,7 +28,16 @@ include Glimmer
|
|
28
28
|
window('hello world').show
|
29
29
|
```
|
30
30
|
|
31
|
+
Mac
|
32
|
+
|
31
33
|

|
34
|
+
|
35
|
+
Windows
|
36
|
+
|
37
|
+

|
38
|
+
|
39
|
+
Linux
|
40
|
+
|
32
41
|

|
33
42
|
|
34
43
|
Basic Table Progress Bar
|
@@ -68,7 +77,16 @@ window('Task Progress', 300, 200) {
|
|
68
77
|
}.show
|
69
78
|
```
|
70
79
|
|
80
|
+
Mac
|
81
|
+
|
71
82
|

|
83
|
+
|
84
|
+
Windows
|
85
|
+
|
86
|
+

|
87
|
+
|
88
|
+
Linux
|
89
|
+
|
72
90
|

|
73
91
|
|
74
92
|
Area Gallery
|
@@ -94,31 +112,24 @@ window('Area Gallery', 400, 400) {
|
|
94
112
|
fill x0: 10, y0: 10, x1: 350, y1: 350, stops: [{pos: 0.25, r: 204, g: 102, b: 204}, {pos: 0.75, r: 102, g: 102, b: 204}]
|
95
113
|
}
|
96
114
|
path { # declarative stable path
|
97
|
-
|
98
|
-
|
99
|
-
line(400, 100)
|
100
|
-
line(400, 400)
|
101
|
-
|
102
|
-
closed true
|
103
|
-
}
|
104
|
-
|
115
|
+
polygon(100, 100, 100, 400, 400, 100, 400, 400)
|
116
|
+
|
105
117
|
fill r: 202, g: 102, b: 104, a: 0.5
|
106
118
|
stroke r: 0, g: 0, b: 0
|
107
119
|
}
|
108
120
|
path { # declarative stable path
|
109
|
-
|
110
|
-
bezier(200, 100, 100, 200, 400, 100)
|
111
|
-
bezier(300, 100, 100, 300, 100, 400)
|
112
|
-
bezier(100, 300, 300, 100, 400, 400)
|
113
|
-
|
114
|
-
closed true
|
115
|
-
}
|
121
|
+
polybezier(0, 0, 200, 100, 100, 200, 400, 100, 300, 100, 100, 300, 100, 400, 100, 300, 300, 100, 400, 400)
|
116
122
|
|
117
123
|
fill r: 202, g: 102, b: 204, a: 0.5
|
118
124
|
stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
|
119
125
|
}
|
120
126
|
path { # declarative stable path
|
121
|
-
|
127
|
+
polyline(100, 100, 400, 100, 100, 400, 400, 400, 0, 0)
|
128
|
+
|
129
|
+
stroke r: 0, g: 0, b: 0, thickness: 2
|
130
|
+
}
|
131
|
+
path { # declarative stable path
|
132
|
+
arc(404, 216, 190, 90, 90, false)
|
122
133
|
|
123
134
|
# radial gradient (has an outer_radius in addition to x0, y0, x1, y1, and stops)
|
124
135
|
fill outer_radius: 90, x0: 0, y0: 0, x1: 500, y1: 500, stops: [{pos: 0.25, r: 102, g: 102, b: 204, a: 0.5}, {pos: 0.75, r: 204, g: 102, b: 204}]
|
@@ -130,9 +141,9 @@ window('Area Gallery', 400, 400) {
|
|
130
141
|
fill r: 202, g: 102, b: 204, a: 0.5
|
131
142
|
stroke r: 0, g: 0, b: 0, thickness: 2
|
132
143
|
}
|
133
|
-
text(
|
144
|
+
text(161, 40, 100) { # x, y, width
|
134
145
|
string('Area Gallery') {
|
135
|
-
font family: '
|
146
|
+
font family: 'Arial', size: 14
|
136
147
|
color :black
|
137
148
|
}
|
138
149
|
}
|
@@ -188,7 +199,16 @@ window('Area Gallery', 400, 400) {
|
|
188
199
|
}.show
|
189
200
|
```
|
190
201
|
|
202
|
+
Mac
|
203
|
+
|
191
204
|

|
205
|
+
|
206
|
+
Windows
|
207
|
+
|
208
|
+

|
209
|
+
|
210
|
+
Linux
|
211
|
+
|
192
212
|

|
193
213
|
|
194
214
|
[Check Out Many More Examples Over Here!](#examples)
|
@@ -257,6 +277,7 @@ Other [Glimmer](https://rubygems.org/gems/glimmer) DSL gems you might be interes
|
|
257
277
|
- [Basic Draw Text](#basic-draw-text)
|
258
278
|
- [Custom Draw Text](#custom-draw-text)
|
259
279
|
- [Method-Based Custom Keyword](#method-based-custom-keyword)
|
280
|
+
- [Tetris](#tetris)
|
260
281
|
- [Applications](#applications)
|
261
282
|
- [Manga2PDF](#manga2pdf)
|
262
283
|
- [Befunge98 GUI](#befunge98-gui)
|
@@ -349,7 +370,7 @@ gem install glimmer-dsl-libui
|
|
349
370
|
Or install via Bundler `Gemfile`:
|
350
371
|
|
351
372
|
```ruby
|
352
|
-
gem 'glimmer-dsl-libui', '~> 0.2.
|
373
|
+
gem 'glimmer-dsl-libui', '~> 0.2.19'
|
353
374
|
```
|
354
375
|
|
355
376
|
Add `require 'glimmer-dsl-libui'` at the top, and then `include Glimmer` into the top-level main object for testing or into an actual class for serious usage.
|
@@ -425,7 +446,7 @@ These are all the supported keywords. Note that some keywords do not represent c
|
|
425
446
|
Keyword(Args) | Properties | Listeners
|
426
447
|
------------- | ---------- | ---------
|
427
448
|
`about_menu_item` | None | `on_clicked`
|
428
|
-
`area` |
|
449
|
+
`area` | `auto_draw_enabled` | `on_draw(area_draw_params)`, `on_mouse_event(area_mouse_event)`, `on_mouse_down(area_mouse_event)`, `on_mouse_up(area_mouse_event)`, `on_mouse_drag_started(area_mouse_event)`, `on_mouse_dragged(area_mouse_event)`, `on_mouse_dropped(area_mouse_event)`, `on_mouse_entered`, `on_mouse_exited`, `on_key_event(area_key_event)`, `on_key_down(area_key_event)`, `on_key_up(area_key_event)`
|
429
450
|
`arc(x_center as Numeric, y_center as Numeric, radius as Numeric, start_angle as Numeric, sweep as Numeric, is_negative as Boolean)` | `x_center` (`Numeric`), `y_center` (`Numeric`), `radius` (`Numeric`), `start_angle` (`Numeric`), `sweep` (`Numeric`), `is_negative` (Boolean) | None
|
430
451
|
`background_color_column(name as String)` | None | None
|
431
452
|
`bezier(c1_x as Numeric, c1_y as Numeric, c2_x as Numeric, c2_y as Numeric, end_x as Numeric, end_y as Numeric)` | `c1_x` (`Numeric`), `c1_y` (`Numeric`), `c2_x` (`Numeric`), `c2_y` (`Numeric`), `end_x` (`Numeric`), `end_y` (`Numeric`) | None
|
@@ -466,6 +487,9 @@ Keyword(Args) | Properties | Listeners
|
|
466
487
|
`non_wrapping_multiline_entry` | `read_only` (Boolean), `text` (`String`) | `on_changed`
|
467
488
|
`password_entry` | `read_only` (Boolean), `text` (`String`) | `on_changed`
|
468
489
|
`path(draw_fill_mode = :winding)` | `fill` (`Hash` of `:r` as `0`-`255`, `:g` as `0`-`255`, `:b` as `0`-`255`, `:a` as `0.0`-`1.0`, hex, or [X11](https://en.wikipedia.org/wiki/X11_color_names) color), `stroke` (`Hash` of `:r` as `0`-`255`, `:g` as `0`-`255`, `:b` as `0`-`255`, `:a` as `0.0`-`1.0`, hex, or [X11](https://en.wikipedia.org/wiki/X11_color_names) color), `:cap` as (`:round`, `:square`, `:flat`), `:join` as (`:miter`, `:round`, `:bevel`), `:thickness` as `Numeric`, `:miter_limit` as `Numeric`, `:dashes` as `Array` of `Numeric` ) | None
|
490
|
+
`polygon(point_array as Array of Arrays of Numeric or Array of Numeric)` | `point_array` (`Array of Arrays of Numeric or Array of Numeric`) | None
|
491
|
+
`polyline(point_array as Array of Arrays of Numeric or Array of Numeric)` | `point_array` (`Array of Arrays of Numeric or Array of Numeric`) | None
|
492
|
+
`polybezier(point_array as Array of Arrays of Numeric or Array of Numeric)` | `point_array` (`Array of Arrays of Numeric or Array of Numeric`) | None
|
469
493
|
`preferences_menu_item` | None | `on_clicked`
|
470
494
|
`progress_bar` | `value` (`Numeric`) | None
|
471
495
|
`progress_bar_column(name as String)` | None | None
|
@@ -717,6 +741,9 @@ Available nested `path` shapes:
|
|
717
741
|
- `arc(x_center as Numeric, y_center as Numeric, radius as Numeric, start_angle as Numeric, sweep as Numeric, is_negative as Boolean)`
|
718
742
|
- `line(x as Numeric, y as Numeric)`
|
719
743
|
- `bezier(c1_x as Numeric, c1_y as Numeric, c2_x as Numeric, c2_y as Numeric, end_x as Numeric, end_y as Numeric)`
|
744
|
+
- `polygon(point_array as Array of Arrays of Numeric or Array of Numeric)`: closed figure of lines; can receive points as [[x1, y1], [x2, y2], ...] or [x1, y1, x2, y2, ...]
|
745
|
+
- `polyline(point_array as Array of Arrays of Numeric or Array of Numeric)`: open figure of lines; can receive points as [[x1, y1], [x2, y2], ...] or [x1, y1, x2, y2, ...]
|
746
|
+
- `polybezier(point_array as Array of Arrays of Numeric or Array of Numeric)`: open figure of beziers; can receive points as [[start_x1, start_y1], [c1_x2, c1_y2, c2_x2, c2_y2, end_x2, end_y2], [c1_x3, c1_y3, c2_x3, c2_y3, end_x3, end_y3], ...] or [start_x1, start_y1, c1_x2, c1_y2, c2_x2, c2_y2, end_x2, end_y2, c1_x3, c1_y3, c2_x3, c2_y3, end_x3, end_y3, ...]
|
720
747
|
- `figure(x=nil as Numeric, y=nil as Numeric)` (composite that can contain other shapes) (can set `closed true` to connect last point to first point automatically)
|
721
748
|
|
722
749
|
Check [examples/area_gallery.rb](#area-gallery) for an overiew of all `path` shapes.
|
@@ -771,6 +798,12 @@ Note that when nesting an `area` directly underneath `window` (without a layout
|
|
771
798
|
|
772
799
|
To redraw an `area`, you may call the `#queue_redraw_all` method, or simply `#redraw`.
|
773
800
|
|
801
|
+
`area` has the following Glimmer-added API methods/attributes:
|
802
|
+
- `request_auto_redraw`: requests auto redraw upon changes to nested stable `path` or shapes
|
803
|
+
- `pause_auto_redraw`: pause auto redraw upon changes to nested stable `path` or shapes (useful to avoid too many micro-change redraws, to group all redraws as one after many micro-changes)
|
804
|
+
- `resume_auto_redraw`: resume auto redraw upon changes to nested stable `path` or shapes
|
805
|
+
- `auto_redraw_enabled`/`auto_redraw_enabled?`/`auto_redraw_enabled=`: an attribute to disable/enable auto redraw on an `area` upon changes to nested stable `path` or shapes
|
806
|
+
|
774
807
|
A transform `matrix` can be set on a path by building a `matrix(m11 = nil, m12 = nil, m21 = nil, m22 = nil, m31 = nil, m32 = nil) {operations}` proxy object and then setting via `transform` property, or alternatively by building and setting the matrix in one call to `transform(m11 = nil, m12 = nil, m21 = nil, m22 = nil, m31 = nil, m32 = nil) {operations}` passing it the matrix arguments and/or content operations.
|
775
808
|
|
776
809
|
When instantiating a `matrix` object, it always starts with identity matrix.
|
@@ -1046,10 +1079,10 @@ window('Method-Based Custom Keyword') {
|
|
1046
1079
|
- `table` `checkbox_column` and `checkbox_text_column` checkbox editing only works on Linux and Windows (not Mac) due to a current limitation in [libui](https://github.com/andlabs/ui/issues/357).
|
1047
1080
|
- `text` `align` property seems not to work on the Mac ([libui](https://github.com/andlabs/libui) has an [issue](https://github.com/andlabs/libui/pull/407) about it)
|
1048
1081
|
- `text` `string` `background` does not work on Windows due to an [issue in libui](https://github.com/andlabs/libui/issues/347).
|
1049
|
-
- `arc` shape does not work on Windows unless a figure is started due to implementation of [libui](https://github.com/andlabs/libui).
|
1050
1082
|
- `table` controls on Windows intentionally get an extra empty row at the end because if any row were to be deleted for the first time, double-deletion happens due to an issue in [libui](https://github.com/andlabs/libui) on Windows.
|
1051
1083
|
- `table` `progress_bar` column on Windows cannot be updated with a positive value if it started initially with `-1` (it ignores update to avoid crashing due to an issue in [libui](https://github.com/andlabs/libui) on Windows.
|
1052
1084
|
- It seems that [libui](https://github.com/andlabs/libui) does not support nesting multiple `area` controls under a `grid` as only the first one shows up in that scenario. To workaround that limitation, use a `vertical_box` with nested `horizontal_box`s instead to include multiple `area`s in a GUI.
|
1085
|
+
- As per the code of [examples/basic_transform.rb](#basic-transform), Windows requires different ordering of transforms than Mac and Linux.
|
1053
1086
|
|
1054
1087
|
### Original API
|
1055
1088
|
|
@@ -1101,6 +1134,10 @@ Mac
|
|
1101
1134
|
|
1102
1135
|

|
1103
1136
|
|
1137
|
+
Windows
|
1138
|
+
|
1139
|
+

|
1140
|
+
|
1104
1141
|
Linux
|
1105
1142
|
|
1106
1143
|

|
@@ -1265,6 +1302,10 @@ Mac
|
|
1265
1302
|
|
1266
1303
|

|
1267
1304
|
|
1305
|
+
Windows
|
1306
|
+
|
1307
|
+

|
1308
|
+
|
1268
1309
|
Linux
|
1269
1310
|
|
1270
1311
|

|
@@ -1345,6 +1386,11 @@ Mac
|
|
1345
1386
|

|
1346
1387
|

|
1347
1388
|
|
1389
|
+
Windows
|
1390
|
+
|
1391
|
+

|
1392
|
+

|
1393
|
+
|
1348
1394
|
Linux
|
1349
1395
|
|
1350
1396
|

|
@@ -1422,6 +1468,11 @@ Mac
|
|
1422
1468
|

|
1423
1469
|

|
1424
1470
|
|
1471
|
+
Windows
|
1472
|
+
|
1473
|
+

|
1474
|
+

|
1475
|
+
|
1425
1476
|
Linux
|
1426
1477
|
|
1427
1478
|

|
@@ -1522,6 +1573,10 @@ Mac
|
|
1522
1573
|
|
1523
1574
|

|
1524
1575
|
|
1576
|
+
Windows
|
1577
|
+
|
1578
|
+

|
1579
|
+
|
1525
1580
|
Linux
|
1526
1581
|
|
1527
1582
|

|
@@ -1595,6 +1650,11 @@ Mac
|
|
1595
1650
|

|
1596
1651
|

|
1597
1652
|
|
1653
|
+
Windows
|
1654
|
+
|
1655
|
+

|
1656
|
+

|
1657
|
+
|
1598
1658
|
Linux
|
1599
1659
|
|
1600
1660
|

|
@@ -1812,6 +1872,10 @@ Mac
|
|
1812
1872
|
|
1813
1873
|

|
1814
1874
|
|
1875
|
+
Windows
|
1876
|
+
|
1877
|
+

|
1878
|
+
|
1815
1879
|
Linux
|
1816
1880
|
|
1817
1881
|

|
@@ -2203,6 +2267,11 @@ Mac
|
|
2203
2267
|

|
2204
2268
|

|
2205
2269
|
|
2270
|
+
Windows
|
2271
|
+
|
2272
|
+

|
2273
|
+

|
2274
|
+
|
2206
2275
|
Linux
|
2207
2276
|
|
2208
2277
|

|
@@ -2287,6 +2356,11 @@ Mac
|
|
2287
2356
|

|
2288
2357
|

|
2289
2358
|
|
2359
|
+
Windows
|
2360
|
+
|
2361
|
+

|
2362
|
+

|
2363
|
+
|
2290
2364
|
Linux
|
2291
2365
|
|
2292
2366
|

|
@@ -2299,7 +2373,7 @@ require 'glimmer-dsl-libui'
|
|
2299
2373
|
|
2300
2374
|
include Glimmer
|
2301
2375
|
|
2302
|
-
window('color button',
|
2376
|
+
window('color button', 240) {
|
2303
2377
|
color_button { |cb|
|
2304
2378
|
color :blue
|
2305
2379
|
|
@@ -2331,6 +2405,10 @@ Mac
|
|
2331
2405
|
|
2332
2406
|

|
2333
2407
|
|
2408
|
+
Windows
|
2409
|
+
|
2410
|
+

|
2411
|
+
|
2334
2412
|
Linux
|
2335
2413
|
|
2336
2414
|

|
@@ -2423,6 +2501,12 @@ Mac
|
|
2423
2501
|

|
2424
2502
|

|
2425
2503
|
|
2504
|
+
Windows
|
2505
|
+
|
2506
|
+

|
2507
|
+

|
2508
|
+

|
2509
|
+
|
2426
2510
|
Linux
|
2427
2511
|
|
2428
2512
|

|
@@ -2561,6 +2645,11 @@ Mac
|
|
2561
2645
|

|
2562
2646
|

|
2563
2647
|
|
2648
|
+
Windows
|
2649
|
+
|
2650
|
+

|
2651
|
+

|
2652
|
+
|
2564
2653
|
Linux
|
2565
2654
|
|
2566
2655
|

|
@@ -2626,6 +2715,10 @@ Mac
|
|
2626
2715
|
|
2627
2716
|

|
2628
2717
|
|
2718
|
+
Windows
|
2719
|
+
|
2720
|
+

|
2721
|
+
|
2629
2722
|
Linux
|
2630
2723
|
|
2631
2724
|

|
@@ -2748,6 +2841,12 @@ Mac
|
|
2748
2841
|

|
2749
2842
|

|
2750
2843
|
|
2844
|
+
Windows
|
2845
|
+
|
2846
|
+

|
2847
|
+

|
2848
|
+

|
2849
|
+
|
2751
2850
|
Linux
|
2752
2851
|
|
2753
2852
|

|
@@ -2815,6 +2914,11 @@ Mac
|
|
2815
2914
|

|
2816
2915
|

|
2817
2916
|
|
2917
|
+
Windows
|
2918
|
+
|
2919
|
+

|
2920
|
+

|
2921
|
+
|
2818
2922
|
Linux
|
2819
2923
|
|
2820
2924
|

|
@@ -2882,6 +2986,10 @@ Mac
|
|
2882
2986
|
|
2883
2987
|

|
2884
2988
|
|
2989
|
+
Windows
|
2990
|
+
|
2991
|
+

|
2992
|
+
|
2885
2993
|
Linux
|
2886
2994
|
|
2887
2995
|

|
@@ -3040,6 +3148,10 @@ Mac
|
|
3040
3148
|
|
3041
3149
|

|
3042
3150
|
|
3151
|
+
Windows
|
3152
|
+
|
3153
|
+

|
3154
|
+
|
3043
3155
|
Linux
|
3044
3156
|
|
3045
3157
|

|
@@ -3111,6 +3223,11 @@ Mac
|
|
3111
3223
|

|
3112
3224
|

|
3113
3225
|
|
3226
|
+
Windows
|
3227
|
+
|
3228
|
+

|
3229
|
+

|
3230
|
+
|
3114
3231
|
Linux
|
3115
3232
|
|
3116
3233
|

|
@@ -3172,6 +3289,10 @@ Mac
|
|
3172
3289
|
|
3173
3290
|

|
3174
3291
|
|
3292
|
+
Windows
|
3293
|
+
|
3294
|
+

|
3295
|
+
|
3175
3296
|
Linux
|
3176
3297
|
|
3177
3298
|

|
@@ -3224,6 +3345,10 @@ Mac
|
|
3224
3345
|
|
3225
3346
|

|
3226
3347
|
|
3348
|
+
Windows
|
3349
|
+
|
3350
|
+

|
3351
|
+
|
3227
3352
|
Linux
|
3228
3353
|
|
3229
3354
|

|
@@ -3276,6 +3401,10 @@ Mac
|
|
3276
3401
|
|
3277
3402
|

|
3278
3403
|
|
3404
|
+
Windows
|
3405
|
+
|
3406
|
+

|
3407
|
+
|
3279
3408
|
Linux
|
3280
3409
|
|
3281
3410
|

|
@@ -3343,6 +3472,10 @@ Mac
|
|
3343
3472
|
|
3344
3473
|

|
3345
3474
|
|
3475
|
+
Windows
|
3476
|
+
|
3477
|
+

|
3478
|
+
|
3346
3479
|
Linux
|
3347
3480
|
|
3348
3481
|

|
@@ -3411,6 +3544,12 @@ Mac
|
|
3411
3544
|

|
3412
3545
|

|
3413
3546
|
|
3547
|
+
Windows
|
3548
|
+
|
3549
|
+

|
3550
|
+

|
3551
|
+

|
3552
|
+
|
3414
3553
|
Linux
|
3415
3554
|
|
3416
3555
|

|
@@ -3531,6 +3670,10 @@ Mac
|
|
3531
3670
|
|
3532
3671
|

|
3533
3672
|
|
3673
|
+
Windows
|
3674
|
+
|
3675
|
+

|
3676
|
+
|
3534
3677
|
Linux
|
3535
3678
|
|
3536
3679
|

|
@@ -3654,6 +3797,11 @@ Mac
|
|
3654
3797
|

|
3655
3798
|

|
3656
3799
|
|
3800
|
+
Windows
|
3801
|
+
|
3802
|
+

|
3803
|
+

|
3804
|
+
|
3657
3805
|
Linux
|
3658
3806
|
|
3659
3807
|

|
@@ -3885,6 +4033,10 @@ Mac
|
|
3885
4033
|
|
3886
4034
|

|
3887
4035
|
|
4036
|
+
Windows
|
4037
|
+
|
4038
|
+

|
4039
|
+
|
3888
4040
|
Linux
|
3889
4041
|
|
3890
4042
|

|
@@ -3912,31 +4064,24 @@ window('Area Gallery', 400, 400) {
|
|
3912
4064
|
fill x0: 10, y0: 10, x1: 350, y1: 350, stops: [{pos: 0.25, r: 204, g: 102, b: 204}, {pos: 0.75, r: 102, g: 102, b: 204}]
|
3913
4065
|
}
|
3914
4066
|
path { # declarative stable path
|
3915
|
-
|
3916
|
-
|
3917
|
-
line(400, 100)
|
3918
|
-
line(400, 400)
|
3919
|
-
|
3920
|
-
closed true
|
3921
|
-
}
|
3922
|
-
|
4067
|
+
polygon(100, 100, 100, 400, 400, 100, 400, 400)
|
4068
|
+
|
3923
4069
|
fill r: 202, g: 102, b: 104, a: 0.5
|
3924
4070
|
stroke r: 0, g: 0, b: 0
|
3925
4071
|
}
|
3926
4072
|
path { # declarative stable path
|
3927
|
-
|
3928
|
-
bezier(200, 100, 100, 200, 400, 100)
|
3929
|
-
bezier(300, 100, 100, 300, 100, 400)
|
3930
|
-
bezier(100, 300, 300, 100, 400, 400)
|
3931
|
-
|
3932
|
-
closed true
|
3933
|
-
}
|
4073
|
+
polybezier(0, 0, 200, 100, 100, 200, 400, 100, 300, 100, 100, 300, 100, 400, 100, 300, 300, 100, 400, 400)
|
3934
4074
|
|
3935
4075
|
fill r: 202, g: 102, b: 204, a: 0.5
|
3936
4076
|
stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
|
3937
4077
|
}
|
3938
4078
|
path { # declarative stable path
|
3939
|
-
|
4079
|
+
polyline(100, 100, 400, 100, 100, 400, 400, 400, 0, 0)
|
4080
|
+
|
4081
|
+
stroke r: 0, g: 0, b: 0, thickness: 2
|
4082
|
+
}
|
4083
|
+
path { # declarative stable path
|
4084
|
+
arc(404, 216, 190, 90, 90, false)
|
3940
4085
|
|
3941
4086
|
# radial gradient (has an outer_radius in addition to x0, y0, x1, y1, and stops)
|
3942
4087
|
fill outer_radius: 90, x0: 0, y0: 0, x1: 500, y1: 500, stops: [{pos: 0.25, r: 102, g: 102, b: 204, a: 0.5}, {pos: 0.75, r: 204, g: 102, b: 204}]
|
@@ -3948,9 +4093,9 @@ window('Area Gallery', 400, 400) {
|
|
3948
4093
|
fill r: 202, g: 102, b: 204, a: 0.5
|
3949
4094
|
stroke r: 0, g: 0, b: 0, thickness: 2
|
3950
4095
|
}
|
3951
|
-
text(
|
4096
|
+
text(161, 40, 100) { # x, y, width
|
3952
4097
|
string('Area Gallery') {
|
3953
|
-
font family: '
|
4098
|
+
font family: 'Arial', size: 14
|
3954
4099
|
color :black
|
3955
4100
|
}
|
3956
4101
|
}
|
@@ -4099,18 +4244,42 @@ window('Area Gallery', 400, 400) {
|
|
4099
4244
|
end_x 400
|
4100
4245
|
end_y 400
|
4101
4246
|
}
|
4102
|
-
|
4103
|
-
closed true
|
4104
4247
|
}
|
4105
4248
|
|
4106
4249
|
fill r: 202, g: 102, b: 204, a: 0.5
|
4107
4250
|
stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
|
4108
4251
|
}
|
4252
|
+
path { # declarative stable path
|
4253
|
+
polyline(100, 100, 400, 100, 100, 400, 400, 400, 0, 0)
|
4254
|
+
figure {
|
4255
|
+
x 100
|
4256
|
+
y 100
|
4257
|
+
|
4258
|
+
line {
|
4259
|
+
x 400
|
4260
|
+
y 100
|
4261
|
+
}
|
4262
|
+
line {
|
4263
|
+
x 100
|
4264
|
+
y 400
|
4265
|
+
}
|
4266
|
+
line {
|
4267
|
+
x 400
|
4268
|
+
y 400
|
4269
|
+
}
|
4270
|
+
line {
|
4271
|
+
x 0
|
4272
|
+
y 0
|
4273
|
+
}
|
4274
|
+
}
|
4275
|
+
|
4276
|
+
stroke r: 0, g: 0, b: 0, thickness: 2
|
4277
|
+
}
|
4109
4278
|
path { # declarative stable path
|
4110
4279
|
arc {
|
4111
|
-
x_center
|
4112
|
-
y_center
|
4113
|
-
radius
|
4280
|
+
x_center 404
|
4281
|
+
y_center 216
|
4282
|
+
radius 190
|
4114
4283
|
start_angle 90
|
4115
4284
|
sweep 90
|
4116
4285
|
is_negative false
|
@@ -4131,12 +4300,12 @@ window('Area Gallery', 400, 400) {
|
|
4131
4300
|
stroke r: 0, g: 0, b: 0, thickness: 2
|
4132
4301
|
}
|
4133
4302
|
text {
|
4134
|
-
x
|
4303
|
+
x 161
|
4135
4304
|
y 40
|
4136
4305
|
width 100
|
4137
4306
|
|
4138
4307
|
string {
|
4139
|
-
font family: '
|
4308
|
+
font family: 'Arial', size: 14
|
4140
4309
|
color :black
|
4141
4310
|
|
4142
4311
|
'Area Gallery'
|
@@ -4207,42 +4376,35 @@ window('Area Gallery', 400, 400) {
|
|
4207
4376
|
path { # a dynamic path is added semi-declaratively inside on_draw block
|
4208
4377
|
square(0, 0, 100)
|
4209
4378
|
square(100, 100, 400)
|
4210
|
-
|
4379
|
+
|
4211
4380
|
fill r: 102, g: 102, b: 204
|
4212
4381
|
}
|
4213
4382
|
path { # a dynamic path is added semi-declaratively inside on_draw block
|
4214
4383
|
rectangle(0, 100, 100, 400)
|
4215
4384
|
rectangle(100, 0, 400, 100)
|
4216
|
-
|
4385
|
+
|
4217
4386
|
# linear gradient (has x0, y0, x1, y1, and stops)
|
4218
4387
|
fill x0: 10, y0: 10, x1: 350, y1: 350, stops: [{pos: 0.25, r: 204, g: 102, b: 204}, {pos: 0.75, r: 102, g: 102, b: 204}]
|
4219
4388
|
}
|
4220
4389
|
path { # a dynamic path is added semi-declaratively inside on_draw block
|
4221
|
-
|
4222
|
-
|
4223
|
-
line(400, 100)
|
4224
|
-
line(400, 400)
|
4225
|
-
|
4226
|
-
closed true
|
4227
|
-
}
|
4228
|
-
|
4390
|
+
polygon(100, 100, 100, 400, 400, 100, 400, 400)
|
4391
|
+
|
4229
4392
|
fill r: 202, g: 102, b: 104, a: 0.5
|
4230
4393
|
stroke r: 0, g: 0, b: 0
|
4231
4394
|
}
|
4232
4395
|
path { # a dynamic path is added semi-declaratively inside on_draw block
|
4233
|
-
|
4234
|
-
|
4235
|
-
bezier(300, 100, 100, 300, 100, 400)
|
4236
|
-
bezier(100, 300, 300, 100, 400, 400)
|
4237
|
-
|
4238
|
-
closed true
|
4239
|
-
}
|
4240
|
-
|
4396
|
+
polybezier(0, 0, 200, 100, 100, 200, 400, 100, 300, 100, 100, 300, 100, 400, 100, 300, 300, 100, 400, 400)
|
4397
|
+
|
4241
4398
|
fill r: 202, g: 102, b: 204, a: 0.5
|
4242
4399
|
stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
|
4243
4400
|
}
|
4244
4401
|
path { # a dynamic path is added semi-declaratively inside on_draw block
|
4245
|
-
|
4402
|
+
polyline(100, 100, 400, 100, 100, 400, 400, 400, 0, 0)
|
4403
|
+
|
4404
|
+
stroke r: 0, g: 0, b: 0, thickness: 2
|
4405
|
+
}
|
4406
|
+
path { # a dynamic path is added semi-declaratively inside on_draw block
|
4407
|
+
arc(404, 216, 190, 90, 90, false)
|
4246
4408
|
|
4247
4409
|
# radial gradient (has an outer_radius in addition to x0, y0, x1, y1, and stops)
|
4248
4410
|
fill outer_radius: 90, x0: 0, y0: 0, x1: 500, y1: 500, stops: [{pos: 0.25, r: 102, g: 102, b: 204, a: 0.5}, {pos: 0.75, r: 204, g: 102, b: 204}]
|
@@ -4254,9 +4416,9 @@ window('Area Gallery', 400, 400) {
|
|
4254
4416
|
fill r: 202, g: 102, b: 204, a: 0.5
|
4255
4417
|
stroke r: 0, g: 0, b: 0, thickness: 2
|
4256
4418
|
}
|
4257
|
-
text(
|
4419
|
+
text(161, 40, 100) { # x, y, width
|
4258
4420
|
string('Area Gallery') {
|
4259
|
-
font family: '
|
4421
|
+
font family: 'Arial', size: 14
|
4260
4422
|
color :black
|
4261
4423
|
}
|
4262
4424
|
}
|
@@ -4371,10 +4533,10 @@ window('Area Gallery', 400, 400) {
|
|
4371
4533
|
x 400
|
4372
4534
|
y 400
|
4373
4535
|
}
|
4374
|
-
|
4536
|
+
|
4375
4537
|
closed true
|
4376
4538
|
}
|
4377
|
-
|
4539
|
+
|
4378
4540
|
fill r: 202, g: 102, b: 104, a: 0.5
|
4379
4541
|
stroke r: 0, g: 0, b: 0
|
4380
4542
|
}
|
@@ -4407,18 +4569,42 @@ window('Area Gallery', 400, 400) {
|
|
4407
4569
|
end_x 400
|
4408
4570
|
end_y 400
|
4409
4571
|
}
|
4410
|
-
|
4411
|
-
closed true
|
4412
4572
|
}
|
4413
|
-
|
4573
|
+
|
4414
4574
|
fill r: 202, g: 102, b: 204, a: 0.5
|
4415
4575
|
stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
|
4416
4576
|
}
|
4577
|
+
path { # a dynamic path is added semi-declaratively inside on_draw block
|
4578
|
+
polyline(100, 100, 400, 100, 100, 400, 400, 400, 0, 0)
|
4579
|
+
figure {
|
4580
|
+
x 100
|
4581
|
+
y 100
|
4582
|
+
|
4583
|
+
line {
|
4584
|
+
x 400
|
4585
|
+
y 100
|
4586
|
+
}
|
4587
|
+
line {
|
4588
|
+
x 100
|
4589
|
+
y 400
|
4590
|
+
}
|
4591
|
+
line {
|
4592
|
+
x 400
|
4593
|
+
y 400
|
4594
|
+
}
|
4595
|
+
line {
|
4596
|
+
x 0
|
4597
|
+
y 0
|
4598
|
+
}
|
4599
|
+
}
|
4600
|
+
|
4601
|
+
stroke r: 0, g: 0, b: 0, thickness: 2
|
4602
|
+
}
|
4417
4603
|
path { # a dynamic path is added semi-declaratively inside on_draw block
|
4418
4604
|
arc {
|
4419
|
-
x_center
|
4420
|
-
y_center
|
4421
|
-
radius
|
4605
|
+
x_center 404
|
4606
|
+
y_center 216
|
4607
|
+
radius 190
|
4422
4608
|
start_angle 90
|
4423
4609
|
sweep 90
|
4424
4610
|
is_negative false
|
@@ -4439,12 +4625,12 @@ window('Area Gallery', 400, 400) {
|
|
4439
4625
|
stroke r: 0, g: 0, b: 0, thickness: 2
|
4440
4626
|
}
|
4441
4627
|
text {
|
4442
|
-
x
|
4628
|
+
x 161
|
4443
4629
|
y 40
|
4444
4630
|
width 100
|
4445
4631
|
|
4446
4632
|
string {
|
4447
|
-
font family: '
|
4633
|
+
font family: 'Arial', size: 14
|
4448
4634
|
color :black
|
4449
4635
|
|
4450
4636
|
'Area Gallery'
|
@@ -4523,6 +4709,10 @@ Mac
|
|
4523
4709
|
|
4524
4710
|

|
4525
4711
|
|
4712
|
+
Windows
|
4713
|
+
|
4714
|
+

|
4715
|
+
|
4526
4716
|
Linux
|
4527
4717
|
|
4528
4718
|

|
@@ -4757,20 +4947,13 @@ end
|
|
4757
4947
|
|
4758
4948
|
# method-based custom control representing a graph path
|
4759
4949
|
def graph_path(width, height, should_extend, &block)
|
4760
|
-
locations = point_locations(width, height)
|
4950
|
+
locations = point_locations(width, height).flatten
|
4761
4951
|
path {
|
4762
|
-
|
4763
|
-
|
4764
|
-
|
4765
|
-
|
4766
|
-
|
4767
|
-
if should_extend
|
4768
|
-
line(width, height)
|
4769
|
-
line(0, height)
|
4770
|
-
|
4771
|
-
closed true
|
4772
|
-
end
|
4773
|
-
}
|
4952
|
+
if should_extend
|
4953
|
+
polygon(locations + [width, height, 0, height])
|
4954
|
+
else
|
4955
|
+
polyline(locations)
|
4956
|
+
end
|
4774
4957
|
|
4775
4958
|
# apply a transform to the coordinate space for this path so (0, 0) is the top-left corner of the graph
|
4776
4959
|
transform {
|
@@ -4864,6 +5047,10 @@ Mac
|
|
4864
5047
|
|
4865
5048
|

|
4866
5049
|
|
5050
|
+
Windows
|
5051
|
+
|
5052
|
+

|
5053
|
+
|
4867
5054
|
Linux
|
4868
5055
|
|
4869
5056
|

|
@@ -4921,6 +5108,11 @@ Mac
|
|
4921
5108
|

|
4922
5109
|

|
4923
5110
|
|
5111
|
+
Windows
|
5112
|
+
|
5113
|
+

|
5114
|
+

|
5115
|
+
|
4924
5116
|
Linux
|
4925
5117
|
|
4926
5118
|

|
@@ -4997,6 +5189,11 @@ Mac
|
|
4997
5189
|

|
4998
5190
|

|
4999
5191
|
|
5192
|
+
Windows
|
5193
|
+
|
5194
|
+

|
5195
|
+

|
5196
|
+
|
5000
5197
|
Linux
|
5001
5198
|
|
5002
5199
|

|
@@ -5162,6 +5359,12 @@ Mac
|
|
5162
5359
|

|
5163
5360
|

|
5164
5361
|
|
5362
|
+
Windows
|
5363
|
+
|
5364
|
+

|
5365
|
+

|
5366
|
+

|
5367
|
+
|
5165
5368
|
Linux
|
5166
5369
|
|
5167
5370
|

|
@@ -5413,6 +5616,10 @@ Mac
|
|
5413
5616
|
|
5414
5617
|

|
5415
5618
|
|
5619
|
+
Windows
|
5620
|
+
|
5621
|
+

|
5622
|
+
|
5416
5623
|
Linux
|
5417
5624
|
|
5418
5625
|

|
@@ -5696,6 +5903,11 @@ Mac
|
|
5696
5903
|

|
5697
5904
|

|
5698
5905
|
|
5906
|
+
Windows
|
5907
|
+
|
5908
|
+

|
5909
|
+

|
5910
|
+
|
5699
5911
|
Linux
|
5700
5912
|
|
5701
5913
|

|
@@ -5910,6 +6122,10 @@ Mac
|
|
5910
6122
|
|
5911
6123
|

|
5912
6124
|
|
6125
|
+
Windows
|
6126
|
+
|
6127
|
+

|
6128
|
+
|
5913
6129
|
Linux
|
5914
6130
|
|
5915
6131
|

|
@@ -6016,6 +6232,295 @@ window('Method-Based Custom Keyword') {
|
|
6016
6232
|
}.show
|
6017
6233
|
```
|
6018
6234
|
|
6235
|
+
### Tetris
|
6236
|
+
|
6237
|
+
[examples/tetris.rb](examples/tetris.rb)
|
6238
|
+
|
6239
|
+
Run with this command from the root of the project if you cloned the project:
|
6240
|
+
|
6241
|
+
```
|
6242
|
+
ruby -r './lib/glimmer-dsl-libui' examples/tetris.rb
|
6243
|
+
```
|
6244
|
+
|
6245
|
+
Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/glimmer-dsl-libui):
|
6246
|
+
|
6247
|
+
```
|
6248
|
+
ruby -r glimmer-dsl-libui -e "require 'examples/tetris'"
|
6249
|
+
```
|
6250
|
+
|
6251
|
+
Mac
|
6252
|
+
|
6253
|
+

|
6254
|
+
|
6255
|
+

|
6256
|
+
|
6257
|
+
New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
|
6258
|
+
|
6259
|
+
```ruby
|
6260
|
+
require 'glimmer-dsl-libui'
|
6261
|
+
|
6262
|
+
require_relative 'tetris/model/game'
|
6263
|
+
|
6264
|
+
class Tetris
|
6265
|
+
include Glimmer
|
6266
|
+
|
6267
|
+
BLOCK_SIZE = 25
|
6268
|
+
BEVEL_CONSTANT = 20
|
6269
|
+
COLOR_GRAY = {r: 192, g: 192, b: 192}
|
6270
|
+
|
6271
|
+
attr_reader :game
|
6272
|
+
|
6273
|
+
def initialize
|
6274
|
+
@game = Model::Game.new
|
6275
|
+
end
|
6276
|
+
|
6277
|
+
def launch
|
6278
|
+
create_gui
|
6279
|
+
register_observers
|
6280
|
+
@game.start!
|
6281
|
+
@main_window.show
|
6282
|
+
end
|
6283
|
+
|
6284
|
+
def create_gui
|
6285
|
+
@main_window = window('Glimmer Tetris') {
|
6286
|
+
content_size Model::Game::PLAYFIELD_WIDTH * BLOCK_SIZE, Model::Game::PLAYFIELD_HEIGHT * BLOCK_SIZE + 98
|
6287
|
+
|
6288
|
+
vertical_box {
|
6289
|
+
label { # filler
|
6290
|
+
stretchy false
|
6291
|
+
}
|
6292
|
+
|
6293
|
+
score_board(block_size: BLOCK_SIZE) {
|
6294
|
+
stretchy false
|
6295
|
+
}
|
6296
|
+
|
6297
|
+
@playfield_blocks = playfield(playfield_width: Model::Game::PLAYFIELD_WIDTH, playfield_height: Model::Game::PLAYFIELD_HEIGHT, block_size: BLOCK_SIZE)
|
6298
|
+
}
|
6299
|
+
}
|
6300
|
+
end
|
6301
|
+
|
6302
|
+
def register_observers
|
6303
|
+
Glimmer::DataBinding::Observer.proc do |game_over|
|
6304
|
+
if game_over
|
6305
|
+
show_game_over_dialog
|
6306
|
+
else
|
6307
|
+
start_moving_tetrominos_down
|
6308
|
+
end
|
6309
|
+
end.observe(@game, :game_over)
|
6310
|
+
|
6311
|
+
Model::Game::PLAYFIELD_HEIGHT.times do |row|
|
6312
|
+
Model::Game::PLAYFIELD_WIDTH.times do |column|
|
6313
|
+
Glimmer::DataBinding::Observer.proc do |new_color|
|
6314
|
+
Glimmer::LibUI.queue_main do
|
6315
|
+
color = Glimmer::LibUI.interpret_color(new_color)
|
6316
|
+
block = @playfield_blocks[row][column]
|
6317
|
+
block[:background_square].fill = color
|
6318
|
+
block[:top_bevel_edge].fill = {r: color[:r] + 4*BEVEL_CONSTANT, g: color[:g] + 4*BEVEL_CONSTANT, b: color[:b] + 4*BEVEL_CONSTANT}
|
6319
|
+
block[:right_bevel_edge].fill = {r: color[:r] - BEVEL_CONSTANT, g: color[:g] - BEVEL_CONSTANT, b: color[:b] - BEVEL_CONSTANT}
|
6320
|
+
block[:bottom_bevel_edge].fill = {r: color[:r] - BEVEL_CONSTANT, g: color[:g] - BEVEL_CONSTANT, b: color[:b] - BEVEL_CONSTANT}
|
6321
|
+
block[:left_bevel_edge].fill = {r: color[:r] - BEVEL_CONSTANT, g: color[:g] - BEVEL_CONSTANT, b: color[:b] - BEVEL_CONSTANT}
|
6322
|
+
block[:border_square].stroke = new_color == Model::Block::COLOR_CLEAR ? COLOR_GRAY : color
|
6323
|
+
end
|
6324
|
+
end.observe(@game.playfield[row][column], :color)
|
6325
|
+
end
|
6326
|
+
end
|
6327
|
+
|
6328
|
+
Model::Game::PREVIEW_PLAYFIELD_HEIGHT.times do |row|
|
6329
|
+
Model::Game::PREVIEW_PLAYFIELD_WIDTH.times do |column|
|
6330
|
+
Glimmer::DataBinding::Observer.proc do |new_color|
|
6331
|
+
Glimmer::LibUI.queue_main do
|
6332
|
+
color = Glimmer::LibUI.interpret_color(new_color)
|
6333
|
+
block = @preview_playfield_blocks[row][column]
|
6334
|
+
block[:background_square].fill = color
|
6335
|
+
block[:top_bevel_edge].fill = {r: color[:r] + 4*BEVEL_CONSTANT, g: color[:g] + 4*BEVEL_CONSTANT, b: color[:b] + 4*BEVEL_CONSTANT}
|
6336
|
+
block[:right_bevel_edge].fill = {r: color[:r] - BEVEL_CONSTANT, g: color[:g] - BEVEL_CONSTANT, b: color[:b] - BEVEL_CONSTANT}
|
6337
|
+
block[:bottom_bevel_edge].fill = {r: color[:r] - BEVEL_CONSTANT, g: color[:g] - BEVEL_CONSTANT, b: color[:b] - BEVEL_CONSTANT}
|
6338
|
+
block[:left_bevel_edge].fill = {r: color[:r] - BEVEL_CONSTANT, g: color[:g] - BEVEL_CONSTANT, b: color[:b] - BEVEL_CONSTANT}
|
6339
|
+
block[:border_square].stroke = new_color == Model::Block::COLOR_CLEAR ? COLOR_GRAY : color
|
6340
|
+
end
|
6341
|
+
end.observe(@game.preview_playfield[row][column], :color)
|
6342
|
+
end
|
6343
|
+
end
|
6344
|
+
|
6345
|
+
Glimmer::DataBinding::Observer.proc do |new_score|
|
6346
|
+
Glimmer::LibUI.queue_main do
|
6347
|
+
@score_label.text = new_score.to_s
|
6348
|
+
end
|
6349
|
+
end.observe(@game, :score)
|
6350
|
+
|
6351
|
+
Glimmer::DataBinding::Observer.proc do |new_lines|
|
6352
|
+
Glimmer::LibUI.queue_main do
|
6353
|
+
@lines_label.text = new_lines.to_s
|
6354
|
+
end
|
6355
|
+
end.observe(@game, :lines)
|
6356
|
+
|
6357
|
+
Glimmer::DataBinding::Observer.proc do |new_level|
|
6358
|
+
Glimmer::LibUI.queue_main do
|
6359
|
+
@level_label.text = new_level.to_s
|
6360
|
+
end
|
6361
|
+
end.observe(@game, :level)
|
6362
|
+
end
|
6363
|
+
|
6364
|
+
def playfield(playfield_width: , playfield_height: , block_size: , &extra_content)
|
6365
|
+
blocks = []
|
6366
|
+
vertical_box {
|
6367
|
+
padded false
|
6368
|
+
|
6369
|
+
playfield_height.times.map do |row|
|
6370
|
+
blocks << []
|
6371
|
+
horizontal_box {
|
6372
|
+
padded false
|
6373
|
+
|
6374
|
+
playfield_width.times.map do |column|
|
6375
|
+
blocks.last << block(row: row, column: column, block_size: block_size)
|
6376
|
+
end
|
6377
|
+
}
|
6378
|
+
end
|
6379
|
+
|
6380
|
+
extra_content&.call
|
6381
|
+
}
|
6382
|
+
blocks
|
6383
|
+
end
|
6384
|
+
|
6385
|
+
def block(row: , column: , block_size: , &extra_content)
|
6386
|
+
block = {}
|
6387
|
+
bevel_pixel_size = 0.16 * block_size.to_f
|
6388
|
+
color = Glimmer::LibUI.interpret_color(Model::Block::COLOR_CLEAR)
|
6389
|
+
area {
|
6390
|
+
block[:background_square] = path {
|
6391
|
+
square(0, 0, block_size)
|
6392
|
+
|
6393
|
+
fill color
|
6394
|
+
}
|
6395
|
+
block[:top_bevel_edge] = path {
|
6396
|
+
polygon(0, 0, block_size, 0, block_size - bevel_pixel_size, bevel_pixel_size, bevel_pixel_size, bevel_pixel_size)
|
6397
|
+
|
6398
|
+
fill r: color[:r] + 4*BEVEL_CONSTANT, g: color[:g] + 4*BEVEL_CONSTANT, b: color[:b] + 4*BEVEL_CONSTANT
|
6399
|
+
}
|
6400
|
+
block[:right_bevel_edge] = path {
|
6401
|
+
polygon(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)
|
6402
|
+
|
6403
|
+
fill r: color[:r] - BEVEL_CONSTANT, g: color[:g] - BEVEL_CONSTANT, b: color[:b] - BEVEL_CONSTANT
|
6404
|
+
}
|
6405
|
+
block[:bottom_bevel_edge] = path {
|
6406
|
+
polygon(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)
|
6407
|
+
|
6408
|
+
fill r: color[:r] - BEVEL_CONSTANT, g: color[:g] - BEVEL_CONSTANT, b: color[:b] - BEVEL_CONSTANT
|
6409
|
+
}
|
6410
|
+
block[:left_bevel_edge] = path {
|
6411
|
+
polygon(0, 0, 0, block_size, bevel_pixel_size, block_size - bevel_pixel_size, bevel_pixel_size, bevel_pixel_size)
|
6412
|
+
|
6413
|
+
fill r: color[:r] - BEVEL_CONSTANT, g: color[:g] - BEVEL_CONSTANT, b: color[:b] - BEVEL_CONSTANT
|
6414
|
+
}
|
6415
|
+
block[:border_square] = path {
|
6416
|
+
square(0, 0, block_size)
|
6417
|
+
|
6418
|
+
stroke COLOR_GRAY
|
6419
|
+
}
|
6420
|
+
|
6421
|
+
on_key_down do |key_event|
|
6422
|
+
case key_event
|
6423
|
+
in ext_key: :down
|
6424
|
+
game.down!
|
6425
|
+
in key: ' '
|
6426
|
+
game.down!(instant: true)
|
6427
|
+
in ext_key: :up
|
6428
|
+
case game.up_arrow_action
|
6429
|
+
when :instant_down
|
6430
|
+
game.down!(instant: true)
|
6431
|
+
when :rotate_right
|
6432
|
+
game.rotate!(:right)
|
6433
|
+
when :rotate_left
|
6434
|
+
game.rotate!(:left)
|
6435
|
+
end
|
6436
|
+
in ext_key: :left
|
6437
|
+
game.left!
|
6438
|
+
in ext_key: :right
|
6439
|
+
game.right!
|
6440
|
+
in modifier: :shift
|
6441
|
+
game.rotate!(:right)
|
6442
|
+
in modifier: :control
|
6443
|
+
game.rotate!(:left)
|
6444
|
+
else
|
6445
|
+
# Do Nothing
|
6446
|
+
end
|
6447
|
+
end
|
6448
|
+
|
6449
|
+
extra_content&.call
|
6450
|
+
}
|
6451
|
+
block
|
6452
|
+
end
|
6453
|
+
|
6454
|
+
def score_board(block_size: , &extra_content)
|
6455
|
+
vertical_box {
|
6456
|
+
horizontal_box {
|
6457
|
+
label # filler
|
6458
|
+
@preview_playfield_blocks = playfield(playfield_width: Model::Game::PREVIEW_PLAYFIELD_WIDTH, playfield_height: Model::Game::PREVIEW_PLAYFIELD_HEIGHT, block_size: block_size)
|
6459
|
+
label # filler
|
6460
|
+
}
|
6461
|
+
|
6462
|
+
horizontal_box {
|
6463
|
+
label # filler
|
6464
|
+
grid {
|
6465
|
+
stretchy false
|
6466
|
+
|
6467
|
+
label('Score') {
|
6468
|
+
left 0
|
6469
|
+
top 0
|
6470
|
+
halign :fill
|
6471
|
+
}
|
6472
|
+
@score_label = label {
|
6473
|
+
left 0
|
6474
|
+
top 1
|
6475
|
+
halign :center
|
6476
|
+
}
|
6477
|
+
|
6478
|
+
label('Lines') {
|
6479
|
+
left 1
|
6480
|
+
top 0
|
6481
|
+
halign :fill
|
6482
|
+
}
|
6483
|
+
@lines_label = label {
|
6484
|
+
left 1
|
6485
|
+
top 1
|
6486
|
+
halign :center
|
6487
|
+
}
|
6488
|
+
|
6489
|
+
label('Level') {
|
6490
|
+
left 2
|
6491
|
+
top 0
|
6492
|
+
halign :fill
|
6493
|
+
}
|
6494
|
+
@level_label = label {
|
6495
|
+
left 2
|
6496
|
+
top 1
|
6497
|
+
halign :center
|
6498
|
+
}
|
6499
|
+
}
|
6500
|
+
label # filler
|
6501
|
+
}
|
6502
|
+
|
6503
|
+
extra_content&.call
|
6504
|
+
}
|
6505
|
+
end
|
6506
|
+
|
6507
|
+
def start_moving_tetrominos_down
|
6508
|
+
Glimmer::LibUI.timer(@game.delay) do
|
6509
|
+
@game.down! if !@game.game_over? && !@game.paused?
|
6510
|
+
end
|
6511
|
+
end
|
6512
|
+
|
6513
|
+
def show_game_over_dialog
|
6514
|
+
Glimmer::LibUI.queue_main do
|
6515
|
+
msg_box('Game Over', "Score: #{@game.high_scores.first.score}\nLines: #{@game.high_scores.first.lines}\nLevel: #{@game.high_scores.first.level}")
|
6516
|
+
@game.restart!
|
6517
|
+
end
|
6518
|
+
end
|
6519
|
+
end
|
6520
|
+
|
6521
|
+
Tetris.new.launch
|
6522
|
+
```
|
6523
|
+
|
6019
6524
|
## Applications
|
6020
6525
|
|
6021
6526
|
Here are some applications built with [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui)
|