glimmer-dsl-libui 0.2.12 → 0.2.13
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 +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
|
[](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)
|
@@ -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
|
-

|
5136
|
+

|
5137
|
+

|
5124
5138
|
|
5125
5139
|
Linux
|
5126
5140
|
|
5127
|
-

|
5142
|
+

|
5143
|
+

|
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
|