glimmer-dsl-libui 0.11.3 → 0.11.5
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 +9 -0
- data/README.md +7 -3
- data/VERSION +1 -1
- data/examples/dynamic_form.rb +3 -1
- data/glimmer-dsl-libui.gemspec +0 -0
- data/lib/glimmer/dsl/libui/content_expression.rb +2 -2
- data/lib/glimmer/dsl/libui/control_expression.rb +2 -1
- data/lib/glimmer/dsl/libui/custom_control_expression.rb +2 -1
- data/lib/glimmer/dsl/libui/custom_shape_expression.rb +2 -1
- data/lib/glimmer/dsl/libui/shape_expression.rb +2 -1
- data/lib/glimmer/dsl/libui/shine_data_binding_expression.rb +2 -1
- data/lib/glimmer/dsl/libui/string_expression.rb +2 -1
- data/lib/glimmer/libui/control_proxy/table_proxy.rb +5 -1
- data/lib/glimmer/libui/control_proxy.rb +4 -1
- data/lib/glimmer/libui/custom_control.rb +22 -11
- data/lib/glimmer/libui/custom_shape.rb +15 -10
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4c7045c2016a37ef9423c6d3e8f2a8480b0b1590e98afc56a2587a4a7d304e30
|
4
|
+
data.tar.gz: 41699750c28cb881e8c9335280c01836044e89ef31964ec149e052155662ea3c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 076d9bc4874bd8328110afd687aa334da3408e9b7dd87937bb7e8eec84591b872bf09e977327de91c27f67e8d342bc4a70e764f87ad61d00fce30bd2cf4daa99
|
7
|
+
data.tar.gz: 640f1392dd961fb5387d04bddada7baef42120ae75d91a6ee362be928ce89966f52688887b996986fb46ed08c5b434d863f726cf56fff5b6ade52bf2a45f087c
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,14 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
+
## 0.11.5
|
4
|
+
|
5
|
+
- Support table explicit data-binding with a model attribute that returns an Enumerator (instead of an Array)
|
6
|
+
|
7
|
+
## 0.11.4
|
8
|
+
|
9
|
+
- Fix issue with Content Data-Binding not working
|
10
|
+
- Fix issue with not successfully processing layout properties (e.g. `stretchy`) when nested under custom controls/windows
|
11
|
+
|
3
12
|
## 0.11.3
|
4
13
|
|
5
14
|
- Support nesting `on_mouse_*` listeners under `text`
|
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.11.
|
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.11.5
|
2
2
|
## Prerequisite-Free Ruby Desktop Development Cross-Platform Native GUI Library ([Fukuoka Award Winning](http://www.digitalfukuoka.jp/topics/187?locale=ja))
|
3
3
|
### The Quickest Way From Zero To GUI
|
4
4
|
[](http://badge.fury.io/rb/glimmer-dsl-libui)
|
@@ -8,6 +8,8 @@
|
|
8
8
|
|
9
9
|
(**[Fukuoka Ruby Award Competition 2022 Special Award Winner](https://andymaleh.blogspot.com/2022/02/glimmer-dsl-for-libui-wins-fukuoka-ruby.html)** [[Award Announcement]](http://www.digitalfukuoka.jp/topics/187?locale=ja))
|
10
10
|
|
11
|
+
(**[***RubyConf 2023 Workshop - How To Build Desktop Applications in Ruby***](https://github.com/AndyObtiva/how-to-build-desktop-applications-in-ruby)**)
|
12
|
+
|
11
13
|
(**[***RubyConf 2022 Talk - Building Native GUI Apps in Ruby***](https://andymaleh.blogspot.com/2023/02/rubyconf-2022-talk-video-for-building.html)**)
|
12
14
|
|
13
15
|
[**(Ruby Rogues Podcast Interview - Desktop Apps in Ruby ft. Andy)**](https://andymaleh.blogspot.com/2022/05/ruby-rogues-podcast-interview-desktop.html)
|
@@ -431,7 +433,7 @@ gem install glimmer-dsl-libui
|
|
431
433
|
Or install via Bundler `Gemfile`:
|
432
434
|
|
433
435
|
```ruby
|
434
|
-
gem 'glimmer-dsl-libui', '~> 0.11.
|
436
|
+
gem 'glimmer-dsl-libui', '~> 0.11.5'
|
435
437
|
```
|
436
438
|
|
437
439
|
Test that installation worked by running the [Glimmer Meta-Example](#examples):
|
@@ -463,7 +465,9 @@ Afterwards, to access the Glimmer GUI DSL:
|
|
463
465
|
|
464
466
|
You may learn more about the different options above with basic examples in the following subsections: [Experimentation Usage](#experimentation-usage), [Prototyping Usage](#prototyping-usage), [Serious Usage](#serious-usage).
|
465
467
|
|
466
|
-
If you are new to [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) (beginner), after going through the subsections below, check out the RubyConf 2022 talk ["Building Native GUI Apps in Ruby"](https://andymaleh.blogspot.com/2023/02/rubyconf-2022-talk-video-for-building.html), [Glimmer GUI DSL Concepts](#glimmer-gui-dsl-concepts), [Glimmer Command](#glimmer-command) (just the basics, how to run an app, and how to run examples to start), [Girb](#girb-glimmer-irb) and [Examples](#examples) to quickly learn through copy/paste. It is very important for beginners to go through all the [Examples](#examples) from the most basic to the most advanced while reading the README topics that relate to the examples. You may refer to the [API](#api)
|
468
|
+
If you are new to [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) (beginner), after going through the subsections below, check out the RubyConf 2022 talk ["Building Native GUI Apps in Ruby"](https://andymaleh.blogspot.com/2023/02/rubyconf-2022-talk-video-for-building.html), [Glimmer GUI DSL Concepts](#glimmer-gui-dsl-concepts), [Glimmer Command](#glimmer-command) (just the basics, how to run an app, and how to run examples to start), [Girb](#girb-glimmer-irb) and [Examples](#examples) to quickly learn through copy/paste. It is very important for beginners to go through all the [Examples](#examples) from the most basic to the most advanced while reading the README topics that relate to the examples. Alternatively, beginners can learn from the RubyConf 2023 workshop ["How To Build Desktop Applications in Ruby"](https://github.com/AndyObtiva/how-to-build-desktop-applications-in-ruby), which includes 27 step-by-step exercises. You may refer to the [API](#api) once you have gotten your feet wet with [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) and need a more detailed reference.
|
469
|
+
|
470
|
+
If you encounter any issues with the documentation, get stuck with code you do not understand, or notice some out-of-date information, you may contact the project maintainers on the [Glimmer Gitter Chat](https://app.gitter.im/#/room/#AndyObtiva_glimmer:gitter.im). Also, this could be your opportunity to be a good steward of Open-Source Software by contributing a documentation fix in a GitHub Pull Request or reporting a GitHub Issue at least.
|
467
471
|
|
468
472
|
### Experimentation Usage
|
469
473
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.11.
|
1
|
+
0.11.5
|
data/examples/dynamic_form.rb
CHANGED
@@ -59,7 +59,9 @@ class DynamicForm
|
|
59
59
|
|
60
60
|
button('Summarize') {
|
61
61
|
on_clicked do
|
62
|
-
|
62
|
+
user_attribute_values = @user.customizable_attributes.map { |attribute| @user.send(attribute) }
|
63
|
+
non_blank_user_attribute_values = user_attribute_values.map(&:to_s).reject(&:empty?)
|
64
|
+
summary = non_blank_user_attribute_values.join(', ')
|
63
65
|
msg_box('Summary', summary)
|
64
66
|
end
|
65
67
|
}
|
data/glimmer-dsl-libui.gemspec
CHANGED
Binary file
|
@@ -19,12 +19,12 @@
|
|
19
19
|
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
20
|
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
21
|
|
22
|
-
require 'glimmer/dsl/
|
22
|
+
require 'glimmer/dsl/expression'
|
23
23
|
|
24
24
|
module Glimmer
|
25
25
|
module DSL
|
26
26
|
module Libui
|
27
|
-
class ContentExpression <
|
27
|
+
class ContentExpression < Expression
|
28
28
|
def can_interpret?(parent, keyword, *args, &block)
|
29
29
|
keyword == 'content' &&
|
30
30
|
block_given? &&
|
@@ -38,7 +38,8 @@ module Glimmer
|
|
38
38
|
end
|
39
39
|
|
40
40
|
def add_content(parent, keyword, *args, &block)
|
41
|
-
options = args.last.is_a?(Hash) ? args.last : {
|
41
|
+
options = args.last.is_a?(Hash) ? args.last : {}
|
42
|
+
options[:post_add_content] = true if !options.include?(:post_add_content)
|
42
43
|
super
|
43
44
|
parent&.post_add_content if options[:post_add_content]
|
44
45
|
end
|
@@ -44,7 +44,8 @@ module Glimmer
|
|
44
44
|
end
|
45
45
|
|
46
46
|
def add_content(custom_control, keyword, *args, &block)
|
47
|
-
options = args.last.is_a?(Hash) ? args.last : {
|
47
|
+
options = args.last.is_a?(Hash) ? args.last : {}
|
48
|
+
options[:post_add_content] = true if !options.include?(:post_add_content)
|
48
49
|
# TODO consider avoiding source_location
|
49
50
|
if block.source_location == custom_control.content&.__getobj__&.source_location
|
50
51
|
custom_control.content.call(custom_control) unless custom_control.content.called?
|
@@ -43,7 +43,8 @@ module Glimmer
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def add_content(custom_shape, keyword, *args, &block)
|
46
|
-
options = args.last.is_a?(Hash) ? args.last : {
|
46
|
+
options = args.last.is_a?(Hash) ? args.last : {}
|
47
|
+
options[:post_add_content] = true if !options.include?(:post_add_content)
|
47
48
|
# TODO consider avoiding source_location
|
48
49
|
if block.source_location == custom_shape.content&.__getobj__&.source_location
|
49
50
|
custom_shape.content.call(custom_shape) unless custom_shape.content.called?
|
@@ -48,7 +48,8 @@ module Glimmer
|
|
48
48
|
end
|
49
49
|
|
50
50
|
def add_content(parent, keyword, *args, &block)
|
51
|
-
options = args.last.is_a?(Hash) ? args.last : {
|
51
|
+
options = args.last.is_a?(Hash) ? args.last : {}
|
52
|
+
options[:post_add_content] = true if !options.include?(:post_add_content)
|
52
53
|
super
|
53
54
|
parent&.post_add_content if options[:post_add_content]
|
54
55
|
end
|
@@ -28,7 +28,8 @@ module Glimmer
|
|
28
28
|
module Libui
|
29
29
|
class ShineDataBindingExpression < Expression
|
30
30
|
def can_interpret?(parent, keyword, *args, &block)
|
31
|
-
|
31
|
+
keyword != 'content' and
|
32
|
+
args.size == 0 and
|
32
33
|
block.nil? and
|
33
34
|
parent.respond_to?(keyword, *args, &block)
|
34
35
|
end
|
@@ -46,7 +46,8 @@ module Glimmer
|
|
46
46
|
end
|
47
47
|
|
48
48
|
def add_content(parent, keyword, *args, &block)
|
49
|
-
options = args.last.is_a?(Hash) ? args.last : {
|
49
|
+
options = args.last.is_a?(Hash) ? args.last : {}
|
50
|
+
options[:post_add_content] = true if !options.include?(:post_add_content)
|
50
51
|
parent&.post_add_content(block) if options[:post_add_content]
|
51
52
|
end
|
52
53
|
end
|
@@ -243,7 +243,11 @@ module Glimmer
|
|
243
243
|
model_attribute_observer = model_attribute_observer_registration = nil
|
244
244
|
model_attribute_observer = Glimmer::DataBinding::Observer.proc do
|
245
245
|
new_value = model_binding.evaluate_property
|
246
|
-
if
|
246
|
+
if !new_value.is_a?(Enumerator) &&
|
247
|
+
(
|
248
|
+
model_binding.binding_options[:column_attributes] ||
|
249
|
+
(!new_value.nil? && (!new_value.is_a?(String) || !new_value.empty?) && (!new_value.is_a?(Array) || !new_value.first.is_a?(Array)))
|
250
|
+
)
|
247
251
|
@model_attribute_array_observer_registration&.deregister
|
248
252
|
@model_attribute_array_observer_registration = model_attribute_observer.observe(new_value, column_attributes, ignore_frozen: true, attribute_writer_type: [:attribute=, :set_attribute])
|
249
253
|
model_attribute_observer.add_dependent(model_attribute_observer_registration => @model_attribute_array_observer_registration)
|
@@ -142,7 +142,10 @@ module Glimmer
|
|
142
142
|
# Subclasses may override to perform post add_content work (normally must call super)
|
143
143
|
def post_add_content
|
144
144
|
unless @content_added
|
145
|
-
|
145
|
+
if CustomControl.custom_controls_being_interpreted.last.nil? ||
|
146
|
+
CustomControl.custom_controls_being_interpreted.last.parent_proxy != @parent_proxy
|
147
|
+
@parent_proxy&.post_initialize_child(self)
|
148
|
+
end
|
146
149
|
@content_added = true
|
147
150
|
end
|
148
151
|
end
|
@@ -52,16 +52,6 @@ module Glimmer
|
|
52
52
|
result ||= can_handle_listener?(method_name)
|
53
53
|
result ||= @body_root.respond_to?(method_name, *args, &block)
|
54
54
|
end
|
55
|
-
|
56
|
-
# Returns content block if used as an attribute reader (no args)
|
57
|
-
# Otherwise, if a block is passed, it adds it as content to this custom control
|
58
|
-
def content(&block)
|
59
|
-
if block_given?
|
60
|
-
Glimmer::DSL::Engine.add_content(self, Glimmer::DSL::Libui::CustomControlExpression.new, self.class.keyword, &block)
|
61
|
-
else
|
62
|
-
@content
|
63
|
-
end
|
64
|
-
end
|
65
55
|
end
|
66
56
|
|
67
57
|
super_module_included do |klass|
|
@@ -193,11 +183,16 @@ module Glimmer
|
|
193
183
|
def after_body(&block)
|
194
184
|
@after_body_block = block
|
195
185
|
end
|
186
|
+
|
187
|
+
def custom_controls_being_interpreted
|
188
|
+
@custom_controls_being_interpreted ||= []
|
189
|
+
end
|
196
190
|
end
|
197
191
|
|
198
192
|
attr_reader :body_root, :libui, :parent, :parent_proxy, :args, :keyword, :content, :options
|
199
193
|
|
200
194
|
def initialize(keyword, parent, args, options, &content)
|
195
|
+
CustomControl.custom_controls_being_interpreted << self
|
201
196
|
@parent_proxy = @parent = parent
|
202
197
|
options ||= {}
|
203
198
|
@options = self.class.options.merge(options)
|
@@ -220,7 +215,8 @@ module Glimmer
|
|
220
215
|
end
|
221
216
|
|
222
217
|
def post_add_content
|
223
|
-
|
218
|
+
@parent_proxy&.post_initialize_child(@body_root)
|
219
|
+
Glimmer::LibUI::CustomControl.custom_controls_being_interpreted.pop
|
224
220
|
end
|
225
221
|
|
226
222
|
def observer_registrations
|
@@ -243,6 +239,21 @@ module Glimmer
|
|
243
239
|
!method(method_name)&.source_location&.first&.include?('glimmer/dsl/engine.rb') and
|
244
240
|
!method(method_name)&.source_location&.first&.include?('glimmer/libui/control_proxy.rb')
|
245
241
|
end
|
242
|
+
|
243
|
+
# Returns content block if used as an attribute reader (no args)
|
244
|
+
# Otherwise, if a block is passed, it adds it as content to this custom control
|
245
|
+
def content(*args, &block)
|
246
|
+
if args.empty?
|
247
|
+
if block_given?
|
248
|
+
Glimmer::DSL::Engine.add_content(self, Glimmer::DSL::Libui::CustomControlExpression.new, self.class.keyword, &block)
|
249
|
+
else
|
250
|
+
@content
|
251
|
+
end
|
252
|
+
else
|
253
|
+
# delegate to GUI DSL ContentExpression
|
254
|
+
super
|
255
|
+
end
|
256
|
+
end
|
246
257
|
|
247
258
|
private
|
248
259
|
|
@@ -52,16 +52,6 @@ module Glimmer
|
|
52
52
|
result ||= can_handle_listener?(method_name)
|
53
53
|
result ||= @body_root.respond_to?(method_name, *args, &block)
|
54
54
|
end
|
55
|
-
|
56
|
-
# Returns content block if used as an attribute reader (no args)
|
57
|
-
# Otherwise, if a block is passed, it adds it as content to this custom shape
|
58
|
-
def content(&block)
|
59
|
-
if block_given?
|
60
|
-
Glimmer::DSL::Engine.add_content(self, Glimmer::DSL::Libui::CustomShapeExpression.new, self.class.keyword, &block)
|
61
|
-
else
|
62
|
-
@content
|
63
|
-
end
|
64
|
-
end
|
65
55
|
end
|
66
56
|
|
67
57
|
super_module_included do |klass|
|
@@ -240,6 +230,21 @@ module Glimmer
|
|
240
230
|
!method(method_name)&.source_location&.first&.include?('glimmer/dsl/engine.rb') and
|
241
231
|
!method(method_name)&.source_location&.first&.include?('glimmer/libui/shape.rb')
|
242
232
|
end
|
233
|
+
|
234
|
+
# Returns content block if used as an attribute reader (no args)
|
235
|
+
# Otherwise, if a block is passed, it adds it as content to this custom shape
|
236
|
+
def content(*args, &block)
|
237
|
+
if args.empty?
|
238
|
+
if block_given?
|
239
|
+
Glimmer::DSL::Engine.add_content(self, Glimmer::DSL::Libui::CustomShapeExpression.new, self.class.keyword, &block)
|
240
|
+
else
|
241
|
+
@content
|
242
|
+
end
|
243
|
+
else
|
244
|
+
# delegate to GUI DSL ContentExpression
|
245
|
+
super
|
246
|
+
end
|
247
|
+
end
|
243
248
|
|
244
249
|
private
|
245
250
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: glimmer-dsl-libui
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.11.
|
4
|
+
version: 0.11.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andy Maleh
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-11-
|
11
|
+
date: 2023-11-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: glimmer
|