glimmer-dsl-libui 0.1.0 → 0.1.1

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: 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