glimmer-dsl-libui 0.2.17 → 0.2.18
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 +8 -0
- data/README.md +188 -104
- data/VERSION +1 -1
- 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/histogram.rb +6 -13
- data/examples/tetris/model/tetromino.rb +2 -2
- data/examples/tetris.rb +67 -36
- 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 +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c52fe6bf6dd2ed5494e9bc372628d340379cfdbfd8e2d19617c4813324e47a91
|
4
|
+
data.tar.gz: d713e9293141c0c7d74d0be00319126fccad50c7aea6d787fe1cb1774b8547a6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d10eb3c9fff91f1a6881189b6ae17735986aff25f256eefc9c88ab1f4b8c11a20837ebf10f9735d02dc86418ba9471032bb2992e9f74e72fd9a446ff9116359d
|
7
|
+
data.tar.gz: 7706f38cf41de97fd1a740ecaf150f0852d1974872e3dd95e0006df03927d081add8d06b342fb0c7b966c79c0134c1d591cfdff499bf5d951470fb7701a131b5
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
+
## 0.2.18
|
4
|
+
|
5
|
+
- Support `polygon` (closed figure of lines), `polyline` (open figure of lines), and `polybezier` (open figure of beziers) shape keywords to use under `path`
|
6
|
+
- Improve examples/tetris.rb with bevel block 3D look and restarting upon game over
|
7
|
+
- Update examples/area_gallery.rb to add uses of `polygon`, `polyline`, and `polybezier`
|
8
|
+
- Refactor examples/histogram.rb to utilize new `polygon` and `polyline` keywords
|
9
|
+
- Support `area` `request_auto_redraw`, `pause_auto_redraw`, and `resume_auto_redraw`, operations, and `auto_redraw_enabled` property.
|
10
|
+
|
3
11
|
## 0.2.17
|
4
12
|
|
5
13
|
- Tetris example - basic version with simple color squares
|
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.18
|
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)
|
@@ -112,31 +112,24 @@ window('Area Gallery', 400, 400) {
|
|
112
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}]
|
113
113
|
}
|
114
114
|
path { # declarative stable path
|
115
|
-
|
116
|
-
|
117
|
-
line(400, 100)
|
118
|
-
line(400, 400)
|
119
|
-
|
120
|
-
closed true
|
121
|
-
}
|
122
|
-
|
115
|
+
polygon(100, 100, 100, 400, 400, 100, 400, 400)
|
116
|
+
|
123
117
|
fill r: 202, g: 102, b: 104, a: 0.5
|
124
118
|
stroke r: 0, g: 0, b: 0
|
125
119
|
}
|
126
120
|
path { # declarative stable path
|
127
|
-
|
128
|
-
bezier(200, 100, 100, 200, 400, 100)
|
129
|
-
bezier(300, 100, 100, 300, 100, 400)
|
130
|
-
bezier(100, 300, 300, 100, 400, 400)
|
131
|
-
|
132
|
-
closed true
|
133
|
-
}
|
121
|
+
polybezier(0, 0, 200, 100, 100, 200, 400, 100, 300, 100, 100, 300, 100, 400, 100, 300, 300, 100, 400, 400)
|
134
122
|
|
135
123
|
fill r: 202, g: 102, b: 204, a: 0.5
|
136
124
|
stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
|
137
125
|
}
|
138
126
|
path { # declarative stable path
|
139
|
-
|
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)
|
140
133
|
|
141
134
|
# radial gradient (has an outer_radius in addition to x0, y0, x1, y1, and stops)
|
142
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}]
|
@@ -148,9 +141,9 @@ window('Area Gallery', 400, 400) {
|
|
148
141
|
fill r: 202, g: 102, b: 204, a: 0.5
|
149
142
|
stroke r: 0, g: 0, b: 0, thickness: 2
|
150
143
|
}
|
151
|
-
text(
|
144
|
+
text(161, 40, 100) { # x, y, width
|
152
145
|
string('Area Gallery') {
|
153
|
-
font family: '
|
146
|
+
font family: 'Arial', size: 14
|
154
147
|
color :black
|
155
148
|
}
|
156
149
|
}
|
@@ -377,7 +370,7 @@ gem install glimmer-dsl-libui
|
|
377
370
|
Or install via Bundler `Gemfile`:
|
378
371
|
|
379
372
|
```ruby
|
380
|
-
gem 'glimmer-dsl-libui', '~> 0.2.
|
373
|
+
gem 'glimmer-dsl-libui', '~> 0.2.18'
|
381
374
|
```
|
382
375
|
|
383
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.
|
@@ -494,6 +487,9 @@ Keyword(Args) | Properties | Listeners
|
|
494
487
|
`non_wrapping_multiline_entry` | `read_only` (Boolean), `text` (`String`) | `on_changed`
|
495
488
|
`password_entry` | `read_only` (Boolean), `text` (`String`) | `on_changed`
|
496
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
|
497
493
|
`preferences_menu_item` | None | `on_clicked`
|
498
494
|
`progress_bar` | `value` (`Numeric`) | None
|
499
495
|
`progress_bar_column(name as String)` | None | None
|
@@ -745,6 +741,9 @@ Available nested `path` shapes:
|
|
745
741
|
- `arc(x_center as Numeric, y_center as Numeric, radius as Numeric, start_angle as Numeric, sweep as Numeric, is_negative as Boolean)`
|
746
742
|
- `line(x as Numeric, y as Numeric)`
|
747
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, ...]
|
748
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)
|
749
748
|
|
750
749
|
Check [examples/area_gallery.rb](#area-gallery) for an overiew of all `path` shapes.
|
@@ -799,6 +798,12 @@ Note that when nesting an `area` directly underneath `window` (without a layout
|
|
799
798
|
|
800
799
|
To redraw an `area`, you may call the `#queue_redraw_all` method, or simply `#redraw`.
|
801
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
|
+
|
802
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.
|
803
808
|
|
804
809
|
When instantiating a `matrix` object, it always starts with identity matrix.
|
@@ -4059,31 +4064,24 @@ window('Area Gallery', 400, 400) {
|
|
4059
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}]
|
4060
4065
|
}
|
4061
4066
|
path { # declarative stable path
|
4062
|
-
|
4063
|
-
|
4064
|
-
line(400, 100)
|
4065
|
-
line(400, 400)
|
4066
|
-
|
4067
|
-
closed true
|
4068
|
-
}
|
4069
|
-
|
4067
|
+
polygon(100, 100, 100, 400, 400, 100, 400, 400)
|
4068
|
+
|
4070
4069
|
fill r: 202, g: 102, b: 104, a: 0.5
|
4071
4070
|
stroke r: 0, g: 0, b: 0
|
4072
4071
|
}
|
4073
4072
|
path { # declarative stable path
|
4074
|
-
|
4075
|
-
bezier(200, 100, 100, 200, 400, 100)
|
4076
|
-
bezier(300, 100, 100, 300, 100, 400)
|
4077
|
-
bezier(100, 300, 300, 100, 400, 400)
|
4078
|
-
|
4079
|
-
closed true
|
4080
|
-
}
|
4073
|
+
polybezier(0, 0, 200, 100, 100, 200, 400, 100, 300, 100, 100, 300, 100, 400, 100, 300, 300, 100, 400, 400)
|
4081
4074
|
|
4082
4075
|
fill r: 202, g: 102, b: 204, a: 0.5
|
4083
4076
|
stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
|
4084
4077
|
}
|
4085
4078
|
path { # declarative stable path
|
4086
|
-
|
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)
|
4087
4085
|
|
4088
4086
|
# radial gradient (has an outer_radius in addition to x0, y0, x1, y1, and stops)
|
4089
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}]
|
@@ -4095,9 +4093,9 @@ window('Area Gallery', 400, 400) {
|
|
4095
4093
|
fill r: 202, g: 102, b: 204, a: 0.5
|
4096
4094
|
stroke r: 0, g: 0, b: 0, thickness: 2
|
4097
4095
|
}
|
4098
|
-
text(
|
4096
|
+
text(161, 40, 100) { # x, y, width
|
4099
4097
|
string('Area Gallery') {
|
4100
|
-
font family: '
|
4098
|
+
font family: 'Arial', size: 14
|
4101
4099
|
color :black
|
4102
4100
|
}
|
4103
4101
|
}
|
@@ -4246,18 +4244,42 @@ window('Area Gallery', 400, 400) {
|
|
4246
4244
|
end_x 400
|
4247
4245
|
end_y 400
|
4248
4246
|
}
|
4249
|
-
|
4250
|
-
closed true
|
4251
4247
|
}
|
4252
4248
|
|
4253
4249
|
fill r: 202, g: 102, b: 204, a: 0.5
|
4254
4250
|
stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
|
4255
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
|
+
}
|
4256
4278
|
path { # declarative stable path
|
4257
4279
|
arc {
|
4258
|
-
x_center
|
4259
|
-
y_center
|
4260
|
-
radius
|
4280
|
+
x_center 404
|
4281
|
+
y_center 216
|
4282
|
+
radius 190
|
4261
4283
|
start_angle 90
|
4262
4284
|
sweep 90
|
4263
4285
|
is_negative false
|
@@ -4278,12 +4300,12 @@ window('Area Gallery', 400, 400) {
|
|
4278
4300
|
stroke r: 0, g: 0, b: 0, thickness: 2
|
4279
4301
|
}
|
4280
4302
|
text {
|
4281
|
-
x
|
4303
|
+
x 161
|
4282
4304
|
y 40
|
4283
4305
|
width 100
|
4284
4306
|
|
4285
4307
|
string {
|
4286
|
-
font family: '
|
4308
|
+
font family: 'Arial', size: 14
|
4287
4309
|
color :black
|
4288
4310
|
|
4289
4311
|
'Area Gallery'
|
@@ -4354,42 +4376,35 @@ window('Area Gallery', 400, 400) {
|
|
4354
4376
|
path { # a dynamic path is added semi-declaratively inside on_draw block
|
4355
4377
|
square(0, 0, 100)
|
4356
4378
|
square(100, 100, 400)
|
4357
|
-
|
4379
|
+
|
4358
4380
|
fill r: 102, g: 102, b: 204
|
4359
4381
|
}
|
4360
4382
|
path { # a dynamic path is added semi-declaratively inside on_draw block
|
4361
4383
|
rectangle(0, 100, 100, 400)
|
4362
4384
|
rectangle(100, 0, 400, 100)
|
4363
|
-
|
4385
|
+
|
4364
4386
|
# linear gradient (has x0, y0, x1, y1, and stops)
|
4365
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}]
|
4366
4388
|
}
|
4367
4389
|
path { # a dynamic path is added semi-declaratively inside on_draw block
|
4368
|
-
|
4369
|
-
|
4370
|
-
line(400, 100)
|
4371
|
-
line(400, 400)
|
4372
|
-
|
4373
|
-
closed true
|
4374
|
-
}
|
4375
|
-
|
4390
|
+
polygon(100, 100, 100, 400, 400, 100, 400, 400)
|
4391
|
+
|
4376
4392
|
fill r: 202, g: 102, b: 104, a: 0.5
|
4377
4393
|
stroke r: 0, g: 0, b: 0
|
4378
4394
|
}
|
4379
4395
|
path { # a dynamic path is added semi-declaratively inside on_draw block
|
4380
|
-
|
4381
|
-
|
4382
|
-
bezier(300, 100, 100, 300, 100, 400)
|
4383
|
-
bezier(100, 300, 300, 100, 400, 400)
|
4384
|
-
|
4385
|
-
closed true
|
4386
|
-
}
|
4387
|
-
|
4396
|
+
polybezier(0, 0, 200, 100, 100, 200, 400, 100, 300, 100, 100, 300, 100, 400, 100, 300, 300, 100, 400, 400)
|
4397
|
+
|
4388
4398
|
fill r: 202, g: 102, b: 204, a: 0.5
|
4389
4399
|
stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
|
4390
4400
|
}
|
4391
4401
|
path { # a dynamic path is added semi-declaratively inside on_draw block
|
4392
|
-
|
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)
|
4393
4408
|
|
4394
4409
|
# radial gradient (has an outer_radius in addition to x0, y0, x1, y1, and stops)
|
4395
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}]
|
@@ -4401,9 +4416,9 @@ window('Area Gallery', 400, 400) {
|
|
4401
4416
|
fill r: 202, g: 102, b: 204, a: 0.5
|
4402
4417
|
stroke r: 0, g: 0, b: 0, thickness: 2
|
4403
4418
|
}
|
4404
|
-
text(
|
4419
|
+
text(161, 40, 100) { # x, y, width
|
4405
4420
|
string('Area Gallery') {
|
4406
|
-
font family: '
|
4421
|
+
font family: 'Arial', size: 14
|
4407
4422
|
color :black
|
4408
4423
|
}
|
4409
4424
|
}
|
@@ -4518,10 +4533,10 @@ window('Area Gallery', 400, 400) {
|
|
4518
4533
|
x 400
|
4519
4534
|
y 400
|
4520
4535
|
}
|
4521
|
-
|
4536
|
+
|
4522
4537
|
closed true
|
4523
4538
|
}
|
4524
|
-
|
4539
|
+
|
4525
4540
|
fill r: 202, g: 102, b: 104, a: 0.5
|
4526
4541
|
stroke r: 0, g: 0, b: 0
|
4527
4542
|
}
|
@@ -4554,18 +4569,42 @@ window('Area Gallery', 400, 400) {
|
|
4554
4569
|
end_x 400
|
4555
4570
|
end_y 400
|
4556
4571
|
}
|
4557
|
-
|
4558
|
-
closed true
|
4559
4572
|
}
|
4560
|
-
|
4573
|
+
|
4561
4574
|
fill r: 202, g: 102, b: 204, a: 0.5
|
4562
4575
|
stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
|
4563
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
|
+
}
|
4564
4603
|
path { # a dynamic path is added semi-declaratively inside on_draw block
|
4565
4604
|
arc {
|
4566
|
-
x_center
|
4567
|
-
y_center
|
4568
|
-
radius
|
4605
|
+
x_center 404
|
4606
|
+
y_center 216
|
4607
|
+
radius 190
|
4569
4608
|
start_angle 90
|
4570
4609
|
sweep 90
|
4571
4610
|
is_negative false
|
@@ -4586,12 +4625,12 @@ window('Area Gallery', 400, 400) {
|
|
4586
4625
|
stroke r: 0, g: 0, b: 0, thickness: 2
|
4587
4626
|
}
|
4588
4627
|
text {
|
4589
|
-
x
|
4628
|
+
x 161
|
4590
4629
|
y 40
|
4591
4630
|
width 100
|
4592
4631
|
|
4593
4632
|
string {
|
4594
|
-
font family: '
|
4633
|
+
font family: 'Arial', size: 14
|
4595
4634
|
color :black
|
4596
4635
|
|
4597
4636
|
'Area Gallery'
|
@@ -4908,20 +4947,13 @@ end
|
|
4908
4947
|
|
4909
4948
|
# method-based custom control representing a graph path
|
4910
4949
|
def graph_path(width, height, should_extend, &block)
|
4911
|
-
locations = point_locations(width, height)
|
4950
|
+
locations = point_locations(width, height).flatten
|
4912
4951
|
path {
|
4913
|
-
|
4914
|
-
|
4915
|
-
|
4916
|
-
|
4917
|
-
|
4918
|
-
if should_extend
|
4919
|
-
line(width, height)
|
4920
|
-
line(0, height)
|
4921
|
-
|
4922
|
-
closed true
|
4923
|
-
end
|
4924
|
-
}
|
4952
|
+
if should_extend
|
4953
|
+
polygon(locations + [width, height, 0, height])
|
4954
|
+
else
|
4955
|
+
polyline(locations)
|
4956
|
+
end
|
4925
4957
|
|
4926
4958
|
# apply a transform to the coordinate space for this path so (0, 0) is the top-left corner of the graph
|
4927
4959
|
transform {
|
@@ -6232,6 +6264,7 @@ class Tetris
|
|
6232
6264
|
|
6233
6265
|
BLOCK_SIZE = 25
|
6234
6266
|
BEVEL_CONSTANT = 20
|
6267
|
+
COLOR_GRAY = {r: 192, g: 192, b: 192}
|
6235
6268
|
|
6236
6269
|
attr_reader :game
|
6237
6270
|
|
@@ -6264,19 +6297,74 @@ class Tetris
|
|
6264
6297
|
Model::Game::PLAYFIELD_HEIGHT.times do |row|
|
6265
6298
|
Model::Game::PLAYFIELD_HEIGHT.times do |column|
|
6266
6299
|
Glimmer::DataBinding::Observer.proc do |new_color|
|
6267
|
-
|
6300
|
+
Glimmer::LibUI.queue_main do
|
6301
|
+
color = Glimmer::LibUI.interpret_color(new_color)
|
6302
|
+
block = @blocks[row][column]
|
6303
|
+
block[:background_square].fill = color
|
6304
|
+
block[:top_bevel_edge].fill = {r: color[:r] + 4*BEVEL_CONSTANT, g: color[:g] + 4*BEVEL_CONSTANT, b: color[:b] + 4*BEVEL_CONSTANT}
|
6305
|
+
block[:right_bevel_edge].fill = {r: color[:r] - BEVEL_CONSTANT, g: color[:g] - BEVEL_CONSTANT, b: color[:b] - BEVEL_CONSTANT}
|
6306
|
+
block[:bottom_bevel_edge].fill = {r: color[:r] - BEVEL_CONSTANT, g: color[:g] - BEVEL_CONSTANT, b: color[:b] - BEVEL_CONSTANT}
|
6307
|
+
block[:left_bevel_edge].fill = {r: color[:r] - BEVEL_CONSTANT, g: color[:g] - BEVEL_CONSTANT, b: color[:b] - BEVEL_CONSTANT}
|
6308
|
+
block[:border_square].stroke = new_color == Model::Block::COLOR_CLEAR ? COLOR_GRAY : color
|
6309
|
+
end
|
6268
6310
|
end.observe(@game.playfield[row][column], :color)
|
6269
6311
|
end
|
6270
6312
|
end
|
6271
6313
|
end
|
6272
6314
|
|
6273
6315
|
def playfield(playfield_width: , playfield_height: , block_size: )
|
6274
|
-
|
6275
|
-
|
6276
|
-
|
6277
|
-
|
6278
|
-
|
6316
|
+
@blocks = []
|
6317
|
+
vertical_box {
|
6318
|
+
padded false
|
6319
|
+
|
6320
|
+
playfield_height.times.map do |row|
|
6321
|
+
@blocks << []
|
6322
|
+
horizontal_box {
|
6323
|
+
padded false
|
6324
|
+
|
6325
|
+
playfield_width.times.map do |column|
|
6326
|
+
@blocks.last << block(row: row, column: column, block_size: block_size)
|
6327
|
+
end
|
6328
|
+
}
|
6279
6329
|
end
|
6330
|
+
}
|
6331
|
+
end
|
6332
|
+
|
6333
|
+
def block(row: , column: , block_size: )
|
6334
|
+
block = {}
|
6335
|
+
bevel_pixel_size = 0.16 * block_size.to_f
|
6336
|
+
color = Glimmer::LibUI.interpret_color(Model::Block::COLOR_CLEAR)
|
6337
|
+
area {
|
6338
|
+
block[:background_square] = path {
|
6339
|
+
square(0, 0, block_size)
|
6340
|
+
|
6341
|
+
fill color
|
6342
|
+
}
|
6343
|
+
block[:top_bevel_edge] = path {
|
6344
|
+
polygon(0, 0, block_size, 0, block_size - bevel_pixel_size, bevel_pixel_size, bevel_pixel_size, bevel_pixel_size)
|
6345
|
+
|
6346
|
+
fill r: color[:r] + 4*BEVEL_CONSTANT, g: color[:g] + 4*BEVEL_CONSTANT, b: color[:b] + 4*BEVEL_CONSTANT
|
6347
|
+
}
|
6348
|
+
block[:right_bevel_edge] = path {
|
6349
|
+
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)
|
6350
|
+
|
6351
|
+
fill r: color[:r] - BEVEL_CONSTANT, g: color[:g] - BEVEL_CONSTANT, b: color[:b] - BEVEL_CONSTANT
|
6352
|
+
}
|
6353
|
+
block[:bottom_bevel_edge] = path {
|
6354
|
+
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)
|
6355
|
+
|
6356
|
+
fill r: color[:r] - BEVEL_CONSTANT, g: color[:g] - BEVEL_CONSTANT, b: color[:b] - BEVEL_CONSTANT
|
6357
|
+
}
|
6358
|
+
block[:left_bevel_edge] = path {
|
6359
|
+
polygon(0, 0, 0, block_size, bevel_pixel_size, block_size - bevel_pixel_size, bevel_pixel_size, bevel_pixel_size)
|
6360
|
+
|
6361
|
+
fill r: color[:r] - BEVEL_CONSTANT, g: color[:g] - BEVEL_CONSTANT, b: color[:b] - BEVEL_CONSTANT
|
6362
|
+
}
|
6363
|
+
block[:border_square] = path {
|
6364
|
+
square(0, 0, block_size)
|
6365
|
+
|
6366
|
+
stroke COLOR_GRAY
|
6367
|
+
}
|
6280
6368
|
|
6281
6369
|
on_key_down do |key_event|
|
6282
6370
|
case key_event
|
@@ -6304,14 +6392,7 @@ class Tetris
|
|
6304
6392
|
end
|
6305
6393
|
end
|
6306
6394
|
}
|
6307
|
-
|
6308
|
-
|
6309
|
-
def block(row: , column: , block_size: )
|
6310
|
-
path {
|
6311
|
-
square(column * block_size, row * block_size, block_size)
|
6312
|
-
|
6313
|
-
fill Model::Block::COLOR_CLEAR
|
6314
|
-
}
|
6395
|
+
block
|
6315
6396
|
end
|
6316
6397
|
|
6317
6398
|
def start_moving_tetrominos_down
|
@@ -6321,7 +6402,10 @@ class Tetris
|
|
6321
6402
|
end
|
6322
6403
|
|
6323
6404
|
def show_game_over_dialog
|
6324
|
-
|
6405
|
+
Glimmer::LibUI.queue_main do
|
6406
|
+
msg_box('Game Over', "Score: #{@game.high_scores.first.score}\nLines: #{@game.high_scores.first.lines}\nLevel: #{@game.high_scores.first.level}")
|
6407
|
+
@game.restart!
|
6408
|
+
end
|
6325
6409
|
end
|
6326
6410
|
end
|
6327
6411
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.18
|
data/examples/area_gallery.rb
CHANGED
@@ -18,31 +18,24 @@ window('Area Gallery', 400, 400) {
|
|
18
18
|
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}]
|
19
19
|
}
|
20
20
|
path { # declarative stable path
|
21
|
-
|
22
|
-
|
23
|
-
line(400, 100)
|
24
|
-
line(400, 400)
|
25
|
-
|
26
|
-
closed true
|
27
|
-
}
|
28
|
-
|
21
|
+
polygon(100, 100, 100, 400, 400, 100, 400, 400)
|
22
|
+
|
29
23
|
fill r: 202, g: 102, b: 104, a: 0.5
|
30
24
|
stroke r: 0, g: 0, b: 0
|
31
25
|
}
|
32
26
|
path { # declarative stable path
|
33
|
-
|
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
|
-
}
|
27
|
+
polybezier(0, 0, 200, 100, 100, 200, 400, 100, 300, 100, 100, 300, 100, 400, 100, 300, 300, 100, 400, 400)
|
40
28
|
|
41
29
|
fill r: 202, g: 102, b: 204, a: 0.5
|
42
30
|
stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
|
43
31
|
}
|
44
32
|
path { # declarative stable path
|
45
|
-
|
33
|
+
polyline(100, 100, 400, 100, 100, 400, 400, 400, 0, 0)
|
34
|
+
|
35
|
+
stroke r: 0, g: 0, b: 0, thickness: 2
|
36
|
+
}
|
37
|
+
path { # declarative stable path
|
38
|
+
arc(404, 216, 190, 90, 90, false)
|
46
39
|
|
47
40
|
# radial gradient (has an outer_radius in addition to x0, y0, x1, y1, and stops)
|
48
41
|
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}]
|
@@ -54,9 +47,9 @@ window('Area Gallery', 400, 400) {
|
|
54
47
|
fill r: 202, g: 102, b: 204, a: 0.5
|
55
48
|
stroke r: 0, g: 0, b: 0, thickness: 2
|
56
49
|
}
|
57
|
-
text(
|
50
|
+
text(161, 40, 100) { # x, y, width
|
58
51
|
string('Area Gallery') {
|
59
|
-
font family: '
|
52
|
+
font family: 'Arial', size: 14
|
60
53
|
color :black
|
61
54
|
}
|
62
55
|
}
|
data/examples/area_gallery2.rb
CHANGED
@@ -88,18 +88,42 @@ window('Area Gallery', 400, 400) {
|
|
88
88
|
end_x 400
|
89
89
|
end_y 400
|
90
90
|
}
|
91
|
-
|
92
|
-
closed true
|
93
91
|
}
|
94
92
|
|
95
93
|
fill r: 202, g: 102, b: 204, a: 0.5
|
96
94
|
stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
|
97
95
|
}
|
96
|
+
path { # declarative stable path
|
97
|
+
polyline(100, 100, 400, 100, 100, 400, 400, 400, 0, 0)
|
98
|
+
figure {
|
99
|
+
x 100
|
100
|
+
y 100
|
101
|
+
|
102
|
+
line {
|
103
|
+
x 400
|
104
|
+
y 100
|
105
|
+
}
|
106
|
+
line {
|
107
|
+
x 100
|
108
|
+
y 400
|
109
|
+
}
|
110
|
+
line {
|
111
|
+
x 400
|
112
|
+
y 400
|
113
|
+
}
|
114
|
+
line {
|
115
|
+
x 0
|
116
|
+
y 0
|
117
|
+
}
|
118
|
+
}
|
119
|
+
|
120
|
+
stroke r: 0, g: 0, b: 0, thickness: 2
|
121
|
+
}
|
98
122
|
path { # declarative stable path
|
99
123
|
arc {
|
100
|
-
x_center
|
101
|
-
y_center
|
102
|
-
radius
|
124
|
+
x_center 404
|
125
|
+
y_center 216
|
126
|
+
radius 190
|
103
127
|
start_angle 90
|
104
128
|
sweep 90
|
105
129
|
is_negative false
|
@@ -120,12 +144,12 @@ window('Area Gallery', 400, 400) {
|
|
120
144
|
stroke r: 0, g: 0, b: 0, thickness: 2
|
121
145
|
}
|
122
146
|
text {
|
123
|
-
x
|
147
|
+
x 161
|
124
148
|
y 40
|
125
149
|
width 100
|
126
150
|
|
127
151
|
string {
|
128
|
-
font family: '
|
152
|
+
font family: 'Arial', size: 14
|
129
153
|
color :black
|
130
154
|
|
131
155
|
'Area Gallery'
|
data/examples/area_gallery3.rb
CHANGED
@@ -8,42 +8,35 @@ window('Area Gallery', 400, 400) {
|
|
8
8
|
path { # a dynamic path is added semi-declaratively inside on_draw block
|
9
9
|
square(0, 0, 100)
|
10
10
|
square(100, 100, 400)
|
11
|
-
|
11
|
+
|
12
12
|
fill r: 102, g: 102, b: 204
|
13
13
|
}
|
14
14
|
path { # a dynamic path is added semi-declaratively inside on_draw block
|
15
15
|
rectangle(0, 100, 100, 400)
|
16
16
|
rectangle(100, 0, 400, 100)
|
17
|
-
|
17
|
+
|
18
18
|
# linear gradient (has x0, y0, x1, y1, and stops)
|
19
19
|
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}]
|
20
20
|
}
|
21
21
|
path { # a dynamic path is added semi-declaratively inside on_draw block
|
22
|
-
|
23
|
-
|
24
|
-
line(400, 100)
|
25
|
-
line(400, 400)
|
26
|
-
|
27
|
-
closed true
|
28
|
-
}
|
29
|
-
|
22
|
+
polygon(100, 100, 100, 400, 400, 100, 400, 400)
|
23
|
+
|
30
24
|
fill r: 202, g: 102, b: 104, a: 0.5
|
31
25
|
stroke r: 0, g: 0, b: 0
|
32
26
|
}
|
33
27
|
path { # a dynamic path is added semi-declaratively inside on_draw block
|
34
|
-
|
35
|
-
|
36
|
-
bezier(300, 100, 100, 300, 100, 400)
|
37
|
-
bezier(100, 300, 300, 100, 400, 400)
|
38
|
-
|
39
|
-
closed true
|
40
|
-
}
|
41
|
-
|
28
|
+
polybezier(0, 0, 200, 100, 100, 200, 400, 100, 300, 100, 100, 300, 100, 400, 100, 300, 300, 100, 400, 400)
|
29
|
+
|
42
30
|
fill r: 202, g: 102, b: 204, a: 0.5
|
43
31
|
stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
|
44
32
|
}
|
45
33
|
path { # a dynamic path is added semi-declaratively inside on_draw block
|
46
|
-
|
34
|
+
polyline(100, 100, 400, 100, 100, 400, 400, 400, 0, 0)
|
35
|
+
|
36
|
+
stroke r: 0, g: 0, b: 0, thickness: 2
|
37
|
+
}
|
38
|
+
path { # a dynamic path is added semi-declaratively inside on_draw block
|
39
|
+
arc(404, 216, 190, 90, 90, false)
|
47
40
|
|
48
41
|
# radial gradient (has an outer_radius in addition to x0, y0, x1, y1, and stops)
|
49
42
|
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}]
|
@@ -55,9 +48,9 @@ window('Area Gallery', 400, 400) {
|
|
55
48
|
fill r: 202, g: 102, b: 204, a: 0.5
|
56
49
|
stroke r: 0, g: 0, b: 0, thickness: 2
|
57
50
|
}
|
58
|
-
text(
|
51
|
+
text(161, 40, 100) { # x, y, width
|
59
52
|
string('Area Gallery') {
|
60
|
-
font family: '
|
53
|
+
font family: 'Arial', size: 14
|
61
54
|
color :black
|
62
55
|
}
|
63
56
|
}
|
data/examples/area_gallery4.rb
CHANGED
@@ -53,10 +53,10 @@ window('Area Gallery', 400, 400) {
|
|
53
53
|
x 400
|
54
54
|
y 400
|
55
55
|
}
|
56
|
-
|
56
|
+
|
57
57
|
closed true
|
58
58
|
}
|
59
|
-
|
59
|
+
|
60
60
|
fill r: 202, g: 102, b: 104, a: 0.5
|
61
61
|
stroke r: 0, g: 0, b: 0
|
62
62
|
}
|
@@ -89,18 +89,42 @@ window('Area Gallery', 400, 400) {
|
|
89
89
|
end_x 400
|
90
90
|
end_y 400
|
91
91
|
}
|
92
|
-
|
93
|
-
closed true
|
94
92
|
}
|
95
|
-
|
93
|
+
|
96
94
|
fill r: 202, g: 102, b: 204, a: 0.5
|
97
95
|
stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
|
98
96
|
}
|
97
|
+
path { # a dynamic path is added semi-declaratively inside on_draw block
|
98
|
+
polyline(100, 100, 400, 100, 100, 400, 400, 400, 0, 0)
|
99
|
+
figure {
|
100
|
+
x 100
|
101
|
+
y 100
|
102
|
+
|
103
|
+
line {
|
104
|
+
x 400
|
105
|
+
y 100
|
106
|
+
}
|
107
|
+
line {
|
108
|
+
x 100
|
109
|
+
y 400
|
110
|
+
}
|
111
|
+
line {
|
112
|
+
x 400
|
113
|
+
y 400
|
114
|
+
}
|
115
|
+
line {
|
116
|
+
x 0
|
117
|
+
y 0
|
118
|
+
}
|
119
|
+
}
|
120
|
+
|
121
|
+
stroke r: 0, g: 0, b: 0, thickness: 2
|
122
|
+
}
|
99
123
|
path { # a dynamic path is added semi-declaratively inside on_draw block
|
100
124
|
arc {
|
101
|
-
x_center
|
102
|
-
y_center
|
103
|
-
radius
|
125
|
+
x_center 404
|
126
|
+
y_center 216
|
127
|
+
radius 190
|
104
128
|
start_angle 90
|
105
129
|
sweep 90
|
106
130
|
is_negative false
|
@@ -121,12 +145,12 @@ window('Area Gallery', 400, 400) {
|
|
121
145
|
stroke r: 0, g: 0, b: 0, thickness: 2
|
122
146
|
}
|
123
147
|
text {
|
124
|
-
x
|
148
|
+
x 161
|
125
149
|
y 40
|
126
150
|
width 100
|
127
151
|
|
128
152
|
string {
|
129
|
-
font family: '
|
153
|
+
font family: 'Arial', size: 14
|
130
154
|
color :black
|
131
155
|
|
132
156
|
'Area Gallery'
|
data/examples/histogram.rb
CHANGED
@@ -31,20 +31,13 @@ end
|
|
31
31
|
|
32
32
|
# method-based custom control representing a graph path
|
33
33
|
def graph_path(width, height, should_extend, &block)
|
34
|
-
locations = point_locations(width, height)
|
34
|
+
locations = point_locations(width, height).flatten
|
35
35
|
path {
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
if should_extend
|
42
|
-
line(width, height)
|
43
|
-
line(0, height)
|
44
|
-
|
45
|
-
closed true
|
46
|
-
end
|
47
|
-
}
|
36
|
+
if should_extend
|
37
|
+
polygon(locations + [width, height, 0, height])
|
38
|
+
else
|
39
|
+
polyline(locations)
|
40
|
+
end
|
48
41
|
|
49
42
|
# apply a transform to the coordinate space for this path so (0, 0) is the top-left corner of the graph
|
50
43
|
transform {
|
data/examples/tetris.rb
CHANGED
@@ -1,24 +1,3 @@
|
|
1
|
-
# Copyright (c) 2021 Andy Maleh
|
2
|
-
#
|
3
|
-
# Permission is hereby granted, free of charge, to any person obtaining
|
4
|
-
# a copy of this software and associated documentation files (the
|
5
|
-
# "Software"), to deal in the Software without restriction, including
|
6
|
-
# without limitation the rights to use, copy, modify, merge, publish,
|
7
|
-
# distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
-
# permit persons to whom the Software is furnished to do so, subject to
|
9
|
-
# the following conditions:
|
10
|
-
#
|
11
|
-
# The above copyright notice and this permission notice shall be
|
12
|
-
# included in all copies or substantial portions of the Software.
|
13
|
-
#
|
14
|
-
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
-
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
-
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
-
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
-
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
-
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
-
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
-
|
22
1
|
require 'glimmer-dsl-libui'
|
23
2
|
|
24
3
|
require_relative 'tetris/model/game'
|
@@ -28,6 +7,7 @@ class Tetris
|
|
28
7
|
|
29
8
|
BLOCK_SIZE = 25
|
30
9
|
BEVEL_CONSTANT = 20
|
10
|
+
COLOR_GRAY = {r: 192, g: 192, b: 192}
|
31
11
|
|
32
12
|
attr_reader :game
|
33
13
|
|
@@ -60,19 +40,74 @@ class Tetris
|
|
60
40
|
Model::Game::PLAYFIELD_HEIGHT.times do |row|
|
61
41
|
Model::Game::PLAYFIELD_HEIGHT.times do |column|
|
62
42
|
Glimmer::DataBinding::Observer.proc do |new_color|
|
63
|
-
|
43
|
+
Glimmer::LibUI.queue_main do
|
44
|
+
color = Glimmer::LibUI.interpret_color(new_color)
|
45
|
+
block = @blocks[row][column]
|
46
|
+
block[:background_square].fill = color
|
47
|
+
block[:top_bevel_edge].fill = {r: color[:r] + 4*BEVEL_CONSTANT, g: color[:g] + 4*BEVEL_CONSTANT, b: color[:b] + 4*BEVEL_CONSTANT}
|
48
|
+
block[:right_bevel_edge].fill = {r: color[:r] - BEVEL_CONSTANT, g: color[:g] - BEVEL_CONSTANT, b: color[:b] - BEVEL_CONSTANT}
|
49
|
+
block[:bottom_bevel_edge].fill = {r: color[:r] - BEVEL_CONSTANT, g: color[:g] - BEVEL_CONSTANT, b: color[:b] - BEVEL_CONSTANT}
|
50
|
+
block[:left_bevel_edge].fill = {r: color[:r] - BEVEL_CONSTANT, g: color[:g] - BEVEL_CONSTANT, b: color[:b] - BEVEL_CONSTANT}
|
51
|
+
block[:border_square].stroke = new_color == Model::Block::COLOR_CLEAR ? COLOR_GRAY : color
|
52
|
+
end
|
64
53
|
end.observe(@game.playfield[row][column], :color)
|
65
54
|
end
|
66
55
|
end
|
67
56
|
end
|
68
57
|
|
69
58
|
def playfield(playfield_width: , playfield_height: , block_size: )
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
59
|
+
@blocks = []
|
60
|
+
vertical_box {
|
61
|
+
padded false
|
62
|
+
|
63
|
+
playfield_height.times.map do |row|
|
64
|
+
@blocks << []
|
65
|
+
horizontal_box {
|
66
|
+
padded false
|
67
|
+
|
68
|
+
playfield_width.times.map do |column|
|
69
|
+
@blocks.last << block(row: row, column: column, block_size: block_size)
|
70
|
+
end
|
71
|
+
}
|
75
72
|
end
|
73
|
+
}
|
74
|
+
end
|
75
|
+
|
76
|
+
def block(row: , column: , block_size: )
|
77
|
+
block = {}
|
78
|
+
bevel_pixel_size = 0.16 * block_size.to_f
|
79
|
+
color = Glimmer::LibUI.interpret_color(Model::Block::COLOR_CLEAR)
|
80
|
+
area {
|
81
|
+
block[:background_square] = path {
|
82
|
+
square(0, 0, block_size)
|
83
|
+
|
84
|
+
fill color
|
85
|
+
}
|
86
|
+
block[:top_bevel_edge] = path {
|
87
|
+
polygon(0, 0, block_size, 0, block_size - bevel_pixel_size, bevel_pixel_size, bevel_pixel_size, bevel_pixel_size)
|
88
|
+
|
89
|
+
fill r: color[:r] + 4*BEVEL_CONSTANT, g: color[:g] + 4*BEVEL_CONSTANT, b: color[:b] + 4*BEVEL_CONSTANT
|
90
|
+
}
|
91
|
+
block[:right_bevel_edge] = path {
|
92
|
+
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)
|
93
|
+
|
94
|
+
fill r: color[:r] - BEVEL_CONSTANT, g: color[:g] - BEVEL_CONSTANT, b: color[:b] - BEVEL_CONSTANT
|
95
|
+
}
|
96
|
+
block[:bottom_bevel_edge] = path {
|
97
|
+
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)
|
98
|
+
|
99
|
+
fill r: color[:r] - BEVEL_CONSTANT, g: color[:g] - BEVEL_CONSTANT, b: color[:b] - BEVEL_CONSTANT
|
100
|
+
}
|
101
|
+
block[:left_bevel_edge] = path {
|
102
|
+
polygon(0, 0, 0, block_size, bevel_pixel_size, block_size - bevel_pixel_size, bevel_pixel_size, bevel_pixel_size)
|
103
|
+
|
104
|
+
fill r: color[:r] - BEVEL_CONSTANT, g: color[:g] - BEVEL_CONSTANT, b: color[:b] - BEVEL_CONSTANT
|
105
|
+
}
|
106
|
+
block[:border_square] = path {
|
107
|
+
square(0, 0, block_size)
|
108
|
+
|
109
|
+
stroke COLOR_GRAY
|
110
|
+
}
|
76
111
|
|
77
112
|
on_key_down do |key_event|
|
78
113
|
case key_event
|
@@ -100,14 +135,7 @@ class Tetris
|
|
100
135
|
end
|
101
136
|
end
|
102
137
|
}
|
103
|
-
|
104
|
-
|
105
|
-
def block(row: , column: , block_size: )
|
106
|
-
path {
|
107
|
-
square(column * block_size, row * block_size, block_size)
|
108
|
-
|
109
|
-
fill Model::Block::COLOR_CLEAR
|
110
|
-
}
|
138
|
+
block
|
111
139
|
end
|
112
140
|
|
113
141
|
def start_moving_tetrominos_down
|
@@ -117,7 +145,10 @@ class Tetris
|
|
117
145
|
end
|
118
146
|
|
119
147
|
def show_game_over_dialog
|
120
|
-
|
148
|
+
Glimmer::LibUI.queue_main do
|
149
|
+
msg_box('Game Over', "Score: #{@game.high_scores.first.score}\nLines: #{@game.high_scores.first.lines}\nLevel: #{@game.high_scores.first.level}")
|
150
|
+
@game.restart!
|
151
|
+
end
|
121
152
|
end
|
122
153
|
end
|
123
154
|
|
data/glimmer-dsl-libui.gemspec
CHANGED
Binary file
|
@@ -109,6 +109,31 @@ module Glimmer
|
|
109
109
|
queue_redraw_all
|
110
110
|
end
|
111
111
|
|
112
|
+
def request_auto_redraw
|
113
|
+
# TODO implement functionality to delay queuing area redraws until post_add_content has been called (area definition is done). Maybe offer an option to enable redrawing before area is closed too.
|
114
|
+
queue_redraw_all if auto_redraw_enabled?
|
115
|
+
end
|
116
|
+
|
117
|
+
def auto_redraw_enabled(value = nil)
|
118
|
+
if value.nil?
|
119
|
+
@auto_redraw_enabled = true if @auto_redraw_enabled.nil?
|
120
|
+
@auto_redraw_enabled
|
121
|
+
else
|
122
|
+
@auto_redraw_enabled = !!value
|
123
|
+
end
|
124
|
+
end
|
125
|
+
alias auto_redraw_enabled? auto_redraw_enabled
|
126
|
+
alias auto_redraw_enabled= auto_redraw_enabled
|
127
|
+
alias set_auto_redraw_enabled auto_redraw_enabled
|
128
|
+
|
129
|
+
def pause_auto_redraw
|
130
|
+
self.auto_redraw_enabled = false
|
131
|
+
end
|
132
|
+
|
133
|
+
def resume_auto_redraw
|
134
|
+
self.auto_redraw_enabled = true
|
135
|
+
end
|
136
|
+
|
112
137
|
private
|
113
138
|
|
114
139
|
def build_control
|
@@ -68,12 +68,16 @@ module Glimmer
|
|
68
68
|
if args.empty?
|
69
69
|
@fill ||= {}
|
70
70
|
else
|
71
|
-
|
72
|
-
@
|
71
|
+
new_color = Glimmer::LibUI.interpret_color(args)
|
72
|
+
if new_color != @fill
|
73
|
+
@fill_observer&.unobserve(@fill) if @fill
|
74
|
+
@fill = new_color
|
75
|
+
request_auto_redraw
|
76
|
+
end
|
73
77
|
end
|
74
78
|
@fill.tap do
|
75
79
|
@fill_observer ||= Glimmer::DataBinding::Observer.proc do
|
76
|
-
|
80
|
+
request_auto_redraw
|
77
81
|
end
|
78
82
|
@fill_observer.observe(@fill)
|
79
83
|
end
|
@@ -92,12 +96,16 @@ module Glimmer
|
|
92
96
|
if args.empty?
|
93
97
|
@stroke ||= {}
|
94
98
|
else
|
95
|
-
|
96
|
-
@
|
99
|
+
new_color = Glimmer::LibUI.interpret_color(args)
|
100
|
+
if new_color != @stroke
|
101
|
+
@stroke_observer&.unobserve(@stroke) if @stroke
|
102
|
+
@stroke = Glimmer::LibUI.interpret_color(args)
|
103
|
+
request_auto_redraw
|
104
|
+
end
|
97
105
|
end
|
98
106
|
@stroke.tap do
|
99
107
|
@stroke_observer ||= Glimmer::DataBinding::Observer.proc do
|
100
|
-
|
108
|
+
request_auto_redraw
|
101
109
|
end
|
102
110
|
@stroke_observer.observe(@stroke)
|
103
111
|
end
|
@@ -137,7 +145,11 @@ module Glimmer
|
|
137
145
|
end
|
138
146
|
|
139
147
|
def redraw
|
140
|
-
@parent_proxy&.
|
148
|
+
@parent_proxy&.redraw
|
149
|
+
end
|
150
|
+
|
151
|
+
def request_auto_redraw
|
152
|
+
@parent_proxy&.request_auto_redraw
|
141
153
|
end
|
142
154
|
|
143
155
|
private
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# Copyright (c) 2021 Andy Maleh
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
# a copy of this software and associated documentation files (the
|
5
|
+
# "Software"), to deal in the Software without restriction, including
|
6
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
# the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be
|
12
|
+
# included in all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
|
22
|
+
require 'glimmer/libui/shape'
|
23
|
+
|
24
|
+
module Glimmer
|
25
|
+
module LibUI
|
26
|
+
class Shape
|
27
|
+
class Polybezier < Shape
|
28
|
+
parameters :point_array
|
29
|
+
parameter_defaults []
|
30
|
+
|
31
|
+
def draw(area_draw_params)
|
32
|
+
alternating_x_y_array = point_array.to_a.compact.flatten
|
33
|
+
unless alternating_x_y_array.empty?
|
34
|
+
::LibUI.draw_path_new_figure(path_proxy.libui, alternating_x_y_array[0], alternating_x_y_array[1])
|
35
|
+
((alternating_x_y_array.size - 2) / 6).times do |n|
|
36
|
+
point_alternating_x_y_index = n * 6
|
37
|
+
::LibUI.draw_path_bezier_to(path_proxy.libui, alternating_x_y_array[point_alternating_x_y_index + 2], alternating_x_y_array[point_alternating_x_y_index + 3], alternating_x_y_array[point_alternating_x_y_index + 4], alternating_x_y_array[point_alternating_x_y_index + 5], alternating_x_y_array[point_alternating_x_y_index + 6], alternating_x_y_array[point_alternating_x_y_index + 7])
|
38
|
+
end
|
39
|
+
end
|
40
|
+
super
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# Copyright (c) 2021 Andy Maleh
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
# a copy of this software and associated documentation files (the
|
5
|
+
# "Software"), to deal in the Software without restriction, including
|
6
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
# the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be
|
12
|
+
# included in all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
|
22
|
+
require 'glimmer/libui/shape'
|
23
|
+
|
24
|
+
module Glimmer
|
25
|
+
module LibUI
|
26
|
+
class Shape
|
27
|
+
class Polygon < Shape
|
28
|
+
parameters :point_array
|
29
|
+
parameter_defaults []
|
30
|
+
|
31
|
+
def draw(area_draw_params)
|
32
|
+
alternating_x_y_array = point_array.to_a.compact.flatten
|
33
|
+
unless alternating_x_y_array.empty?
|
34
|
+
::LibUI.draw_path_new_figure(path_proxy.libui, alternating_x_y_array[0], alternating_x_y_array[1])
|
35
|
+
((alternating_x_y_array.size - 2) / 2).times do |n|
|
36
|
+
point_alternating_x_y_index = n * 2
|
37
|
+
::LibUI.draw_path_line_to(path_proxy.libui, alternating_x_y_array[point_alternating_x_y_index + 2], alternating_x_y_array[point_alternating_x_y_index + 3])
|
38
|
+
end
|
39
|
+
::LibUI.draw_path_close_figure(path_proxy.libui)
|
40
|
+
end
|
41
|
+
super
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# Copyright (c) 2021 Andy Maleh
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
# a copy of this software and associated documentation files (the
|
5
|
+
# "Software"), to deal in the Software without restriction, including
|
6
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
# the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be
|
12
|
+
# included in all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
|
22
|
+
require 'glimmer/libui/shape'
|
23
|
+
|
24
|
+
module Glimmer
|
25
|
+
module LibUI
|
26
|
+
class Shape
|
27
|
+
class Polyline < Shape
|
28
|
+
parameters :point_array
|
29
|
+
parameter_defaults []
|
30
|
+
|
31
|
+
def draw(area_draw_params)
|
32
|
+
alternating_x_y_array = point_array.to_a.compact.flatten
|
33
|
+
unless alternating_x_y_array.empty?
|
34
|
+
::LibUI.draw_path_new_figure(path_proxy.libui, alternating_x_y_array[0], alternating_x_y_array[1])
|
35
|
+
((alternating_x_y_array.size - 2) / 2).times do |n|
|
36
|
+
point_alternating_x_y_index = n * 2
|
37
|
+
::LibUI.draw_path_line_to(path_proxy.libui, alternating_x_y_array[point_alternating_x_y_index + 2], alternating_x_y_array[point_alternating_x_y_index + 3])
|
38
|
+
end
|
39
|
+
end
|
40
|
+
super
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/lib/glimmer/libui/shape.rb
CHANGED
@@ -87,7 +87,11 @@ module Glimmer
|
|
87
87
|
end
|
88
88
|
|
89
89
|
def redraw
|
90
|
-
area_proxy&.
|
90
|
+
area_proxy&.auto_redraw
|
91
|
+
end
|
92
|
+
|
93
|
+
def request_auto_redraw
|
94
|
+
area_proxy&.request_auto_redraw
|
91
95
|
end
|
92
96
|
|
93
97
|
def destroy
|
@@ -113,8 +117,10 @@ module Glimmer
|
|
113
117
|
method_name = method_name.to_s
|
114
118
|
parameter_index = self.class.parameters.index(method_name_parameter)
|
115
119
|
if method_name.start_with?('set_') || method_name.end_with?('=') || !args.empty?
|
116
|
-
@args[parameter_index]
|
117
|
-
|
120
|
+
if args.first != @args[parameter_index]
|
121
|
+
@args[parameter_index] = args.first
|
122
|
+
request_auto_redraw
|
123
|
+
end
|
118
124
|
else
|
119
125
|
@args[parameter_index]
|
120
126
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: glimmer-dsl-libui
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.18
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andy Maleh
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-11-
|
11
|
+
date: 2021-11-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: glimmer
|
@@ -344,6 +344,9 @@ files:
|
|
344
344
|
- lib/glimmer/libui/shape/circle.rb
|
345
345
|
- lib/glimmer/libui/shape/figure.rb
|
346
346
|
- lib/glimmer/libui/shape/line.rb
|
347
|
+
- lib/glimmer/libui/shape/polybezier.rb
|
348
|
+
- lib/glimmer/libui/shape/polygon.rb
|
349
|
+
- lib/glimmer/libui/shape/polyline.rb
|
347
350
|
- lib/glimmer/libui/shape/rectangle.rb
|
348
351
|
- lib/glimmer/libui/shape/square.rb
|
349
352
|
- sounds/AlanWalker-Faded.mid
|