glimmer-dsl-libui 0.4.6 → 0.4.7

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: e2f52b21e108a75ec59b380fa0d84cd116bb47423877575486ee5bc2647d7953
4
- data.tar.gz: 2d7d9ab30e81bd1eb846dca3bddeb79509dab1e641c38b44d5d31914679ab49c
3
+ metadata.gz: 1256d99b9a792c92f657e9320af1264a275f26e7de5586d3f174daaf33b35f07
4
+ data.tar.gz: 5d8dcf4a6eb8870136579240d8d5337e72c6e2bac76b78fd506a3c1335ecd8a7
5
5
  SHA512:
6
- metadata.gz: d90045f52bd836fc18ff4aff2bc096302101651bc006a144af9f80563e171ecd4d236e85ebbb064b53374a61946185fa9aef0946b493b0ca1df967670629ac5e
7
- data.tar.gz: 491694ae1ccdbbb5b4c7e0e3bfa30beee648f9a579dfaaa13b35ee583a6551967c441078fa83857c0e886a2991662d83d952f79b73a39e27769262c0c77b822e
6
+ metadata.gz: 8c99de618602038c939715d95a03ac6b8296e6f46bff298808df977c161dead4859aa6e7cca1e7d72bac6216e2c4f6cbbc090e4648ab933db406aced2028cf14
7
+ data.tar.gz: ed6e9d34fe546651d72918f2e5895cfb0cfd13a6eb2ab0f5e55b78a5cf8ecbbff1bc362afb9356f0839a80852c7a5bf30e262ddd05ee76f750e98129ae980a25
data/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Change Log
2
2
 
3
+ ## 0.4.7
4
+
5
+ - Support `date_time_picker`/`date_picker`/`time_picker` `time` bidirectional data-binding (with `<=>` sign)
6
+ - Support `combobox` `selected`/`selected_item` bidirectional data-binding (with `<=>` sign)
7
+ - Support `editable_combobox` `text` bidirectional data-binding (with `<=>` sign)
8
+ - Improve examples/date_time_picker.rb with bidirectional data-binding for `date_time_picker` `time`
9
+ - Improve examples/midi_player.rb with bidirectional data-binding for `combobox` `selected`/`selected_item`
10
+
3
11
  ## 0.4.6
4
12
 
5
13
  - Support `slider` `value` bidirectional data-binding (with `<=>` sign)
data/README.md CHANGED
@@ -1,9 +1,9 @@
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.4.6
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.4.7
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
  [![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)
5
5
 
6
- [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!
6
+ [Glimmer](https://github.com/AndyObtiva/glimmer) DSL for [LibUI](https://github.com/kojix2/LibUI) is a prerequisite-free Ruby desktop development GUI (Graphical User Interface) library. No need to pre-install any prerequisites. Just install the [gem](https://rubygems.org/gems/glimmer-dsl-libui) and have platform-independent native GUI that just works!
7
7
 
8
8
  Mac | Windows | Linux
9
9
  ----|---------|------
@@ -373,7 +373,7 @@ gem install glimmer-dsl-libui
373
373
  Or install via Bundler `Gemfile`:
374
374
 
375
375
  ```ruby
376
- gem 'glimmer-dsl-libui', '~> 0.4.6'
376
+ gem 'glimmer-dsl-libui', '~> 0.4.7'
377
377
  ```
378
378
 
379
379
  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.
@@ -460,7 +460,7 @@ Keyword(Args) | Properties | Listeners
460
460
  `checkbox_text_column(name as String)` | `editable` (Boolean), `editable_checkbox` (Boolean), `editable_text` (Boolean) | None
461
461
  `checkbox_text_color_column(name as String)` | `editable` (Boolean), `editable_checkbox` (Boolean), `editable_text` (Boolean) | None
462
462
  `check_menu_item(text as String)` | `checked` (Boolean) | `on_clicked`
463
- `combobox` | `items` (`Array` of `String`), `selected` (`Integer`) | `on_selected`
463
+ `combobox` | `items` (`Array` of `String`), `selected` (`Integer`), `selected_item` (`String`) | `on_selected`
464
464
  `color_button` | `color` (Array of `red` as `Float`, `green` as `Float`, `blue` as `Float`, `alpha` as `Float`), `red` as `Float`, `green` as `Float`, `blue` as `Float`, `alpha` as `Float` | `on_changed`
465
465
  `date_picker` | `time` (`Hash` of keys: `sec` as `Integer`, `min` as `Integer`, `hour` as `Integer`, `mday` as `Integer`, `mon` as `Integer`, `year` as `Integer`, `wday` as `Integer`, `yday` as `Integer`, `dst` as Boolean) | `on_changed`
466
466
  `date_time_picker` | `time` (`Hash` of keys: `sec` as `Integer`, `min` as `Integer`, `hour` as `Integer`, `mday` as `Integer`, `mon` as `Integer`, `year` as `Integer`, `wday` as `Integer`, `yday` as `Integer`, `dst` as Boolean) | `on_changed`
@@ -1383,6 +1383,10 @@ Data-binding supports utilizing the [MVP (Model View Presenter)](https://en.wiki
1383
1383
 
1384
1384
  [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) supports bidirectional (two-way) data-binding of the following controls/properties via the `<=>` operator (indicating data is moving in both directions between View and Model):
1385
1385
  - `color_button`: `color`
1386
+ - `combobox`: `selected`, `selected_item`
1387
+ - `date_picker`: `time`
1388
+ - `date_time_picker`: `time`
1389
+ - `editable_combobox`: `text`
1386
1390
  - `entry`: `text`
1387
1391
  - `font_button`: `font`
1388
1392
  - `multiline_entry`: `text`
@@ -1390,6 +1394,7 @@ Data-binding supports utilizing the [MVP (Model View Presenter)](https://en.wiki
1390
1394
  - `search_entry`: `text`
1391
1395
  - `slider`: `value`
1392
1396
  - `spinbox`: `value`
1397
+ - `time_picker`: `time`
1393
1398
 
1394
1399
  Example of bidirectional data-binding:
1395
1400
 
@@ -1439,6 +1444,11 @@ To summarize the data-binding API:
1439
1444
 
1440
1445
  This is also known as the [Glimmer Shine](https://github.com/AndyObtiva/glimmer-dsl-swt/blob/master/docs/reference/GLIMMER_GUI_DSL_SYNTAX.md#shine) syntax for data-binding, a [Glimmer](https://github.com/AndyObtiva/glimmer)-only unique innovation that takes advantage of [Ruby](https://www.ruby-lang.org/en/)'s highly expressive syntax and malleable DSL support.
1441
1446
 
1447
+ Data-bound model attribute can be:
1448
+ - **Direct:** `Symbol` representing attribute reader/writer (e.g. `[person, :name`])
1449
+ - **Nested:** `String` representing nested attribute path (e.g. `[company, 'address.street']`). That results in "nested data-binding"
1450
+ - **Indexed:** `String` containing array attribute index (e.g. `[customer, 'addresses[0].street']`). That results in "indexed data-binding"
1451
+
1442
1452
  Data-binding options include:
1443
1453
  - `before_read {|value| ...}`: performs an operation before reading data from Model to update the View.
1444
1454
  - `on_read {|value| ...}`: converts value read from Model to update the View.
@@ -1446,7 +1456,7 @@ Data-binding options include:
1446
1456
  - `before_write {|value| ...}`: performs an operation before writing data to Model from View.
1447
1457
  - `on_write {|value| ...}`: converts value read from View to update the Model.
1448
1458
  - `after_write {|converted_value| ...}`: performs an operation after writing to Model from View.
1449
- - `computed_by attribute` or `computed_by [attribute1, attribute2, ...]`: indicates model attribute is computed from specified attribute(s), thus updated when they are updated (see in [Login example version 2](/examples/login2.rb))
1459
+ - `computed_by attribute` or `computed_by [attribute1, attribute2, ...]`: indicates model attribute is computed from specified attribute(s), thus updated when they are updated (see in [Login example version 2](/examples/login2.rb)). That is known as "computed data-binding".
1450
1460
 
1451
1461
  Note that with both `on_read` and `on_write` converters, you could pass a `Symbol` representing the name of a method on the value object to invoke.
1452
1462
 
@@ -1878,7 +1888,7 @@ Example:
1878
1888
 
1879
1889
  ## Examples
1880
1890
 
1881
- The following examples include reimplementions of the examples in the [LibUI](https://github.com/kojix2/LibUI) project utilizing the [Glimmer GUI DSL](#glimmer-gui-dsl-concepts) (with and without data-binding) as well as brand new examples.
1891
+ The following examples include reimplementions of the examples in the [LibUI](https://github.com/kojix2/LibUI) project utilizing the [Glimmer GUI DSL](#glimmer-gui-dsl-concepts) (with and without [data-binding](#data-binding)) as well as brand new examples.
1882
1892
 
1883
1893
  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.
1884
1894
 
@@ -2668,7 +2678,35 @@ UI.main
2668
2678
  UI.quit
2669
2679
  ```
2670
2680
 
2671
- [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
2681
+ [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version (with [data-binding](#data-binding)):
2682
+
2683
+ ```ruby
2684
+ require 'glimmer-dsl-libui'
2685
+
2686
+ class DateTimePicker
2687
+ include Glimmer
2688
+
2689
+ attr_accessor :picked_time
2690
+
2691
+ def launch
2692
+ window('Date Time Pickers', 300, 200) {
2693
+ vertical_box {
2694
+ date_time_picker {
2695
+ time <=> [self, :picked_time, after_write: ->(time) { p time }]
2696
+ }
2697
+ }
2698
+
2699
+ on_closing do
2700
+ puts 'Bye Bye'
2701
+ end
2702
+ }.show
2703
+ end
2704
+ end
2705
+
2706
+ DateTimePicker.new.launch
2707
+ ```
2708
+
2709
+ [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version 2 (without [data-binding](#data-binding)):
2672
2710
 
2673
2711
  ```ruby
2674
2712
  require 'glimmer-dsl-libui'
@@ -7852,7 +7890,181 @@ end
7852
7890
  TinyMidiPlayer.new
7853
7891
  ```
7854
7892
 
7855
- [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
7893
+ [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version (with [data-binding](#data-binding)):
7894
+
7895
+ ```ruby
7896
+ # frozen_string_literal: true
7897
+
7898
+ require 'glimmer-dsl-libui'
7899
+
7900
+ class TinyMidiPlayer
7901
+ include Glimmer
7902
+
7903
+ VERSION = '0.0.1'
7904
+
7905
+ attr_accessor :selected_file
7906
+
7907
+ def initialize
7908
+ @pid = nil
7909
+ @music_directory = File.expand_path('../sounds', __dir__)
7910
+ @midi_files = Dir.glob(File.join(@music_directory, '**/*.mid'))
7911
+ .sort_by { |path| File.basename(path) }
7912
+ at_exit { stop_midi }
7913
+ create_gui
7914
+ end
7915
+
7916
+ def stop_midi
7917
+ if @pid
7918
+ Process.kill(:SIGKILL, @pid) if @th.alive?
7919
+ @pid = nil
7920
+ end
7921
+ end
7922
+
7923
+ def play_midi
7924
+ stop_midi
7925
+ if @pid.nil? && @selected_file
7926
+ begin
7927
+ @pid = spawn "timidity #{@selected_file}"
7928
+ @th = Process.detach @pid
7929
+ rescue Errno::ENOENT
7930
+ warn 'Timidty++ not found. Please install Timidity++.'
7931
+ warn 'https://sourceforge.net/projects/timidity/'
7932
+ end
7933
+ end
7934
+ end
7935
+
7936
+ def show_version
7937
+ msg_box('Tiny Midi Player',
7938
+ "Written in Ruby\n" \
7939
+ "https://github.com/kojix2/libui\n" \
7940
+ "Version #{VERSION}")
7941
+ end
7942
+
7943
+ def create_gui
7944
+ menu('Help') {
7945
+ menu_item('Version') {
7946
+ on_clicked do
7947
+ show_version
7948
+ end
7949
+ }
7950
+ }
7951
+ window('Tiny Midi Player', 200, 50) {
7952
+ horizontal_box {
7953
+ vertical_box {
7954
+ stretchy false
7955
+
7956
+ button('▶') {
7957
+ on_clicked do
7958
+ play_midi
7959
+ end
7960
+ }
7961
+ button('■') {
7962
+ on_clicked do
7963
+ stop_midi
7964
+ end
7965
+ }
7966
+ }
7967
+
7968
+ combobox { |c|
7969
+ items @midi_files.map { |path| File.basename(path) }
7970
+ # data-bind selected item (String) to self.selected_file with on-read/on-write converters and after_write operation
7971
+ selected_item <=> [self, :selected_file, on_read: ->(f) {File.basename(f.to_s)}, on_write: ->(f) {File.join(@music_directory, f)}, after_write: -> { play_midi if @th&.alive? }]
7972
+ }
7973
+ }
7974
+ }.show
7975
+ end
7976
+ end
7977
+
7978
+ TinyMidiPlayer.new
7979
+ ```
7980
+
7981
+ [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version 2 (with [data-binding](#data-binding)):
7982
+
7983
+ ```ruby
7984
+ require 'glimmer-dsl-libui'
7985
+
7986
+ class TinyMidiPlayer
7987
+ include Glimmer
7988
+
7989
+ VERSION = '0.0.1'
7990
+
7991
+ attr_accessor :selected_file
7992
+
7993
+ def initialize
7994
+ @pid = nil
7995
+ @music_directory = File.expand_path('../sounds', __dir__)
7996
+ @midi_files = Dir.glob(File.join(@music_directory, '**/*.mid'))
7997
+ .sort_by { |path| File.basename(path) }
7998
+ at_exit { stop_midi }
7999
+ create_gui
8000
+ end
8001
+
8002
+ def stop_midi
8003
+ if @pid
8004
+ Process.kill(:SIGKILL, @pid) if @th.alive?
8005
+ @pid = nil
8006
+ end
8007
+ end
8008
+
8009
+ def play_midi
8010
+ stop_midi
8011
+ if @pid.nil? && @selected_file
8012
+ begin
8013
+ @pid = spawn "timidity #{@selected_file}"
8014
+ @th = Process.detach @pid
8015
+ rescue Errno::ENOENT
8016
+ warn 'Timidty++ not found. Please install Timidity++.'
8017
+ warn 'https://sourceforge.net/projects/timidity/'
8018
+ end
8019
+ end
8020
+ end
8021
+
8022
+ def show_version
8023
+ msg_box('Tiny Midi Player',
8024
+ "Written in Ruby\n" \
8025
+ "https://github.com/kojix2/libui\n" \
8026
+ "Version #{VERSION}")
8027
+ end
8028
+
8029
+ def create_gui
8030
+ menu('Help') {
8031
+ menu_item('Version') {
8032
+ on_clicked do
8033
+ show_version
8034
+ end
8035
+ }
8036
+ }
8037
+ window('Tiny Midi Player', 200, 50) {
8038
+ horizontal_box {
8039
+ vertical_box {
8040
+ stretchy false
8041
+
8042
+ button('▶') {
8043
+ on_clicked do
8044
+ play_midi
8045
+ end
8046
+ }
8047
+ button('■') {
8048
+ on_clicked do
8049
+ stop_midi
8050
+ end
8051
+ }
8052
+ }
8053
+
8054
+ combobox { |c|
8055
+ items @midi_files.map { |path| File.basename(path) }
8056
+ # data-bind selected index (Integer) to self.selected_file with on-read/on-write converters and after_write operation
8057
+ selected <=> [self, :selected_file, on_read: ->(f) {@midi_files.index(f)}, on_write: ->(i) {@midi_files[i]}, after_write: -> { play_midi if @th&.alive? }]
8058
+ }
8059
+ }
8060
+ }.show
8061
+ end
8062
+ end
8063
+
8064
+ TinyMidiPlayer.new
8065
+ ```
8066
+
8067
+ [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version 3 (without [data-binding](#data-binding)):
7856
8068
 
7857
8069
  ```ruby
7858
8070
  require 'glimmer-dsl-libui'
@@ -8869,7 +9081,7 @@ https://github.com/iraamaro/i3off-gtk-ruby
8869
9081
 
8870
9082
  ### Issues
8871
9083
 
8872
- If you encounter [issues](https://github.com/AndyObtiva/glimmer-dsl-libui/issues) that are not reported, discover missing features that are not mentioned in [TODO.md](TODO.md), or think up better ways to use [libui](https://github.com/andlabs/libui) than what is possible with [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui), you may submit an [issue](https://github.com/AndyObtiva/glimmer-dsl-libui/issues/new) or [pull request](https://github.com/AndyObtiva/glimmer-dsl-libui/compare) on [GitHub](https://github.com).
9084
+ If you encounter [issues](https://github.com/AndyObtiva/glimmer-dsl-libui/issues) that are not reported, discover missing features that are not mentioned in [TODO.md](TODO.md), or think up better ways to use [libui](https://github.com/andlabs/libui) than what is possible with [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui), you may submit an [issue](https://github.com/AndyObtiva/glimmer-dsl-libui/issues/new) or [pull request](https://github.com/AndyObtiva/glimmer-dsl-libui/compare) on [GitHub](https://github.com). In the meantime, you may try older gem versions of [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) till you find one that works until issues are resolved.
8873
9085
 
8874
9086
  ### Chat
8875
9087
 
@@ -8901,6 +9113,8 @@ These features have been planned or suggested. You might see them in a future ve
8901
9113
  is fine, but please isolate to its own commit so I can cherry-pick
8902
9114
  around it.
8903
9115
 
9116
+ Note that the latest development sometimes takes place in [development](https://github.com/AndyObtiva/glimmer-dsl-libui/tree/development) branch (which is deleted once merged back to [master](https://github.com/AndyObtiva/glimmer-dsl-libui)).
9117
+
8904
9118
  ## Contributors
8905
9119
 
8906
9120
  * [Andy Maleh](https://github.com/AndyObtiva) (Founder)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.6
1
+ 0.4.7
@@ -2,19 +2,24 @@
2
2
 
3
3
  require 'glimmer-dsl-libui'
4
4
 
5
- include Glimmer
6
-
7
- window('Date Time Pickers', 300, 200) {
8
- vertical_box {
9
- date_time_picker { |dtp|
10
- on_changed do
11
- time = dtp.time
12
- p time
13
- end
14
- }
15
- }
5
+ class DateTimePicker
6
+ include Glimmer
7
+
8
+ attr_accessor :picked_time
16
9
 
17
- on_closing do
18
- puts 'Bye Bye'
10
+ def launch
11
+ window('Date Time Pickers', 300, 200) {
12
+ vertical_box {
13
+ date_time_picker {
14
+ time <=> [self, :picked_time, after_write: ->(time) { p time }]
15
+ }
16
+ }
17
+
18
+ on_closing do
19
+ puts 'Bye Bye'
20
+ end
21
+ }.show
19
22
  end
20
- }.show
23
+ end
24
+
25
+ DateTimePicker.new.launch
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'glimmer-dsl-libui'
4
+
5
+ include Glimmer
6
+
7
+ window('Date Time Pickers', 300, 200) {
8
+ vertical_box {
9
+ date_time_picker { |dtp|
10
+ on_changed do
11
+ time = dtp.time
12
+ p time
13
+ end
14
+ }
15
+ }
16
+
17
+ on_closing do
18
+ puts 'Bye Bye'
19
+ end
20
+ }.show
@@ -6,6 +6,8 @@ class TinyMidiPlayer
6
6
  include Glimmer
7
7
 
8
8
  VERSION = '0.0.1'
9
+
10
+ attr_accessor :selected_file
9
11
 
10
12
  def initialize
11
13
  @pid = nil
@@ -70,11 +72,8 @@ class TinyMidiPlayer
70
72
 
71
73
  combobox { |c|
72
74
  items @midi_files.map { |path| File.basename(path) }
73
-
74
- on_selected do
75
- @selected_file = @midi_files[c.selected]
76
- play_midi if @th&.alive?
77
- end
75
+ # data-bind selected item (String) to self.selected_file with on-read/on-write converters and after_write operation
76
+ selected_item <=> [self, :selected_file, on_read: ->(f) {File.basename(f.to_s)}, on_write: ->(f) {File.join(@music_directory, f)}, after_write: -> { play_midi if @th&.alive? }]
78
77
  }
79
78
  }
80
79
  }.show
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'glimmer-dsl-libui'
4
+
5
+ class TinyMidiPlayer
6
+ include Glimmer
7
+
8
+ VERSION = '0.0.1'
9
+
10
+ attr_accessor :selected_file
11
+
12
+ def initialize
13
+ @pid = nil
14
+ @music_directory = File.expand_path('../sounds', __dir__)
15
+ @midi_files = Dir.glob(File.join(@music_directory, '**/*.mid'))
16
+ .sort_by { |path| File.basename(path) }
17
+ at_exit { stop_midi }
18
+ create_gui
19
+ end
20
+
21
+ def stop_midi
22
+ if @pid
23
+ Process.kill(:SIGKILL, @pid) if @th.alive?
24
+ @pid = nil
25
+ end
26
+ end
27
+
28
+ def play_midi
29
+ stop_midi
30
+ if @pid.nil? && @selected_file
31
+ begin
32
+ @pid = spawn "timidity #{@selected_file}"
33
+ @th = Process.detach @pid
34
+ rescue Errno::ENOENT
35
+ warn 'Timidty++ not found. Please install Timidity++.'
36
+ warn 'https://sourceforge.net/projects/timidity/'
37
+ end
38
+ end
39
+ end
40
+
41
+ def show_version
42
+ msg_box('Tiny Midi Player',
43
+ "Written in Ruby\n" \
44
+ "https://github.com/kojix2/libui\n" \
45
+ "Version #{VERSION}")
46
+ end
47
+
48
+ def create_gui
49
+ menu('Help') {
50
+ menu_item('Version') {
51
+ on_clicked do
52
+ show_version
53
+ end
54
+ }
55
+ }
56
+ window('Tiny Midi Player', 200, 50) {
57
+ horizontal_box {
58
+ vertical_box {
59
+ stretchy false
60
+
61
+ button('▶') {
62
+ on_clicked do
63
+ play_midi
64
+ end
65
+ }
66
+ button('■') {
67
+ on_clicked do
68
+ stop_midi
69
+ end
70
+ }
71
+ }
72
+
73
+ combobox { |c|
74
+ items @midi_files.map { |path| File.basename(path) }
75
+ # data-bind selected index (Integer) to self.selected_file with on-read/on-write converters and after_write operation
76
+ selected <=> [self, :selected_file, on_read: ->(f) {@midi_files.index(f)}, on_write: ->(i) {@midi_files[i]}, after_write: -> { play_midi if @th&.alive? }]
77
+ }
78
+ }
79
+ }.show
80
+ end
81
+ end
82
+
83
+ TinyMidiPlayer.new
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'glimmer-dsl-libui'
4
+
5
+ class TinyMidiPlayer
6
+ include Glimmer
7
+
8
+ VERSION = '0.0.1'
9
+
10
+ def initialize
11
+ @pid = nil
12
+ @music_directory = File.expand_path('../sounds', __dir__)
13
+ @midi_files = Dir.glob(File.join(@music_directory, '**/*.mid'))
14
+ .sort_by { |path| File.basename(path) }
15
+ at_exit { stop_midi }
16
+ create_gui
17
+ end
18
+
19
+ def stop_midi
20
+ if @pid
21
+ Process.kill(:SIGKILL, @pid) if @th.alive?
22
+ @pid = nil
23
+ end
24
+ end
25
+
26
+ def play_midi
27
+ stop_midi
28
+ if @pid.nil? && @selected_file
29
+ begin
30
+ @pid = spawn "timidity #{@selected_file}"
31
+ @th = Process.detach @pid
32
+ rescue Errno::ENOENT
33
+ warn 'Timidty++ not found. Please install Timidity++.'
34
+ warn 'https://sourceforge.net/projects/timidity/'
35
+ end
36
+ end
37
+ end
38
+
39
+ def show_version
40
+ msg_box('Tiny Midi Player',
41
+ "Written in Ruby\n" \
42
+ "https://github.com/kojix2/libui\n" \
43
+ "Version #{VERSION}")
44
+ end
45
+
46
+ def create_gui
47
+ menu('Help') {
48
+ menu_item('Version') {
49
+ on_clicked do
50
+ show_version
51
+ end
52
+ }
53
+ }
54
+ window('Tiny Midi Player', 200, 50) {
55
+ horizontal_box {
56
+ vertical_box {
57
+ stretchy false
58
+
59
+ button('▶') {
60
+ on_clicked do
61
+ play_midi
62
+ end
63
+ }
64
+ button('■') {
65
+ on_clicked do
66
+ stop_midi
67
+ end
68
+ }
69
+ }
70
+
71
+ combobox { |c|
72
+ items @midi_files.map { |path| File.basename(path) }
73
+
74
+ on_selected do
75
+ @selected_file = @midi_files[c.selected]
76
+ play_midi if @th&.alive?
77
+ end
78
+ }
79
+ }
80
+ }.show
81
+ end
82
+ end
83
+
84
+ TinyMidiPlayer.new
Binary file
@@ -54,8 +54,24 @@ module Glimmer
54
54
  alias set_items items
55
55
  alias items= items
56
56
 
57
- def selected_item
58
- items[selected]
57
+ def selected_item(value = nil)
58
+ if value.nil?
59
+ items[selected]
60
+ else
61
+ self.selected = items.index(value)
62
+ end
63
+ end
64
+ alias set_selected_item selected_item
65
+ alias selected_item= selected_item
66
+
67
+ def data_bind(property, model_binding)
68
+ super
69
+ case property
70
+ when 'selected'
71
+ handle_listener('on_selected') { model_binding.call(selected) }
72
+ when 'selected_item'
73
+ handle_listener('on_selected') { model_binding.call(selected_item) }
74
+ end
59
75
  end
60
76
  end
61
77
  end
@@ -64,6 +64,11 @@ module Glimmer
64
64
  Fiddle.free @time unless @time.nil?
65
65
  super
66
66
  end
67
+
68
+ def data_bind(property, model_binding)
69
+ super
70
+ handle_listener('on_changed') { model_binding.call(time) } if property == 'time'
71
+ end
67
72
  end
68
73
  end
69
74
  end
@@ -40,6 +40,11 @@ module Glimmer
40
40
  alias set_items items
41
41
  alias items= items
42
42
  end
43
+
44
+ def data_bind(property, model_binding)
45
+ super
46
+ handle_listener('on_changed') { model_binding.call(text) } if property == 'text'
47
+ end
43
48
  end
44
49
  end
45
50
  end
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.4.6
4
+ version: 0.4.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andy Maleh
@@ -253,6 +253,7 @@ files:
253
253
  - examples/custom_draw_text.rb
254
254
  - examples/custom_draw_text2.rb
255
255
  - examples/date_time_picker.rb
256
+ - examples/date_time_picker2.rb
256
257
  - examples/dynamic_area.rb
257
258
  - examples/dynamic_area2.rb
258
259
  - examples/dynamic_area3.rb
@@ -277,6 +278,8 @@ files:
277
278
  - examples/method_based_custom_keyword.rb
278
279
  - examples/method_based_custom_keyword2.rb
279
280
  - examples/midi_player.rb
281
+ - examples/midi_player2.rb
282
+ - examples/midi_player3.rb
280
283
  - examples/simple_notepad.rb
281
284
  - examples/snake.rb
282
285
  - examples/snake/model/apple.rb