glimmer-dsl-libui 0.3.3 → 0.3.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -0
- data/README.md +266 -139
- data/VERSION +1 -1
- data/examples/area_gallery.rb +15 -15
- data/examples/area_gallery2.rb +36 -35
- data/examples/area_gallery3.rb +15 -15
- data/examples/area_gallery4.rb +35 -35
- data/examples/basic_area.rb +1 -3
- data/examples/basic_area2.rb +1 -3
- data/examples/basic_area3.rb +17 -0
- data/examples/basic_area4.rb +19 -0
- data/examples/basic_scrolling_area.rb +79 -0
- data/glimmer-dsl-libui.gemspec +0 -0
- data/lib/glimmer/libui/control_proxy/area_proxy/scrolling_area_proxy.rb +35 -0
- data/lib/glimmer/libui/control_proxy/window_proxy.rb +20 -0
- data/lib/glimmer/libui/shape.rb +5 -0
- metadata +4 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ca4d302e851d275aad52599a64d0fc9ee6d6414efa753b023d38aaa1bfca283d
|
4
|
+
data.tar.gz: 3185bb17a987adadc03dfaac631c89850b726e36775bacd4885a40d2bfaa3e7c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 157a6fa09dded3a1b52689dcc06effaf094f29b2d8975051b1838565720b15987e4faebdfcea9a90d67b841468f93ca8f2c9c8089b7d5d8cf81a851f408ff68f
|
7
|
+
data.tar.gz: c9b606a58e391302e760d54a227b0e6d8e9e972ce9fce8ac742fcc0b82c377a4a13d4b78f3cc19f432dff01a3cda1432954aeba4065a65ef18098e3bdff5e134
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
+
## 0.3.4
|
4
|
+
|
5
|
+
- New examples/basic_scrolling_area.rb
|
6
|
+
- Smart defaults for `scrolling_area` control + convenience `width` and `height` attributes
|
7
|
+
- Simplify examples/basic_area.rb (all versions) by nesting shapes directly under `area`
|
8
|
+
- Support `#content {}` method in `figure` to be able to reopen a `figure`'s content to add more shapes in.
|
9
|
+
|
3
10
|
## 0.3.3
|
4
11
|
|
5
12
|
- Support nesting shapes directly under `area` to represent paths having one shape, and nesting `fill`/`stroke` within the shapes (not `path`)
|
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.3.
|
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.3.4
|
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)
|
@@ -86,21 +86,6 @@ include Glimmer
|
|
86
86
|
|
87
87
|
window('Area Gallery', 400, 400) {
|
88
88
|
area {
|
89
|
-
path { # declarative stable path (explicit path syntax for multiple shapes sharing attributes)
|
90
|
-
square(0, 0, 100)
|
91
|
-
square(100, 100, 400)
|
92
|
-
|
93
|
-
fill r: 102, g: 102, b: 204
|
94
|
-
}
|
95
|
-
|
96
|
-
path { # declarative stable path (explicit path syntax for multiple shapes sharing attributes)
|
97
|
-
rectangle(0, 100, 100, 400)
|
98
|
-
rectangle(100, 0, 400, 100)
|
99
|
-
|
100
|
-
# linear gradient (has x0, y0, x1, y1, and stops)
|
101
|
-
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}]
|
102
|
-
}
|
103
|
-
|
104
89
|
polygon(100, 100, 100, 400, 400, 100, 400, 400) { # declarative stable path (implicit path syntax for a single shape nested directly under area)
|
105
90
|
fill r: 202, g: 102, b: 104, a: 0.5
|
106
91
|
stroke r: 0, g: 0, b: 0
|
@@ -129,6 +114,21 @@ window('Area Gallery', 400, 400) {
|
|
129
114
|
stroke r: 0, g: 0, b: 0, thickness: 2
|
130
115
|
}
|
131
116
|
|
117
|
+
path { # declarative stable path (explicit path syntax for multiple shapes sharing attributes)
|
118
|
+
square(0, 0, 100)
|
119
|
+
square(100, 100, 400)
|
120
|
+
|
121
|
+
fill r: 102, g: 102, b: 204
|
122
|
+
}
|
123
|
+
|
124
|
+
path { # declarative stable path (explicit path syntax for multiple shapes sharing attributes)
|
125
|
+
rectangle(0, 100, 100, 400)
|
126
|
+
rectangle(100, 0, 400, 100)
|
127
|
+
|
128
|
+
# linear gradient (has x0, y0, x1, y1, and stops)
|
129
|
+
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}]
|
130
|
+
}
|
131
|
+
|
132
132
|
text(161, 40, 100) { # declarative stable text
|
133
133
|
string('Area Gallery') {
|
134
134
|
font family: 'Arial', size: (OS.mac? ? 14 : 11)
|
@@ -222,6 +222,7 @@ Other [Glimmer](https://rubygems.org/gems/glimmer) DSL gems you might be interes
|
|
222
222
|
- [Extra Operations](#extra-operations)
|
223
223
|
- [Table API](#table-api)
|
224
224
|
- [Area API](#area-api)
|
225
|
+
- [Scrolling Area](#scrolling_area)
|
225
226
|
- [Area Path Shapes](#area-path-shapes)
|
226
227
|
- [Area Text](#area-text)
|
227
228
|
- [Area Image](#area-image)
|
@@ -261,6 +262,7 @@ Other [Glimmer](https://rubygems.org/gems/glimmer) DSL gems you might be interes
|
|
261
262
|
- [Form Table](#form-table)
|
262
263
|
- [Basic Area](#basic-area)
|
263
264
|
- [Dynamic Area](#dynamic-area)
|
265
|
+
- [Basic Scrolling Area](#basic-scrolling-area)
|
264
266
|
- [Area Gallery](#area-gallery)
|
265
267
|
- [Basic Image](#basic-image)
|
266
268
|
- [Histogram](#histogram)
|
@@ -366,7 +368,7 @@ gem install glimmer-dsl-libui
|
|
366
368
|
Or install via Bundler `Gemfile`:
|
367
369
|
|
368
370
|
```ruby
|
369
|
-
gem 'glimmer-dsl-libui', '~> 0.3.
|
371
|
+
gem 'glimmer-dsl-libui', '~> 0.3.4'
|
370
372
|
```
|
371
373
|
|
372
374
|
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.
|
@@ -493,6 +495,7 @@ Keyword(Args) | Properties | Listeners
|
|
493
495
|
`quit_menu_item` | None | `on_clicked`
|
494
496
|
`radio_buttons` | `selected` (`Integer`) | `on_selected`
|
495
497
|
`rectangle(x as Numeric, y as Numeric, width as Numeric, height as Numeric)` | `x` (`Numeric`), `y` (`Numeric`), `width` (`Numeric`), `height` (`Numeric`) | None
|
498
|
+
`scrolling_area(width = main_window.width, height = main_window.height)` | `auto_draw_enabled` (Boolean), `size` (`Array` of `width` (`Numeric`) and `height` (`Numeric`)), `width` (`Numeric`), `height` (`Numeric`) | `on_draw(area_draw_params)`, `on_mouse_event(area_mouse_event)`, `on_mouse_down(area_mouse_event)`, `on_mouse_up(area_mouse_event)`, `on_mouse_drag_started(area_mouse_event)`, `on_mouse_dragged(area_mouse_event)`, `on_mouse_dropped(area_mouse_event)`, `on_mouse_entered`, `on_mouse_exited`, `on_key_event(area_key_event)`, `on_key_down(area_key_event)`, `on_key_up(area_key_event)`
|
496
499
|
`search_entry` | `read_only` (Boolean), `text` (`String`) | `on_changed`
|
497
500
|
`separator_menu_item` | None | None
|
498
501
|
`slider(min as Numeric, max as Numeric)` | `value` (`Numeric`) | `on_changed`
|
@@ -508,7 +511,7 @@ Keyword(Args) | Properties | Listeners
|
|
508
511
|
`time_picker` | `time` (`Hash` of keys: `sec` as `Integer`, `min` as `Integer`, `hour` as `Integer`) | `on_changed`
|
509
512
|
`vertical_box` | `padded` (Boolean) | None
|
510
513
|
`vertical_separator` | None | None
|
511
|
-
`window(title as String, width as Integer, height as Integer, has_menubar as Boolean)` | `borderless` (Boolean), `content_size` (width `Numeric`, height `Numeric`), `fullscreen` (Boolean), `margined` (Boolean), `title` (`String`), `resizable` (Boolean) | `on_closing`, `on_content_size_changed`, `on_destroy`
|
514
|
+
`window(title as String, width as Integer, height as Integer, has_menubar as Boolean)` | `borderless` (Boolean), `content_size` (width `Numeric`, height `Numeric`), `width` (`Numeric`), `height` (`Numeric`), `fullscreen` (Boolean), `margined` (Boolean), `title` (`String`), `resizable` (Boolean) | `on_closing`, `on_content_size_changed`, `on_destroy`
|
512
515
|
|
513
516
|
### Common Control Properties
|
514
517
|
- `enabled` (Boolean)
|
@@ -764,6 +767,18 @@ window('Basic Area', 400, 400) {
|
|
764
767
|
|
765
768
|
Check [examples/dynamic_area.rb](#dynamic-area) for a more detailed semi-declarative example.
|
766
769
|
|
770
|
+
#### Scrolling Area
|
771
|
+
|
772
|
+
`scrolling_area(width as Numeric = main_window.width, height as Numeric = main_window.height)` is similar to `area`, but has the following additional methods:
|
773
|
+
- `scroll_to(x as Numeric, y as Numeric, width as Numeric = main_window.width, height as Numeric = main_window.height)`: scrolls to `x`/`y` location with `width` and `height` viewport size.
|
774
|
+
- `set_size(width as Numeric, height as Numeric)`: set size of scrolling area, which must must exceed that of visible viewport in order for scrolling to be enabled.
|
775
|
+
|
776
|
+
Mac |
|
777
|
+
----|
|
778
|
+
![glimmer-dsl-libui-mac-dynamic-area.png](images/glimmer-dsl-libui-mac-basic-scrolling-area.png) ![glimmer-dsl-libui-mac-dynamic-area-updated.png](images/glimmer-dsl-libui-mac-basic-scrolling-area-scrolled.png)
|
779
|
+
|
780
|
+
Check [examples/basic_scrolling_area.rb](#basic-scrolling-area) for a more detailed example.
|
781
|
+
|
767
782
|
#### Area Path Shapes
|
768
783
|
|
769
784
|
`path` can receive a `draw_fill_mode` argument that can accept values `:winding` or `:alternate` and defaults to `:winding`.
|
@@ -1026,7 +1041,7 @@ Check [Histogram](#histogram) example for use of hex colors.
|
|
1026
1041
|
|
1027
1042
|
#### Area Draw Params
|
1028
1043
|
|
1029
|
-
The `area_draw_params` argument for `on_draw` block is a hash consisting of the following keys:
|
1044
|
+
The `area_draw_params` `Hash` argument for `on_draw` block is a hash consisting of the following keys:
|
1030
1045
|
- `:context`: the drawing context object
|
1031
1046
|
- `:area_width`: area width
|
1032
1047
|
- `:area_height`: area height
|
@@ -1182,6 +1197,8 @@ Note that `area`, `path`, and nested shapes are all truly declarative, meaning t
|
|
1182
1197
|
- `image` instances are automatically freed from memory after `window` is destroyed.
|
1183
1198
|
- `image` `width` and `height` can be left off if it has one `image_part` only as they default to the same `width` and `height` of the `image_part`
|
1184
1199
|
- Automatically provide shifted `:key` characters in `area_key_event` provided in `area` key listeners `on_key_event`, `on_key_down`, and `on_key_up`
|
1200
|
+
- `scrolling_area` `width` and `height` default to main window width and height if not specified.
|
1201
|
+
- `scrolling_area` `#scroll_to` 3rd and 4th arguments (`width` and `height`) default to main window width and height if not specified.
|
1185
1202
|
- `area` paths are specified declaratively with figures underneath (e.g. `rectangle`) and `area` draw listener is automatically generated
|
1186
1203
|
- Observe figure properties (e.g. `rectangle` `width`) for changes and automatically redraw containing area accordingly
|
1187
1204
|
- Observe `path` `fill` and `stroke` hashes for changes and automatically redraw containing area accordingly
|
@@ -1352,15 +1369,13 @@ Example:
|
|
1352
1369
|
}
|
1353
1370
|
```
|
1354
1371
|
|
1355
|
-
**3 - Control property declarations always have arguments that are
|
1372
|
+
**3 - Control property declarations always have arguments that are not wrapped inside parentheses and typically do not take a block.**
|
1356
1373
|
|
1357
1374
|
Example:
|
1358
1375
|
|
1359
1376
|
```ruby
|
1360
|
-
|
1361
|
-
|
1362
|
-
value 42
|
1363
|
-
}
|
1377
|
+
stretchy false
|
1378
|
+
value 42
|
1364
1379
|
```
|
1365
1380
|
|
1366
1381
|
**4 - Control listeners are always declared starting with on_ prefix and affixing listener event method name afterwards in underscored lowercase form. Their multi-line blocks have a `do; end` style.**
|
@@ -1964,12 +1979,8 @@ class TinyMidiPlayer
|
|
1964
1979
|
|
1965
1980
|
def stop_midi
|
1966
1981
|
if @pid
|
1967
|
-
if @th.alive?
|
1968
|
-
|
1969
|
-
@pid = nil
|
1970
|
-
else
|
1971
|
-
@pid = nil
|
1972
|
-
end
|
1982
|
+
Process.kill(:SIGKILL, @pid) if @th.alive?
|
1983
|
+
@pid = nil
|
1973
1984
|
end
|
1974
1985
|
end
|
1975
1986
|
|
@@ -1995,6 +2006,20 @@ class TinyMidiPlayer
|
|
1995
2006
|
end
|
1996
2007
|
|
1997
2008
|
def create_gui
|
2009
|
+
# loop_menu = UI.new_menu('Repeat')
|
2010
|
+
# items = %w[Off One].map do |item_name|
|
2011
|
+
# item = UI.menu_append_check_item(loop_menu, item_name)
|
2012
|
+
# end
|
2013
|
+
# items.each_with_index do |item, idx|
|
2014
|
+
# UI.menu_item_on_clicked(item) do
|
2015
|
+
# @repeat = idx
|
2016
|
+
# (items - [item]).each do |i|
|
2017
|
+
# UI.menu_item_set_checked(i, 0)
|
2018
|
+
# end
|
2019
|
+
# 0
|
2020
|
+
# end
|
2021
|
+
# end
|
2022
|
+
|
1998
2023
|
help_menu = UI.new_menu('Help')
|
1999
2024
|
version_item = UI.menu_append_item(help_menu, 'Version')
|
2000
2025
|
|
@@ -2009,11 +2034,11 @@ class TinyMidiPlayer
|
|
2009
2034
|
|
2010
2035
|
UI.new_horizontal_box.tap do |hbox|
|
2011
2036
|
UI.new_vertical_box.tap do |vbox|
|
2012
|
-
UI.new_button('
|
2037
|
+
UI.new_button('▶').tap do |button1|
|
2013
2038
|
UI.button_on_clicked(button1) { play_midi }
|
2014
2039
|
UI.box_append(vbox, button1, 1)
|
2015
2040
|
end
|
2016
|
-
UI.new_button('
|
2041
|
+
UI.new_button('■').tap do |button2|
|
2017
2042
|
UI.button_on_clicked(button2) { stop_midi }
|
2018
2043
|
UI.box_append(vbox, button2, 1)
|
2019
2044
|
end
|
@@ -2107,12 +2132,12 @@ class TinyMidiPlayer
|
|
2107
2132
|
vertical_box {
|
2108
2133
|
stretchy false
|
2109
2134
|
|
2110
|
-
button('
|
2135
|
+
button('▶') {
|
2111
2136
|
on_clicked do
|
2112
2137
|
play_midi
|
2113
2138
|
end
|
2114
2139
|
}
|
2115
|
-
button('
|
2140
|
+
button('■') {
|
2116
2141
|
on_clicked do
|
2117
2142
|
stop_midi
|
2118
2143
|
end
|
@@ -4195,6 +4220,109 @@ window('Dynamic Area', 240, 600) {
|
|
4195
4220
|
}.show
|
4196
4221
|
```
|
4197
4222
|
|
4223
|
+
### Basic Scrolling Area
|
4224
|
+
|
4225
|
+
[examples/basic_scrolling_area.rb](examples/basic_scrolling_area.rb)
|
4226
|
+
|
4227
|
+
Run with this command from the root of the project if you cloned the project:
|
4228
|
+
|
4229
|
+
```
|
4230
|
+
ruby -r './lib/glimmer-dsl-libui' examples/basic_scrolling_area.rb
|
4231
|
+
```
|
4232
|
+
|
4233
|
+
Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/glimmer-dsl-libui):
|
4234
|
+
|
4235
|
+
```
|
4236
|
+
ruby -r glimmer-dsl-libui -e "require 'examples/basic_scrolling_area'"
|
4237
|
+
```
|
4238
|
+
|
4239
|
+
Mac |
|
4240
|
+
----|
|
4241
|
+
![glimmer-dsl-libui-mac-dynamic-area.png](images/glimmer-dsl-libui-mac-basic-scrolling-area.png) ![glimmer-dsl-libui-mac-dynamic-area-updated.png](images/glimmer-dsl-libui-mac-basic-scrolling-area-scrolled.png)
|
4242
|
+
|
4243
|
+
New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
|
4244
|
+
|
4245
|
+
```ruby
|
4246
|
+
require 'glimmer-dsl-libui'
|
4247
|
+
|
4248
|
+
class BasicScrollingArea
|
4249
|
+
include Glimmer
|
4250
|
+
|
4251
|
+
SCROLLING_AREA_WIDTH = 800
|
4252
|
+
SCROLLING_AREA_HEIGHT = 400
|
4253
|
+
SCROLLING_AREA_PADDING_X = 20
|
4254
|
+
SCROLLING_AREA_PADDING_Y = 20
|
4255
|
+
|
4256
|
+
def initialize
|
4257
|
+
@x = SCROLLING_AREA_PADDING_X
|
4258
|
+
@y = SCROLLING_AREA_HEIGHT - SCROLLING_AREA_PADDING_Y
|
4259
|
+
create_gui
|
4260
|
+
Glimmer::LibUI.timer(0.01) do
|
4261
|
+
@x += SCROLLING_AREA_PADDING_X
|
4262
|
+
@y = [[@y + rand(SCROLLING_AREA_PADDING_Y*4)*(rand(2) == 0 ? -1 : 1), SCROLLING_AREA_PADDING_Y].max, SCROLLING_AREA_HEIGHT - SCROLLING_AREA_PADDING_Y].min
|
4263
|
+
@graph.content { # re-open @graph's content and add a line
|
4264
|
+
line(@x, @y)
|
4265
|
+
}
|
4266
|
+
# if there is a need to enlarge scrolling area, call `@scrolling_area.set_size(new_width, new_height)`
|
4267
|
+
@scrolling_area.scroll_to(@x - (SCROLLING_AREA_WIDTH/2), @y) # 3rd and 4th arguments for width and height are assumed as those of main window by default if not supplied
|
4268
|
+
# return false to stop timer once @x exceeds scrolling area width - padding
|
4269
|
+
false if @x >= (SCROLLING_AREA_WIDTH - SCROLLING_AREA_PADDING_X*2)
|
4270
|
+
end
|
4271
|
+
end
|
4272
|
+
|
4273
|
+
def launch
|
4274
|
+
@main_window.show
|
4275
|
+
end
|
4276
|
+
|
4277
|
+
def x_axis
|
4278
|
+
polyline(SCROLLING_AREA_PADDING_X, SCROLLING_AREA_HEIGHT - SCROLLING_AREA_PADDING_Y, SCROLLING_AREA_WIDTH - SCROLLING_AREA_PADDING_X*2, SCROLLING_AREA_HEIGHT - SCROLLING_AREA_PADDING_Y) {
|
4279
|
+
stroke :black, thickness: 3
|
4280
|
+
}
|
4281
|
+
|
4282
|
+
((SCROLLING_AREA_WIDTH - SCROLLING_AREA_PADDING_X*4) / SCROLLING_AREA_PADDING_X).times do |x_multiplier|
|
4283
|
+
x = x_multiplier*SCROLLING_AREA_PADDING_X + SCROLLING_AREA_PADDING_X*2
|
4284
|
+
y = SCROLLING_AREA_HEIGHT - SCROLLING_AREA_PADDING_Y
|
4285
|
+
|
4286
|
+
polyline(x, y, x, y + SCROLLING_AREA_PADDING_Y/2) {
|
4287
|
+
stroke :black, thickness: 2
|
4288
|
+
}
|
4289
|
+
end
|
4290
|
+
end
|
4291
|
+
|
4292
|
+
def y_axis
|
4293
|
+
polyline(SCROLLING_AREA_PADDING_X, SCROLLING_AREA_PADDING_Y, SCROLLING_AREA_PADDING_X, SCROLLING_AREA_HEIGHT - SCROLLING_AREA_PADDING_Y) {
|
4294
|
+
stroke :black, thickness: 3
|
4295
|
+
}
|
4296
|
+
|
4297
|
+
((SCROLLING_AREA_HEIGHT - SCROLLING_AREA_PADDING_Y*3) / SCROLLING_AREA_PADDING_Y).times do |y_multiplier|
|
4298
|
+
x = SCROLLING_AREA_PADDING_X
|
4299
|
+
y = y_multiplier*SCROLLING_AREA_PADDING_Y + SCROLLING_AREA_PADDING_Y*2
|
4300
|
+
|
4301
|
+
polyline(x, y, x - SCROLLING_AREA_PADDING_X/2, y) {
|
4302
|
+
stroke :black, thickness: 2
|
4303
|
+
}
|
4304
|
+
end
|
4305
|
+
end
|
4306
|
+
|
4307
|
+
def create_gui
|
4308
|
+
@main_window = window('Basic Scrolling Area', SCROLLING_AREA_WIDTH / 2, SCROLLING_AREA_HEIGHT) {
|
4309
|
+
resizable false
|
4310
|
+
|
4311
|
+
@scrolling_area = scrolling_area(SCROLLING_AREA_WIDTH, SCROLLING_AREA_HEIGHT) {
|
4312
|
+
x_axis
|
4313
|
+
y_axis
|
4314
|
+
|
4315
|
+
@graph = figure(SCROLLING_AREA_PADDING_X, SCROLLING_AREA_HEIGHT - SCROLLING_AREA_PADDING_Y) {
|
4316
|
+
stroke :blue, thickness: 2
|
4317
|
+
}
|
4318
|
+
}
|
4319
|
+
}
|
4320
|
+
end
|
4321
|
+
end
|
4322
|
+
|
4323
|
+
BasicScrollingArea.new.launch
|
4324
|
+
```
|
4325
|
+
|
4198
4326
|
### Area Gallery
|
4199
4327
|
|
4200
4328
|
[examples/area_gallery.rb](examples/area_gallery.rb)
|
@@ -4224,21 +4352,6 @@ include Glimmer
|
|
4224
4352
|
|
4225
4353
|
window('Area Gallery', 400, 400) {
|
4226
4354
|
area {
|
4227
|
-
path { # declarative stable path (explicit path syntax for multiple shapes sharing attributes)
|
4228
|
-
square(0, 0, 100)
|
4229
|
-
square(100, 100, 400)
|
4230
|
-
|
4231
|
-
fill r: 102, g: 102, b: 204
|
4232
|
-
}
|
4233
|
-
|
4234
|
-
path { # declarative stable path (explicit path syntax for multiple shapes sharing attributes)
|
4235
|
-
rectangle(0, 100, 100, 400)
|
4236
|
-
rectangle(100, 0, 400, 100)
|
4237
|
-
|
4238
|
-
# linear gradient (has x0, y0, x1, y1, and stops)
|
4239
|
-
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}]
|
4240
|
-
}
|
4241
|
-
|
4242
4355
|
polygon(100, 100, 100, 400, 400, 100, 400, 400) { # declarative stable path (implicit path syntax for a single shape nested directly under area)
|
4243
4356
|
fill r: 202, g: 102, b: 104, a: 0.5
|
4244
4357
|
stroke r: 0, g: 0, b: 0
|
@@ -4267,6 +4380,21 @@ window('Area Gallery', 400, 400) {
|
|
4267
4380
|
stroke r: 0, g: 0, b: 0, thickness: 2
|
4268
4381
|
}
|
4269
4382
|
|
4383
|
+
path { # declarative stable path (explicit path syntax for multiple shapes sharing attributes)
|
4384
|
+
square(0, 0, 100)
|
4385
|
+
square(100, 100, 400)
|
4386
|
+
|
4387
|
+
fill r: 102, g: 102, b: 204
|
4388
|
+
}
|
4389
|
+
|
4390
|
+
path { # declarative stable path (explicit path syntax for multiple shapes sharing attributes)
|
4391
|
+
rectangle(0, 100, 100, 400)
|
4392
|
+
rectangle(100, 0, 400, 100)
|
4393
|
+
|
4394
|
+
# linear gradient (has x0, y0, x1, y1, and stops)
|
4395
|
+
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}]
|
4396
|
+
}
|
4397
|
+
|
4270
4398
|
text(161, 40, 100) { # declarative stable text
|
4271
4399
|
string('Area Gallery') {
|
4272
4400
|
font family: 'Arial', size: (OS.mac? ? 14 : 11)
|
@@ -4334,41 +4462,7 @@ include Glimmer
|
|
4334
4462
|
|
4335
4463
|
window('Area Gallery', 400, 400) {
|
4336
4464
|
area {
|
4337
|
-
|
4338
|
-
square {
|
4339
|
-
x 0
|
4340
|
-
y 0
|
4341
|
-
length 100
|
4342
|
-
}
|
4343
|
-
|
4344
|
-
square {
|
4345
|
-
x 100
|
4346
|
-
y 100
|
4347
|
-
length 400
|
4348
|
-
}
|
4349
|
-
|
4350
|
-
fill r: 102, g: 102, b: 204
|
4351
|
-
}
|
4352
|
-
|
4353
|
-
path { # declarative stable path with explicit attributes (explicit path syntax for multiple shapes sharing attributes)
|
4354
|
-
rectangle {
|
4355
|
-
x 0
|
4356
|
-
y 100
|
4357
|
-
width 100
|
4358
|
-
height 400
|
4359
|
-
}
|
4360
|
-
|
4361
|
-
rectangle {
|
4362
|
-
x 100
|
4363
|
-
y 0
|
4364
|
-
width 400
|
4365
|
-
height 100
|
4366
|
-
}
|
4367
|
-
|
4368
|
-
# linear gradient (has x0, y0, x1, y1, and stops)
|
4369
|
-
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}]
|
4370
|
-
}
|
4371
|
-
|
4465
|
+
|
4372
4466
|
figure { # declarative stable path with explicit attributes (implicit path syntax for a single shape nested directly under area)
|
4373
4467
|
x 100
|
4374
4468
|
y 100
|
@@ -4475,6 +4569,41 @@ window('Area Gallery', 400, 400) {
|
|
4475
4569
|
stroke r: 0, g: 0, b: 0, thickness: 2
|
4476
4570
|
}
|
4477
4571
|
|
4572
|
+
path { # declarative stable path with explicit attributes (explicit path syntax for multiple shapes sharing attributes)
|
4573
|
+
square {
|
4574
|
+
x 0
|
4575
|
+
y 0
|
4576
|
+
length 100
|
4577
|
+
}
|
4578
|
+
|
4579
|
+
square {
|
4580
|
+
x 100
|
4581
|
+
y 100
|
4582
|
+
length 400
|
4583
|
+
}
|
4584
|
+
|
4585
|
+
fill r: 102, g: 102, b: 204
|
4586
|
+
}
|
4587
|
+
|
4588
|
+
path { # declarative stable path with explicit attributes (explicit path syntax for multiple shapes sharing attributes)
|
4589
|
+
rectangle {
|
4590
|
+
x 0
|
4591
|
+
y 100
|
4592
|
+
width 100
|
4593
|
+
height 400
|
4594
|
+
}
|
4595
|
+
|
4596
|
+
rectangle {
|
4597
|
+
x 100
|
4598
|
+
y 0
|
4599
|
+
width 400
|
4600
|
+
height 100
|
4601
|
+
}
|
4602
|
+
|
4603
|
+
# linear gradient (has x0, y0, x1, y1, and stops)
|
4604
|
+
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}]
|
4605
|
+
}
|
4606
|
+
|
4478
4607
|
text { # declarative stable text with explicit attributes
|
4479
4608
|
x 161
|
4480
4609
|
y 40
|
@@ -4549,21 +4678,6 @@ include Glimmer
|
|
4549
4678
|
window('Area Gallery', 400, 400) {
|
4550
4679
|
area {
|
4551
4680
|
on_draw do |area_draw_params|
|
4552
|
-
path { # dynamic path, added semi-declaratively inside on_draw block
|
4553
|
-
square(0, 0, 100)
|
4554
|
-
square(100, 100, 400)
|
4555
|
-
|
4556
|
-
fill r: 102, g: 102, b: 204
|
4557
|
-
}
|
4558
|
-
|
4559
|
-
path { # dynamic path, added semi-declaratively inside on_draw block
|
4560
|
-
rectangle(0, 100, 100, 400)
|
4561
|
-
rectangle(100, 0, 400, 100)
|
4562
|
-
|
4563
|
-
# linear gradient (has x0, y0, x1, y1, and stops)
|
4564
|
-
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}]
|
4565
|
-
}
|
4566
|
-
|
4567
4681
|
polygon(100, 100, 100, 400, 400, 100, 400, 400) { # dynamic path, added semi-declaratively inside on_draw block
|
4568
4682
|
fill r: 202, g: 102, b: 104, a: 0.5
|
4569
4683
|
stroke r: 0, g: 0, b: 0
|
@@ -4592,6 +4706,21 @@ window('Area Gallery', 400, 400) {
|
|
4592
4706
|
stroke r: 0, g: 0, b: 0, thickness: 2
|
4593
4707
|
}
|
4594
4708
|
|
4709
|
+
path { # dynamic path, added semi-declaratively inside on_draw block
|
4710
|
+
square(0, 0, 100)
|
4711
|
+
square(100, 100, 400)
|
4712
|
+
|
4713
|
+
fill r: 102, g: 102, b: 204
|
4714
|
+
}
|
4715
|
+
|
4716
|
+
path { # dynamic path, added semi-declaratively inside on_draw block
|
4717
|
+
rectangle(0, 100, 100, 400)
|
4718
|
+
rectangle(100, 0, 400, 100)
|
4719
|
+
|
4720
|
+
# linear gradient (has x0, y0, x1, y1, and stops)
|
4721
|
+
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}]
|
4722
|
+
}
|
4723
|
+
|
4595
4724
|
text(161, 40, 100) { # dynamic text added semi-declaratively inside on_draw block
|
4596
4725
|
string('Area Gallery') {
|
4597
4726
|
font family: 'Arial', size: (OS.mac? ? 14 : 11)
|
@@ -4661,41 +4790,6 @@ include Glimmer
|
|
4661
4790
|
window('Area Gallery', 400, 400) {
|
4662
4791
|
area {
|
4663
4792
|
on_draw do |area_draw_params|
|
4664
|
-
path { # dynamic path, added semi-declaratively inside on_draw block
|
4665
|
-
square {
|
4666
|
-
x 0
|
4667
|
-
y 0
|
4668
|
-
length 100
|
4669
|
-
}
|
4670
|
-
|
4671
|
-
square {
|
4672
|
-
x 100
|
4673
|
-
y 100
|
4674
|
-
length 400
|
4675
|
-
}
|
4676
|
-
|
4677
|
-
fill r: 102, g: 102, b: 204
|
4678
|
-
}
|
4679
|
-
|
4680
|
-
path { # dynamic path, added semi-declaratively inside on_draw block
|
4681
|
-
rectangle {
|
4682
|
-
x 0
|
4683
|
-
y 100
|
4684
|
-
width 100
|
4685
|
-
height 400
|
4686
|
-
}
|
4687
|
-
|
4688
|
-
rectangle {
|
4689
|
-
x 100
|
4690
|
-
y 0
|
4691
|
-
width 400
|
4692
|
-
height 100
|
4693
|
-
}
|
4694
|
-
|
4695
|
-
# linear gradient (has x0, y0, x1, y1, and stops)
|
4696
|
-
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}]
|
4697
|
-
}
|
4698
|
-
|
4699
4793
|
figure { # dynamic path, added semi-declaratively inside on_draw block
|
4700
4794
|
x 100
|
4701
4795
|
y 100
|
@@ -4802,6 +4896,41 @@ window('Area Gallery', 400, 400) {
|
|
4802
4896
|
stroke r: 0, g: 0, b: 0, thickness: 2
|
4803
4897
|
}
|
4804
4898
|
|
4899
|
+
path { # dynamic path, added semi-declaratively inside on_draw block
|
4900
|
+
square {
|
4901
|
+
x 0
|
4902
|
+
y 0
|
4903
|
+
length 100
|
4904
|
+
}
|
4905
|
+
|
4906
|
+
square {
|
4907
|
+
x 100
|
4908
|
+
y 100
|
4909
|
+
length 400
|
4910
|
+
}
|
4911
|
+
|
4912
|
+
fill r: 102, g: 102, b: 204
|
4913
|
+
}
|
4914
|
+
|
4915
|
+
path { # dynamic path, added semi-declaratively inside on_draw block
|
4916
|
+
rectangle {
|
4917
|
+
x 0
|
4918
|
+
y 100
|
4919
|
+
width 100
|
4920
|
+
height 400
|
4921
|
+
}
|
4922
|
+
|
4923
|
+
rectangle {
|
4924
|
+
x 100
|
4925
|
+
y 0
|
4926
|
+
width 400
|
4927
|
+
height 100
|
4928
|
+
}
|
4929
|
+
|
4930
|
+
# linear gradient (has x0, y0, x1, y1, and stops)
|
4931
|
+
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}]
|
4932
|
+
}
|
4933
|
+
|
4805
4934
|
text { # dynamic path, added semi-declaratively inside on_draw block
|
4806
4935
|
x 161
|
4807
4936
|
y 40
|
@@ -7128,7 +7257,7 @@ class Snake
|
|
7128
7257
|
Glimmer::DataBinding::Observer.proc do |game_over|
|
7129
7258
|
Glimmer::LibUI.queue_main do
|
7130
7259
|
if game_over
|
7131
|
-
msg_box('Game Over!', "Score: #{@game.score}")
|
7260
|
+
msg_box('Game Over!', "Score: #{@game.score} | High Score: #{@game.high_score}")
|
7132
7261
|
@game.start
|
7133
7262
|
end
|
7134
7263
|
end
|
@@ -7137,7 +7266,7 @@ class Snake
|
|
7137
7266
|
Glimmer::LibUI.timer(SNAKE_MOVE_DELAY) do
|
7138
7267
|
unless @game.over?
|
7139
7268
|
@game.snake.move
|
7140
|
-
@main_window.title = "Glimmer Snake (Score: #{@game.score})"
|
7269
|
+
@main_window.title = "Glimmer Snake (Score: #{@game.score} | High Score: #{@game.high_score})"
|
7141
7270
|
end
|
7142
7271
|
end
|
7143
7272
|
end
|
@@ -7157,9 +7286,7 @@ class Snake
|
|
7157
7286
|
|
7158
7287
|
@game.width.times do |column|
|
7159
7288
|
area {
|
7160
|
-
@cell_grid.last <<
|
7161
|
-
square(0, 0, CELL_SIZE)
|
7162
|
-
|
7289
|
+
@cell_grid.last << square(0, 0, CELL_SIZE) {
|
7163
7290
|
fill Presenter::Cell::COLOR_CLEAR
|
7164
7291
|
}
|
7165
7292
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.4
|
data/examples/area_gallery.rb
CHANGED
@@ -4,21 +4,6 @@ include Glimmer
|
|
4
4
|
|
5
5
|
window('Area Gallery', 400, 400) {
|
6
6
|
area {
|
7
|
-
path { # declarative stable path (explicit path syntax for multiple shapes sharing attributes)
|
8
|
-
square(0, 0, 100)
|
9
|
-
square(100, 100, 400)
|
10
|
-
|
11
|
-
fill r: 102, g: 102, b: 204
|
12
|
-
}
|
13
|
-
|
14
|
-
path { # declarative stable path (explicit path syntax for multiple shapes sharing attributes)
|
15
|
-
rectangle(0, 100, 100, 400)
|
16
|
-
rectangle(100, 0, 400, 100)
|
17
|
-
|
18
|
-
# linear gradient (has x0, y0, x1, y1, and stops)
|
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
|
-
}
|
21
|
-
|
22
7
|
polygon(100, 100, 100, 400, 400, 100, 400, 400) { # declarative stable path (implicit path syntax for a single shape nested directly under area)
|
23
8
|
fill r: 202, g: 102, b: 104, a: 0.5
|
24
9
|
stroke r: 0, g: 0, b: 0
|
@@ -47,6 +32,21 @@ window('Area Gallery', 400, 400) {
|
|
47
32
|
stroke r: 0, g: 0, b: 0, thickness: 2
|
48
33
|
}
|
49
34
|
|
35
|
+
path { # declarative stable path (explicit path syntax for multiple shapes sharing attributes)
|
36
|
+
square(0, 0, 100)
|
37
|
+
square(100, 100, 400)
|
38
|
+
|
39
|
+
fill r: 102, g: 102, b: 204
|
40
|
+
}
|
41
|
+
|
42
|
+
path { # declarative stable path (explicit path syntax for multiple shapes sharing attributes)
|
43
|
+
rectangle(0, 100, 100, 400)
|
44
|
+
rectangle(100, 0, 400, 100)
|
45
|
+
|
46
|
+
# linear gradient (has x0, y0, x1, y1, and stops)
|
47
|
+
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}]
|
48
|
+
}
|
49
|
+
|
50
50
|
text(161, 40, 100) { # declarative stable text
|
51
51
|
string('Area Gallery') {
|
52
52
|
font family: 'Arial', size: (OS.mac? ? 14 : 11)
|
data/examples/area_gallery2.rb
CHANGED
@@ -4,41 +4,7 @@ include Glimmer
|
|
4
4
|
|
5
5
|
window('Area Gallery', 400, 400) {
|
6
6
|
area {
|
7
|
-
|
8
|
-
square {
|
9
|
-
x 0
|
10
|
-
y 0
|
11
|
-
length 100
|
12
|
-
}
|
13
|
-
|
14
|
-
square {
|
15
|
-
x 100
|
16
|
-
y 100
|
17
|
-
length 400
|
18
|
-
}
|
19
|
-
|
20
|
-
fill r: 102, g: 102, b: 204
|
21
|
-
}
|
22
|
-
|
23
|
-
path { # declarative stable path with explicit attributes (explicit path syntax for multiple shapes sharing attributes)
|
24
|
-
rectangle {
|
25
|
-
x 0
|
26
|
-
y 100
|
27
|
-
width 100
|
28
|
-
height 400
|
29
|
-
}
|
30
|
-
|
31
|
-
rectangle {
|
32
|
-
x 100
|
33
|
-
y 0
|
34
|
-
width 400
|
35
|
-
height 100
|
36
|
-
}
|
37
|
-
|
38
|
-
# linear gradient (has x0, y0, x1, y1, and stops)
|
39
|
-
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}]
|
40
|
-
}
|
41
|
-
|
7
|
+
|
42
8
|
figure { # declarative stable path with explicit attributes (implicit path syntax for a single shape nested directly under area)
|
43
9
|
x 100
|
44
10
|
y 100
|
@@ -145,6 +111,41 @@ window('Area Gallery', 400, 400) {
|
|
145
111
|
stroke r: 0, g: 0, b: 0, thickness: 2
|
146
112
|
}
|
147
113
|
|
114
|
+
path { # declarative stable path with explicit attributes (explicit path syntax for multiple shapes sharing attributes)
|
115
|
+
square {
|
116
|
+
x 0
|
117
|
+
y 0
|
118
|
+
length 100
|
119
|
+
}
|
120
|
+
|
121
|
+
square {
|
122
|
+
x 100
|
123
|
+
y 100
|
124
|
+
length 400
|
125
|
+
}
|
126
|
+
|
127
|
+
fill r: 102, g: 102, b: 204
|
128
|
+
}
|
129
|
+
|
130
|
+
path { # declarative stable path with explicit attributes (explicit path syntax for multiple shapes sharing attributes)
|
131
|
+
rectangle {
|
132
|
+
x 0
|
133
|
+
y 100
|
134
|
+
width 100
|
135
|
+
height 400
|
136
|
+
}
|
137
|
+
|
138
|
+
rectangle {
|
139
|
+
x 100
|
140
|
+
y 0
|
141
|
+
width 400
|
142
|
+
height 100
|
143
|
+
}
|
144
|
+
|
145
|
+
# linear gradient (has x0, y0, x1, y1, and stops)
|
146
|
+
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}]
|
147
|
+
}
|
148
|
+
|
148
149
|
text { # declarative stable text with explicit attributes
|
149
150
|
x 161
|
150
151
|
y 40
|
data/examples/area_gallery3.rb
CHANGED
@@ -5,21 +5,6 @@ include Glimmer
|
|
5
5
|
window('Area Gallery', 400, 400) {
|
6
6
|
area {
|
7
7
|
on_draw do |area_draw_params|
|
8
|
-
path { # dynamic path, added semi-declaratively inside on_draw block
|
9
|
-
square(0, 0, 100)
|
10
|
-
square(100, 100, 400)
|
11
|
-
|
12
|
-
fill r: 102, g: 102, b: 204
|
13
|
-
}
|
14
|
-
|
15
|
-
path { # dynamic path, added semi-declaratively inside on_draw block
|
16
|
-
rectangle(0, 100, 100, 400)
|
17
|
-
rectangle(100, 0, 400, 100)
|
18
|
-
|
19
|
-
# linear gradient (has x0, y0, x1, y1, and stops)
|
20
|
-
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}]
|
21
|
-
}
|
22
|
-
|
23
8
|
polygon(100, 100, 100, 400, 400, 100, 400, 400) { # dynamic path, added semi-declaratively inside on_draw block
|
24
9
|
fill r: 202, g: 102, b: 104, a: 0.5
|
25
10
|
stroke r: 0, g: 0, b: 0
|
@@ -48,6 +33,21 @@ window('Area Gallery', 400, 400) {
|
|
48
33
|
stroke r: 0, g: 0, b: 0, thickness: 2
|
49
34
|
}
|
50
35
|
|
36
|
+
path { # dynamic path, added semi-declaratively inside on_draw block
|
37
|
+
square(0, 0, 100)
|
38
|
+
square(100, 100, 400)
|
39
|
+
|
40
|
+
fill r: 102, g: 102, b: 204
|
41
|
+
}
|
42
|
+
|
43
|
+
path { # dynamic path, added semi-declaratively inside on_draw block
|
44
|
+
rectangle(0, 100, 100, 400)
|
45
|
+
rectangle(100, 0, 400, 100)
|
46
|
+
|
47
|
+
# linear gradient (has x0, y0, x1, y1, and stops)
|
48
|
+
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}]
|
49
|
+
}
|
50
|
+
|
51
51
|
text(161, 40, 100) { # dynamic text added semi-declaratively inside on_draw block
|
52
52
|
string('Area Gallery') {
|
53
53
|
font family: 'Arial', size: (OS.mac? ? 14 : 11)
|
data/examples/area_gallery4.rb
CHANGED
@@ -5,41 +5,6 @@ include Glimmer
|
|
5
5
|
window('Area Gallery', 400, 400) {
|
6
6
|
area {
|
7
7
|
on_draw do |area_draw_params|
|
8
|
-
path { # dynamic path, added semi-declaratively inside on_draw block
|
9
|
-
square {
|
10
|
-
x 0
|
11
|
-
y 0
|
12
|
-
length 100
|
13
|
-
}
|
14
|
-
|
15
|
-
square {
|
16
|
-
x 100
|
17
|
-
y 100
|
18
|
-
length 400
|
19
|
-
}
|
20
|
-
|
21
|
-
fill r: 102, g: 102, b: 204
|
22
|
-
}
|
23
|
-
|
24
|
-
path { # dynamic path, added semi-declaratively inside on_draw block
|
25
|
-
rectangle {
|
26
|
-
x 0
|
27
|
-
y 100
|
28
|
-
width 100
|
29
|
-
height 400
|
30
|
-
}
|
31
|
-
|
32
|
-
rectangle {
|
33
|
-
x 100
|
34
|
-
y 0
|
35
|
-
width 400
|
36
|
-
height 100
|
37
|
-
}
|
38
|
-
|
39
|
-
# linear gradient (has x0, y0, x1, y1, and stops)
|
40
|
-
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}]
|
41
|
-
}
|
42
|
-
|
43
8
|
figure { # dynamic path, added semi-declaratively inside on_draw block
|
44
9
|
x 100
|
45
10
|
y 100
|
@@ -146,6 +111,41 @@ window('Area Gallery', 400, 400) {
|
|
146
111
|
stroke r: 0, g: 0, b: 0, thickness: 2
|
147
112
|
}
|
148
113
|
|
114
|
+
path { # dynamic path, added semi-declaratively inside on_draw block
|
115
|
+
square {
|
116
|
+
x 0
|
117
|
+
y 0
|
118
|
+
length 100
|
119
|
+
}
|
120
|
+
|
121
|
+
square {
|
122
|
+
x 100
|
123
|
+
y 100
|
124
|
+
length 400
|
125
|
+
}
|
126
|
+
|
127
|
+
fill r: 102, g: 102, b: 204
|
128
|
+
}
|
129
|
+
|
130
|
+
path { # dynamic path, added semi-declaratively inside on_draw block
|
131
|
+
rectangle {
|
132
|
+
x 0
|
133
|
+
y 100
|
134
|
+
width 100
|
135
|
+
height 400
|
136
|
+
}
|
137
|
+
|
138
|
+
rectangle {
|
139
|
+
x 100
|
140
|
+
y 0
|
141
|
+
width 400
|
142
|
+
height 100
|
143
|
+
}
|
144
|
+
|
145
|
+
# linear gradient (has x0, y0, x1, y1, and stops)
|
146
|
+
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}]
|
147
|
+
}
|
148
|
+
|
149
149
|
text { # dynamic path, added semi-declaratively inside on_draw block
|
150
150
|
x 161
|
151
151
|
y 40
|
data/examples/basic_area.rb
CHANGED
@@ -7,9 +7,7 @@ window('Basic Area', 400, 400) {
|
|
7
7
|
|
8
8
|
vertical_box {
|
9
9
|
area {
|
10
|
-
|
11
|
-
rectangle(0, 0, 400, 400)
|
12
|
-
|
10
|
+
rectangle(0, 0, 400, 400) { # stable implicit path shape, added declaratively
|
13
11
|
fill r: 102, g: 102, b: 204, a: 1.0
|
14
12
|
}
|
15
13
|
}
|
data/examples/basic_area2.rb
CHANGED
@@ -8,9 +8,7 @@ window('Basic Area', 400, 400) {
|
|
8
8
|
vertical_box {
|
9
9
|
area {
|
10
10
|
on_draw do |area_draw_params|
|
11
|
-
|
12
|
-
rectangle(0, 0, 400, 400)
|
13
|
-
|
11
|
+
rectangle(0, 0, 400, 400) { # dynamic implicit path shape, added semi-declaratively inside on_draw block
|
14
12
|
fill r: 102, g: 102, b: 204, a: 1.0
|
15
13
|
}
|
16
14
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'glimmer-dsl-libui'
|
2
|
+
|
3
|
+
include Glimmer
|
4
|
+
|
5
|
+
window('Basic Area', 400, 400) {
|
6
|
+
margined true
|
7
|
+
|
8
|
+
vertical_box {
|
9
|
+
area {
|
10
|
+
path { # stable path, added declaratively
|
11
|
+
rectangle(0, 0, 400, 400)
|
12
|
+
|
13
|
+
fill r: 102, g: 102, b: 204, a: 1.0
|
14
|
+
}
|
15
|
+
}
|
16
|
+
}
|
17
|
+
}.show
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'glimmer-dsl-libui'
|
2
|
+
|
3
|
+
include Glimmer
|
4
|
+
|
5
|
+
window('Basic Area', 400, 400) {
|
6
|
+
margined true
|
7
|
+
|
8
|
+
vertical_box {
|
9
|
+
area {
|
10
|
+
on_draw do |area_draw_params|
|
11
|
+
path { # dynamic path, added semi-declaratively inside on_draw block
|
12
|
+
rectangle(0, 0, 400, 400)
|
13
|
+
|
14
|
+
fill r: 102, g: 102, b: 204, a: 1.0
|
15
|
+
}
|
16
|
+
end
|
17
|
+
}
|
18
|
+
}
|
19
|
+
}.show
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'glimmer-dsl-libui'
|
2
|
+
|
3
|
+
class BasicScrollingArea
|
4
|
+
include Glimmer
|
5
|
+
|
6
|
+
SCROLLING_AREA_WIDTH = 800
|
7
|
+
SCROLLING_AREA_HEIGHT = 400
|
8
|
+
SCROLLING_AREA_PADDING_X = 20
|
9
|
+
SCROLLING_AREA_PADDING_Y = 20
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@x = SCROLLING_AREA_PADDING_X
|
13
|
+
@y = SCROLLING_AREA_HEIGHT - SCROLLING_AREA_PADDING_Y
|
14
|
+
create_gui
|
15
|
+
Glimmer::LibUI.timer(0.01) do
|
16
|
+
@x += SCROLLING_AREA_PADDING_X
|
17
|
+
@y = [[@y + rand(SCROLLING_AREA_PADDING_Y*4)*(rand(2) == 0 ? -1 : 1), SCROLLING_AREA_PADDING_Y].max, SCROLLING_AREA_HEIGHT - SCROLLING_AREA_PADDING_Y].min
|
18
|
+
@graph.content { # re-open @graph's content and add a line
|
19
|
+
line(@x, @y)
|
20
|
+
}
|
21
|
+
# if there is a need to enlarge scrolling area, call `@scrolling_area.set_size(new_width, new_height)`
|
22
|
+
# Note that `#scroll_to` does not seem to work on Linux, but normal scrolling does.
|
23
|
+
@scrolling_area.scroll_to(@x - (SCROLLING_AREA_WIDTH/2), @y) # 3rd and 4th arguments for width and height are assumed as those of main window by default if not supplied
|
24
|
+
# return false to stop timer once @x exceeds scrolling area width - padding
|
25
|
+
false if @x >= (SCROLLING_AREA_WIDTH - SCROLLING_AREA_PADDING_X*2)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def launch
|
30
|
+
@main_window.show
|
31
|
+
end
|
32
|
+
|
33
|
+
def x_axis
|
34
|
+
polyline(SCROLLING_AREA_PADDING_X, SCROLLING_AREA_HEIGHT - SCROLLING_AREA_PADDING_Y, SCROLLING_AREA_WIDTH - SCROLLING_AREA_PADDING_X*2, SCROLLING_AREA_HEIGHT - SCROLLING_AREA_PADDING_Y) {
|
35
|
+
stroke :black, thickness: 3
|
36
|
+
}
|
37
|
+
|
38
|
+
((SCROLLING_AREA_WIDTH - SCROLLING_AREA_PADDING_X*4) / SCROLLING_AREA_PADDING_X).times do |x_multiplier|
|
39
|
+
x = x_multiplier*SCROLLING_AREA_PADDING_X + SCROLLING_AREA_PADDING_X*2
|
40
|
+
y = SCROLLING_AREA_HEIGHT - SCROLLING_AREA_PADDING_Y
|
41
|
+
|
42
|
+
polyline(x, y, x, y + SCROLLING_AREA_PADDING_Y/2) {
|
43
|
+
stroke :black, thickness: 2
|
44
|
+
}
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def y_axis
|
49
|
+
polyline(SCROLLING_AREA_PADDING_X, SCROLLING_AREA_PADDING_Y, SCROLLING_AREA_PADDING_X, SCROLLING_AREA_HEIGHT - SCROLLING_AREA_PADDING_Y) {
|
50
|
+
stroke :black, thickness: 3
|
51
|
+
}
|
52
|
+
|
53
|
+
((SCROLLING_AREA_HEIGHT - SCROLLING_AREA_PADDING_Y*3) / SCROLLING_AREA_PADDING_Y).times do |y_multiplier|
|
54
|
+
x = SCROLLING_AREA_PADDING_X
|
55
|
+
y = y_multiplier*SCROLLING_AREA_PADDING_Y + SCROLLING_AREA_PADDING_Y*2
|
56
|
+
|
57
|
+
polyline(x, y, x - SCROLLING_AREA_PADDING_X/2, y) {
|
58
|
+
stroke :black, thickness: 2
|
59
|
+
}
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def create_gui
|
64
|
+
@main_window = window('Basic Scrolling Area', SCROLLING_AREA_WIDTH / 2, SCROLLING_AREA_HEIGHT) {
|
65
|
+
resizable false
|
66
|
+
|
67
|
+
@scrolling_area = scrolling_area(SCROLLING_AREA_WIDTH, SCROLLING_AREA_HEIGHT) { # double width of window enables horizontal scrolling
|
68
|
+
x_axis
|
69
|
+
y_axis
|
70
|
+
|
71
|
+
@graph = figure(SCROLLING_AREA_PADDING_X, SCROLLING_AREA_HEIGHT - SCROLLING_AREA_PADDING_Y) {
|
72
|
+
stroke :blue, thickness: 2
|
73
|
+
}
|
74
|
+
}
|
75
|
+
}
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
BasicScrollingArea.new.launch
|
data/glimmer-dsl-libui.gemspec
CHANGED
Binary file
|
@@ -31,8 +31,43 @@ module Glimmer
|
|
31
31
|
class ScrollingAreaProxy < AreaProxy
|
32
32
|
def build_control
|
33
33
|
@area_handler = ::LibUI::FFI::AreaHandler.malloc
|
34
|
+
@args[0] ||= Glimmer::LibUI::ControlProxy.main_window_proxy.width
|
35
|
+
@args[1] ||= Glimmer::LibUI::ControlProxy.main_window_proxy.height
|
34
36
|
@libui = ::LibUI.new_scrolling_area(@area_handler, *@args)
|
35
37
|
end
|
38
|
+
|
39
|
+
def width(value = nil)
|
40
|
+
if value.nil?
|
41
|
+
@args[0]
|
42
|
+
else
|
43
|
+
@args[0] = value
|
44
|
+
set_size(width, height)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
alias width= width
|
48
|
+
alias set_width width
|
49
|
+
|
50
|
+
def height(value = nil)
|
51
|
+
if value.nil?
|
52
|
+
@args[1]
|
53
|
+
else
|
54
|
+
@args[1] = value
|
55
|
+
set_size(width, height)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
alias height= height
|
59
|
+
alias set_height height
|
60
|
+
|
61
|
+
def set_size(width, height)
|
62
|
+
@args[0] = width
|
63
|
+
@args[1] = height
|
64
|
+
super(width, height)
|
65
|
+
end
|
66
|
+
|
67
|
+
def scroll_to(scroll_x, scroll_y, scroll_width = nil, scroll_height = nil)
|
68
|
+
scroll_width, scroll_height = Glimmer::LibUI::ControlProxy.main_window_proxy.content_size
|
69
|
+
super(scroll_x, scroll_y, scroll_width, scroll_height)
|
70
|
+
end
|
36
71
|
end
|
37
72
|
end
|
38
73
|
end
|
@@ -113,6 +113,26 @@ module Glimmer
|
|
113
113
|
alias content_size= content_size
|
114
114
|
alias set_content_size content_size
|
115
115
|
|
116
|
+
def width(value = nil)
|
117
|
+
if value.nil?
|
118
|
+
content_size.first
|
119
|
+
else
|
120
|
+
set_content_size(value, height)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
alias width= width
|
124
|
+
alias set_width width
|
125
|
+
|
126
|
+
def height(value = nil)
|
127
|
+
if value.nil?
|
128
|
+
content_size.last
|
129
|
+
else
|
130
|
+
set_content_size(width, value)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
alias height= height
|
134
|
+
alias set_height height
|
135
|
+
|
116
136
|
def resizable(value = nil)
|
117
137
|
if value.nil?
|
118
138
|
@resizable = true if @resizable.nil?
|
data/lib/glimmer/libui/shape.rb
CHANGED
@@ -91,6 +91,11 @@ module Glimmer
|
|
91
91
|
end
|
92
92
|
end
|
93
93
|
|
94
|
+
def content(&block)
|
95
|
+
Glimmer::DSL::Engine.add_content(self, Glimmer::DSL::Libui::ShapeExpression.new, @keyword, &block)
|
96
|
+
request_auto_redraw
|
97
|
+
end
|
98
|
+
|
94
99
|
# Subclasses must override to perform draw work and call super afterwards to ensure calling destroy when semi-declarative in an on_draw method
|
95
100
|
def draw(area_draw_params)
|
96
101
|
destroy if area_proxy.nil?
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: glimmer-dsl-libui
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andy Maleh
|
@@ -217,6 +217,8 @@ files:
|
|
217
217
|
- examples/area_gallery4.rb
|
218
218
|
- examples/basic_area.rb
|
219
219
|
- examples/basic_area2.rb
|
220
|
+
- examples/basic_area3.rb
|
221
|
+
- examples/basic_area4.rb
|
220
222
|
- examples/basic_button.rb
|
221
223
|
- examples/basic_draw_text.rb
|
222
224
|
- examples/basic_draw_text2.rb
|
@@ -226,6 +228,7 @@ files:
|
|
226
228
|
- examples/basic_image3.rb
|
227
229
|
- examples/basic_image4.rb
|
228
230
|
- examples/basic_image5.rb
|
231
|
+
- examples/basic_scrolling_area.rb
|
229
232
|
- examples/basic_table.rb
|
230
233
|
- examples/basic_table_button.rb
|
231
234
|
- examples/basic_table_checkbox.rb
|