glimmer-dsl-libui 0.1.0 → 0.1.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f0e5255370f70684a7f60de75fe52399f604761996059b23370ce53c4e11cdd1
4
- data.tar.gz: 00fe32154a83c206843d2386406cde3841da5296cb432585d8aedf421578c47c
3
+ metadata.gz: '0938fd7cd0d762ecf27c7897a6305ec9a1d8b447917c4612c864e87486e44241'
4
+ data.tar.gz: 7387d2a5d966bbf5f2e70184013cc8056023b94375b1ec1e9941bcdac0c8da27
5
5
  SHA512:
6
- metadata.gz: 92ef8efbe6d9563dcf20affce754ea4f8fd6ee3eceec014f7499a8ea15631e0127877526ca313513129aee506dc9b363651dde235e2e965a456ddcb2df29c7ae
7
- data.tar.gz: 9ceec5135f065862bfc7590883346dc0930380da5e12f6b575a5c4a6c1c6d45e7d575392daf0b003cf78889a5c90cc4033cd48783e1a6c2cd5f4e53d4814b009
6
+ metadata.gz: c44c83599999686358def664edf39c9f4cdcac415fd608d3668109eaba098b296cd27ce33130d8b0318904f89b406a5bddc2df808233f85c5474dc1165bbbfd2
7
+ data.tar.gz: c9d69205562886250e16359b5db53d426d4cea2d96da8bdac34c41b1488f7cd74e9e3864fa82636cd351169fab60e945f56a19f5219fc59312b4fc5d11e63770
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # Change Log
2
2
 
3
+ ## 0.1.1
4
+
5
+ - Support `area` listener: `on_draw`
6
+ - New examples/basic_area2.rb
7
+
3
8
  ## 0.1.0
4
9
 
5
10
  - Support examples/basic_area.rb
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.1.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.1.1
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)
@@ -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.1.0](#-glimmer-dsl-for-libui-010)
46
+ - [Glimmer DSL for LibUI 0.1.1](#-glimmer-dsl-for-libui-011)
47
47
  - [Glimmer GUI DSL Concepts](#glimmer-gui-dsl-concepts)
48
48
  - [Usage](#usage)
49
49
  - [API](#api)
@@ -82,6 +82,7 @@ Other [Glimmer](https://rubygems.org/gems/glimmer) DSL gems you might be interes
82
82
  - [Basic Table Progress Bar](#basic-table-progress-bar)
83
83
  - [Form Table](#form-table)
84
84
  - [Basic Area](#basic-area)
85
+ - [Dynamic Area](#dynamic-area)
85
86
  - [Contributing to glimmer-dsl-libui](#contributing-to-glimmer-dsl-libui)
86
87
  - [Help](#help)
87
88
  - [Issues](#issues)
@@ -169,7 +170,7 @@ gem install glimmer-dsl-libui
169
170
  Or install via Bundler `Gemfile`:
170
171
 
171
172
  ```ruby
172
- gem 'glimmer-dsl-libui', '~> 0.1.0'
173
+ gem 'glimmer-dsl-libui', '~> 0.1.1'
173
174
  ```
174
175
 
175
176
  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.
@@ -225,7 +226,7 @@ w.libui # => #<Fiddle::Pointer:0x00007fde53997980 ptr=0x00007fde51352a60 size=0
225
226
  Control(Args) | Properties | Listeners
226
227
  ------------- | ---------- | ---------
227
228
  `about_menu_item` | None | `on_clicked`
228
- `area` | None | None
229
+ `area` | None | `on_draw`
229
230
  `button(text as String)` | `text` (`String`) | `on_clicked`
230
231
  `button_column(name as String)` | `enabled` (Boolean) | None
231
232
  `checkbox(text as String)` | `checked` (Boolean), `text` (`String`) | `on_toggled`
@@ -328,7 +329,61 @@ Note that the `cell_rows` property declaration results in "implicit data-binding
328
329
 
329
330
  ### Area API
330
331
 
331
- The `area` control can have a `path` nested underneath declaratively, containing figures like `rectangle`, and all the drawing logic is generated automatically from that.
332
+ The `area` control can be used in one of two ways:
333
+ - Declaratively via stable paths: useful for stable paths that will not change later on. Simply nest `path` and figures like `rectangle` and all drawing logic is generated automatically.
334
+ - Semi-declaratively via on_draw listener dynamic paths: useful for more dynamic paths that will definitely change. Open an `on_draw` listener block and nest `path(area_draw_params)` and figures like `rectangle` and all drawing logic is generated automatically.
335
+
336
+ Here is an example of a declarative `area` with a stable path (you may copy/paste in [`girb`](#girb-glimmer-irb)):
337
+
338
+ ```ruby
339
+ require 'glimmer-dsl-libui'
340
+
341
+ include Glimmer
342
+
343
+ window('Basic Area', 400, 400) {
344
+ margined true
345
+
346
+ vertical_box {
347
+ area {
348
+ path { # a stable path is added declaratively
349
+ rectangle(0, 0, 400, 400)
350
+
351
+ fill r: 102, g: 102, b: 204, a: 1.0
352
+ }
353
+ }
354
+ }
355
+ }.show
356
+ ```
357
+
358
+ ![glimmer-dsl-libui-mac-basic-area.png](images/glimmer-dsl-libui-mac-basic-area.png)
359
+
360
+ Here is the same example using a semi-declarative `area` with `on_draw` listener and a dynamic path (you may copy/paste in [`girb`](#girb-glimmer-irb)):
361
+
362
+ ```ruby
363
+ require 'glimmer-dsl-libui'
364
+
365
+ include Glimmer
366
+
367
+ window('Basic Area', 400, 400) {
368
+ margined true
369
+
370
+ vertical_box {
371
+ area {
372
+ on_draw do |area_draw_params|
373
+ path(area_draw_params) { # a dynamic path is added semi-declaratively inside on_draw block
374
+ rectangle(0, 0, 400, 400)
375
+
376
+ fill r: 102, g: 102, b: 204, a: 1.0
377
+ }
378
+ end
379
+ }
380
+ }
381
+ }.show
382
+ ```
383
+
384
+ Check [examples/dynamic_area.rb](#dynamic-area) for a more detailed semi-declarative example.
385
+
386
+ To redraw an `area`, you may call `#queue_redraw_all` method.
332
387
 
333
388
  ### Smart Defaults and Conventions
334
389
 
@@ -2689,6 +2744,136 @@ window('Basic Area', 400, 400) {
2689
2744
  }.show
2690
2745
  ```
2691
2746
 
2747
+ ### Dynamic Area
2748
+
2749
+ [examples/dynamic_area.rb](examples/dynamic_area.rb)
2750
+
2751
+ Run with this command from the root of the project if you cloned the project:
2752
+
2753
+ ```
2754
+ ruby -r './lib/glimmer-dsl-libui' examples/dynamic_area.rb
2755
+ ```
2756
+
2757
+ Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/glimmer-dsl-libui):
2758
+
2759
+ ```
2760
+ ruby -r glimmer-dsl-libui -e "require 'examples/dynamic_area'"
2761
+ ```
2762
+
2763
+ Mac
2764
+
2765
+ ![glimmer-dsl-libui-mac-dynamic-area.png](images/glimmer-dsl-libui-mac-dynamic-area.png)
2766
+ ![glimmer-dsl-libui-mac-dynamic-area-updated.png](images/glimmer-dsl-libui-mac-dynamic-area-updated.png)
2767
+
2768
+ Linux
2769
+
2770
+ ![glimmer-dsl-libui-linux-dynamic-area.png](images/glimmer-dsl-libui-linux-dynamic-area.png)
2771
+ ![glimmer-dsl-libui-linux-dynamic-area-updated.png](images/glimmer-dsl-libui-linux-dynamic-area-updated.png)
2772
+
2773
+ New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
2774
+
2775
+ ```ruby
2776
+ require 'glimmer-dsl-libui'
2777
+
2778
+ include Glimmer
2779
+
2780
+ window('Dynamic Area', 240, 500) {
2781
+ margined true
2782
+
2783
+ vertical_box {
2784
+ label('Rectangle Properties') {
2785
+ stretchy false
2786
+ }
2787
+
2788
+ form {
2789
+ stretchy false
2790
+
2791
+ @x_spinbox = spinbox(0, 1000) {
2792
+ label 'x'
2793
+ value 25
2794
+
2795
+ on_changed do
2796
+ @area.queue_redraw_all
2797
+ end
2798
+ }
2799
+
2800
+ @y_spinbox = spinbox(0, 1000) {
2801
+ label 'y'
2802
+ value 25
2803
+
2804
+ on_changed do
2805
+ @area.queue_redraw_all
2806
+ end
2807
+ }
2808
+
2809
+ @width_spinbox = spinbox(0, 1000) {
2810
+ label 'width'
2811
+ value 150
2812
+
2813
+ on_changed do
2814
+ @area.queue_redraw_all
2815
+ end
2816
+ }
2817
+
2818
+ @height_spinbox = spinbox(0, 1000) {
2819
+ label 'height'
2820
+ value 150
2821
+
2822
+ on_changed do
2823
+ @area.queue_redraw_all
2824
+ end
2825
+ }
2826
+
2827
+ @red_spinbox = spinbox(0, 255) {
2828
+ label 'red'
2829
+ value 102
2830
+
2831
+ on_changed do
2832
+ @area.queue_redraw_all
2833
+ end
2834
+ }
2835
+
2836
+ @green_spinbox = spinbox(0, 255) {
2837
+ label 'green'
2838
+ value 102
2839
+
2840
+ on_changed do
2841
+ @area.queue_redraw_all
2842
+ end
2843
+ }
2844
+
2845
+ @blue_spinbox = spinbox(0, 255) {
2846
+ label 'blue'
2847
+ value 204
2848
+
2849
+ on_changed do
2850
+ @area.queue_redraw_all
2851
+ end
2852
+ }
2853
+
2854
+ @alpha_spinbox = spinbox(0, 100) {
2855
+ label 'alpha'
2856
+ value 100
2857
+
2858
+ on_changed do
2859
+ @area.queue_redraw_all
2860
+ end
2861
+ }
2862
+ }
2863
+
2864
+ @area = area {
2865
+ on_draw do |area_draw_params|
2866
+ path(area_draw_params) { # a dynamic path is added semi-declaratively inside on_draw block
2867
+ rectangle(@x_spinbox.value, @y_spinbox.value, @width_spinbox.value, @height_spinbox.value)
2868
+
2869
+ fill r: @red_spinbox.value, g: @green_spinbox.value, b: @blue_spinbox.value, a: @alpha_spinbox.value / 100.0
2870
+ }
2871
+ end
2872
+ }
2873
+ }
2874
+ }.show
2875
+ ```
2876
+
2692
2877
  ## Contributing to glimmer-dsl-libui
2693
2878
 
2694
2879
  - Check out the latest master to make sure the feature hasn't been
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.1.1
@@ -0,0 +1,19 @@
1
+ require 'glimmer-dsl-libui'
2
+
3
+ include Glimmer
4
+
5
+ window('Basic Area', 400, 400) {
6
+ margined true
7
+
8
+ vertical_box {
9
+ area {
10
+ on_draw do |area_draw_params|
11
+ path(area_draw_params) { # a dynamic path is added semi-declaratively inside on_draw block
12
+ rectangle(0, 0, 400, 400)
13
+
14
+ fill r: 102, g: 102, b: 204, a: 1.0
15
+ }
16
+ end
17
+ }
18
+ }
19
+ }.show
@@ -0,0 +1,99 @@
1
+ require 'glimmer-dsl-libui'
2
+
3
+ include Glimmer
4
+
5
+ window('Dynamic Area', 240, 600) {
6
+ margined true
7
+
8
+ vertical_box {
9
+ label('Rectangle Properties') {
10
+ stretchy false
11
+ }
12
+
13
+ form {
14
+ stretchy false
15
+
16
+ @x_spinbox = spinbox(0, 1000) {
17
+ label 'x'
18
+ value 25
19
+
20
+ on_changed do
21
+ @area.queue_redraw_all
22
+ end
23
+ }
24
+
25
+ @y_spinbox = spinbox(0, 1000) {
26
+ label 'y'
27
+ value 25
28
+
29
+ on_changed do
30
+ @area.queue_redraw_all
31
+ end
32
+ }
33
+
34
+ @width_spinbox = spinbox(0, 1000) {
35
+ label 'width'
36
+ value 150
37
+
38
+ on_changed do
39
+ @area.queue_redraw_all
40
+ end
41
+ }
42
+
43
+ @height_spinbox = spinbox(0, 1000) {
44
+ label 'height'
45
+ value 150
46
+
47
+ on_changed do
48
+ @area.queue_redraw_all
49
+ end
50
+ }
51
+
52
+ @red_spinbox = spinbox(0, 255) {
53
+ label 'red'
54
+ value 102
55
+
56
+ on_changed do
57
+ @area.queue_redraw_all
58
+ end
59
+ }
60
+
61
+ @green_spinbox = spinbox(0, 255) {
62
+ label 'green'
63
+ value 102
64
+
65
+ on_changed do
66
+ @area.queue_redraw_all
67
+ end
68
+ }
69
+
70
+ @blue_spinbox = spinbox(0, 255) {
71
+ label 'blue'
72
+ value 204
73
+
74
+ on_changed do
75
+ @area.queue_redraw_all
76
+ end
77
+ }
78
+
79
+ @alpha_spinbox = spinbox(0, 100) {
80
+ label 'alpha'
81
+ value 100
82
+
83
+ on_changed do
84
+ @area.queue_redraw_all
85
+ end
86
+ }
87
+ }
88
+
89
+ @area = area {
90
+ on_draw do |area_draw_params|
91
+ path(area_draw_params) { # a dynamic path is added semi-declaratively inside on_draw block
92
+ rectangle(@x_spinbox.value, @y_spinbox.value, @width_spinbox.value, @height_spinbox.value)
93
+
94
+ fill r: @red_spinbox.value, g: @green_spinbox.value, b: @blue_spinbox.value, a: @alpha_spinbox.value / 100.0
95
+ }
96
+ end
97
+ }
98
+ }
99
+ }.show
Binary file
@@ -46,6 +46,29 @@ module Glimmer
46
46
  @children ||= []
47
47
  end
48
48
 
49
+ def on_draw(&block)
50
+ @on_draw_procs ||= []
51
+ if block.nil?
52
+ @on_draw_procs
53
+ else
54
+ @on_draw_procs << block
55
+ block
56
+ end
57
+ end
58
+
59
+ def can_handle_listener?(listener_name)
60
+ listener_name == 'on_draw' || super
61
+ end
62
+
63
+ def handle_listener(listener_name, &listener)
64
+ case listener_name
65
+ when 'on_draw'
66
+ on_draw(&listener)
67
+ else
68
+ super
69
+ end
70
+ end
71
+
49
72
  private
50
73
 
51
74
  def build_control
@@ -56,13 +79,27 @@ module Glimmer
56
79
  def install_listeners
57
80
  @area_handler.Draw = fiddle_closure_block_caller(0, [1, 1, 1]) do |_, _, area_draw_params|
58
81
  area_draw_params = ::LibUI::FFI::AreaDrawParams.new(area_draw_params)
82
+ area_draw_params = area_draw_params_hash(area_draw_params)
59
83
  children.each {|child| child.draw(area_draw_params)}
84
+ on_draw.each {|listener| listener.call(area_draw_params) }
60
85
  end
61
86
  @area_handler.MouseEvent = fiddle_closure_block_caller(0, [0]) {}
62
87
  @area_handler.MouseCrossed = fiddle_closure_block_caller(0, [0]) {}
63
88
  @area_handler.DragBroken = fiddle_closure_block_caller(0, [0]) {}
64
89
  @area_handler.KeyEvent = fiddle_closure_block_caller(0, [0]) {}
65
90
  end
91
+
92
+ def area_draw_params_hash(area_draw_params)
93
+ {
94
+ context: area_draw_params.Context,
95
+ area_width: area_draw_params.AreaWidth,
96
+ area_height: area_draw_params.AreaHeight,
97
+ clip_x: area_draw_params.ClipX,
98
+ clip_y: area_draw_params.ClipY,
99
+ clip_width: area_draw_params.ClipWidth,
100
+ clip_height: area_draw_params.ClipHeight,
101
+ }
102
+ end
66
103
  end
67
104
  end
68
105
  end
@@ -35,7 +35,12 @@ module Glimmer
35
35
  def on_clicked(&block)
36
36
  # TODO consider generalizing into custom listeners and moving to ControlProxy
37
37
  @on_clicked_procs ||= []
38
- @on_clicked_procs << block
38
+ if block.nil?
39
+ @on_clicked_procs
40
+ else
41
+ @on_clicked_procs << block
42
+ block
43
+ end
39
44
  end
40
45
 
41
46
  def can_handle_listener?(listener_name)
@@ -42,6 +42,11 @@ module Glimmer
42
42
  children << child
43
43
  end
44
44
 
45
+ def post_add_content
46
+ super
47
+ draw(area_draw_params) if @parent_proxy.nil?
48
+ end
49
+
45
50
  def children
46
51
  @children ||= []
47
52
  end
@@ -50,8 +55,8 @@ module Glimmer
50
55
  build_control
51
56
  children.each {|child| child.draw(area_draw_params)}
52
57
  ::LibUI.draw_path_end(@libui)
53
- ::LibUI.draw_fill(area_draw_params.Context, @libui, fill_draw_brush.to_ptr) unless fill.empty?
54
- ::LibUI.draw_stroke(area_draw_params.Context, @libui, stroke_draw_brush, draw_stroke_params) unless stroke.empty?
58
+ ::LibUI.draw_fill(area_draw_params[:context], @libui, fill_draw_brush.to_ptr) unless fill.empty?
59
+ ::LibUI.draw_stroke(area_draw_params[:context], @libui, stroke_draw_brush, draw_stroke_params) unless stroke.empty?
55
60
  ::LibUI.draw_free_path(@libui)
56
61
  end
57
62
 
@@ -103,11 +108,14 @@ module Glimmer
103
108
  @draw_stroke_params.DashPhase = @stroke[:dash_phase] || 0
104
109
  @draw_stroke_params
105
110
  end
111
+
112
+ # returns area_draw_params if built inside on_draw listener (not needed if declared outside)
113
+ def area_draw_params
114
+ @args[0] if @parent_proxy.nil?
115
+ end
106
116
 
107
117
  def destroy
108
- if @parent_proxy
109
- @parent_proxy.children.delete(self)
110
- end
118
+ @parent_proxy.children.delete(self) unless @parent_proxy.nil?
111
119
  end
112
120
 
113
121
  private
@@ -48,8 +48,14 @@ module Glimmer
48
48
  end
49
49
 
50
50
  def on_destroy(&block)
51
+ # TODO look into a way to generalize this logic for multiple listeners
51
52
  @on_destroy_procs ||= []
52
- @on_destroy_procs << block
53
+ if block.nil?
54
+ @on_destroy_procs
55
+ else
56
+ @on_destroy_procs << block
57
+ block
58
+ end
53
59
  end
54
60
 
55
61
  def show
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.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andy Maleh
@@ -195,6 +195,7 @@ files:
195
195
  - bin/girb
196
196
  - bin/girb_runner.rb
197
197
  - examples/basic_area.rb
198
+ - examples/basic_area2.rb
198
199
  - examples/basic_button.rb
199
200
  - examples/basic_entry.rb
200
201
  - examples/basic_table.rb
@@ -209,6 +210,7 @@ files:
209
210
  - examples/color_button.rb
210
211
  - examples/control_gallery.rb
211
212
  - examples/date_time_picker.rb
213
+ - examples/dynamic_area.rb
212
214
  - examples/editable_column_table.rb
213
215
  - examples/editable_table.rb
214
216
  - examples/font_button.rb