glimmer-dsl-libui 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c3d949c7e8a83eaa3d09b07e3117158885f1c34d13737420d3a1cf7499d2250c
4
- data.tar.gz: db7447e66369398e9c1b48ab194f27c710cab11e60998bc8eaae1bb2c64145b7
3
+ metadata.gz: 602cf477d5809c99e64e46f2e51a66f1610364a28402b568cc6fe97cf5666115
4
+ data.tar.gz: 3a45bca62165d28c11d8f9ee9e0c281c986c499b9df9ffb889214cb4a2240974
5
5
  SHA512:
6
- metadata.gz: 8f9c8af1645a02379f6a1693bffc20bc6c1c70a349603810a7f292b886c1652f60426459063641a676ee50e5f6b035a25effe21b4f39acca5bb43c394ef89e58
7
- data.tar.gz: f41584f6026750c4c30e18475ceabac1a8382b11cfccd62f536fafbed0225a4a21cd651ec477baae93b596090154f7a1692ac3a3ae6fca8a7625fe774a618fcd
6
+ metadata.gz: 696a6c43d9b75fa8692d74121d6674dc0b3a040cf47401721007ed6a4865372a67dc46df96bdf63d167a2b3b5187c3ca4139a365fa7942d537f85ed6287f8908
7
+ data.tar.gz: 1b9480211e41aa30fa51f3936d44b3597c5c30d535ccead178504bb7b9c3ed2f3dbc61ae838b81e2c6d2e3fe8a6e4d30a8406fdce81e800398972564699dff63
data/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Change Log
2
2
 
3
+ ## 0.0.6
4
+
5
+ - Make listener block provide Ruby proxy object as optional argument (not Fiddle pointer)
6
+ - Handle `tab_item` scenario where it has an empty block or no block (auto-generate empty `horizontal_box` content as a smart default to avoid crashing)
7
+ - Support `non_wrapping_multiline_entry` propeties/operations via `LibUI.multiline_entry_*` methods (enhancing them to accept Ruby objects in addition to pointers)
8
+ - Support splatting `items` array for `radio_buttons`, `editable_combobox`, and `combobox` items
9
+ - Fix issue with `menu_item` `on_clicked` listeners crashing in examples/control_gallery.rb due to garbage collection
10
+
3
11
  ## 0.0.5
4
12
 
5
13
  - Support examples/control_gallery.rb
data/README.md CHANGED
@@ -1,10 +1,10 @@
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.5
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.6
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)
5
5
  [![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)
6
6
 
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 GUI that just works!
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
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 widgets 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
 
@@ -41,6 +41,34 @@ Other [Glimmer](https://rubygems.org/gems/glimmer) DSL gems you might be interes
41
41
  - [glimmer-dsl-css](https://github.com/AndyObtiva/glimmer-dsl-css): Glimmer DSL for CSS
42
42
  - [glimmer-dsl-tk](https://github.com/AndyObtiva/glimmer-dsl-tk): Glimmer DSL for Tk (MRI Ruby Desktop Development GUI Library)
43
43
 
44
+ ## Table of Contents
45
+
46
+ - [Glimmer DSL for LibUI 0.0.6](#-glimmer-dsl-for-libui-006)
47
+ - [Glimmer GUI DSL Concepts](#glimmer-gui-dsl-concepts)
48
+ - [Usage](#usage)
49
+ - [API](#api)
50
+ - [Supported Controls](#supported-controls)
51
+ - [Common Control Properties](#common-control-properties)
52
+ - [Common Control Operations](#common-control-operations)
53
+ - [Extra Operations](#extra-operations)
54
+ - [Girb (Glimmer IRB)](#girb-glimmer-irb)
55
+ - [Examples](#examples)
56
+ - [Basic Window](#basic-window)
57
+ - [Basic Button](#basic-button)
58
+ - [Basic Entry](#basic-entry)
59
+ - [Simple Notepad](#simple-notepad)
60
+ - [Midi Player](#midi-player)
61
+ - [Control Gallery](#control-gallery)
62
+ - [Contributing to glimmer-dsl-libui](#contributing-to-glimmer-dsl-libui)
63
+ - [Help](#help)
64
+ - [Issues](#issues)
65
+ - [Chat](#chat)
66
+ - [Process](#process)
67
+ - [Planned Features and Feature Suggestions](#planned-features-and-feature-suggestions)
68
+ - [Change Log](#change-log)
69
+ - [Contributors](#contributors)
70
+ - [License](#license)
71
+
44
72
  ## Glimmer GUI DSL Concepts
45
73
 
46
74
  The Glimmer GUI DSL provides object-oriented declarative hierarchical syntax for [LibUI](https://github.com/kojix2/LibUI) that:
@@ -118,7 +146,7 @@ gem install glimmer-dsl-libui
118
146
  Or install via Bundler `Gemfile`:
119
147
 
120
148
  ```ruby
121
- gem 'glimmer-dsl-libui', '~> 0.0.5'
149
+ gem 'glimmer-dsl-libui', '~> 0.0.6'
122
150
  ```
123
151
 
124
152
  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.
@@ -169,35 +197,43 @@ w = window('hello world', 300, 200, 1) # => #<Glimmer::LibUI::WindowProxy:0x0000
169
197
  w.libui # => #<Fiddle::Pointer:0x00007fde53997980 ptr=0x00007fde51352a60 size=0 free=0x0000000000000000>
170
198
  ```
171
199
 
172
- Supported Controls and their Properties / Listeners:
173
- - `button`: `text` (`String`) / `on_clicked`
174
- - `combobox`: `items` (`Array` of `String`), `selected` (`1` or `0`) / `on_selected`
175
- - `color_button`: `color` (r `Numeric`, g `Numeric`, b `Numeric`, a `Numeric`), `selected` (`1` or `0`) / `on_selected`
176
- - `date_picker`: None / None
177
- - `date_time_picker`: `time` (`UI::FFI::TM`) / `on_changed`
178
- - `editable_combobox`: `items` (`Array` of `String`), `text` (`String`) / `on_changed`
179
- - `entry`: `read_only` (`1` or `0`), `text` (`String`) / `on_changed`
180
- - `font_button`: `font` (`UI::FFI::FontDescriptor`) / `on_changed`
181
- - `group`: `margined` (`1` or `0`), `title` (`String`) / None
182
- - `horizontal_box`: `padded` (`1` or `0`) / None
183
- - `horizontal_separator`: None / None
184
- - `label`: `text` (`String`) / None
185
- - `menu`: None / None
186
- - `menu_item`: `checked` (`1` or `0`) / `on_clicked`
187
- - `multiline_entry`: `read_only` (`1` or `0`), `text` (`String`) / None
188
- - `msg_box`: None / None
189
- - `non_wrapping_multiline_entry`: None / None
190
- - `progress_bar`: `value` (`Numeric`) / None
191
- - `radio_buttons`: `selected` (`1` or `0`) / `on_selected`
192
- - `slider`: `value` (`Numeric`) / `on_changed`
193
- - `spinbox`: `value` (`Numeric`) / `on_changed`
194
- - `tab`: `margined` (`1` or `0`), `num_pages` (`Integer`) / None
195
- - `tab_item`: `index` [read-only] (`Integer`), `margined` (`1` or `0`), `name` [read-only] (`String`) / None
196
- - `time_picker`: None / None
197
- - `vertical_box`: `padded` (`1` or `0`) / None
198
- - `window`: `borderless` (`1` or `0`), `content_size` (width `Numeric`, height `Numeric`), `fullscreen` (`1` or `0`), `margined` (`1` or `0`), `title` (`String`) / `on_closing`, `on_content_size_changed`
199
-
200
- Common Control Properties:
200
+ ### Supported Controls
201
+
202
+ Control(Args) | Properties | Listeners
203
+ ------------- | ---------- | ---------
204
+ `about_menu_item` | None | `on_clicked`
205
+ `button(text as String)` | `text` (`String`) | `on_clicked`
206
+ `checkbox(text as String)` | `checked` (`1` or `0`), `text` (`String`) | `on_toggled`
207
+ `combobox` | `items` (`Array` of `String`), `selected` (`1` or `0`) | `on_selected`
208
+ `color_button` | `color` (r `Numeric`, g `Numeric`, b `Numeric`, a `Numeric`), `selected` (`1` or `0`) | `on_selected`
209
+ `date_picker` | None | None
210
+ `date_time_picker` | `time` (`UI::FFI::TM`) | `on_changed`
211
+ `editable_combobox` | `items` (`Array` of `String`), `text` (`String`) | `on_changed`
212
+ `entry` | `read_only` (`1` or `0`), `text` (`String`) | `on_changed`
213
+ `font_button` | `font` (`UI::FFI::FontDescriptor`) | `on_changed`
214
+ `group(text as String)` | `margined` (`1` or `0`), `title` (`String`) | None
215
+ `horizontal_box` | `padded` (`1` or `0`) | None
216
+ `horizontal_separator` | None | None
217
+ `label(text as String)` | `text` (`String`) | None
218
+ `menu(text as String)` | None | None
219
+ `menu_item(text as String)` | `checked` (`1` or `0`) | `on_clicked`
220
+ `multiline_entry` | `read_only` (`1` or `0`), `text` (`String`) | `on_changed`
221
+ `msg_box(window as Glimmer::LibUI::WindowProxy, title as String, description as String)` | None | None
222
+ `msg_box_error(window as Glimmer::LibUI::WindowProxy, title as String, description as String)` | None | None
223
+ `non_wrapping_multiline_entry` | `read_only` (`1` or `0`), `text` (`String`) | `on_changed`
224
+ `preferences_menu_item` | None | `on_clicked`
225
+ `progress_bar` | `value` (`Numeric`) | None
226
+ `quit_menu_item` | None | `on_clicked`
227
+ `radio_buttons` | `selected` (`1` or `0`) | `on_selected`
228
+ `slider(min as Numeric, max as Numeric)` | `value` (`Numeric`) | `on_changed`
229
+ `spinbox(min as Numeric, max as Numeric)` | `value` (`Numeric`) | `on_changed`
230
+ `tab` | `margined` (`1` or `0`), `num_pages` (`Integer`) | None
231
+ `tab_item(name as String)` | `index` [read-only] (`Integer`), `margined` (`1` or `0`), `name` [read-only] (`String`) | None
232
+ `time_picker` | None | None
233
+ `vertical_box` | `padded` (`1` or `0`) | None
234
+ `window(title as String, width as Integer, height as Integer, has_menubar as 1 or 0)` | `borderless` (`1` or `0`), `content_size` (width `Numeric`, height `Numeric`), `fullscreen` (`1` or `0`), `margined` (`1` or `0`), `title` (`String`) | `on_closing`, `on_content_size_changed`
235
+
236
+ ### Common Control Properties
201
237
  - `enabled` (`1` or `0`)
202
238
  - `libui` (`Fiddle::Pointer`): returns wrapped [LibUI](https://github.com/kojix2/LibUI) object
203
239
  - `parent_proxy` (`Glimmer::LibUI::ControlProxy` or subclass)
@@ -206,13 +242,17 @@ Common Control Properties:
206
242
  - `visible` (`1` or `0`)
207
243
  - `stretchy` [dsl-only] (`1` or `0`): available in [Glimmer GUI DSL](#glimmer-gui-dsl-concepts) when nested under `horizontal_box` or `vertical_box`
208
244
 
209
- Common Control Operations:
245
+ ### Common Control Operations
210
246
  - `destroy`
211
247
  - `disable`
212
248
  - `enable`
213
249
  - `hide`
214
250
  - `show`
215
251
 
252
+ ### Extra Operations
253
+ - `open_file(window as Glimmer::LibUI::WindowProxy)`: returns selected file (`String`) or `nil` if cancelled
254
+ - `save_file(window as Glimmer::LibUI::WindowProxy)`: returns selected file (`String`) or `nil` if cancelled
255
+
216
256
  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), check out the [libui C headers](https://github.com/andlabs/libui/blob/master/ui.h)
217
257
 
218
258
  ## Girb (Glimmer IRB)
@@ -1018,7 +1058,7 @@ menu('File') {
1018
1058
  menu('Edit') {
1019
1059
  check_menu_item('Checkable Item_')
1020
1060
  separator_menu_item
1021
- menu_item('Disabled Item_') { |mi|
1061
+ menu_item('Disabled Item_') {
1022
1062
  enabled 0
1023
1063
  }
1024
1064
  }
@@ -1036,7 +1076,7 @@ MAIN_WINDOW = window('Control Gallery', 600, 500, 1) {
1036
1076
  puts 'Bye Bye'
1037
1077
  end
1038
1078
 
1039
- vertical_box { |vb|
1079
+ vertical_box {
1040
1080
  padded 1
1041
1081
 
1042
1082
  horizontal_box {
@@ -1056,10 +1096,10 @@ MAIN_WINDOW = window('Control Gallery', 600, 500, 1) {
1056
1096
  end
1057
1097
  }
1058
1098
 
1059
- checkbox('Checkbox') { |c|
1099
+ checkbox('Checkbox') {
1060
1100
  stretchy 0
1061
1101
 
1062
- on_toggled do
1102
+ on_toggled do |c|
1063
1103
  checked = c.checked == 1
1064
1104
  MAIN_WINDOW.title = "Checkbox is #{checked}"
1065
1105
  c.text = "I am the checkbox (#{checked})"
@@ -1092,19 +1132,19 @@ MAIN_WINDOW = window('Control Gallery', 600, 500, 1) {
1092
1132
  vertical_box {
1093
1133
  padded 1
1094
1134
 
1095
- spinbox(0, 100) { |s|
1135
+ spinbox(0, 100) {
1096
1136
  stretchy 0
1097
1137
  value 42
1098
1138
 
1099
- on_changed do
1139
+ on_changed do |s|
1100
1140
  puts "New Spinbox value: #{s.value}"
1101
1141
  end
1102
1142
  }
1103
1143
 
1104
- slider(0, 100) { |s|
1144
+ slider(0, 100) {
1105
1145
  stretchy 0
1106
1146
 
1107
- on_changed do
1147
+ on_changed do |s|
1108
1148
  v = s.value
1109
1149
  puts "New Slider value: #{v}"
1110
1150
  @progress_bar.value = v
@@ -1122,22 +1162,22 @@ MAIN_WINDOW = window('Control Gallery', 600, 500, 1) {
1122
1162
  vertical_box {
1123
1163
  padded 1
1124
1164
 
1125
- combobox { |c|
1165
+ combobox {
1126
1166
  stretchy 0
1127
- items ['combobox Item 1', 'combobox Item 2', 'combobox Item 3']
1167
+ items 'combobox Item 1', 'combobox Item 2', 'combobox Item 3' # also accepts a single array argument
1128
1168
 
1129
- on_selected do
1169
+ on_selected do |c|
1130
1170
  puts "New combobox selection: #{c.selected}"
1131
1171
  end
1132
1172
  }
1133
1173
 
1134
1174
  editable_combobox {
1135
1175
  stretchy 0
1136
- items ['Editable Item 1', 'Editable Item 2', 'Editable Item 3']
1176
+ items 'Editable Item 1', 'Editable Item 2', 'Editable Item 3' # also accepts a single array argument
1137
1177
  }
1138
1178
 
1139
1179
  radio_buttons {
1140
- items ['Radio Button 1', 'Radio Button 2', 'Radio Button 3']
1180
+ items 'Radio Button 1', 'Radio Button 2', 'Radio Button 3' # also accepts a single array argument
1141
1181
  }
1142
1182
  }
1143
1183
  }
@@ -1145,20 +1185,20 @@ MAIN_WINDOW = window('Control Gallery', 600, 500, 1) {
1145
1185
  tab {
1146
1186
  tab_item('Page 1') {
1147
1187
  horizontal_box {
1148
- entry { |e|
1188
+ entry {
1149
1189
  text 'Please enter your feelings'
1150
1190
 
1151
- on_changed do
1191
+ on_changed do |e|
1152
1192
  puts "Current textbox data: '#{e.text}'"
1153
1193
  end
1154
1194
  }
1155
1195
  }
1156
1196
  }
1157
-
1197
+
1158
1198
  tab_item('Page 2') {
1159
1199
  horizontal_box
1160
1200
  }
1161
-
1201
+
1162
1202
  tab_item('Page 3') {
1163
1203
  horizontal_box
1164
1204
  }
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.5
1
+ 0.0.6
@@ -31,7 +31,7 @@ menu('File') {
31
31
  menu('Edit') {
32
32
  check_menu_item('Checkable Item_')
33
33
  separator_menu_item
34
- menu_item('Disabled Item_') { |mi|
34
+ menu_item('Disabled Item_') {
35
35
  enabled 0
36
36
  }
37
37
  }
@@ -49,7 +49,7 @@ MAIN_WINDOW = window('Control Gallery', 600, 500, 1) {
49
49
  puts 'Bye Bye'
50
50
  end
51
51
 
52
- vertical_box { |vb|
52
+ vertical_box {
53
53
  padded 1
54
54
 
55
55
  horizontal_box {
@@ -69,10 +69,10 @@ MAIN_WINDOW = window('Control Gallery', 600, 500, 1) {
69
69
  end
70
70
  }
71
71
 
72
- checkbox('Checkbox') { |c|
72
+ checkbox('Checkbox') {
73
73
  stretchy 0
74
74
 
75
- on_toggled do
75
+ on_toggled do |c|
76
76
  checked = c.checked == 1
77
77
  MAIN_WINDOW.title = "Checkbox is #{checked}"
78
78
  c.text = "I am the checkbox (#{checked})"
@@ -105,19 +105,19 @@ MAIN_WINDOW = window('Control Gallery', 600, 500, 1) {
105
105
  vertical_box {
106
106
  padded 1
107
107
 
108
- spinbox(0, 100) { |s|
108
+ spinbox(0, 100) {
109
109
  stretchy 0
110
110
  value 42
111
111
 
112
- on_changed do
112
+ on_changed do |s|
113
113
  puts "New Spinbox value: #{s.value}"
114
114
  end
115
115
  }
116
116
 
117
- slider(0, 100) { |s|
117
+ slider(0, 100) {
118
118
  stretchy 0
119
119
 
120
- on_changed do
120
+ on_changed do |s|
121
121
  v = s.value
122
122
  puts "New Slider value: #{v}"
123
123
  @progress_bar.value = v
@@ -135,22 +135,22 @@ MAIN_WINDOW = window('Control Gallery', 600, 500, 1) {
135
135
  vertical_box {
136
136
  padded 1
137
137
 
138
- combobox { |c|
138
+ combobox {
139
139
  stretchy 0
140
- items ['combobox Item 1', 'combobox Item 2', 'combobox Item 3']
140
+ items 'combobox Item 1', 'combobox Item 2', 'combobox Item 3' # also accepts a single array argument
141
141
 
142
- on_selected do
142
+ on_selected do |c|
143
143
  puts "New combobox selection: #{c.selected}"
144
144
  end
145
145
  }
146
146
 
147
147
  editable_combobox {
148
148
  stretchy 0
149
- items ['Editable Item 1', 'Editable Item 2', 'Editable Item 3']
149
+ items 'Editable Item 1', 'Editable Item 2', 'Editable Item 3' # also accepts a single array argument
150
150
  }
151
151
 
152
152
  radio_buttons {
153
- items ['Radio Button 1', 'Radio Button 2', 'Radio Button 3']
153
+ items 'Radio Button 1', 'Radio Button 2', 'Radio Button 3' # also accepts a single array argument
154
154
  }
155
155
  }
156
156
  }
@@ -158,20 +158,20 @@ MAIN_WINDOW = window('Control Gallery', 600, 500, 1) {
158
158
  tab {
159
159
  tab_item('Page 1') {
160
160
  horizontal_box {
161
- entry { |e|
161
+ entry {
162
162
  text 'Please enter your feelings'
163
163
 
164
- on_changed do
164
+ on_changed do |e|
165
165
  puts "Current textbox data: '#{e.text}'"
166
166
  end
167
167
  }
168
168
  }
169
169
  }
170
-
170
+
171
171
  tab_item('Page 2') {
172
172
  horizontal_box
173
173
  }
174
-
174
+
175
175
  tab_item('Page 3') {
176
176
  horizontal_box
177
177
  }
Binary file
@@ -27,7 +27,7 @@ module Glimmer
27
27
  module Libui
28
28
  class TabItemExpression < StaticExpression
29
29
  def interpret(parent, keyword, *args, &block)
30
- Glimmer::LibUI::TabItemProxy.new(keyword, parent, args, &block)
30
+ Glimmer::LibUI::TabItemProxy.create(keyword, parent, args, &block)
31
31
  end
32
32
  end
33
33
  end
@@ -27,8 +27,9 @@ module Glimmer
27
27
  #
28
28
  # Follows the Proxy Design Pattern
29
29
  class ComboboxProxy < ControlProxy
30
- def items(values = nil)
31
- if values.nil?
30
+ def items(*values)
31
+ values = values.first if values.first.is_a?(Array)
32
+ if values.empty?
32
33
  @values
33
34
  else
34
35
  @values = values
@@ -33,7 +33,7 @@ module Glimmer
33
33
  end
34
34
 
35
35
  def create(keyword, parent, args, &block)
36
- widget_proxy_class(keyword).new(keyword, parent, args, &block)
36
+ widget_proxy_class(keyword).new(keyword, parent, args, &block).tap {|c| all_controls << c}
37
37
  end
38
38
 
39
39
  def widget_proxy_class(keyword)
@@ -44,6 +44,12 @@ module Glimmer
44
44
  Glimmer::LibUI::ControlProxy
45
45
  end
46
46
  end
47
+
48
+ # autosave all controls in this array to avoid garbage collection
49
+ def all_controls
50
+ @@all_controls = [] unless defined?(@@all_controls)
51
+ @@all_controls
52
+ end
47
53
  end
48
54
 
49
55
  # libui returns the contained LibUI object
@@ -73,21 +79,23 @@ module Glimmer
73
79
  end
74
80
 
75
81
  def can_handle_listener?(listener_name)
76
- ::LibUI.respond_to?("control_#{listener_name}") || ::LibUI.respond_to?("#{libui_api_keyword}_#{listener_name}")
82
+ ::LibUI.respond_to?("#{libui_api_keyword}_#{listener_name}") ||
83
+ ::LibUI.respond_to?("control_#{listener_name}")
77
84
  end
78
85
 
79
86
  def handle_listener(listener_name, &listener)
80
- if ::LibUI.respond_to?("control_#{listener_name}")
81
- ::LibUI.send("control_#{listener_name}", @libui, &listener)
82
- elsif ::LibUI.respond_to?("#{libui_api_keyword}_#{listener_name}")
83
- ::LibUI.send("#{libui_api_keyword}_#{listener_name}", @libui, &listener)
87
+ safe_listener = Proc.new { listener.call(self) }
88
+ if ::LibUI.respond_to?("#{libui_api_keyword}_#{listener_name}")
89
+ ::LibUI.send("#{libui_api_keyword}_#{listener_name}", @libui, &safe_listener)
90
+ elsif ::LibUI.respond_to?("control_#{listener_name}")
91
+ ::LibUI.send("control_#{listener_name}", @libui, &safe_listener)
84
92
  end
85
93
  end
86
94
 
87
95
  def respond_to?(method_name, *args, &block)
88
96
  respond_to_libui?(method_name, *args, &block) ||
89
97
  (append_properties.include?(method_name.to_s) || append_properties.include?(method_name.to_s.sub(/=$/, ''))) ||
90
- super
98
+ super(method_name, true)
91
99
  end
92
100
 
93
101
  def respond_to_libui?(method_name, *args, &block)
@@ -172,6 +180,11 @@ module Glimmer
172
180
  alias set_visible visible
173
181
  alias visible= visible
174
182
 
183
+ def destroy
184
+ send_to_libui('destroy')
185
+ self.class.all_controls.delete(self)
186
+ end
187
+
175
188
  private
176
189
 
177
190
  def build_control
@@ -27,8 +27,9 @@ module Glimmer
27
27
  #
28
28
  # Follows the Proxy Design Pattern
29
29
  class EditableComboboxProxy < ControlProxy
30
- def items(values = nil)
31
- if values.nil?
30
+ def items(*values)
31
+ values = values.first if values.first.is_a?(Array)
32
+ if values.empty?
32
33
  @values
33
34
  else
34
35
  @values = values
@@ -0,0 +1,35 @@
1
+ # Copyright (c) 2021 Andy Maleh
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining
4
+ # a copy of this software and associated documentation files (the
5
+ # "Software"), to deal in the Software without restriction, including
6
+ # without limitation the rights to use, copy, modify, merge, publish,
7
+ # distribute, sublicense, and/or sell copies of the Software, and to
8
+ # permit persons to whom the Software is furnished to do so, subject to
9
+ # the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be
12
+ # included in all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
22
+ require 'glimmer/libui/control_proxy'
23
+
24
+ module Glimmer
25
+ module LibUI
26
+ # Proxy for LibUI multiline entry objects
27
+ #
28
+ # Follows the Proxy Design Pattern
29
+ class MultilineEntryProxy < ControlProxy
30
+ def libui_api_keyword
31
+ 'multiline_entry'
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,32 @@
1
+ # Copyright (c) 2021 Andy Maleh
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining
4
+ # a copy of this software and associated documentation files (the
5
+ # "Software"), to deal in the Software without restriction, including
6
+ # without limitation the rights to use, copy, modify, merge, publish,
7
+ # distribute, sublicense, and/or sell copies of the Software, and to
8
+ # permit persons to whom the Software is furnished to do so, subject to
9
+ # the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be
12
+ # included in all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
22
+ require 'glimmer/libui/multiline_entry_proxy'
23
+
24
+ module Glimmer
25
+ module LibUI
26
+ # Proxy for LibUI non wrapping multiline entry objects
27
+ #
28
+ # Follows the Proxy Design Pattern
29
+ class NonWrappingMultilineEntryProxy < MultilineEntryProxy
30
+ end
31
+ end
32
+ end
@@ -33,8 +33,8 @@ module Glimmer
33
33
 
34
34
  def handle_listener(listener_name, &listener)
35
35
  if listener_name == 'on_clicked'
36
- default_behavior_listener = Proc.new do
37
- return_value = listener.call
36
+ @default_behavior_listener = Proc.new do
37
+ return_value = listener.call(self)
38
38
  if return_value.is_a?(Numeric)
39
39
  return_value
40
40
  else
@@ -43,8 +43,8 @@ module Glimmer
43
43
  0
44
44
  end
45
45
  end
46
+ ::LibUI.on_should_quit(&@default_behavior_listener)
46
47
  end
47
- ::LibUI.on_should_quit(&default_behavior_listener)
48
48
  end
49
49
 
50
50
  private
@@ -27,8 +27,9 @@ module Glimmer
27
27
  #
28
28
  # Follows the Proxy Design Pattern
29
29
  class RadioButtonsProxy < ControlProxy
30
- def items(values = nil)
31
- if values.nil?
30
+ def items(*values)
31
+ values = values.first if values.first.is_a?(Array)
32
+ if values.empty?
32
33
  @values
33
34
  else
34
35
  @values = values
@@ -20,6 +20,7 @@
20
20
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
21
 
22
22
  require 'glimmer/libui/control_proxy'
23
+ require 'glimmer/libui/horizontal_box_proxy'
23
24
 
24
25
  module Glimmer
25
26
  module LibUI
@@ -36,7 +37,7 @@ module Glimmer
36
37
  @block = block
37
38
  @enabled = 1
38
39
  @index = @parent_proxy.num_pages
39
- @content = @block.call
40
+ @content = @block&.call
40
41
  build_control
41
42
  end
42
43
 
@@ -57,6 +58,7 @@ module Glimmer
57
58
  private
58
59
 
59
60
  def build_control
61
+ @content = HorizontalBoxProxy.new('horizontal_box', @libui, []) if @content.nil?
60
62
  @libui = @parent_proxy.append(name, @content.libui)
61
63
  end
62
64
  end
@@ -43,7 +43,7 @@ module Glimmer
43
43
  def handle_listener(listener_name, &listener)
44
44
  if listener_name == 'on_closing'
45
45
  default_behavior_listener = Proc.new do
46
- return_value = listener.call
46
+ return_value = listener.call(self)
47
47
  if return_value.is_a?(Numeric)
48
48
  return_value
49
49
  else
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.0.5
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andy Maleh
@@ -143,8 +143,8 @@ dependencies:
143
143
  - !ruby/object:Gem::Version
144
144
  version: 0.7.0
145
145
  description: Prerequisite-Free Ruby Desktop Development GUI Library (no need to pre-install
146
- any prerequisites. Just install the gem and have platform-independent GUI that just
147
- works!)
146
+ any prerequisites. Just install the gem and have platform-independent native GUI
147
+ that just works!)
148
148
  email: andy.am@gmail.com
149
149
  executables:
150
150
  - girb
@@ -185,6 +185,8 @@ files:
185
185
  - lib/glimmer/libui/group_proxy.rb
186
186
  - lib/glimmer/libui/horizontal_box_proxy.rb
187
187
  - lib/glimmer/libui/menu_item_proxy.rb
188
+ - lib/glimmer/libui/multiline_entry_proxy.rb
189
+ - lib/glimmer/libui/non_wrapping_multiline_entry_proxy.rb
188
190
  - lib/glimmer/libui/preferences_menu_item_proxy.rb
189
191
  - lib/glimmer/libui/quit_menu_item_proxy.rb
190
192
  - lib/glimmer/libui/radio_buttons_proxy.rb