glimmer-dsl-libui 0.0.7 → 0.0.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +28 -0
- data/README.md +324 -68
- data/VERSION +1 -1
- data/examples/basic_button.rb +1 -1
- data/examples/basic_entry.rb +3 -3
- data/examples/basic_window.rb +1 -1
- data/examples/basic_window2.rb +14 -0
- data/examples/color_button.rb +14 -0
- data/examples/control_gallery.rb +20 -20
- data/examples/font_button.rb +18 -0
- data/examples/meta_example.rb +57 -0
- data/examples/midi_player.rb +2 -2
- data/examples/simple_notepad.rb +1 -1
- data/glimmer-dsl-libui.gemspec +0 -0
- data/lib/glimmer/libui/box.rb +15 -3
- data/lib/glimmer/libui/color_button_proxy.rb +64 -0
- data/lib/glimmer/libui/control_proxy.rb +86 -25
- data/lib/glimmer/libui/date_picker_proxy.rb +32 -0
- data/lib/glimmer/libui/date_time_picker_proxy.rb +35 -0
- data/lib/glimmer/libui/font_button_proxy.rb +68 -0
- data/lib/glimmer/libui/group_proxy.rb +6 -1
- data/lib/glimmer/libui/tab_item_proxy.rb +1 -0
- data/lib/glimmer/libui/time_picker_proxy.rb +32 -0
- data/lib/glimmer/libui/window_proxy.rb +23 -2
- data/lib/glimmer-dsl-libui.rb +1 -0
- metadata +34 -5
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.0.
|
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.0.11
|
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
|
[![Maintainability](https://api.codeclimate.com/v1/badges/ce2853efdbecf6ebdc73/maintainability)](https://codeclimate.com/github/AndyObtiva/glimmer-dsl-libui/maintainability)
|
@@ -6,18 +6,18 @@
|
|
6
6
|
|
7
7
|
[Glimmer](https://github.com/AndyObtiva/glimmer) DSL for [LibUI](https://github.com/kojix2/LibUI) is a prerequisite-free Ruby desktop development GUI library. No need to pre-install any prerequisites. Just install the gem and have platform-independent native GUI that just works!
|
8
8
|
|
9
|
-
[LibUI](https://github.com/kojix2/LibUI) is a thin [Ruby](https://www.ruby-lang.org/en/) wrapper around [libui](https://github.com/andlabs/libui), a relatively new C GUI library that renders native
|
9
|
+
[LibUI](https://github.com/kojix2/LibUI) is a thin [Ruby](https://www.ruby-lang.org/en/) wrapper around [libui](https://github.com/andlabs/libui), a relatively new C GUI library that renders native controls on every platform (similar to [SWT](https://www.eclipse.org/swt/), but without the heavy weight of the [Java Virtual Machine](https://www.java.com/en/)).
|
10
10
|
|
11
11
|
The main trade-off in using [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) as opposed to [Glimmer DSL for SWT](https://github.com/AndyObtiva/glimmer-dsl-swt) or [Glimmer DSL for Tk](https://github.com/AndyObtiva/glimmer-dsl-tk) is the fact that [SWT](https://www.eclipse.org/swt/) and [Tk](https://www.tcl.tk/) are more mature than mid-alpha [libui](https://github.com/andlabs/libui) as GUI toolkits. Still, if there is only a need to build a small simple application, [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) could be a good convenient choice due to having zero prerequisites beyond the dependencies included in the [Ruby gem](https://rubygems.org/gems/glimmer-dsl-libui). Also, just like [Glimmer DSL for Tk](https://github.com/AndyObtiva/glimmer-dsl-tk), its apps start instantly and have a small memory footprint. [LibUI](https://github.com/kojix2/LibUI) is a promising new GUI toolkit that might prove quite worthy in the future.
|
12
12
|
|
13
13
|
[Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) aims to provide a DSL similar to the [Glimmer DSL for SWT](https://github.com/AndyObtiva/glimmer-dsl-swt) to enable more productive desktop development in Ruby with:
|
14
|
-
- Declarative DSL syntax that visually maps to the GUI
|
14
|
+
- Declarative DSL syntax that visually maps to the GUI control hierarchy
|
15
15
|
- Convention over configuration via smart defaults and automation of low-level details
|
16
16
|
- Requiring the least amount of syntax possible to build GUI
|
17
17
|
- Bidirectional Data-Binding to declaratively wire and automatically synchronize GUI with Business Models
|
18
|
-
- Custom
|
19
|
-
- Scaffolding for new custom
|
20
|
-
- Native-Executable packaging on Mac, Windows, and Linux
|
18
|
+
- Custom Control support
|
19
|
+
- Scaffolding for new custom controls, apps, and gems
|
20
|
+
- Native-Executable packaging on Mac, Windows, and Linux.
|
21
21
|
|
22
22
|
Example:
|
23
23
|
|
@@ -26,7 +26,7 @@ require 'glimmer-dsl-libui'
|
|
26
26
|
|
27
27
|
include Glimmer
|
28
28
|
|
29
|
-
window('hello world'
|
29
|
+
window('hello world').show
|
30
30
|
```
|
31
31
|
|
32
32
|
![glimmer-dsl-libui-mac-basic-window.png](images/glimmer-dsl-libui-mac-basic-window.png)
|
@@ -43,7 +43,7 @@ Other [Glimmer](https://rubygems.org/gems/glimmer) DSL gems you might be interes
|
|
43
43
|
|
44
44
|
## Table of Contents
|
45
45
|
|
46
|
-
- [Glimmer DSL for LibUI 0.0.
|
46
|
+
- [Glimmer DSL for LibUI 0.0.11](#-glimmer-dsl-for-libui-0011)
|
47
47
|
- [Glimmer GUI DSL Concepts](#glimmer-gui-dsl-concepts)
|
48
48
|
- [Usage](#usage)
|
49
49
|
- [API](#api)
|
@@ -54,6 +54,7 @@ Other [Glimmer](https://rubygems.org/gems/glimmer) DSL gems you might be interes
|
|
54
54
|
- [Extra Operations](#extra-operations)
|
55
55
|
- [Smart Defaults and Conventions](#smart-defaults-and-conventions)
|
56
56
|
- [Original API](#original-api)
|
57
|
+
- [Glimmer Style Guide](#glimmer-style-guide)
|
57
58
|
- [Girb (Glimmer IRB)](#girb-glimmer-irb)
|
58
59
|
- [Examples](#examples)
|
59
60
|
- [Basic Window](#basic-window)
|
@@ -62,6 +63,8 @@ Other [Glimmer](https://rubygems.org/gems/glimmer) DSL gems you might be interes
|
|
62
63
|
- [Simple Notepad](#simple-notepad)
|
63
64
|
- [Midi Player](#midi-player)
|
64
65
|
- [Control Gallery](#control-gallery)
|
66
|
+
- [Font Button](#font-button)
|
67
|
+
- [Color Button](#color-button)
|
65
68
|
- [Contributing to glimmer-dsl-libui](#contributing-to-glimmer-dsl-libui)
|
66
69
|
- [Help](#help)
|
67
70
|
- [Issues](#issues)
|
@@ -76,14 +79,14 @@ Other [Glimmer](https://rubygems.org/gems/glimmer) DSL gems you might be interes
|
|
76
79
|
|
77
80
|
The Glimmer GUI DSL provides object-oriented declarative hierarchical syntax for [LibUI](https://github.com/kojix2/LibUI) that:
|
78
81
|
- Supports smart defaults (e.g. automatic `on_closing` listener that quits `window`)
|
79
|
-
- Automates wiring of
|
82
|
+
- Automates wiring of controls (e.g. `button` is automatically set as child of `window`)
|
80
83
|
- Hides lower-level details (e.g. `LibUI.main` loop is started automatically when triggering `show` on `window`)
|
81
|
-
- Nests
|
84
|
+
- Nests controls according to their visual hierarchy
|
82
85
|
- Requires the minimum amount of syntax needed to describe an app's GUI
|
83
86
|
|
84
87
|
The Glimmer GUI DSL follows these simple concepts in mapping from [LibUI](https://github.com/kojix2/LibUI) syntax:
|
85
|
-
- **Control**: [LibUI](https://github.com/kojix2/LibUI) controls may be declared by lower-case underscored name (aka keyword) (e.g. `window` or `button`). Behind the scenes, they are represented by keyword methods that map to corresponding `LibUI.new_keyword` methods receiving args (e.g. `window('hello world', 300, 200,
|
86
|
-
- **Content/Properties/Listeners Block**: Any keyword may be optionally followed by a Ruby curly-brace multi-line-block containing nested controls (content) and/or properties (attributes) (e.g. `window('hello world', 300, 200,
|
88
|
+
- **Control**: [LibUI](https://github.com/kojix2/LibUI) controls may be declared by lower-case underscored name (aka keyword) (e.g. `window` or `button`). Behind the scenes, they are represented by keyword methods that map to corresponding `LibUI.new_keyword` methods receiving args (e.g. `window('hello world', 300, 200, true)`).
|
89
|
+
- **Content/Properties/Listeners Block**: Any keyword may be optionally followed by a Ruby curly-brace multi-line-block containing nested controls (content) and/or properties (attributes) (e.g. `window('hello world', 300, 200, true) {button('greet')}`). It optionally receives one arg representing the control (e.g. `button('greet') {|b| on_clicked { puts b.text}}`)
|
87
90
|
- **Property**: Control properties may be declared inside keyword blocks with lower-case underscored name followed by property value args (e.g. `title "hello world"` inside `group`). Behind the scenes, properties correspond to `control_set_property` methods.
|
88
91
|
- **Listener**: Control listeners may be declared inside keyword blocks with listener lower-case underscored name beginning with `on_` and receiving required block handler (e.g. `on_clicked {puts 'clicked'}` inside `button`). Behind the scenes, listeners correspond to `control_on_event` methods.
|
89
92
|
|
@@ -125,7 +128,7 @@ require 'glimmer-dsl-libui'
|
|
125
128
|
|
126
129
|
include Glimmer
|
127
130
|
|
128
|
-
window('hello world', 300, 200
|
131
|
+
window('hello world', 300, 200) { |w|
|
129
132
|
button('Button') {
|
130
133
|
on_clicked do
|
131
134
|
msg_box(w, 'Information', 'You clicked the button')
|
@@ -149,7 +152,7 @@ gem install glimmer-dsl-libui
|
|
149
152
|
Or install via Bundler `Gemfile`:
|
150
153
|
|
151
154
|
```ruby
|
152
|
-
gem 'glimmer-dsl-libui', '~> 0.0.
|
155
|
+
gem 'glimmer-dsl-libui', '~> 0.0.11'
|
153
156
|
```
|
154
157
|
|
155
158
|
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.
|
@@ -163,7 +166,7 @@ class Application
|
|
163
166
|
include Glimmer
|
164
167
|
|
165
168
|
def launch
|
166
|
-
window('hello world', 300, 200
|
169
|
+
window('hello world', 300, 200) {
|
167
170
|
button('Button') {
|
168
171
|
on_clicked do
|
169
172
|
puts 'Button Clicked'
|
@@ -206,44 +209,44 @@ Control(Args) | Properties | Listeners
|
|
206
209
|
------------- | ---------- | ---------
|
207
210
|
`about_menu_item` | None | `on_clicked`
|
208
211
|
`button(text as String)` | `text` (`String`) | `on_clicked`
|
209
|
-
`checkbox(text as String)` | `checked` (
|
210
|
-
`combobox` | `items` (`Array` of `String`), `selected` (`
|
211
|
-
`color_button` | `color` (
|
212
|
-
`date_picker` |
|
212
|
+
`checkbox(text as String)` | `checked` (Boolean), `text` (`String`) | `on_toggled`
|
213
|
+
`combobox` | `items` (`Array` of `String`), `selected` (`Integer`) | `on_selected`
|
214
|
+
`color_button` | `color` (Array of `red` as `Float`, `green` as `Float`, `blue` as `Float`, `alpha` as `Float`), `red` as `Float`, `green` as `Float`, `blue` as `Float`, `alpha` as `Float` | `on_changed`
|
215
|
+
`date_picker` | `time` (`LibUI::FFI::TM`) | `on_changed`
|
213
216
|
`date_time_picker` | `time` (`LibUI::FFI::TM`) | `on_changed`
|
214
217
|
`editable_combobox` | `items` (`Array` of `String`), `text` (`String`) | `on_changed`
|
215
|
-
`entry` | `read_only` (
|
216
|
-
`font_button` | `font` (`
|
217
|
-
`group(text as String)` | `margined` (
|
218
|
-
`horizontal_box` | `padded` (
|
218
|
+
`entry` | `read_only` (Boolean), `text` (`String`) | `on_changed`
|
219
|
+
`font_button` | `font` [read-only] (`Hash` of keys: `:family`, `:size`, `:weight`, `:italic`, `:stretch`), `family` as `String`, `size` as `Float`, `weight` as `Integer`, `italic` as `Integer`, `stretch` as `Integer` | `on_changed`
|
220
|
+
`group(text as String)` | `margined` (Boolean), `title` (`String`) | None
|
221
|
+
`horizontal_box` | `padded` (Boolean) | None
|
219
222
|
`horizontal_separator` | None | None
|
220
223
|
`label(text as String)` | `text` (`String`) | None
|
221
224
|
`menu(text as String)` | None | None
|
222
|
-
`menu_item(text as String)` | `checked` (
|
223
|
-
`multiline_entry` | `read_only` (
|
225
|
+
`menu_item(text as String)` | `checked` (Boolean) | `on_clicked`
|
226
|
+
`multiline_entry` | `read_only` (Boolean), `text` (`String`) | `on_changed`
|
224
227
|
`msg_box(window as Glimmer::LibUI::WindowProxy, title as String, description as String)` | None | None
|
225
228
|
`msg_box_error(window as Glimmer::LibUI::WindowProxy, title as String, description as String)` | None | None
|
226
|
-
`non_wrapping_multiline_entry` | `read_only` (
|
229
|
+
`non_wrapping_multiline_entry` | `read_only` (Boolean), `text` (`String`) | `on_changed`
|
227
230
|
`preferences_menu_item` | None | `on_clicked`
|
228
231
|
`progress_bar` | `value` (`Numeric`) | None
|
229
232
|
`quit_menu_item` | None | `on_clicked`
|
230
|
-
`radio_buttons` | `selected` (`
|
233
|
+
`radio_buttons` | `selected` (`Integer`) | `on_selected`
|
231
234
|
`slider(min as Numeric, max as Numeric)` | `value` (`Numeric`) | `on_changed`
|
232
235
|
`spinbox(min as Numeric, max as Numeric)` | `value` (`Numeric`) | `on_changed`
|
233
|
-
`tab` | `margined` (
|
234
|
-
`tab_item(name as String)` | `index` [read-only] (`Integer`), `margined` (
|
235
|
-
`time_picker` |
|
236
|
-
`vertical_box` | `padded` (
|
237
|
-
`window(title as String, width as Integer, height as Integer, has_menubar as
|
236
|
+
`tab` | `margined` (Boolean), `num_pages` (`Integer`) | None
|
237
|
+
`tab_item(name as String)` | `index` [read-only] (`Integer`), `margined` (Boolean), `name` [read-only] (`String`) | None
|
238
|
+
`time_picker` | `time` (`LibUI::FFI::TM`) | `on_changed`
|
239
|
+
`vertical_box` | `padded` (Boolean) | None
|
240
|
+
`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`) | `on_closing`, `on_content_size_changed`
|
238
241
|
|
239
242
|
### Common Control Properties
|
240
|
-
- `enabled` (
|
243
|
+
- `enabled` (Boolean)
|
241
244
|
- `libui` (`Fiddle::Pointer`): returns wrapped [LibUI](https://github.com/kojix2/LibUI) object
|
242
245
|
- `parent_proxy` (`Glimmer::LibUI::ControlProxy` or subclass)
|
243
246
|
- `parent` (`Fiddle::Pointer`)
|
244
|
-
- `toplevel` [read-only] (
|
245
|
-
- `visible` (
|
246
|
-
- `stretchy` [dsl-only] (
|
247
|
+
- `toplevel` [read-only] (Boolean)
|
248
|
+
- `visible` (Boolean)
|
249
|
+
- `stretchy` [dsl-only] (Boolean): available in [Glimmer GUI DSL](#glimmer-gui-dsl-concepts) when nested under `horizontal_box` or `vertical_box`
|
247
250
|
|
248
251
|
### Common Control Operations
|
249
252
|
- `destroy`
|
@@ -265,19 +268,37 @@ Control(Args) | Properties | Listeners
|
|
265
268
|
|
266
269
|
### Smart Defaults and Conventions
|
267
270
|
|
268
|
-
- `horizontal_box` and `vertical_box` controls have `padded` as `
|
269
|
-
- `group` controls have `margined` as `
|
270
|
-
- All controls nested under a `horizontal_box` or `vertical_box` have `stretchy` property (passed to `box_append` method) as `
|
271
|
+
- `horizontal_box` and `vertical_box` controls have `padded` as `true` upon instantiation to ensure more user-friendly GUI by default
|
272
|
+
- `group` controls have `margined` as `true` upon instantiation to ensure more user-friendly GUI by default
|
273
|
+
- All controls nested under a `horizontal_box` or `vertical_box` have `stretchy` property (passed to `box_append` method) as `true` by default (filling maximum space)
|
274
|
+
- `window` constructor args can be left off and have the following defaults when unspecified: `title` as `'Glimmer'`, `width` as `150`, `height` as `150`, and `has_menubar` as `true`)
|
271
275
|
- `window` has an `on_closing` listener by default that quits application upon hitting the close button (can be overridden with a manual `on_closing` implementation that returns integer `0` for success)
|
272
276
|
- `quit_menu_item` has an `on_clicked` listener by default that quits application upon selecting the quit menu item (can be overridden with a manual `on_clicked` implementation that returns integer `0` for success)
|
273
277
|
- If an `on_closing` listener was defined on `window` and it does not return an integer, default exit behavior is assumed (`window.destroy` is called followed by `LibUI.quit`, returning `0`).
|
274
278
|
- If an `on_clicked` listener was defined on `quit_menu_item` and it does not return an integer, default exit behavior is assumed (`main_window.destroy` is called followed by `LibUI.quit`, returning `0`).
|
279
|
+
- All boolean property readers return `true` or `false` in Ruby instead of the [libui](https://github.com/andlabs/libui) original `0` or `1` in C.
|
280
|
+
- All boolean property writers accept `true`/`false` in addition to `1`/`0` in Ruby
|
281
|
+
- All string property readers return a `String` object in Ruby instead of the [libui](https://github.com/andlabs/libui) Fiddle pointer object.
|
282
|
+
- Automatically allocate font descriptors upon instantiating `font_button` controls and free them when destorying `font_button` controls
|
283
|
+
- Automatically allocate color value pointers upon instantiating `color_button` controls and free them when destorying `color_button` controls
|
284
|
+
- On the Mac, if no `menu` items were added, an automatic `quit_menu_item` is added to enable quitting with CTRL+Q
|
285
|
+
- When destroying a control nested under a `horizontal_box` or `vertical_box`, it is automatically deleted from the box's children
|
286
|
+
- When destroying a control nested under a `window` or `group`, it is automatically unset as their child to allow successful destruction
|
275
287
|
|
276
288
|
### Original API
|
277
289
|
|
278
290
|
To learn more about the [LibUI](https://github.com/kojix2/LibUI) API exposed through [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui),
|
279
291
|
check out the [libui C headers](https://github.com/andlabs/libui/blob/master/ui.h)
|
280
292
|
|
293
|
+
## Glimmer Style Guide
|
294
|
+
|
295
|
+
- Control arguments are always wrapped by parentheses
|
296
|
+
- Control blocks are always declared with curly braces to clearly visualize hierarchical view code and separate from logic code
|
297
|
+
- Control property declarations always have arguments and never take a block
|
298
|
+
- Control property arguments are never wrapped inside parentheses
|
299
|
+
- 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.
|
300
|
+
- Pure logic multi-line blocks that do not constitute GUI DSL view elements have `do; end` style to clearly separate logic code from view code.
|
301
|
+
|
281
302
|
## Girb (Glimmer IRB)
|
282
303
|
|
283
304
|
You can run the `girb` command (`bin/girb` if you cloned the project locally):
|
@@ -292,7 +313,96 @@ Gotcha: On the Mac, when you close a window opened in `girb`, it remains open un
|
|
292
313
|
|
293
314
|
## Examples
|
294
315
|
|
295
|
-
These examples
|
316
|
+
These examples include reimplementions of the examples in the [LibUI](https://github.com/kojix2/LibUI) project utilizing the [Glimmer GUI DSL](#glimmer-gui-dsl-concepts) as well as brand new examples.
|
317
|
+
|
318
|
+
To browse all examples, simply launch the [Meta-Example](examples/meta_example.rb), which lists all examples and displays each example's code when selected.
|
319
|
+
|
320
|
+
[examples/meta_example.rb](examples/meta_example.rb)
|
321
|
+
|
322
|
+
Run with this command from the root of the project if you cloned the project:
|
323
|
+
|
324
|
+
```
|
325
|
+
ruby -r './lib/glimmer-dsl-libui' examples/meta_example.rb
|
326
|
+
```
|
327
|
+
|
328
|
+
Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/glimmer-dsl-libui):
|
329
|
+
|
330
|
+
```
|
331
|
+
ruby -r glimmer-dsl-libui -e "require 'examples/meta_example'"
|
332
|
+
```
|
333
|
+
|
334
|
+
Mac
|
335
|
+
|
336
|
+
![glimmer-dsl-libui-mac-meta-example.png](images/glimmer-dsl-libui-mac-meta-example.png)
|
337
|
+
|
338
|
+
Linux
|
339
|
+
|
340
|
+
![glimmer-dsl-libui-linux-meta-example.png](images/glimmer-dsl-libui-linux-meta-example.png)
|
341
|
+
|
342
|
+
New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
|
343
|
+
|
344
|
+
```ruby
|
345
|
+
require 'glimmer-dsl-libui'
|
346
|
+
require 'facets'
|
347
|
+
|
348
|
+
class MetaExample
|
349
|
+
include Glimmer
|
350
|
+
|
351
|
+
def examples
|
352
|
+
if @examples.nil?
|
353
|
+
example_files = Dir.glob(File.join(File.expand_path('.', __dir__), '**', '*.rb'))
|
354
|
+
example_file_names = example_files.map { |f| File.basename(f, '.rb') }
|
355
|
+
example_file_names = example_file_names.reject { |f| f == 'meta_example' }
|
356
|
+
@examples = example_file_names.map { |f| f.underscore.titlecase }
|
357
|
+
end
|
358
|
+
@examples
|
359
|
+
end
|
360
|
+
|
361
|
+
def file_path_for(example)
|
362
|
+
File.join(File.expand_path('.', __dir__), "#{example.underscore}.rb")
|
363
|
+
end
|
364
|
+
|
365
|
+
def launch
|
366
|
+
menu('File') {
|
367
|
+
quit_menu_item
|
368
|
+
}
|
369
|
+
|
370
|
+
window('Meta-Example', 700, 500) { |w|
|
371
|
+
margined true
|
372
|
+
|
373
|
+
horizontal_box {
|
374
|
+
vertical_box {
|
375
|
+
@rbs = radio_buttons {
|
376
|
+
stretchy false
|
377
|
+
items examples
|
378
|
+
selected 0
|
379
|
+
|
380
|
+
on_selected do
|
381
|
+
@nwme.text = File.read(file_path_for(@examples[@rbs.selected]))
|
382
|
+
end
|
383
|
+
}
|
384
|
+
button('Launch') {
|
385
|
+
stretchy false
|
386
|
+
|
387
|
+
on_clicked do
|
388
|
+
system "ruby -r puts_debuggerer -r #{File.expand_path('../lib/glimmer-dsl-libui', __dir__)} #{file_path_for(@examples[@rbs.selected])}"
|
389
|
+
end
|
390
|
+
}
|
391
|
+
}
|
392
|
+
vertical_box {
|
393
|
+
@nwme = non_wrapping_multiline_entry {
|
394
|
+
read_only true
|
395
|
+
text File.read(file_path_for(@examples[@rbs.selected]))
|
396
|
+
}
|
397
|
+
}
|
398
|
+
}
|
399
|
+
}.show
|
400
|
+
end
|
401
|
+
end
|
402
|
+
|
403
|
+
MetaExample.new.launch
|
404
|
+
```
|
405
|
+
|
296
406
|
|
297
407
|
### Basic Window
|
298
408
|
|
@@ -349,7 +459,7 @@ require 'glimmer-dsl-libui'
|
|
349
459
|
|
350
460
|
include Glimmer
|
351
461
|
|
352
|
-
window('hello world', 300, 200,
|
462
|
+
window('hello world', 300, 200, true) {
|
353
463
|
on_closing do
|
354
464
|
puts 'Bye Bye'
|
355
465
|
end
|
@@ -375,7 +485,7 @@ ruby -r glimmer-dsl-libui -e "require 'examples/basic_button'"
|
|
375
485
|
Mac
|
376
486
|
|
377
487
|
![glimmer-dsl-libui-mac-basic-button.png](images/glimmer-dsl-libui-mac-basic-button.png)
|
378
|
-
![glimmer-dsl-libui-mac-basic-button-msg-box.png](images/glimmer-dsl-libui-basic-button-msg-box.png)
|
488
|
+
![glimmer-dsl-libui-mac-basic-button-msg-box.png](images/glimmer-dsl-libui-mac-basic-button-msg-box.png)
|
379
489
|
|
380
490
|
Linux
|
381
491
|
|
@@ -420,7 +530,7 @@ require 'glimmer-dsl-libui'
|
|
420
530
|
|
421
531
|
include Glimmer
|
422
532
|
|
423
|
-
window('hello world', 300, 200,
|
533
|
+
window('hello world', 300, 200, true) { |w|
|
424
534
|
button('Button') {
|
425
535
|
on_clicked do
|
426
536
|
msg_box(w, 'Information', 'You clicked the button')
|
@@ -433,6 +543,23 @@ window('hello world', 300, 200, 1) { |w|
|
|
433
543
|
}.show
|
434
544
|
```
|
435
545
|
|
546
|
+
[Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version 2:
|
547
|
+
|
548
|
+
```ruby
|
549
|
+
require 'glimmer-dsl-libui'
|
550
|
+
|
551
|
+
include Glimmer
|
552
|
+
|
553
|
+
window { # first 3 args can be set via properties with 4th arg has_menubar=true by default
|
554
|
+
title 'hello world'
|
555
|
+
content_size 300, 200
|
556
|
+
|
557
|
+
on_closing do
|
558
|
+
puts 'Bye Bye'
|
559
|
+
end
|
560
|
+
}.show
|
561
|
+
```
|
562
|
+
|
436
563
|
### Basic Entry
|
437
564
|
|
438
565
|
[examples/basic_entry.rb](examples/basic_entry.rb)
|
@@ -507,10 +634,10 @@ require 'glimmer-dsl-libui'
|
|
507
634
|
|
508
635
|
include Glimmer
|
509
636
|
|
510
|
-
window('Basic Entry', 300, 50
|
637
|
+
window('Basic Entry', 300, 50) { |w|
|
511
638
|
horizontal_box {
|
512
639
|
e = entry {
|
513
|
-
# stretchy
|
640
|
+
# stretchy true # Smart default option for appending to horizontal_box
|
514
641
|
|
515
642
|
on_changed do
|
516
643
|
puts e.text
|
@@ -519,7 +646,7 @@ window('Basic Entry', 300, 50, 1) { |w|
|
|
519
646
|
}
|
520
647
|
|
521
648
|
button('Button') {
|
522
|
-
stretchy
|
649
|
+
stretchy false
|
523
650
|
|
524
651
|
on_clicked do
|
525
652
|
text = e.text
|
@@ -593,7 +720,7 @@ require 'glimmer-dsl-libui'
|
|
593
720
|
|
594
721
|
include Glimmer
|
595
722
|
|
596
|
-
window('Notepad', 500, 300
|
723
|
+
window('Notepad', 500, 300) {
|
597
724
|
on_closing do
|
598
725
|
puts 'Bye Bye'
|
599
726
|
end
|
@@ -794,10 +921,10 @@ class TinyMidiPlayer
|
|
794
921
|
end
|
795
922
|
}
|
796
923
|
}
|
797
|
-
@main_window = window('Tiny Midi Player', 200, 50
|
924
|
+
@main_window = window('Tiny Midi Player', 200, 50) {
|
798
925
|
horizontal_box {
|
799
926
|
vertical_box {
|
800
|
-
stretchy
|
927
|
+
stretchy false
|
801
928
|
|
802
929
|
button('▶') {
|
803
930
|
on_clicked do
|
@@ -1082,7 +1209,7 @@ menu('Edit') {
|
|
1082
1209
|
check_menu_item('Checkable Item_')
|
1083
1210
|
separator_menu_item
|
1084
1211
|
menu_item('Disabled Item_') {
|
1085
|
-
enabled
|
1212
|
+
enabled false
|
1086
1213
|
}
|
1087
1214
|
}
|
1088
1215
|
|
@@ -1092,8 +1219,8 @@ menu('Help') {
|
|
1092
1219
|
about_menu_item # Can optionally contain an on_clicked listener
|
1093
1220
|
}
|
1094
1221
|
|
1095
|
-
MAIN_WINDOW = window('Control Gallery', 600, 500
|
1096
|
-
margined
|
1222
|
+
MAIN_WINDOW = window('Control Gallery', 600, 500) {
|
1223
|
+
margined true
|
1097
1224
|
|
1098
1225
|
on_closing do
|
1099
1226
|
puts 'Bye Bye'
|
@@ -1104,7 +1231,7 @@ MAIN_WINDOW = window('Control Gallery', 600, 500, 1) {
|
|
1104
1231
|
group('Basic Controls') {
|
1105
1232
|
vertical_box {
|
1106
1233
|
button('Button') {
|
1107
|
-
stretchy
|
1234
|
+
stretchy false
|
1108
1235
|
|
1109
1236
|
on_clicked do
|
1110
1237
|
msg_box(MAIN_WINDOW, 'Information', 'You clicked the button')
|
@@ -1112,7 +1239,7 @@ MAIN_WINDOW = window('Control Gallery', 600, 500, 1) {
|
|
1112
1239
|
}
|
1113
1240
|
|
1114
1241
|
checkbox('Checkbox') {
|
1115
|
-
stretchy
|
1242
|
+
stretchy false
|
1116
1243
|
|
1117
1244
|
on_toggled do |c|
|
1118
1245
|
checked = c.checked == 1
|
@@ -1121,29 +1248,29 @@ MAIN_WINDOW = window('Control Gallery', 600, 500, 1) {
|
|
1121
1248
|
end
|
1122
1249
|
}
|
1123
1250
|
|
1124
|
-
label('Label') { stretchy
|
1251
|
+
label('Label') { stretchy false }
|
1125
1252
|
|
1126
|
-
horizontal_separator { stretchy
|
1253
|
+
horizontal_separator { stretchy false }
|
1127
1254
|
|
1128
|
-
date_picker { stretchy
|
1255
|
+
date_picker { stretchy false }
|
1129
1256
|
|
1130
|
-
time_picker { stretchy
|
1257
|
+
time_picker { stretchy false }
|
1131
1258
|
|
1132
|
-
date_time_picker { stretchy
|
1259
|
+
date_time_picker { stretchy false }
|
1133
1260
|
|
1134
|
-
font_button { stretchy
|
1261
|
+
font_button { stretchy false }
|
1135
1262
|
|
1136
|
-
color_button { stretchy
|
1263
|
+
color_button { stretchy false }
|
1137
1264
|
}
|
1138
1265
|
}
|
1139
1266
|
|
1140
1267
|
vertical_box {
|
1141
1268
|
group('Numbers') {
|
1142
|
-
stretchy
|
1269
|
+
stretchy false
|
1143
1270
|
|
1144
1271
|
vertical_box {
|
1145
1272
|
spinbox(0, 100) {
|
1146
|
-
stretchy
|
1273
|
+
stretchy false
|
1147
1274
|
value 42
|
1148
1275
|
|
1149
1276
|
on_changed do |s|
|
@@ -1152,7 +1279,7 @@ MAIN_WINDOW = window('Control Gallery', 600, 500, 1) {
|
|
1152
1279
|
}
|
1153
1280
|
|
1154
1281
|
slider(0, 100) {
|
1155
|
-
stretchy
|
1282
|
+
stretchy false
|
1156
1283
|
|
1157
1284
|
on_changed do |s|
|
1158
1285
|
v = s.value
|
@@ -1161,16 +1288,16 @@ MAIN_WINDOW = window('Control Gallery', 600, 500, 1) {
|
|
1161
1288
|
end
|
1162
1289
|
}
|
1163
1290
|
|
1164
|
-
@progress_bar = progress_bar { stretchy
|
1291
|
+
@progress_bar = progress_bar { stretchy false }
|
1165
1292
|
}
|
1166
1293
|
}
|
1167
1294
|
|
1168
1295
|
group('Lists') {
|
1169
|
-
stretchy
|
1296
|
+
stretchy false
|
1170
1297
|
|
1171
1298
|
vertical_box {
|
1172
1299
|
combobox {
|
1173
|
-
stretchy
|
1300
|
+
stretchy false
|
1174
1301
|
items 'combobox Item 1', 'combobox Item 2', 'combobox Item 3' # also accepts a single array argument
|
1175
1302
|
|
1176
1303
|
on_selected do |c|
|
@@ -1179,7 +1306,7 @@ MAIN_WINDOW = window('Control Gallery', 600, 500, 1) {
|
|
1179
1306
|
}
|
1180
1307
|
|
1181
1308
|
editable_combobox {
|
1182
|
-
stretchy
|
1309
|
+
stretchy false
|
1183
1310
|
items 'Editable Item 1', 'Editable Item 2', 'Editable Item 3' # also accepts a single array argument
|
1184
1311
|
}
|
1185
1312
|
|
@@ -1218,6 +1345,135 @@ MAIN_WINDOW = window('Control Gallery', 600, 500, 1) {
|
|
1218
1345
|
MAIN_WINDOW.show
|
1219
1346
|
```
|
1220
1347
|
|
1348
|
+
### Font Button
|
1349
|
+
|
1350
|
+
[examples/font_button.rb](examples/font_button.rb)
|
1351
|
+
|
1352
|
+
Run with this command from the root of the project if you cloned the project:
|
1353
|
+
|
1354
|
+
```
|
1355
|
+
ruby -r './lib/glimmer-dsl-libui' examples/font_button.rb
|
1356
|
+
```
|
1357
|
+
|
1358
|
+
Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/glimmer-dsl-libui):
|
1359
|
+
|
1360
|
+
```
|
1361
|
+
ruby -r glimmer-dsl-libui -e "require 'examples/font_button'"
|
1362
|
+
```
|
1363
|
+
|
1364
|
+
Mac
|
1365
|
+
|
1366
|
+
![glimmer-dsl-libui-mac-font-button.png](images/glimmer-dsl-libui-mac-font-button.png)
|
1367
|
+
![glimmer-dsl-libui-mac-font-button-selection.png](images/glimmer-dsl-libui-mac-font-button-selection.png)
|
1368
|
+
|
1369
|
+
Linux
|
1370
|
+
|
1371
|
+
![glimmer-dsl-libui-linux-font-button.png](images/glimmer-dsl-libui-linux-font-button.png)
|
1372
|
+
![glimmer-dsl-libui-linux-font-button-selection.png](images/glimmer-dsl-libui-linux-font-button-selection.png)
|
1373
|
+
|
1374
|
+
[LibUI](https://github.com/kojix2/LibUI) Original Version:
|
1375
|
+
|
1376
|
+
```ruby
|
1377
|
+
require 'libui'
|
1378
|
+
|
1379
|
+
UI = LibUI
|
1380
|
+
|
1381
|
+
UI.init
|
1382
|
+
|
1383
|
+
main_window = UI.new_window('hello world', 300, 200, 1)
|
1384
|
+
|
1385
|
+
font_button = UI.new_font_button
|
1386
|
+
font_descriptor = UI::FFI::FontDescriptor.malloc
|
1387
|
+
UI.font_button_on_changed(font_button) do
|
1388
|
+
UI.font_button_font(font_button, font_descriptor)
|
1389
|
+
p family: font_descriptor.Family.to_s,
|
1390
|
+
size: font_descriptor.Size,
|
1391
|
+
weight: font_descriptor.Weight,
|
1392
|
+
italic: font_descriptor.Italic,
|
1393
|
+
stretch: font_descriptor.Stretch
|
1394
|
+
end
|
1395
|
+
|
1396
|
+
UI.window_on_closing(main_window) do
|
1397
|
+
puts 'Bye Bye'
|
1398
|
+
UI.control_destroy(main_window)
|
1399
|
+
UI.quit
|
1400
|
+
0
|
1401
|
+
end
|
1402
|
+
|
1403
|
+
UI.window_set_child(main_window, font_button)
|
1404
|
+
UI.control_show(main_window)
|
1405
|
+
|
1406
|
+
UI.main
|
1407
|
+
UI.quit
|
1408
|
+
|
1409
|
+
```
|
1410
|
+
|
1411
|
+
[Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
|
1412
|
+
|
1413
|
+
```ruby
|
1414
|
+
require 'glimmer-dsl-libui'
|
1415
|
+
|
1416
|
+
include Glimmer
|
1417
|
+
|
1418
|
+
window('hello world', 300, 200) {
|
1419
|
+
font_button { |fb|
|
1420
|
+
on_changed do
|
1421
|
+
font_descriptor = fb.font
|
1422
|
+
p font_descriptor
|
1423
|
+
end
|
1424
|
+
}
|
1425
|
+
|
1426
|
+
on_closing do
|
1427
|
+
puts 'Bye Bye'
|
1428
|
+
end
|
1429
|
+
}.show
|
1430
|
+
```
|
1431
|
+
|
1432
|
+
### Color Button
|
1433
|
+
|
1434
|
+
[examples/color_button.rb](examples/color_button.rb)
|
1435
|
+
|
1436
|
+
Run with this command from the root of the project if you cloned the project:
|
1437
|
+
|
1438
|
+
```
|
1439
|
+
ruby -r './lib/glimmer-dsl-libui' examples/color_button.rb
|
1440
|
+
```
|
1441
|
+
|
1442
|
+
Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/glimmer-dsl-libui):
|
1443
|
+
|
1444
|
+
```
|
1445
|
+
ruby -r glimmer-dsl-libui -e "require 'examples/color_button'"
|
1446
|
+
```
|
1447
|
+
|
1448
|
+
Mac
|
1449
|
+
|
1450
|
+
![glimmer-dsl-libui-mac-color-button.png](images/glimmer-dsl-libui-mac-color-button.png)
|
1451
|
+
![glimmer-dsl-libui-mac-color-button-selection.png](images/glimmer-dsl-libui-mac-color-button-selection.png)
|
1452
|
+
|
1453
|
+
Linux
|
1454
|
+
|
1455
|
+
![glimmer-dsl-libui-linux-color-button.png](images/glimmer-dsl-libui-linux-color-button.png)
|
1456
|
+
![glimmer-dsl-libui-linux-color-button-selection.png](images/glimmer-dsl-libui-linux-color-button-selection.png)
|
1457
|
+
|
1458
|
+
New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
|
1459
|
+
|
1460
|
+
```ruby
|
1461
|
+
# frozen_string_literal: true
|
1462
|
+
|
1463
|
+
require 'glimmer-dsl-libui'
|
1464
|
+
|
1465
|
+
include Glimmer
|
1466
|
+
|
1467
|
+
window('color button', 230) {
|
1468
|
+
color_button { |cb|
|
1469
|
+
on_changed do
|
1470
|
+
rgba = cb.color
|
1471
|
+
p rgba
|
1472
|
+
end
|
1473
|
+
}
|
1474
|
+
}.show
|
1475
|
+
```
|
1476
|
+
|
1221
1477
|
## Contributing to glimmer-dsl-libui
|
1222
1478
|
|
1223
1479
|
- Check out the latest master to make sure the feature hasn't been
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.11
|