glimmer-dsl-libui 0.1.7 → 0.1.8

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: dc16d9ab058fc6f75617c56ba43134253caf52ff729402efa045121823687245
4
- data.tar.gz: 3ff67efc0e34b5730818c477693f81d31cb41a7f3b928fda34038d358d26c71e
3
+ metadata.gz: ee3dcc2080c663175956845a975fb2bb0fb3a927f9b1b612f9d230d874fe8c86
4
+ data.tar.gz: 754ca74f6124c056209da9c8131cf1f3b527d67cf9a3c62a318d0c9d75f3c2ca
5
5
  SHA512:
6
- metadata.gz: 7cfe89c0e5f2f0507484c8fadddc2bd75f02e8cb6f09368679c58ebde66fb37dc8c1980b9617e578846138e92b2a6b77920e2f7b5309ddb98cfc658b7bcaabd7
7
- data.tar.gz: 99479329a3c7917bc2768f3ca7d7514c448ce70888b807741bf18db67e45d5c139c0ffe6ac7d21595a4f33ddb0cd92e7c328f63470cedd0569c974574fb5938a
6
+ metadata.gz: 5d8f0591d1647409c2c0f5f443addabb06d668e7b3fcdfbceabb8d6cf545fd23ec8d1f87c42302a72375da1db72a2268a1c6e27deffbdd2d38399f0d038f011e
7
+ data.tar.gz: 3494b576ed3d9945e7f4675739cb5a303dcaeb8360a78ea233ae1b11dd6a6d56fda6d90458be1422af3ce3e6a453643dd6e99ce872b7410bd2f07bacab832ca4
data/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # Change Log
2
2
 
3
+ ## 0.1.8
4
+
5
+ - Support `area` listener: `on_mouse_event`
6
+ - Support `area` listener: `on_mouse_down`
7
+ - Support `area` listener: `on_mouse_up`
8
+ - Support `area` listener: `on_mouse_drag_start`
9
+ - Support `area` listener: `on_mouse_drag`
10
+ - Support `area` listener: `on_mouse_drop`
11
+ - Support `area` listener: `on_mouse_crossed`
12
+ - Support `area` listener: `on_mouse_enter`
13
+ - Support `area` listener: `on_mouse_exit`
14
+ - Support `area` listener: `on_drag_broken`
15
+
3
16
  ## 0.1.7
4
17
 
5
18
  - Support `stroke` `:dashes` and use in examples/area_gallery.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.7
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.8
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)
@@ -123,6 +123,42 @@ window('Area Gallery', 400, 400) {
123
123
  fill r: 202, g: 102, b: 204, a: 0.5
124
124
  stroke r: 0, g: 0, b: 0, thickness: 2
125
125
  }
126
+
127
+ on_mouse_event do |area_mouse_event|
128
+ p area_mouse_event
129
+ end
130
+
131
+ on_mouse_moved do |area_mouse_event|
132
+ puts 'moved'
133
+ end
134
+
135
+ on_mouse_down do |area_mouse_event|
136
+ puts 'mouse down'
137
+ end
138
+
139
+ on_mouse_up do |area_mouse_event|
140
+ puts 'mouse up'
141
+ end
142
+
143
+ on_mouse_drag_started do |area_mouse_event|
144
+ puts 'drag started'
145
+ end
146
+
147
+ on_mouse_dragged do |area_mouse_event|
148
+ puts 'dragged'
149
+ end
150
+
151
+ on_mouse_dropped do |area_mouse_event|
152
+ puts 'dropped'
153
+ end
154
+
155
+ on_mouse_entered do
156
+ puts 'entered'
157
+ end
158
+
159
+ on_mouse_exited do
160
+ puts 'exited'
161
+ end
126
162
  }
127
163
  }.show
128
164
  ```
@@ -143,7 +179,7 @@ Other [Glimmer](https://rubygems.org/gems/glimmer) DSL gems you might be interes
143
179
 
144
180
  ## Table of Contents
145
181
 
146
- - [Glimmer DSL for LibUI 0.1.7](#-glimmer-dsl-for-libui-017)
182
+ - [Glimmer DSL for LibUI 0.1.8](#-glimmer-dsl-for-libui-018)
147
183
  - [Glimmer GUI DSL Concepts](#glimmer-gui-dsl-concepts)
148
184
  - [Usage](#usage)
149
185
  - [Girb (Glimmer IRB)](#girb-glimmer-irb)
@@ -273,7 +309,7 @@ gem install glimmer-dsl-libui
273
309
  Or install via Bundler `Gemfile`:
274
310
 
275
311
  ```ruby
276
- gem 'glimmer-dsl-libui', '~> 0.1.7'
312
+ gem 'glimmer-dsl-libui', '~> 0.1.8'
277
313
  ```
278
314
 
279
315
  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.
@@ -347,7 +383,7 @@ w.libui # => #<Fiddle::Pointer:0x00007fde53997980 ptr=0x00007fde51352a60 size=0
347
383
  Control(Args) | Properties | Listeners
348
384
  ------------- | ---------- | ---------
349
385
  `about_menu_item` | None | `on_clicked`
350
- `area` | None | `on_draw`
386
+ `area` | None | `on_draw(area_draw_params)`, `on_mouse_event(area_mouse_event)`, `on_mouse_down(area_mouse_event)`, `on_mouse_up(area_mouse_event)`, `on_mouse_drag_started(area_mouse_event)`, `on_mouse_dragged(area_mouse_event)`, `on_mouse_dropped(area_mouse_event)`, `on_mouse_entered`, `on_mouse_exited`
351
387
  `arc(x_center as Numeric, y_center as Numeric, radius as Numeric, start_angle as Numeric, sweep as Numeric, is_negative as Boolean)` | `x_center` (`Numeric`), `y_center` (`Numeric`), `radius` (`Numeric`), `start_angle` (`Numeric`), `sweep` (`Numeric`), `is_negative` (Boolean) | None
352
388
  `bezier(c1_x as Numeric, c1_y as Numeric, c2_x as Numeric, c2_y as Numeric, end_x as Numeric, end_y as Numeric)` | `c1_x` (`Numeric`), `c1_y` (`Numeric`), `c2_x` (`Numeric`), `c2_y` (`Numeric`), `end_x` (`Numeric`), `end_y` (`Numeric`) | None
353
389
  `button(text as String)` | `text` (`String`) | `on_clicked`
@@ -608,6 +644,29 @@ The `area_draw_params` argument for `on_draw` block is a hash consisting of the
608
644
 
609
645
  In general, it is recommended to use declarative stable paths whenever feasible since they require less code and simpler maintenance. But, in more advanced cases, semi-declarative dynamic paths could be used instead, especially if there are thousands of dynamic paths that need maximum performance and low memory footprint.
610
646
 
647
+ `area` supported mouse listeners are:
648
+ - `on_mouse_event {|area_mouse_event| ...}`: general catch-all mouse event (recommend use fine-grained event below instead)
649
+ - `on_mouse_down {|area_mouse_event)`
650
+ - `on_mouse_up {|area_mouse_event)`
651
+ - `on_mouse_drag_started {|area_mouse_event)`
652
+ - `on_mouse_dragged {|area_mouse_event)`
653
+ - `on_mouse_dropped {|area_mouse_event)`
654
+ - `on_mouse_entered {...}`
655
+ - `on_mouse_exited {...}`
656
+ - `on_mouse_crossed {|left| ...}` (NOT RECOMMENDED; it does what `on_mouse_entered` and `on_mouse_exited` do by returning a `left` argument indicating if mouse left `area`)
657
+ - `on_drag_broken {...}` (NOT RECOMMENDED; varies per platforms; use `on_mouse_dropped` instead)
658
+
659
+ The `area_mouse_event` argument for mouse events that receive it (e.g. `on_mouse_up`, `on_mouse_dragged`) consist of the following keys:
660
+ - `:x`: mouse x location in relation to area's top-left-corner
661
+ - `:y`: mouse y location in relation to area's top-left-corner
662
+ - `:area_width`: area current width
663
+ - `:area_height`: area current height
664
+ - `:down`: mouse pressed button (e.g. `1` is left button, `3` is right button)
665
+ - `:up`: mouse depressed button (e.g. `1` is left button, `3` is right button)
666
+ - `:count`: count of mouse clicks (e.g. `2` for double-click, `1` for single-click)
667
+ - `:modifers`: `Array` of `Symbol`s from one of the following: `[:command, :shift, :alt, :control]`
668
+ - `:held`: mouse held button during dragging (e.g. `1` is left button, `4` is right button)
669
+
611
670
  Note that when nesting an `area` directly underneath `window` (without a layout control like `vertical_box`), it is automatically reparented with `vertical_box` in between the `window` and `area` since it would not show up on Linux otherwise.
612
671
 
613
672
  To redraw an `area`, you may call the `#queue_redraw_all` method, or simply `#redraw`.
@@ -746,6 +805,8 @@ The following examples include reimplementions of the examples in the [LibUI](ht
746
805
 
747
806
  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. It also enables code editing to facilitate experimentation and learning.
748
807
 
808
+ (note that for examples that emit output to terminal/command-line via `p` or `puts`, you must run them directly to see output)
809
+
749
810
  [examples/meta_example.rb](examples/meta_example.rb)
750
811
 
751
812
  Run with this command from the root of the project if you cloned the project:
@@ -3377,6 +3438,42 @@ window('Area Gallery', 400, 400) {
3377
3438
  fill r: 202, g: 102, b: 204, a: 0.5
3378
3439
  stroke r: 0, g: 0, b: 0, thickness: 2
3379
3440
  }
3441
+
3442
+ on_mouse_event do |area_mouse_event|
3443
+ p area_mouse_event
3444
+ end
3445
+
3446
+ on_mouse_moved do |area_mouse_event|
3447
+ puts 'moved'
3448
+ end
3449
+
3450
+ on_mouse_down do |area_mouse_event|
3451
+ puts 'mouse down'
3452
+ end
3453
+
3454
+ on_mouse_up do |area_mouse_event|
3455
+ puts 'mouse up'
3456
+ end
3457
+
3458
+ on_mouse_drag_started do |area_mouse_event|
3459
+ puts 'drag started'
3460
+ end
3461
+
3462
+ on_mouse_dragged do |area_mouse_event|
3463
+ puts 'dragged'
3464
+ end
3465
+
3466
+ on_mouse_dropped do |area_mouse_event|
3467
+ puts 'dropped'
3468
+ end
3469
+
3470
+ on_mouse_entered do
3471
+ puts 'entered'
3472
+ end
3473
+
3474
+ on_mouse_exited do
3475
+ puts 'exited'
3476
+ end
3380
3477
  }
3381
3478
  }.show
3382
3479
  ```
@@ -3493,6 +3590,42 @@ window('Area Gallery', 400, 400) {
3493
3590
  fill r: 202, g: 102, b: 204, a: 0.5
3494
3591
  stroke r: 0, g: 0, b: 0, thickness: 2
3495
3592
  }
3593
+
3594
+ on_mouse_event do |area_mouse_event|
3595
+ p area_mouse_event
3596
+ end
3597
+
3598
+ on_mouse_moved do |area_mouse_event|
3599
+ puts 'moved'
3600
+ end
3601
+
3602
+ on_mouse_down do |area_mouse_event|
3603
+ puts 'mouse down'
3604
+ end
3605
+
3606
+ on_mouse_up do |area_mouse_event|
3607
+ puts 'mouse up'
3608
+ end
3609
+
3610
+ on_mouse_drag_started do |area_mouse_event|
3611
+ puts 'drag started'
3612
+ end
3613
+
3614
+ on_mouse_dragged do |area_mouse_event|
3615
+ puts 'dragged'
3616
+ end
3617
+
3618
+ on_mouse_dropped do |area_mouse_event|
3619
+ puts 'dropped'
3620
+ end
3621
+
3622
+ on_mouse_entered do
3623
+ puts 'entered'
3624
+ end
3625
+
3626
+ on_mouse_exited do
3627
+ puts 'exited'
3628
+ end
3496
3629
  }
3497
3630
  }.show
3498
3631
  ```
@@ -3550,6 +3683,42 @@ window('Area Gallery', 400, 400) {
3550
3683
  stroke r: 0, g: 0, b: 0, thickness: 2
3551
3684
  }
3552
3685
  end
3686
+
3687
+ on_mouse_event do |area_mouse_event|
3688
+ p area_mouse_event
3689
+ end
3690
+
3691
+ on_mouse_moved do |area_mouse_event|
3692
+ puts 'moved'
3693
+ end
3694
+
3695
+ on_mouse_down do |area_mouse_event|
3696
+ puts 'mouse down'
3697
+ end
3698
+
3699
+ on_mouse_up do |area_mouse_event|
3700
+ puts 'mouse up'
3701
+ end
3702
+
3703
+ on_mouse_drag_started do |area_mouse_event|
3704
+ puts 'drag started'
3705
+ end
3706
+
3707
+ on_mouse_dragged do |area_mouse_event|
3708
+ puts 'dragged'
3709
+ end
3710
+
3711
+ on_mouse_dropped do |area_mouse_event|
3712
+ puts 'dropped'
3713
+ end
3714
+
3715
+ on_mouse_entered do
3716
+ puts 'entered'
3717
+ end
3718
+
3719
+ on_mouse_exited do
3720
+ puts 'exited'
3721
+ end
3553
3722
  }
3554
3723
  }.show
3555
3724
  ```
@@ -3668,6 +3837,42 @@ window('Area Gallery', 400, 400) {
3668
3837
  stroke r: 0, g: 0, b: 0, thickness: 2
3669
3838
  }
3670
3839
  end
3840
+
3841
+ on_mouse_event do |area_mouse_event|
3842
+ p area_mouse_event
3843
+ end
3844
+
3845
+ on_mouse_moved do |area_mouse_event|
3846
+ puts 'moved'
3847
+ end
3848
+
3849
+ on_mouse_down do |area_mouse_event|
3850
+ puts 'mouse down'
3851
+ end
3852
+
3853
+ on_mouse_up do |area_mouse_event|
3854
+ puts 'mouse up'
3855
+ end
3856
+
3857
+ on_mouse_drag_started do |area_mouse_event|
3858
+ puts 'drag started'
3859
+ end
3860
+
3861
+ on_mouse_dragged do |area_mouse_event|
3862
+ puts 'dragged'
3863
+ end
3864
+
3865
+ on_mouse_dropped do |area_mouse_event|
3866
+ puts 'dropped'
3867
+ end
3868
+
3869
+ on_mouse_entered do
3870
+ puts 'entered'
3871
+ end
3872
+
3873
+ on_mouse_exited do
3874
+ puts 'exited'
3875
+ end
3671
3876
  }
3672
3877
  }.show
3673
3878
  ```
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.7
1
+ 0.1.8
@@ -46,5 +46,41 @@ window('Area Gallery', 400, 400) {
46
46
  fill r: 202, g: 102, b: 204, a: 0.5
47
47
  stroke r: 0, g: 0, b: 0, thickness: 2
48
48
  }
49
+
50
+ on_mouse_event do |area_mouse_event|
51
+ p area_mouse_event
52
+ end
53
+
54
+ on_mouse_moved do |area_mouse_event|
55
+ puts 'moved'
56
+ end
57
+
58
+ on_mouse_down do |area_mouse_event|
59
+ puts 'mouse down'
60
+ end
61
+
62
+ on_mouse_up do |area_mouse_event|
63
+ puts 'mouse up'
64
+ end
65
+
66
+ on_mouse_drag_started do |area_mouse_event|
67
+ puts 'drag started'
68
+ end
69
+
70
+ on_mouse_dragged do |area_mouse_event|
71
+ puts 'dragged'
72
+ end
73
+
74
+ on_mouse_dropped do |area_mouse_event|
75
+ puts 'dropped'
76
+ end
77
+
78
+ on_mouse_entered do
79
+ puts 'entered'
80
+ end
81
+
82
+ on_mouse_exited do
83
+ puts 'exited'
84
+ end
49
85
  }
50
86
  }.show
@@ -107,5 +107,41 @@ window('Area Gallery', 400, 400) {
107
107
  fill r: 202, g: 102, b: 204, a: 0.5
108
108
  stroke r: 0, g: 0, b: 0, thickness: 2
109
109
  }
110
+
111
+ on_mouse_event do |area_mouse_event|
112
+ p area_mouse_event
113
+ end
114
+
115
+ on_mouse_moved do |area_mouse_event|
116
+ puts 'moved'
117
+ end
118
+
119
+ on_mouse_down do |area_mouse_event|
120
+ puts 'mouse down'
121
+ end
122
+
123
+ on_mouse_up do |area_mouse_event|
124
+ puts 'mouse up'
125
+ end
126
+
127
+ on_mouse_drag_started do |area_mouse_event|
128
+ puts 'drag started'
129
+ end
130
+
131
+ on_mouse_dragged do |area_mouse_event|
132
+ puts 'dragged'
133
+ end
134
+
135
+ on_mouse_dropped do |area_mouse_event|
136
+ puts 'dropped'
137
+ end
138
+
139
+ on_mouse_entered do
140
+ puts 'entered'
141
+ end
142
+
143
+ on_mouse_exited do
144
+ puts 'exited'
145
+ end
110
146
  }
111
147
  }.show
@@ -48,5 +48,41 @@ window('Area Gallery', 400, 400) {
48
48
  stroke r: 0, g: 0, b: 0, thickness: 2
49
49
  }
50
50
  end
51
+
52
+ on_mouse_event do |area_mouse_event|
53
+ p area_mouse_event
54
+ end
55
+
56
+ on_mouse_moved do |area_mouse_event|
57
+ puts 'moved'
58
+ end
59
+
60
+ on_mouse_down do |area_mouse_event|
61
+ puts 'mouse down'
62
+ end
63
+
64
+ on_mouse_up do |area_mouse_event|
65
+ puts 'mouse up'
66
+ end
67
+
68
+ on_mouse_drag_started do |area_mouse_event|
69
+ puts 'drag started'
70
+ end
71
+
72
+ on_mouse_dragged do |area_mouse_event|
73
+ puts 'dragged'
74
+ end
75
+
76
+ on_mouse_dropped do |area_mouse_event|
77
+ puts 'dropped'
78
+ end
79
+
80
+ on_mouse_entered do
81
+ puts 'entered'
82
+ end
83
+
84
+ on_mouse_exited do
85
+ puts 'exited'
86
+ end
51
87
  }
52
88
  }.show
@@ -109,5 +109,41 @@ window('Area Gallery', 400, 400) {
109
109
  stroke r: 0, g: 0, b: 0, thickness: 2
110
110
  }
111
111
  end
112
+
113
+ on_mouse_event do |area_mouse_event|
114
+ p area_mouse_event
115
+ end
116
+
117
+ on_mouse_moved do |area_mouse_event|
118
+ puts 'moved'
119
+ end
120
+
121
+ on_mouse_down do |area_mouse_event|
122
+ puts 'mouse down'
123
+ end
124
+
125
+ on_mouse_up do |area_mouse_event|
126
+ puts 'mouse up'
127
+ end
128
+
129
+ on_mouse_drag_started do |area_mouse_event|
130
+ puts 'drag started'
131
+ end
132
+
133
+ on_mouse_dragged do |area_mouse_event|
134
+ puts 'dragged'
135
+ end
136
+
137
+ on_mouse_dropped do |area_mouse_event|
138
+ puts 'dropped'
139
+ end
140
+
141
+ on_mouse_entered do
142
+ puts 'entered'
143
+ end
144
+
145
+ on_mouse_exited do
146
+ puts 'exited'
147
+ end
112
148
  }
113
149
  }.show
Binary file
@@ -36,6 +36,19 @@ module Glimmer
36
36
  attr_accessor :current_area_draw_params
37
37
  end
38
38
 
39
+ LISTENERS = ['on_draw', 'on_mouse_event', 'on_mouse_move', 'on_mouse_down', 'on_mouse_up', 'on_mouse_drag_start', 'on_mouse_drag', 'on_mouse_drop', 'on_mouse_crossed', 'on_mouse_enter', 'on_mouse_exit', 'on_drag_broken']
40
+ LISTENER_ALIASES = {
41
+ on_drawn: 'on_draw',
42
+ on_mouse_moved: 'on_mouse_move',
43
+ on_mouse_drag_started: 'on_mouse_drag_start',
44
+ on_mouse_dragged: 'on_mouse_drag',
45
+ on_mouse_dropped: 'on_mouse_drop',
46
+ on_mouse_cross: 'on_mouse_crossed',
47
+ on_mouse_entered: 'on_mouse_enter',
48
+ on_mouse_exited: 'on_mouse_exit',
49
+ on_drag_break: 'on_drag_broken',
50
+ }
51
+
39
52
  include Glimmer::FiddleConsumer
40
53
  include Parent
41
54
  prepend Transformable
@@ -47,29 +60,6 @@ module Glimmer
47
60
  install_listeners
48
61
  end
49
62
 
50
- def on_draw(&block)
51
- @on_draw_procs ||= []
52
- if block.nil?
53
- @on_draw_procs
54
- else
55
- @on_draw_procs << block
56
- block
57
- end
58
- end
59
-
60
- def can_handle_listener?(listener_name)
61
- listener_name == 'on_draw' || super
62
- end
63
-
64
- def handle_listener(listener_name, &listener)
65
- case listener_name
66
- when 'on_draw'
67
- on_draw(&listener)
68
- else
69
- super
70
- end
71
- end
72
-
73
63
  def draw(area_draw_params)
74
64
  children.dup.each {|child| child.draw(area_draw_params)}
75
65
  on_draw.each {|listener| listener.call(area_draw_params)}
@@ -94,9 +84,32 @@ module Glimmer
94
84
  draw(area_draw_params)
95
85
  AreaProxy.current_area_draw_params = nil
96
86
  end
97
- @area_handler.MouseEvent = fiddle_closure_block_caller(0, [0]) {}
98
- @area_handler.MouseCrossed = fiddle_closure_block_caller(0, [0]) {}
99
- @area_handler.DragBroken = fiddle_closure_block_caller(0, [0]) {}
87
+ @area_handler.MouseEvent = fiddle_closure_block_caller(0, [1, 1, 1]) do |_, _, area_mouse_event|
88
+ area_mouse_event = ::LibUI::FFI::AreaMouseEvent.new(area_mouse_event)
89
+ area_mouse_event = area_mouse_event_hash(area_mouse_event)
90
+ on_mouse_event.each { |listener| listener.call(area_mouse_event)}
91
+ on_mouse_move.each { |listener| listener.call(area_mouse_event)} if area_mouse_event[:x].between?(0, area_mouse_event[:area_width]) && area_mouse_event[:y].between?(0, area_mouse_event[:area_height])
92
+ unless @last_area_mouse_event.nil?
93
+ on_mouse_down.each { |listener| listener.call(area_mouse_event)} if area_mouse_event[:down] > 0 && @last_area_mouse_event[:down] == 0
94
+ on_mouse_up.each { |listener| listener.call(area_mouse_event)} if area_mouse_event[:up] > 0 && @last_area_mouse_event[:up] == 0
95
+ on_mouse_drag_start.each { |listener| listener.call(area_mouse_event)} if area_mouse_event[:held] > 0 && @last_area_mouse_event[:held] == 0
96
+ on_mouse_drag.each { |listener| listener.call(area_mouse_event)} if area_mouse_event[:held] > 0
97
+ on_mouse_drop.each { |listener| listener.call(area_mouse_event)} if area_mouse_event[:held] == 0 && @last_area_mouse_event[:held] > 0
98
+ end
99
+ @last_area_mouse_event = area_mouse_event
100
+ end
101
+ @area_handler.MouseCrossed = fiddle_closure_block_caller(0, [1, 1, 4]) do |_, _, left|
102
+ left = Glimmer::LibUI.integer_to_boolean(left)
103
+ on_mouse_crossed.each { |listener| listener.call(left) }
104
+ if left
105
+ on_mouse_exit.each { |listener| listener.call(left) }
106
+ else
107
+ on_mouse_enter.each { |listener| listener.call(left) }
108
+ end
109
+ end
110
+ @area_handler.DragBroken = fiddle_closure_block_caller(0, [1, 1]) do |_, _|
111
+ on_drag_broken.each { |listener| listener.call }
112
+ end
100
113
  @area_handler.KeyEvent = fiddle_closure_block_caller(0, [0]) {}
101
114
  end
102
115
 
@@ -111,6 +124,42 @@ module Glimmer
111
124
  clip_height: area_draw_params.ClipHeight,
112
125
  }
113
126
  end
127
+
128
+ def area_mouse_event_hash(area_mouse_event)
129
+ {
130
+ x: area_mouse_event.X,
131
+ y: area_mouse_event.Y,
132
+ area_width: area_mouse_event.AreaWidth,
133
+ area_height: area_mouse_event.AreaHeight,
134
+ down: area_mouse_event.Down,
135
+ up: area_mouse_event.Up,
136
+ count: area_mouse_event.Count,
137
+ modifers: modifiers_to_symbols(area_mouse_event.Modifiers),
138
+ held: area_mouse_event.Held1To64,
139
+ }
140
+ end
141
+
142
+ def modifiers_to_symbols(modifiers_value)
143
+ symbols = []
144
+ modifiers_value = extract_symbol_from_modifiers_value(modifiers_value, symbols: symbols) while modifiers_value > 0
145
+ symbols
146
+ end
147
+
148
+ def extract_symbol_from_modifiers_value(modifiers_value, symbols: )
149
+ if modifiers_value >= 8
150
+ symbols << :command
151
+ modifiers_value -= 8
152
+ elsif modifiers_value >= 4
153
+ symbols << :shift
154
+ modifiers_value -= 4
155
+ elsif modifiers_value >= 2
156
+ symbols << :alt
157
+ modifiers_value -= 2
158
+ elsif modifiers_value >= 1
159
+ symbols << :control
160
+ modifiers_value -= 1
161
+ end
162
+ end
114
163
  end
115
164
  end
116
165
  end
@@ -141,7 +141,8 @@ module Glimmer
141
141
 
142
142
  def can_handle_listener?(listener_name)
143
143
  ::LibUI.respond_to?("#{libui_api_keyword}_#{listener_name}") ||
144
- ::LibUI.respond_to?("control_#{listener_name}")
144
+ ::LibUI.respond_to?("control_#{listener_name}") ||
145
+ has_custom_listener?(listener_name)
145
146
  end
146
147
 
147
148
  def handle_listener(listener_name, &listener)
@@ -150,6 +151,34 @@ module Glimmer
150
151
  ::LibUI.send("#{libui_api_keyword}_#{listener_name}", @libui, &safe_listener)
151
152
  elsif ::LibUI.respond_to?("control_#{listener_name}")
152
153
  ::LibUI.send("control_#{listener_name}", @libui, &safe_listener)
154
+ elsif has_custom_listener?(listener_name)
155
+ handle_custom_listener(listener_name, &listener)
156
+ end
157
+ end
158
+
159
+ def has_custom_listener?(listener_name)
160
+ listener_name = listener_name.to_s
161
+ custom_listeners.include?(listener_name) || custom_listener_aliases.stringify_keys.keys.include?(listener_name)
162
+ end
163
+
164
+ def custom_listeners
165
+ self.class.constants.include?(:LISTENERS) ? self.class::LISTENERS : []
166
+ end
167
+
168
+ def custom_listener_aliases
169
+ self.class.constants.include?(:LISTENER_ALIASES) ? self.class::LISTENER_ALIASES : {}
170
+ end
171
+
172
+ def handle_custom_listener(listener_name, &listener)
173
+ listener_name = listener_name.to_s
174
+ listener_name = custom_listener_aliases.stringify_keys[listener_name] || listener_name
175
+ instance_variable_name = "@#{listener_name}_procs"
176
+ instance_variable_set(instance_variable_name, []) if instance_variable_get(instance_variable_name).nil?
177
+ if listener.nil?
178
+ instance_variable_get(instance_variable_name)
179
+ else
180
+ instance_variable_get(instance_variable_name) << listener
181
+ listener
153
182
  end
154
183
  end
155
184
 
@@ -160,6 +189,7 @@ module Glimmer
160
189
  (append_properties.include?(method_name.to_s.sub(/\?$/, '')) && BOOLEAN_PROPERTIES.include?(method_name.to_s.sub(/\?$/, ''))) ||
161
190
  append_properties.include?(method_name.to_s.sub(/=$/, ''))
162
191
  ) ||
192
+ can_handle_listener?(method_name.to_s) ||
163
193
  super(method_name, true)
164
194
  end
165
195
 
@@ -178,6 +208,8 @@ module Glimmer
178
208
  elsif append_properties.include?(method_name.to_s) ||
179
209
  append_properties.include?(method_name.to_s.sub(/(=|\?)$/, ''))
180
210
  append_property(method_name, *args)
211
+ elsif can_handle_listener?(method_name.to_s)
212
+ handle_listener(method_name.to_s, &block)
181
213
  else
182
214
  super
183
215
  end
@@ -29,6 +29,7 @@ require 'glimmer'
29
29
  require 'color'
30
30
  require 'os'
31
31
  require 'array_include_methods'
32
+ require 'facets/hash/stringify_keys'
32
33
  require 'libui'
33
34
 
34
35
  # Internal requires
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.1.7
4
+ version: 0.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andy Maleh
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-01 00:00:00.000000000 Z
11
+ date: 2021-10-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: glimmer