glimmer-dsl-libui 0.2.12 → 0.2.13
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +19 -0
- data/README.md +178 -148
- data/VERSION +1 -1
- data/bin/girb +0 -0
- data/bin/girb_runner.rb +1 -1
- data/examples/area_gallery.rb +15 -13
- data/examples/area_gallery2.rb +24 -22
- data/examples/area_gallery3.rb +15 -13
- data/examples/area_gallery4.rb +24 -22
- data/examples/basic_table_button.rb +1 -1
- data/examples/basic_table_checkbox.rb +1 -1
- data/examples/basic_table_image.rb +1 -0
- data/examples/basic_table_image_text.rb +1 -0
- data/examples/{color_the_circles.rb → color_the_shapes.rb} +45 -44
- data/examples/control_gallery.rb +6 -0
- data/examples/meta_example.rb +1 -0
- data/glimmer-dsl-libui.gemspec +0 -0
- data/lib/glimmer/libui/attributed_string.rb +20 -10
- data/lib/glimmer/libui/control_proxy/table_proxy.rb +29 -9
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d0d69180e099ba8e4ef76b6d862542fd84753baf128e07ea17ef145ee1a4e20d
|
4
|
+
data.tar.gz: 25a96db46d241e7e17ec45778bda264fc662c77fcf9323e4eb0917ace5cda6da
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5073abc3a7bec0ffafa7d7dccc90273c9d6fbb5533a15a74b083a25df0d7a8b3e0dd7536429b47ea1d8b863afb4e98ef6de63943593025b3a53df39a7d455eeb
|
7
|
+
data.tar.gz: 33c26144db9e702762afaa3866685851e620208b60515937bdaccf44d059056c2232a325fc43d629f8998965f35b60106f390677ff2400305f711b1860475f4b
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,24 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
+
## 0.2.13
|
4
|
+
|
5
|
+
- Rename examples/color_the_circles.rb to examples/color_the_shapes.rb to fix/make compatible with Windows by rendering only Squares on Windows, but Squares and Circles on Mac/Linux
|
6
|
+
- Fix examples/basic_table_button.rb double-deletion issue on Windows via a temporary workaround (generating an extra empty row on Windows only)
|
7
|
+
- Fix examples/basic_table_checkbox.rb , examples/basic_table_checkbox_text.rb , and examples/basic_table_color.rb on Windows
|
8
|
+
- Fix examples/basic_table_progress_bar.rb crash due to an issue on Windows when switching from -1 to a positive value
|
9
|
+
- Fix examples/area_gallery.rb (all its versions) by disabling arc/circle on Windows where they don't work due to issue in libui
|
10
|
+
- Fix girb on Windows
|
11
|
+
- Removed redundant `table` on_change notification
|
12
|
+
- Fix issue with supplying a font without all its keys (e.g. missing `:weight`) to attributed `string` nested under `text`, tolerating missing font keys.
|
13
|
+
- Fix issue with examples/color_the_circles.rb when clicking outside the playing area causing this error:
|
14
|
+
```
|
15
|
+
examples/color_the_circles.rb:82:in `block in color_circle': undefined method `include?' for nil:NilClass (NoMethodError)
|
16
|
+
from examples/color_the_circles.rb:81:in `each'
|
17
|
+
from examples/color_the_circles.rb:81:in `find'
|
18
|
+
from examples/color_the_circles.rb:81:in `color_circle'
|
19
|
+
from examples/color_the_circles.rb:212:in `block (4 levels) in launch'
|
20
|
+
```
|
21
|
+
|
3
22
|
## 0.2.12
|
4
23
|
|
5
24
|
- Upgrade to glimmer 2.4.0
|
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.13
|
2
2
|
## Prerequisite-Free Ruby Desktop Development GUI Library
|
3
3
|
[![Gem Version](https://badge.fury.io/rb/glimmer-dsl-libui.svg)](http://badge.fury.io/rb/glimmer-dsl-libui)
|
4
4
|
[![Join the chat at https://gitter.im/AndyObtiva/glimmer](https://badges.gitter.im/AndyObtiva/glimmer.svg)](https://gitter.im/AndyObtiva/glimmer?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
@@ -119,19 +119,21 @@ window('Area Gallery', 400, 400) {
|
|
119
119
|
fill r: 202, g: 102, b: 204, a: 0.5
|
120
120
|
stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
|
121
121
|
}
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
122
|
+
unless OS.windows?
|
123
|
+
path { # declarative stable path
|
124
|
+
arc(400, 220, 180, 90, 90, false)
|
125
|
+
|
126
|
+
# radial gradient (has an outer_radius in addition to x0, y0, x1, y1, and stops)
|
127
|
+
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}]
|
128
|
+
stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
|
129
|
+
}
|
130
|
+
path { # declarative stable path
|
131
|
+
circle(200, 200, 90)
|
132
|
+
|
133
|
+
fill r: 202, g: 102, b: 204, a: 0.5
|
134
|
+
stroke r: 0, g: 0, b: 0, thickness: 2
|
135
|
+
}
|
136
|
+
end
|
135
137
|
text(160, 40, 100) { # x, y, width
|
136
138
|
string('Area Gallery') {
|
137
139
|
font family: 'Times', size: 14
|
@@ -255,7 +257,7 @@ Other [Glimmer](https://rubygems.org/gems/glimmer) DSL gems you might be interes
|
|
255
257
|
- [Basic Transform](#basic-transform)
|
256
258
|
- [Login](#login)
|
257
259
|
- [Timer](#timer)
|
258
|
-
- [Color The
|
260
|
+
- [Color The Shapes](#color-the-shapes)
|
259
261
|
- [Basic Draw Text](#basic-draw-text)
|
260
262
|
- [Custom Draw Text](#custom-draw-text)
|
261
263
|
- [Method-Based Custom Keyword](#method-based-custom-keyword)
|
@@ -346,7 +348,7 @@ gem install glimmer-dsl-libui
|
|
346
348
|
Or install via Bundler `Gemfile`:
|
347
349
|
|
348
350
|
```ruby
|
349
|
-
gem 'glimmer-dsl-libui', '~> 0.2.
|
351
|
+
gem 'glimmer-dsl-libui', '~> 0.2.13'
|
350
352
|
```
|
351
353
|
|
352
354
|
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.
|
@@ -1013,6 +1015,10 @@ window('Method-Based Custom Keyword') {
|
|
1013
1015
|
- There is no proper way to destroy `grid` children due to [libui](https://github.com/andlabs/libui) not offering any API for deleting them from `grid` (no `grid_delete` similar to `box_delete` for `horizontal_box` and `vertical_box`).
|
1014
1016
|
- `table` `checkbox_column` and `checkbox_text_column` checkbox editing only works on Windows and Linux (not Mac) due to a current limitation in [libui](https://github.com/andlabs/ui/issues/357).
|
1015
1017
|
- `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)
|
1018
|
+
- `text` `string` `background` does not work on Windows due to an issue in [libui](https://github.com/andlabs/libui).
|
1019
|
+
- `arc` shape does not work on Windows due to an issue in [libui](https://github.com/andlabs/libui).
|
1020
|
+
- `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.
|
1021
|
+
- `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.
|
1016
1022
|
|
1017
1023
|
### Original API
|
1018
1024
|
|
@@ -3895,19 +3901,21 @@ window('Area Gallery', 400, 400) {
|
|
3895
3901
|
fill r: 202, g: 102, b: 204, a: 0.5
|
3896
3902
|
stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
|
3897
3903
|
}
|
3898
|
-
|
3899
|
-
|
3900
|
-
|
3901
|
-
|
3902
|
-
|
3903
|
-
|
3904
|
-
|
3905
|
-
|
3906
|
-
|
3907
|
-
|
3908
|
-
|
3909
|
-
|
3910
|
-
|
3904
|
+
unless OS.windows?
|
3905
|
+
path { # declarative stable path
|
3906
|
+
arc(400, 220, 180, 90, 90, false)
|
3907
|
+
|
3908
|
+
# radial gradient (has an outer_radius in addition to x0, y0, x1, y1, and stops)
|
3909
|
+
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}]
|
3910
|
+
stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
|
3911
|
+
}
|
3912
|
+
path { # declarative stable path
|
3913
|
+
circle(200, 200, 90)
|
3914
|
+
|
3915
|
+
fill r: 202, g: 102, b: 204, a: 0.5
|
3916
|
+
stroke r: 0, g: 0, b: 0, thickness: 2
|
3917
|
+
}
|
3918
|
+
end
|
3911
3919
|
text(160, 40, 100) { # x, y, width
|
3912
3920
|
string('Area Gallery') {
|
3913
3921
|
font family: 'Times', size: 14
|
@@ -4066,30 +4074,32 @@ window('Area Gallery', 400, 400) {
|
|
4066
4074
|
fill r: 202, g: 102, b: 204, a: 0.5
|
4067
4075
|
stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
|
4068
4076
|
}
|
4069
|
-
|
4070
|
-
|
4071
|
-
|
4072
|
-
|
4073
|
-
|
4074
|
-
|
4075
|
-
|
4076
|
-
|
4077
|
+
unless OS.windows?
|
4078
|
+
path { # declarative stable path
|
4079
|
+
arc {
|
4080
|
+
x_center 400
|
4081
|
+
y_center 220
|
4082
|
+
radius 180
|
4083
|
+
start_angle 90
|
4084
|
+
sweep 90
|
4085
|
+
is_negative false
|
4086
|
+
}
|
4087
|
+
|
4088
|
+
# radial gradient (has an outer_radius in addition to x0, y0, x1, y1, and stops)
|
4089
|
+
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}]
|
4090
|
+
stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
|
4077
4091
|
}
|
4078
|
-
|
4079
|
-
|
4080
|
-
|
4081
|
-
|
4082
|
-
|
4083
|
-
|
4084
|
-
|
4085
|
-
|
4086
|
-
|
4087
|
-
radius 90
|
4092
|
+
path { # declarative stable path
|
4093
|
+
circle {
|
4094
|
+
x_center 200
|
4095
|
+
y_center 200
|
4096
|
+
radius 90
|
4097
|
+
}
|
4098
|
+
|
4099
|
+
fill r: 202, g: 102, b: 204, a: 0.5
|
4100
|
+
stroke r: 0, g: 0, b: 0, thickness: 2
|
4088
4101
|
}
|
4089
|
-
|
4090
|
-
fill r: 202, g: 102, b: 204, a: 0.5
|
4091
|
-
stroke r: 0, g: 0, b: 0, thickness: 2
|
4092
|
-
}
|
4102
|
+
end
|
4093
4103
|
text {
|
4094
4104
|
x 160
|
4095
4105
|
y 40
|
@@ -4201,19 +4211,21 @@ window('Area Gallery', 400, 400) {
|
|
4201
4211
|
fill r: 202, g: 102, b: 204, a: 0.5
|
4202
4212
|
stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
|
4203
4213
|
}
|
4204
|
-
|
4205
|
-
|
4206
|
-
|
4207
|
-
|
4208
|
-
|
4209
|
-
|
4210
|
-
|
4211
|
-
|
4212
|
-
|
4213
|
-
|
4214
|
-
|
4215
|
-
|
4216
|
-
|
4214
|
+
unless OS.windows?
|
4215
|
+
path { # a dynamic path is added semi-declaratively inside on_draw block
|
4216
|
+
arc(400, 220, 180, 90, 90, false)
|
4217
|
+
|
4218
|
+
# radial gradient (has an outer_radius in addition to x0, y0, x1, y1, and stops)
|
4219
|
+
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}]
|
4220
|
+
stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
|
4221
|
+
}
|
4222
|
+
path { # a dynamic path is added semi-declaratively inside on_draw block
|
4223
|
+
circle(200, 200, 90)
|
4224
|
+
|
4225
|
+
fill r: 202, g: 102, b: 204, a: 0.5
|
4226
|
+
stroke r: 0, g: 0, b: 0, thickness: 2
|
4227
|
+
}
|
4228
|
+
end
|
4217
4229
|
text(160, 40, 100) { # x, y, width
|
4218
4230
|
string('Area Gallery') {
|
4219
4231
|
font family: 'Times', size: 14
|
@@ -4374,30 +4386,32 @@ window('Area Gallery', 400, 400) {
|
|
4374
4386
|
fill r: 202, g: 102, b: 204, a: 0.5
|
4375
4387
|
stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
|
4376
4388
|
}
|
4377
|
-
|
4378
|
-
|
4379
|
-
|
4380
|
-
|
4381
|
-
|
4382
|
-
|
4383
|
-
|
4384
|
-
|
4389
|
+
unless OS.windows?
|
4390
|
+
path { # a dynamic path is added semi-declaratively inside on_draw block
|
4391
|
+
arc {
|
4392
|
+
x_center 400
|
4393
|
+
y_center 220
|
4394
|
+
radius 180
|
4395
|
+
start_angle 90
|
4396
|
+
sweep 90
|
4397
|
+
is_negative false
|
4398
|
+
}
|
4399
|
+
|
4400
|
+
# radial gradient (has an outer_radius in addition to x0, y0, x1, y1, and stops)
|
4401
|
+
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}]
|
4402
|
+
stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
|
4385
4403
|
}
|
4386
|
-
|
4387
|
-
|
4388
|
-
|
4389
|
-
|
4390
|
-
|
4391
|
-
|
4392
|
-
|
4393
|
-
|
4394
|
-
|
4395
|
-
radius 90
|
4404
|
+
path { # a dynamic path is added semi-declaratively inside on_draw block
|
4405
|
+
circle {
|
4406
|
+
x_center 200
|
4407
|
+
y_center 200
|
4408
|
+
radius 90
|
4409
|
+
}
|
4410
|
+
|
4411
|
+
fill r: 202, g: 102, b: 204, a: 0.5
|
4412
|
+
stroke r: 0, g: 0, b: 0, thickness: 2
|
4396
4413
|
}
|
4397
|
-
|
4398
|
-
fill r: 202, g: 102, b: 204, a: 0.5
|
4399
|
-
stroke r: 0, g: 0, b: 0, thickness: 2
|
4400
|
-
}
|
4414
|
+
end
|
4401
4415
|
text {
|
4402
4416
|
x 160
|
4403
4417
|
y 40
|
@@ -5100,70 +5114,74 @@ end
|
|
5100
5114
|
Timer.new
|
5101
5115
|
```
|
5102
5116
|
|
5103
|
-
### Color The
|
5117
|
+
### Color The Shapes
|
5104
5118
|
|
5105
|
-
[examples/
|
5119
|
+
[examples/color_the_shapes.rb](examples/color_the_shapes.rb)
|
5106
5120
|
|
5107
5121
|
Run with this command from the root of the project if you cloned the project:
|
5108
5122
|
|
5109
5123
|
```
|
5110
|
-
ruby -r './lib/glimmer-dsl-libui' examples/
|
5124
|
+
ruby -r './lib/glimmer-dsl-libui' examples/color_the_shapes.rb
|
5111
5125
|
```
|
5112
5126
|
|
5113
5127
|
Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/glimmer-dsl-libui):
|
5114
5128
|
|
5115
5129
|
```
|
5116
|
-
ruby -r glimmer-dsl-libui -e "require 'examples/
|
5130
|
+
ruby -r glimmer-dsl-libui -e "require 'examples/color_the_shapes'"
|
5117
5131
|
```
|
5118
5132
|
|
5119
5133
|
Mac
|
5120
5134
|
|
5121
|
-
![glimmer-dsl-libui-mac-color-the-
|
5122
|
-
![glimmer-dsl-libui-mac-color-the-
|
5123
|
-
![glimmer-dsl-libui-mac-color-the-
|
5135
|
+
![glimmer-dsl-libui-mac-color-the-shapes.png](images/glimmer-dsl-libui-mac-color-the-shapes.png)
|
5136
|
+
![glimmer-dsl-libui-mac-color-the-shapes-lost.png](images/glimmer-dsl-libui-mac-color-the-shapes-lost.png)
|
5137
|
+
![glimmer-dsl-libui-mac-color-the-shapes-won.png](images/glimmer-dsl-libui-mac-color-the-shapes-won.png)
|
5124
5138
|
|
5125
5139
|
Linux
|
5126
5140
|
|
5127
|
-
![glimmer-dsl-libui-linux-color-the-
|
5128
|
-
![glimmer-dsl-libui-linux-color-the-
|
5129
|
-
![glimmer-dsl-libui-linux-color-the-
|
5141
|
+
![glimmer-dsl-libui-linux-color-the-shapes.png](images/glimmer-dsl-libui-linux-color-the-shapes.png)
|
5142
|
+
![glimmer-dsl-libui-linux-color-the-shapes-lost.png](images/glimmer-dsl-libui-linux-color-the-shapes-lost.png)
|
5143
|
+
![glimmer-dsl-libui-linux-color-the-shapes-won.png](images/glimmer-dsl-libui-linux-color-the-shapes-won.png)
|
5130
5144
|
|
5131
5145
|
New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
|
5132
5146
|
|
5133
5147
|
```ruby
|
5134
5148
|
require 'glimmer-dsl-libui'
|
5135
5149
|
|
5136
|
-
class
|
5150
|
+
class ColorTheShapes
|
5137
5151
|
include Glimmer
|
5138
5152
|
|
5139
5153
|
WINDOW_WIDTH = 800
|
5140
5154
|
WINDOW_HEIGHT = 600
|
5141
|
-
|
5142
|
-
|
5155
|
+
SHAPE_MIN_SIZE = 15
|
5156
|
+
SHAPE_MAX_SIZE = 100
|
5143
5157
|
MARGIN_WIDTH = 55
|
5144
5158
|
MARGIN_HEIGHT = 155
|
5145
5159
|
TIME_MAX_EASY = 4
|
5146
5160
|
TIME_MAX_MEDIUM = 3
|
5147
5161
|
TIME_MAX_HARD = 2
|
5148
5162
|
TIME_MAX_INSANE = 1
|
5163
|
+
SHAPES = ['square'] + (OS.windows? ? [] : ['circle'])
|
5149
5164
|
|
5150
5165
|
attr_accessor :score
|
5151
5166
|
|
5152
5167
|
def initialize
|
5153
|
-
@
|
5168
|
+
@shapes_data = []
|
5154
5169
|
@score = 0
|
5155
5170
|
@time_max = TIME_MAX_HARD
|
5171
|
+
@game_over = false
|
5156
5172
|
register_observers
|
5157
|
-
|
5173
|
+
setup_shape_factory
|
5158
5174
|
end
|
5159
5175
|
|
5160
5176
|
def register_observers
|
5161
5177
|
observer = Glimmer::DataBinding::Observer.proc do |new_score|
|
5162
5178
|
@score_label.text = new_score.to_s
|
5163
5179
|
if new_score == -20
|
5180
|
+
@game_over = true
|
5164
5181
|
msg_box('You Lost!', 'Sorry! Your score reached -20')
|
5165
5182
|
restart_game
|
5166
5183
|
elsif new_score == 0
|
5184
|
+
@game_over = true
|
5167
5185
|
msg_box('You Won!', 'Congratulations! Your score reached 0')
|
5168
5186
|
restart_game
|
5169
5187
|
end
|
@@ -5171,13 +5189,15 @@ class ColorTheCircles
|
|
5171
5189
|
observer.observe(self, :score) # automatically enhances self to become Glimmer::DataBinding::ObservableModel and notify observer on score attribute changes
|
5172
5190
|
end
|
5173
5191
|
|
5174
|
-
def
|
5192
|
+
def setup_shape_factory
|
5175
5193
|
consumer = Proc.new do
|
5176
|
-
|
5177
|
-
|
5178
|
-
|
5179
|
-
|
5180
|
-
|
5194
|
+
unless @game_over
|
5195
|
+
if @shapes_data.empty?
|
5196
|
+
# start with 3 shapes to make more challenging
|
5197
|
+
add_shape until @shapes_data.size > 3
|
5198
|
+
else
|
5199
|
+
add_shape
|
5200
|
+
end
|
5181
5201
|
end
|
5182
5202
|
delay = rand * @time_max
|
5183
5203
|
Glimmer::LibUI.timer(delay, repeat: false, &consumer)
|
@@ -5185,13 +5205,13 @@ class ColorTheCircles
|
|
5185
5205
|
Glimmer::LibUI.queue_main(&consumer)
|
5186
5206
|
end
|
5187
5207
|
|
5188
|
-
def
|
5189
|
-
|
5190
|
-
|
5191
|
-
|
5208
|
+
def add_shape
|
5209
|
+
shape_x = rand * (WINDOW_WIDTH - MARGIN_WIDTH - SHAPE_MAX_SIZE) + SHAPE_MAX_SIZE
|
5210
|
+
shape_y = rand * (WINDOW_HEIGHT - MARGIN_HEIGHT - SHAPE_MAX_SIZE) + SHAPE_MAX_SIZE
|
5211
|
+
shape_size = rand * (SHAPE_MAX_SIZE - SHAPE_MIN_SIZE) + SHAPE_MIN_SIZE
|
5192
5212
|
stroke_color = Glimmer::LibUI.x11_colors.sample
|
5193
|
-
@
|
5194
|
-
args: [
|
5213
|
+
@shapes_data << {
|
5214
|
+
args: [shape_x, shape_y, shape_size],
|
5195
5215
|
fill: nil,
|
5196
5216
|
stroke: stroke_color
|
5197
5217
|
}
|
@@ -5201,9 +5221,29 @@ class ColorTheCircles
|
|
5201
5221
|
|
5202
5222
|
def restart_game
|
5203
5223
|
@score = 0 # update variable directly to avoid notifying observers
|
5204
|
-
@
|
5224
|
+
@shapes_data.clear
|
5225
|
+
@game_over = false
|
5205
5226
|
end
|
5206
5227
|
|
5228
|
+
def color_shape(x, y)
|
5229
|
+
clicked_shape_data = @shapes_data.find do |shape_data|
|
5230
|
+
shape_data[:fill].nil? && shape_data[:shape]&.include?(x, y)
|
5231
|
+
end
|
5232
|
+
if clicked_shape_data
|
5233
|
+
clicked_shape_data[:fill] = clicked_shape_data[:stroke]
|
5234
|
+
push_colored_shape_behind_uncolored_shapes(clicked_shape_data)
|
5235
|
+
@area.queue_redraw_all
|
5236
|
+
self.score += 1 # notifies score observers automatically of change
|
5237
|
+
end
|
5238
|
+
end
|
5239
|
+
|
5240
|
+
def push_colored_shape_behind_uncolored_shapes(colored_shape_data)
|
5241
|
+
removed_colored_shape_data = @shapes_data.delete(colored_shape_data)
|
5242
|
+
last_colored_shape_data = @shapes_data.select {|cd| cd[:fill]}.last
|
5243
|
+
last_colored_shape_data_index = @shapes_data.index(last_colored_shape_data) || -1
|
5244
|
+
@shapes_data.insert(last_colored_shape_data_index + 1, removed_colored_shape_data)
|
5245
|
+
end
|
5246
|
+
|
5207
5247
|
def launch
|
5208
5248
|
menu('Actions') {
|
5209
5249
|
menu_item('Restart') {
|
@@ -5246,12 +5286,12 @@ class ColorTheCircles
|
|
5246
5286
|
menu('Help') {
|
5247
5287
|
menu_item('Instructions') {
|
5248
5288
|
on_clicked do
|
5249
|
-
msg_box('Instructions', "Score goes down as
|
5289
|
+
msg_box('Instructions', "Score goes down as shapes are added.\nIf it reaches -20, you lose!\n\nClick shapes to color and score!\nOnce score reaches 0, you win!\n\nBeware of concealed light-colored shapes!\nThey are revealed once darker shapes intersect them.\n\nThere are four levels of difficulty.\nChange via difficulty menu if the game gets too tough.")
|
5250
5290
|
end
|
5251
5291
|
}
|
5252
5292
|
}
|
5253
5293
|
|
5254
|
-
window('Color The
|
5294
|
+
window('Color The Shapes', WINDOW_WIDTH, WINDOW_HEIGHT) {
|
5255
5295
|
margined true
|
5256
5296
|
|
5257
5297
|
grid {
|
@@ -5265,13 +5305,13 @@ class ColorTheCircles
|
|
5265
5305
|
end
|
5266
5306
|
}
|
5267
5307
|
|
5268
|
-
label('Score goes down as
|
5308
|
+
label('Score goes down as shapes are added. If it reaches -20, you lose!') {
|
5269
5309
|
left 0
|
5270
5310
|
top 1
|
5271
5311
|
halign :center
|
5272
5312
|
}
|
5273
5313
|
|
5274
|
-
label('Click
|
5314
|
+
label('Click shapes to color and score! Once score reaches 0, you win!') {
|
5275
5315
|
left 0
|
5276
5316
|
top 2
|
5277
5317
|
halign :center
|
@@ -5291,51 +5331,41 @@ class ColorTheCircles
|
|
5291
5331
|
}
|
5292
5332
|
}
|
5293
5333
|
|
5294
|
-
|
5334
|
+
@area = area {
|
5295
5335
|
left 0
|
5296
5336
|
top 4
|
5297
5337
|
hexpand true
|
5298
5338
|
vexpand true
|
5299
5339
|
halign :fill
|
5300
5340
|
valign :fill
|
5301
|
-
|
5302
|
-
|
5303
|
-
|
5341
|
+
|
5342
|
+
on_draw do |area_draw_params|
|
5343
|
+
path {
|
5344
|
+
rectangle(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT)
|
5345
|
+
|
5346
|
+
fill :white
|
5347
|
+
}
|
5348
|
+
|
5349
|
+
@shapes_data.each do |shape_data|
|
5304
5350
|
path {
|
5305
|
-
|
5306
|
-
|
5307
|
-
fill :
|
5351
|
+
shape_data[:shape] = send(SHAPES.sample, *shape_data[:args])
|
5352
|
+
|
5353
|
+
fill shape_data[:fill]
|
5354
|
+
stroke shape_data[:stroke]
|
5308
5355
|
}
|
5309
|
-
|
5310
|
-
@circles_data.each do |circle_data|
|
5311
|
-
path {
|
5312
|
-
circle_data[:circle] = circle(*circle_data[:args])
|
5313
|
-
|
5314
|
-
fill circle_data[:fill]
|
5315
|
-
stroke circle_data[:stroke]
|
5316
|
-
}
|
5317
|
-
end
|
5318
5356
|
end
|
5319
|
-
|
5320
|
-
|
5321
|
-
|
5322
|
-
|
5323
|
-
|
5324
|
-
if clicked_circle_data
|
5325
|
-
clicked_circle_data[:fill] = clicked_circle_data[:stroke]
|
5326
|
-
@area.queue_redraw_all
|
5327
|
-
self.score += 1 # notifies score observers automatically of change
|
5328
|
-
end
|
5329
|
-
end
|
5330
|
-
}
|
5357
|
+
end
|
5358
|
+
|
5359
|
+
on_mouse_down do |area_mouse_event|
|
5360
|
+
color_shape(area_mouse_event[:x], area_mouse_event[:y])
|
5361
|
+
end
|
5331
5362
|
}
|
5332
|
-
|
5333
5363
|
}
|
5334
5364
|
}.show
|
5335
5365
|
end
|
5336
5366
|
end
|
5337
5367
|
|
5338
|
-
|
5368
|
+
ColorTheShapes.new.launch
|
5339
5369
|
```
|
5340
5370
|
|
5341
5371
|
### Basic Draw Text
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.13
|
data/bin/girb
CHANGED
File without changes
|
data/bin/girb_runner.rb
CHANGED
@@ -27,7 +27,7 @@ require_relative '../lib/glimmer-dsl-libui'
|
|
27
27
|
|
28
28
|
include Glimmer
|
29
29
|
|
30
|
-
GIRB_RUNNER_EXIT_FILE = "#{
|
30
|
+
GIRB_RUNNER_EXIT_FILE = "#{Dir.home}/.girb_runner_exit"
|
31
31
|
FileUtils.rm_rf GIRB_RUNNER_EXIT_FILE
|
32
32
|
|
33
33
|
@exit_method = method(:exit)
|
data/examples/area_gallery.rb
CHANGED
@@ -41,19 +41,21 @@ window('Area Gallery', 400, 400) {
|
|
41
41
|
fill r: 202, g: 102, b: 204, a: 0.5
|
42
42
|
stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
|
43
43
|
}
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
44
|
+
unless OS.windows?
|
45
|
+
path { # declarative stable path
|
46
|
+
arc(400, 220, 180, 90, 90, false)
|
47
|
+
|
48
|
+
# radial gradient (has an outer_radius in addition to x0, y0, x1, y1, and stops)
|
49
|
+
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}]
|
50
|
+
stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
|
51
|
+
}
|
52
|
+
path { # declarative stable path
|
53
|
+
circle(200, 200, 90)
|
54
|
+
|
55
|
+
fill r: 202, g: 102, b: 204, a: 0.5
|
56
|
+
stroke r: 0, g: 0, b: 0, thickness: 2
|
57
|
+
}
|
58
|
+
end
|
57
59
|
text(160, 40, 100) { # x, y, width
|
58
60
|
string('Area Gallery') {
|
59
61
|
font family: 'Times', size: 14
|
data/examples/area_gallery2.rb
CHANGED
@@ -95,30 +95,32 @@ window('Area Gallery', 400, 400) {
|
|
95
95
|
fill r: 202, g: 102, b: 204, a: 0.5
|
96
96
|
stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
|
97
97
|
}
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
98
|
+
unless OS.windows?
|
99
|
+
path { # declarative stable path
|
100
|
+
arc {
|
101
|
+
x_center 400
|
102
|
+
y_center 220
|
103
|
+
radius 180
|
104
|
+
start_angle 90
|
105
|
+
sweep 90
|
106
|
+
is_negative false
|
107
|
+
}
|
108
|
+
|
109
|
+
# radial gradient (has an outer_radius in addition to x0, y0, x1, y1, and stops)
|
110
|
+
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}]
|
111
|
+
stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
|
106
112
|
}
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
radius 90
|
113
|
+
path { # declarative stable path
|
114
|
+
circle {
|
115
|
+
x_center 200
|
116
|
+
y_center 200
|
117
|
+
radius 90
|
118
|
+
}
|
119
|
+
|
120
|
+
fill r: 202, g: 102, b: 204, a: 0.5
|
121
|
+
stroke r: 0, g: 0, b: 0, thickness: 2
|
117
122
|
}
|
118
|
-
|
119
|
-
fill r: 202, g: 102, b: 204, a: 0.5
|
120
|
-
stroke r: 0, g: 0, b: 0, thickness: 2
|
121
|
-
}
|
123
|
+
end
|
122
124
|
text {
|
123
125
|
x 160
|
124
126
|
y 40
|
data/examples/area_gallery3.rb
CHANGED
@@ -42,19 +42,21 @@ window('Area Gallery', 400, 400) {
|
|
42
42
|
fill r: 202, g: 102, b: 204, a: 0.5
|
43
43
|
stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
|
44
44
|
}
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
45
|
+
unless OS.windows?
|
46
|
+
path { # a dynamic path is added semi-declaratively inside on_draw block
|
47
|
+
arc(400, 220, 180, 90, 90, false)
|
48
|
+
|
49
|
+
# radial gradient (has an outer_radius in addition to x0, y0, x1, y1, and stops)
|
50
|
+
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}]
|
51
|
+
stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
|
52
|
+
}
|
53
|
+
path { # a dynamic path is added semi-declaratively inside on_draw block
|
54
|
+
circle(200, 200, 90)
|
55
|
+
|
56
|
+
fill r: 202, g: 102, b: 204, a: 0.5
|
57
|
+
stroke r: 0, g: 0, b: 0, thickness: 2
|
58
|
+
}
|
59
|
+
end
|
58
60
|
text(160, 40, 100) { # x, y, width
|
59
61
|
string('Area Gallery') {
|
60
62
|
font family: 'Times', size: 14
|
data/examples/area_gallery4.rb
CHANGED
@@ -96,30 +96,32 @@ window('Area Gallery', 400, 400) {
|
|
96
96
|
fill r: 202, g: 102, b: 204, a: 0.5
|
97
97
|
stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
|
98
98
|
}
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
99
|
+
unless OS.windows?
|
100
|
+
path { # a dynamic path is added semi-declaratively inside on_draw block
|
101
|
+
arc {
|
102
|
+
x_center 400
|
103
|
+
y_center 220
|
104
|
+
radius 180
|
105
|
+
start_angle 90
|
106
|
+
sweep 90
|
107
|
+
is_negative false
|
108
|
+
}
|
109
|
+
|
110
|
+
# radial gradient (has an outer_radius in addition to x0, y0, x1, y1, and stops)
|
111
|
+
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}]
|
112
|
+
stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
|
107
113
|
}
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
radius 90
|
114
|
+
path { # a dynamic path is added semi-declaratively inside on_draw block
|
115
|
+
circle {
|
116
|
+
x_center 200
|
117
|
+
y_center 200
|
118
|
+
radius 90
|
119
|
+
}
|
120
|
+
|
121
|
+
fill r: 202, g: 102, b: 204, a: 0.5
|
122
|
+
stroke r: 0, g: 0, b: 0, thickness: 2
|
118
123
|
}
|
119
|
-
|
120
|
-
fill r: 202, g: 102, b: 204, a: 0.5
|
121
|
-
stroke r: 0, g: 0, b: 0, thickness: 2
|
122
|
-
}
|
124
|
+
end
|
123
125
|
text {
|
124
126
|
x 160
|
125
127
|
y 40
|
@@ -1,28 +1,29 @@
|
|
1
1
|
require 'glimmer-dsl-libui'
|
2
2
|
|
3
|
-
class
|
3
|
+
class ColorTheShapes
|
4
4
|
include Glimmer
|
5
5
|
|
6
6
|
WINDOW_WIDTH = 800
|
7
7
|
WINDOW_HEIGHT = 600
|
8
|
-
|
9
|
-
|
8
|
+
SHAPE_MIN_SIZE = 15
|
9
|
+
SHAPE_MAX_SIZE = 100
|
10
10
|
MARGIN_WIDTH = 55
|
11
11
|
MARGIN_HEIGHT = 155
|
12
12
|
TIME_MAX_EASY = 4
|
13
13
|
TIME_MAX_MEDIUM = 3
|
14
14
|
TIME_MAX_HARD = 2
|
15
15
|
TIME_MAX_INSANE = 1
|
16
|
+
SHAPES = ['square'] + (OS.windows? ? [] : ['circle'])
|
16
17
|
|
17
18
|
attr_accessor :score
|
18
19
|
|
19
20
|
def initialize
|
20
|
-
@
|
21
|
+
@shapes_data = []
|
21
22
|
@score = 0
|
22
23
|
@time_max = TIME_MAX_HARD
|
23
24
|
@game_over = false
|
24
25
|
register_observers
|
25
|
-
|
26
|
+
setup_shape_factory
|
26
27
|
end
|
27
28
|
|
28
29
|
def register_observers
|
@@ -41,14 +42,14 @@ class ColorTheCircles
|
|
41
42
|
observer.observe(self, :score) # automatically enhances self to become Glimmer::DataBinding::ObservableModel and notify observer on score attribute changes
|
42
43
|
end
|
43
44
|
|
44
|
-
def
|
45
|
+
def setup_shape_factory
|
45
46
|
consumer = Proc.new do
|
46
47
|
unless @game_over
|
47
|
-
if @
|
48
|
-
# start with 3
|
49
|
-
|
48
|
+
if @shapes_data.empty?
|
49
|
+
# start with 3 shapes to make more challenging
|
50
|
+
add_shape until @shapes_data.size > 3
|
50
51
|
else
|
51
|
-
|
52
|
+
add_shape
|
52
53
|
end
|
53
54
|
end
|
54
55
|
delay = rand * @time_max
|
@@ -57,13 +58,13 @@ class ColorTheCircles
|
|
57
58
|
Glimmer::LibUI.queue_main(&consumer)
|
58
59
|
end
|
59
60
|
|
60
|
-
def
|
61
|
-
|
62
|
-
|
63
|
-
|
61
|
+
def add_shape
|
62
|
+
shape_x = rand * (WINDOW_WIDTH - MARGIN_WIDTH - SHAPE_MAX_SIZE) + SHAPE_MAX_SIZE
|
63
|
+
shape_y = rand * (WINDOW_HEIGHT - MARGIN_HEIGHT - SHAPE_MAX_SIZE) + SHAPE_MAX_SIZE
|
64
|
+
shape_size = rand * (SHAPE_MAX_SIZE - SHAPE_MIN_SIZE) + SHAPE_MIN_SIZE
|
64
65
|
stroke_color = Glimmer::LibUI.x11_colors.sample
|
65
|
-
@
|
66
|
-
args: [
|
66
|
+
@shapes_data << {
|
67
|
+
args: [shape_x, shape_y, shape_size],
|
67
68
|
fill: nil,
|
68
69
|
stroke: stroke_color
|
69
70
|
}
|
@@ -73,29 +74,29 @@ class ColorTheCircles
|
|
73
74
|
|
74
75
|
def restart_game
|
75
76
|
@score = 0 # update variable directly to avoid notifying observers
|
76
|
-
@
|
77
|
+
@shapes_data.clear
|
77
78
|
@game_over = false
|
78
79
|
end
|
79
80
|
|
80
|
-
def
|
81
|
-
|
82
|
-
|
81
|
+
def color_shape(x, y)
|
82
|
+
clicked_shape_data = @shapes_data.find do |shape_data|
|
83
|
+
shape_data[:fill].nil? && shape_data[:shape]&.include?(x, y)
|
83
84
|
end
|
84
|
-
if
|
85
|
-
|
86
|
-
|
85
|
+
if clicked_shape_data
|
86
|
+
clicked_shape_data[:fill] = clicked_shape_data[:stroke]
|
87
|
+
push_colored_shape_behind_uncolored_shapes(clicked_shape_data)
|
87
88
|
@area.queue_redraw_all
|
88
89
|
self.score += 1 # notifies score observers automatically of change
|
89
90
|
end
|
90
91
|
end
|
91
92
|
|
92
|
-
def
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
@
|
93
|
+
def push_colored_shape_behind_uncolored_shapes(colored_shape_data)
|
94
|
+
removed_colored_shape_data = @shapes_data.delete(colored_shape_data)
|
95
|
+
last_colored_shape_data = @shapes_data.select {|cd| cd[:fill]}.last
|
96
|
+
last_colored_shape_data_index = @shapes_data.index(last_colored_shape_data) || -1
|
97
|
+
@shapes_data.insert(last_colored_shape_data_index + 1, removed_colored_shape_data)
|
97
98
|
end
|
98
|
-
|
99
|
+
|
99
100
|
def launch
|
100
101
|
menu('Actions') {
|
101
102
|
menu_item('Restart') {
|
@@ -138,12 +139,12 @@ class ColorTheCircles
|
|
138
139
|
menu('Help') {
|
139
140
|
menu_item('Instructions') {
|
140
141
|
on_clicked do
|
141
|
-
msg_box('Instructions', "Score goes down as
|
142
|
+
msg_box('Instructions', "Score goes down as shapes are added.\nIf it reaches -20, you lose!\n\nClick shapes to color and score!\nOnce score reaches 0, you win!\n\nBeware of concealed light-colored shapes!\nThey are revealed once darker shapes intersect them.\n\nThere are four levels of difficulty.\nChange via difficulty menu if the game gets too tough.")
|
142
143
|
end
|
143
144
|
}
|
144
145
|
}
|
145
146
|
|
146
|
-
window('Color The
|
147
|
+
window('Color The Shapes', WINDOW_WIDTH, WINDOW_HEIGHT) {
|
147
148
|
margined true
|
148
149
|
|
149
150
|
grid {
|
@@ -157,13 +158,13 @@ class ColorTheCircles
|
|
157
158
|
end
|
158
159
|
}
|
159
160
|
|
160
|
-
label('Score goes down as
|
161
|
+
label('Score goes down as shapes are added. If it reaches -20, you lose!') {
|
161
162
|
left 0
|
162
163
|
top 1
|
163
164
|
halign :center
|
164
165
|
}
|
165
166
|
|
166
|
-
label('Click
|
167
|
+
label('Click shapes to color and score! Once score reaches 0, you win!') {
|
167
168
|
left 0
|
168
169
|
top 2
|
169
170
|
halign :center
|
@@ -190,26 +191,26 @@ class ColorTheCircles
|
|
190
191
|
vexpand true
|
191
192
|
halign :fill
|
192
193
|
valign :fill
|
193
|
-
|
194
|
+
|
194
195
|
on_draw do |area_draw_params|
|
195
196
|
path {
|
196
197
|
rectangle(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT)
|
197
|
-
|
198
|
+
|
198
199
|
fill :white
|
199
200
|
}
|
200
|
-
|
201
|
-
@
|
201
|
+
|
202
|
+
@shapes_data.each do |shape_data|
|
202
203
|
path {
|
203
|
-
|
204
|
-
|
205
|
-
fill
|
206
|
-
stroke
|
204
|
+
shape_data[:shape] = send(SHAPES.sample, *shape_data[:args])
|
205
|
+
|
206
|
+
fill shape_data[:fill]
|
207
|
+
stroke shape_data[:stroke]
|
207
208
|
}
|
208
209
|
end
|
209
210
|
end
|
210
|
-
|
211
|
+
|
211
212
|
on_mouse_down do |area_mouse_event|
|
212
|
-
|
213
|
+
color_shape(area_mouse_event[:x], area_mouse_event[:y])
|
213
214
|
end
|
214
215
|
}
|
215
216
|
}
|
@@ -217,4 +218,4 @@ class ColorTheCircles
|
|
217
218
|
end
|
218
219
|
end
|
219
220
|
|
220
|
-
|
221
|
+
ColorTheShapes.new.launch
|
data/examples/control_gallery.rb
CHANGED
@@ -9,6 +9,7 @@ menu('File') {
|
|
9
9
|
on_clicked do
|
10
10
|
file = open_file
|
11
11
|
puts file unless file.nil?
|
12
|
+
$stdout.flush # for Windows
|
12
13
|
end
|
13
14
|
}
|
14
15
|
|
@@ -16,6 +17,7 @@ menu('File') {
|
|
16
17
|
on_clicked do
|
17
18
|
file = save_file
|
18
19
|
puts file unless file.nil?
|
20
|
+
$stdout.flush # for Windows
|
19
21
|
end
|
20
22
|
}
|
21
23
|
|
@@ -98,6 +100,7 @@ MAIN_WINDOW = window('Control Gallery', 600, 500) {
|
|
98
100
|
|
99
101
|
on_changed do |s|
|
100
102
|
puts "New Spinbox value: #{s.value}"
|
103
|
+
$stdout.flush # for Windows
|
101
104
|
end
|
102
105
|
}
|
103
106
|
|
@@ -107,6 +110,7 @@ MAIN_WINDOW = window('Control Gallery', 600, 500) {
|
|
107
110
|
on_changed do |s|
|
108
111
|
v = s.value
|
109
112
|
puts "New Slider value: #{v}"
|
113
|
+
$stdout.flush # for Windows
|
110
114
|
@progress_bar.value = v
|
111
115
|
end
|
112
116
|
}
|
@@ -125,6 +129,7 @@ MAIN_WINDOW = window('Control Gallery', 600, 500) {
|
|
125
129
|
|
126
130
|
on_selected do |c|
|
127
131
|
puts "New combobox selection: #{c.selected}"
|
132
|
+
$stdout.flush # for Windows
|
128
133
|
end
|
129
134
|
}
|
130
135
|
|
@@ -147,6 +152,7 @@ MAIN_WINDOW = window('Control Gallery', 600, 500) {
|
|
147
152
|
|
148
153
|
on_changed do |e|
|
149
154
|
puts "Current textbox data: '#{e.text}'"
|
155
|
+
$stdout.flush # for Windows
|
150
156
|
end
|
151
157
|
}
|
152
158
|
}
|
data/examples/meta_example.rb
CHANGED
data/glimmer-dsl-libui.gemspec
CHANGED
Binary file
|
@@ -151,16 +151,26 @@ module Glimmer
|
|
151
151
|
end
|
152
152
|
end
|
153
153
|
unless font.nil?
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
154
|
+
if font[:family]
|
155
|
+
family_attribute = ::LibUI.new_family_attribute(font[:family])
|
156
|
+
::LibUI.attributed_string_set_attribute(@parent_proxy.attributed_string, family_attribute, @start, @start + @string.size)
|
157
|
+
end
|
158
|
+
if font[:size]
|
159
|
+
size_attribute = ::LibUI.new_size_attribute(font[:size])
|
160
|
+
::LibUI.attributed_string_set_attribute(@parent_proxy.attributed_string, size_attribute, @start, @start + @string.size)
|
161
|
+
end
|
162
|
+
if font[:weight]
|
163
|
+
weight_attribute = ::LibUI.new_weight_attribute(Glimmer::LibUI.enum_symbol_to_value(:text_weight, font[:weight]))
|
164
|
+
::LibUI.attributed_string_set_attribute(@parent_proxy.attributed_string, weight_attribute, @start, @start + @string.size)
|
165
|
+
end
|
166
|
+
if font[:italic]
|
167
|
+
italic_attribute = ::LibUI.new_italic_attribute(Glimmer::LibUI.enum_symbol_to_value(:text_italic, font[:italic]))
|
168
|
+
::LibUI.attributed_string_set_attribute(@parent_proxy.attributed_string, italic_attribute, @start, @start + @string.size)
|
169
|
+
end
|
170
|
+
if font[:stretch]
|
171
|
+
stretch_attribute = ::LibUI.new_stretch_attribute(Glimmer::LibUI.enum_symbol_to_value(:text_stretch, font[:stretch]))
|
172
|
+
::LibUI.attributed_string_set_attribute(@parent_proxy.attributed_string, stretch_attribute, @start, @start + @string.size)
|
173
|
+
end
|
164
174
|
end
|
165
175
|
unless open_type_features.nil?
|
166
176
|
open_type_features_attribute = ::LibUI.new_features_attribute(open_type_features.libui)
|
@@ -84,7 +84,7 @@ module Glimmer
|
|
84
84
|
@cell_rows = rows
|
85
85
|
@cell_rows.tap do
|
86
86
|
@last_cell_rows = array_deep_clone(@cell_rows)
|
87
|
-
Glimmer::DataBinding::Observer.proc do
|
87
|
+
Glimmer::DataBinding::Observer.proc do |new_cell_rows|
|
88
88
|
if @cell_rows.size < @last_cell_rows.size && @last_cell_rows.include_all?(*@cell_rows)
|
89
89
|
@last_cell_rows.array_diff_indexes(@cell_rows).reverse.each do |row|
|
90
90
|
::LibUI.table_model_row_deleted(model, row)
|
@@ -103,6 +103,7 @@ module Glimmer
|
|
103
103
|
end
|
104
104
|
end
|
105
105
|
end
|
106
|
+
@last_last_cell_rows = array_deep_clone(@last_cell_rows)
|
106
107
|
@last_cell_rows = array_deep_clone(@cell_rows)
|
107
108
|
end.observe(self, :cell_rows, recursive: true)
|
108
109
|
end
|
@@ -112,7 +113,11 @@ module Glimmer
|
|
112
113
|
alias set_cell_rows cell_rows
|
113
114
|
|
114
115
|
def expanded_cell_rows
|
115
|
-
cell_rows
|
116
|
+
expand(cell_rows)
|
117
|
+
end
|
118
|
+
|
119
|
+
def expand(cell_rows)
|
120
|
+
cell_rows.to_a.map do |row|
|
116
121
|
row.flatten(1)
|
117
122
|
end
|
118
123
|
end
|
@@ -146,23 +151,39 @@ module Glimmer
|
|
146
151
|
3
|
147
152
|
end
|
148
153
|
end
|
149
|
-
@model_handler.NumRows = fiddle_closure_block_caller(4)
|
154
|
+
@model_handler.NumRows = fiddle_closure_block_caller(4) do
|
155
|
+
# Note: there is a double-delete bug in Windows when performing table_model_row_deleted, which requires pre-adding and extra empty row
|
156
|
+
cell_rows.count + (OS.windows? ? 1 : 0)
|
157
|
+
end
|
150
158
|
@model_handler.CellValue = fiddle_closure_block_caller(1, [1, 1, 4, 4]) do |_, _, row, column|
|
151
159
|
the_cell_rows = expanded_cell_rows
|
152
160
|
case @columns[column]
|
153
161
|
when Column::TextColumnProxy, Column::ButtonColumnProxy, Column::TextColorColumnProxy, :text
|
154
162
|
::LibUI.new_table_value_string((expanded_cell_rows[row] && expanded_cell_rows[row][column]).to_s)
|
155
163
|
when Column::ImageColumnProxy, Column::ImageTextColumnProxy, Column::ImageTextColorColumnProxy
|
156
|
-
|
164
|
+
if OS.windows? && row == cell_rows.count
|
165
|
+
::LibUI.new_table_value_image((expanded_cell_rows[row - 1] && (expanded_cell_rows[row - 1][column].respond_to?(:libui) ? expanded_cell_rows[row - 1][column].libui : expanded_cell_rows[row - 1][column])))
|
166
|
+
else
|
167
|
+
::LibUI.new_table_value_image((expanded_cell_rows[row] && (expanded_cell_rows[row][column].respond_to?(:libui) ? expanded_cell_rows[row][column].libui : expanded_cell_rows[row][column])))
|
168
|
+
end
|
157
169
|
when Column::CheckboxColumnProxy, Column::CheckboxTextColumnProxy, Column::CheckboxTextColorColumnProxy
|
158
|
-
::LibUI.new_table_value_int((expanded_cell_rows[row] && (expanded_cell_rows[row][column] == 1 || expanded_cell_rows[row][column].to_s.strip.downcase == 'true' ? 1 : 0)))
|
170
|
+
::LibUI.new_table_value_int(((expanded_cell_rows[row] && (expanded_cell_rows[row][column] == 1 || expanded_cell_rows[row][column].to_s.strip.downcase == 'true' ? 1 : 0))) || 0)
|
159
171
|
when Column::ProgressBarColumnProxy
|
160
|
-
|
172
|
+
value = (expanded_cell_rows[row] && expanded_cell_rows[row][column]).to_i
|
173
|
+
expanded_last_last_cell_rows = expand(@last_last_cell_rows)
|
174
|
+
old_value = (expanded_last_last_cell_rows[row] && expanded_last_last_cell_rows[row][column]).to_i
|
175
|
+
if OS.windows? && old_value == -1 && value >= 0
|
176
|
+
Glimmer::Config.logger.error('Switching a progress bar value from -1 to a positive value is not supported on Windows')
|
177
|
+
cell_rows[row][column] = -1
|
178
|
+
::LibUI.new_table_value_int(old_value)
|
179
|
+
else
|
180
|
+
::LibUI.new_table_value_int((expanded_cell_rows[row] && expanded_cell_rows[row][column]).to_i)
|
181
|
+
end
|
161
182
|
when Column::BackgroundColorColumnProxy
|
162
|
-
background_color = Glimmer::LibUI.interpret_color(expanded_cell_rows[row] && expanded_cell_rows[row][column])
|
183
|
+
background_color = Glimmer::LibUI.interpret_color(expanded_cell_rows[row] && expanded_cell_rows[row][column]) || {r: 255, g: 255, b: 255}
|
163
184
|
::LibUI.new_table_value_color(background_color[:r] / 255.0, background_color[:g] / 255.0, background_color[:b] / 255.0, background_color[:a] || 1.0)
|
164
185
|
when :color
|
165
|
-
color = Glimmer::LibUI.interpret_color(expanded_cell_rows[row] && expanded_cell_rows[row][column])
|
186
|
+
color = Glimmer::LibUI.interpret_color(expanded_cell_rows[row] && expanded_cell_rows[row][column]) || {r: 0, g: 0, b: 0}
|
166
187
|
::LibUI.new_table_value_color(color[:r] / 255.0, color[:g] / 255.0, color[:b] / 255.0, color[:a] || 1.0)
|
167
188
|
end
|
168
189
|
end
|
@@ -182,7 +203,6 @@ module Glimmer
|
|
182
203
|
@cell_rows[row] ||= []
|
183
204
|
@cell_rows[row][column] = ::LibUI.table_value_int(val).to_i == 1
|
184
205
|
end
|
185
|
-
on_changed.each {|listener| listener.call(row, :changed, @cell_rows[row])}
|
186
206
|
on_edited.each {|listener| listener.call(row, @cell_rows[row])}
|
187
207
|
end
|
188
208
|
|
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.13
|
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-10-
|
11
|
+
date: 2021-10-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: glimmer
|
@@ -193,9 +193,9 @@ dependencies:
|
|
193
193
|
description: Glimmer DSL for LibUI - Prerequisite-Free Ruby Desktop Development GUI
|
194
194
|
Library (No need to pre-install any prerequisites. Just install the gem and have
|
195
195
|
platform-independent native GUI that just works! Glimmer DSL for LibUI aims to provide
|
196
|
-
declarative DSL syntax that visually maps to
|
197
|
-
|
198
|
-
|
196
|
+
declarative DSL syntax that visually maps to GUI control hierarchy, convention over
|
197
|
+
configuration via smart defaults, automation of low-level details, requiring the
|
198
|
+
least amount of syntax possible to build GUI, and custom control support.
|
199
199
|
email: andy.am@gmail.com
|
200
200
|
executables:
|
201
201
|
- girb
|
@@ -233,7 +233,7 @@ files:
|
|
233
233
|
- examples/basic_window.rb
|
234
234
|
- examples/basic_window2.rb
|
235
235
|
- examples/color_button.rb
|
236
|
-
- examples/
|
236
|
+
- examples/color_the_shapes.rb
|
237
237
|
- examples/control_gallery.rb
|
238
238
|
- examples/custom_draw_text.rb
|
239
239
|
- examples/custom_draw_text2.rb
|