glimmer-dsl-libui 0.0.7 → 0.0.11
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 +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 | 
             
            [](http://badge.fury.io/rb/glimmer-dsl-libui)
         | 
| 4 4 | 
             
            [](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 | 
             
            
         | 
| @@ -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 | 
            +
            
         | 
| 337 | 
            +
             | 
| 338 | 
            +
            Linux
         | 
| 339 | 
            +
             | 
| 340 | 
            +
            
         | 
| 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 | 
             
            
         | 
| 378 | 
            -
            
         | 
| 488 | 
            +
            
         | 
| 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 | 
            +
            
         | 
| 1367 | 
            +
            
         | 
| 1368 | 
            +
             | 
| 1369 | 
            +
            Linux
         | 
| 1370 | 
            +
             | 
| 1371 | 
            +
            
         | 
| 1372 | 
            +
            
         | 
| 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 | 
            +
            
         | 
| 1451 | 
            +
            
         | 
| 1452 | 
            +
             | 
| 1453 | 
            +
            Linux
         | 
| 1454 | 
            +
             | 
| 1455 | 
            +
            
         | 
| 1456 | 
            +
            
         | 
| 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
         |