glimmer-dsl-libui 0.2.0 → 0.2.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: ffbecd89743bd4d6037a21613742b1d4817aed439bbdf67a32c86752c2c5f9f0
4
- data.tar.gz: 6ad928e4ae5108c74fef25bac43e27c351453748d37596c9226b8bfd85aba032
3
+ metadata.gz: 276e4ac15791c16e7f6b8816bba43b7a402484800bc1a11e84037e5511ec9b39
4
+ data.tar.gz: b6fcc1cb1e2707452ab8e88140d40446e7e740e6b0d5d2241aa204ec59ee8a11
5
5
  SHA512:
6
- metadata.gz: f150724cb5f29130c9e347468d38da5e125c86193d12663206f64ffe627fc97f2b4f3977cdabab7d223dbf513561ed246c748f3696afb8c736f9e3cd55f17b5b
7
- data.tar.gz: 19f493db469713670a630cae23302f12c8a46edfdd5b9726def28eb36d7e4341ae61562a399fde29bbeb82841e739db8b59d26517323c2db1960a7eac041d07b
6
+ metadata.gz: 07a11c38a4d2e2a9ea043bab960c20b84cb148ba837d4293157b452a0851d51246373f1b031aa3c79680a28e56c2e95b33c0661c6949aa865a6182151b719872
7
+ data.tar.gz: 53c5d5be2ca21d765d81e75d1b6924965536a7c34d5ba63899b7e37f7e2785c19eabf271fbbb801b899cb703ffa7d2ad4357c38dd6bce63673adcc3899b1e00a
data/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # Change Log
2
2
 
3
+ ## 0.2.1
4
+
5
+ - Have examples/timer.rb show `msg_box` on finish
6
+ - Have examples/color_the_circles.rb push colored circles when colored behind uncolored circles to keep uncolored circles visible
7
+ - Fix non-blocking dialog issue on Linux with examples/color_the_circles.rb
8
+ - Support all `LibUI` methods through `Glimmer::LibUI` (with some enhanced, like `timer` and `queue_main`, which accept blocks)
9
+
10
+ ## 0.2.0
11
+
12
+ - Support examples/timer.rb
13
+ - Support examples/color_the_circles.rb
14
+ - Support `timer` and `queue_main` with simple blocks through `Glimmer::LibUI.timer(time_in_seconds=0.1, repeat: true, &block)` and `Glimmer::LibUI.queue_main(&block)`
15
+ - Support `radio_menu_item` (similar to `check_menu_item`, but auto-unchecks sibling `radio_menu_item`s when checked)
16
+ - Support degrees for arc arguments (instead of radians)
17
+ - Support `circle` shape and use in examples/area_gallery.rb (all versions)
18
+ - Support `Glimmer::LibUI.x11_colors` to obtain all available X11 color symbols
19
+ - Support `#include?` method in `circle`, `rectangle`, and `square` to test containment of a point `x`,`y` coordinates
20
+
3
21
  ## 0.1.11
4
22
 
5
23
  - New examples/login.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.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.2.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)
@@ -118,11 +118,17 @@ window('Area Gallery', 400, 400) {
118
118
  stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
119
119
  }
120
120
  path { # declarative stable path
121
- arc(200, 200, 90, 0, 360, false)
121
+ circle(200, 200, 90)
122
122
 
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
+ path { # declarative stable path
127
+ arc(400, 220, 180, 90, 90, false)
128
+
129
+ fill r: 204, g: 102, b: 204, a: 0.5
130
+ stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
131
+ }
126
132
 
127
133
  on_mouse_event do |area_mouse_event|
128
134
  p area_mouse_event
@@ -191,7 +197,7 @@ Other [Glimmer](https://rubygems.org/gems/glimmer) DSL gems you might be interes
191
197
 
192
198
  ## Table of Contents
193
199
 
194
- - [Glimmer DSL for LibUI 0.1.10](#-glimmer-dsl-for-libui-0111)
200
+ - [Glimmer DSL for LibUI 0.2.1](#-glimmer-dsl-for-libui-021)
195
201
  - [Glimmer GUI DSL Concepts](#glimmer-gui-dsl-concepts)
196
202
  - [Usage](#usage)
197
203
  - [Girb (Glimmer IRB)](#girb-glimmer-irb)
@@ -199,6 +205,7 @@ Other [Glimmer](https://rubygems.org/gems/glimmer) DSL gems you might be interes
199
205
  - [Supported Controls](#supported-controls)
200
206
  - [Common Control Properties](#common-control-properties)
201
207
  - [Common Control Operations](#common-control-operations)
208
+ - [LibUI Operations](#libui-operations)
202
209
  - [Extra Dialogs](#extra-dialogs)
203
210
  - [Extra Operations](#extra-operations)
204
211
  - [Table API](#table-api)
@@ -235,6 +242,8 @@ Other [Glimmer](https://rubygems.org/gems/glimmer) DSL gems you might be interes
235
242
  - [Histogram](#histogram)
236
243
  - [Basic Transform](#basic-transform)
237
244
  - [Login](#login)
245
+ - [Timer](#timer)
246
+ - [Color The Circles](#color-the-circles)
238
247
  - [Contributing to glimmer-dsl-libui](#contributing-to-glimmer-dsl-libui)
239
248
  - [Help](#help)
240
249
  - [Issues](#issues)
@@ -322,7 +331,7 @@ gem install glimmer-dsl-libui
322
331
  Or install via Bundler `Gemfile`:
323
332
 
324
333
  ```ruby
325
- gem 'glimmer-dsl-libui', '~> 0.1.10'
334
+ gem 'glimmer-dsl-libui', '~> 0.2.1'
326
335
  ```
327
336
 
328
337
  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.
@@ -475,6 +484,13 @@ Control(Args) | Properties | Listeners
475
484
  - `hide`
476
485
  - `show`
477
486
 
487
+ ### LibUI Operations
488
+
489
+ All operations that could normally be called on `LibUI` can also be called on `Glimmer::LibUI`, but some have enhancements as detailed below.
490
+
491
+ - `Glimmer::LibUI::queue_main(&block)`: queues an operation to be run on the main event loop at the earliest opportunity possible
492
+ - `Glimmer::LibUI::timer(time_in_seconds=0.1, repeat: true, &block)`: calls block after time_in_seconds has elapsed, repeating indefinitely unless repeat is `false` or an `Integer` for finite number of repeats. Block can return `false` or `true` to override next repetition.
493
+
478
494
  ### Extra Dialogs
479
495
 
480
496
  - `open_file(window as Glimmer::LibUI::WindowProxy)`: returns selected file (`String`) or `nil` if cancelled
@@ -766,6 +782,8 @@ Note that `area`, `path`, and nested shapes are all truly declarative, meaning t
766
782
 
767
783
  `fill` and `stroke` accept [X11](https://en.wikipedia.org/wiki/X11_color_names) color `Symbol`s/`String`s like `:skyblue` and `'sandybrown'` or 6-number hex or 3-number hex-shorthand (as `Integer` or `String` with or without `0x` prefix)
768
784
 
785
+ Available [X11](https://en.wikipedia.org/wiki/X11_color_names) colors can be obtained through `Glimmer::LibUI.x11_colors` method.
786
+
769
787
  Check [Basic Transform](#basic-transform) example for use of [X11](https://en.wikipedia.org/wiki/X11_color_names) colors.
770
788
 
771
789
  Check [Histogram](#histogram) example for use of hex colors.
@@ -1438,7 +1456,7 @@ class TinyMidiPlayer
1438
1456
  end
1439
1457
 
1440
1458
  def create_gui
1441
- menu('Help') { |m|
1459
+ menu('Help') {
1442
1460
  menu_item('Version') {
1443
1461
  on_clicked do
1444
1462
  show_version
@@ -3523,11 +3541,17 @@ window('Area Gallery', 400, 400) {
3523
3541
  stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
3524
3542
  }
3525
3543
  path { # declarative stable path
3526
- arc(200, 200, 90, 0, 360, false)
3544
+ circle(200, 200, 90)
3527
3545
 
3528
3546
  fill r: 202, g: 102, b: 204, a: 0.5
3529
3547
  stroke r: 0, g: 0, b: 0, thickness: 2
3530
3548
  }
3549
+ path { # declarative stable path
3550
+ arc(400, 220, 180, 90, 90, false)
3551
+
3552
+ fill r: 204, g: 102, b: 204, a: 0.5
3553
+ stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
3554
+ }
3531
3555
 
3532
3556
  on_mouse_event do |area_mouse_event|
3533
3557
  p area_mouse_event
@@ -3680,18 +3704,28 @@ window('Area Gallery', 400, 400) {
3680
3704
  stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
3681
3705
  }
3682
3706
  path { # declarative stable path
3683
- arc {
3707
+ circle {
3684
3708
  x_center 200
3685
3709
  y_center 200
3686
3710
  radius 90
3687
- start_angle 0
3688
- sweep 360
3689
- is_negative false
3690
3711
  }
3691
3712
 
3692
3713
  fill r: 202, g: 102, b: 204, a: 0.5
3693
3714
  stroke r: 0, g: 0, b: 0, thickness: 2
3694
3715
  }
3716
+ path { # declarative stable path
3717
+ arc {
3718
+ x_center 400
3719
+ y_center 220
3720
+ radius 180
3721
+ start_angle 90
3722
+ sweep 90
3723
+ is_negative false
3724
+ }
3725
+
3726
+ fill r: 204, g: 102, b: 204, a: 0.5
3727
+ stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
3728
+ }
3695
3729
 
3696
3730
  on_mouse_event do |area_mouse_event|
3697
3731
  p area_mouse_event
@@ -3791,13 +3825,19 @@ window('Area Gallery', 400, 400) {
3791
3825
  stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
3792
3826
  }
3793
3827
  path { # a dynamic path is added semi-declaratively inside on_draw block
3794
- arc(200, 200, 90, 0, 360, false)
3795
-
3828
+ circle(200, 200, 90)
3829
+
3796
3830
  fill r: 202, g: 102, b: 204, a: 0.5
3797
3831
  stroke r: 0, g: 0, b: 0, thickness: 2
3798
3832
  }
3833
+ path { # a dynamic path is added semi-declaratively inside on_draw block
3834
+ arc(400, 220, 180, 90, 90, false)
3835
+
3836
+ fill r: 204, g: 102, b: 204, a: 0.5
3837
+ stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
3838
+ }
3799
3839
  end
3800
-
3840
+
3801
3841
  on_mouse_event do |area_mouse_event|
3802
3842
  p area_mouse_event
3803
3843
  end
@@ -3950,20 +3990,30 @@ window('Area Gallery', 400, 400) {
3950
3990
  stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
3951
3991
  }
3952
3992
  path { # a dynamic path is added semi-declaratively inside on_draw block
3953
- arc {
3993
+ circle {
3954
3994
  x_center 200
3955
3995
  y_center 200
3956
3996
  radius 90
3957
- start_angle 0
3958
- sweep 360
3959
- is_negative false
3960
3997
  }
3961
-
3998
+
3962
3999
  fill r: 202, g: 102, b: 204, a: 0.5
3963
4000
  stroke r: 0, g: 0, b: 0, thickness: 2
3964
4001
  }
4002
+ path { # a dynamic path is added semi-declaratively inside on_draw block
4003
+ arc {
4004
+ x_center 400
4005
+ y_center 220
4006
+ radius 180
4007
+ start_angle 90
4008
+ sweep 90
4009
+ is_negative false
4010
+ }
4011
+
4012
+ fill r: 204, g: 102, b: 204, a: 0.5
4013
+ stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
4014
+ }
3965
4015
  end
3966
-
4016
+
3967
4017
  on_mouse_event do |area_mouse_event|
3968
4018
  p area_mouse_event
3969
4019
  end
@@ -4486,6 +4536,409 @@ window('Login') {
4486
4536
  }.show
4487
4537
  ```
4488
4538
 
4539
+ ### Timer
4540
+
4541
+ [examples/timer.rb](examples/timer.rb)
4542
+
4543
+ Run with this command from the root of the project if you cloned the project:
4544
+
4545
+ ```
4546
+ ruby -r './lib/glimmer-dsl-libui' examples/timer.rb
4547
+ ```
4548
+
4549
+ Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/glimmer-dsl-libui):
4550
+
4551
+ ```
4552
+ ruby -r glimmer-dsl-libui -e "require 'examples/timer'"
4553
+ ```
4554
+
4555
+ Mac
4556
+
4557
+ ![glimmer-dsl-libui-mac-timer.png](images/glimmer-dsl-libui-mac-timer.png)
4558
+ ![glimmer-dsl-libui-mac-timer-in-progress.png](images/glimmer-dsl-libui-mac-timer-in-progress.png)
4559
+
4560
+ Linux
4561
+
4562
+ ![glimmer-dsl-libui-linux-timer.png](images/glimmer-dsl-libui-linux-timer.png)
4563
+ ![glimmer-dsl-libui-linux-timer-in-progress.png](images/glimmer-dsl-libui-linux-timer-in-progress.png)
4564
+
4565
+ New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
4566
+
4567
+ ```ruby
4568
+ # frozen_string_literal: true
4569
+
4570
+ require 'glimmer-dsl-libui'
4571
+
4572
+ class Timer
4573
+ include Glimmer
4574
+
4575
+ SECOND_MAX = 59
4576
+ MINUTE_MAX = 59
4577
+ HOUR_MAX = 23
4578
+
4579
+ def initialize
4580
+ @pid = nil
4581
+ @midi_file = File.expand_path('../sounds/AlanWalker-Faded.mid', __dir__)
4582
+ at_exit { stop_midi }
4583
+ setup_timer
4584
+ create_gui
4585
+ end
4586
+
4587
+ def stop_midi
4588
+ if @pid
4589
+ if @th.alive?
4590
+ Process.kill(:SIGKILL, @pid)
4591
+ @pid = nil
4592
+ else
4593
+ @pid = nil
4594
+ end
4595
+ end
4596
+ end
4597
+
4598
+ def play_midi
4599
+ stop_midi
4600
+ if @pid.nil?
4601
+ begin
4602
+ @pid = spawn "timidity -G 0.0-10.0 #{@midi_file}"
4603
+ @th = Process.detach @pid
4604
+ rescue Errno::ENOENT
4605
+ warn 'Timidty++ not found. Please install Timidity++.'
4606
+ warn 'https://sourceforge.net/projects/timidity/'
4607
+ end
4608
+ end
4609
+ end
4610
+
4611
+ def setup_timer
4612
+ unless @setup_timer
4613
+ Glimmer::LibUI.timer(1) do
4614
+ if @started
4615
+ seconds = @sec_spinbox.value
4616
+ minutes = @min_spinbox.value
4617
+ hours = @hour_spinbox.value
4618
+ if seconds > 0
4619
+ @sec_spinbox.value = seconds -= 1
4620
+ end
4621
+ if seconds == 0
4622
+ if minutes > 0
4623
+ @min_spinbox.value = minutes -= 1
4624
+ @sec_spinbox.value = seconds = SECOND_MAX
4625
+ end
4626
+ if minutes == 0
4627
+ if hours > 0
4628
+ @hour_spinbox.value = hours -= 1
4629
+ @min_spinbox.value = minutes = MINUTE_MAX
4630
+ @sec_spinbox.value = seconds = SECOND_MAX
4631
+ end
4632
+ if hours == 0 && minutes == 0 && seconds == 0
4633
+ @start_button.enabled = true
4634
+ @stop_button.enabled = false
4635
+ @started = false
4636
+ unless @played
4637
+ play_midi
4638
+ @played = true
4639
+ end
4640
+ end
4641
+ end
4642
+ end
4643
+ end
4644
+ end
4645
+ @setup_timer = true
4646
+ end
4647
+ end
4648
+
4649
+ def create_gui
4650
+ window('Timer') {
4651
+ margined true
4652
+
4653
+ group('Countdown') {
4654
+ vertical_box {
4655
+ horizontal_box {
4656
+ @hour_spinbox = spinbox(0, HOUR_MAX) {
4657
+ stretchy false
4658
+ value 0
4659
+ }
4660
+ label(':') {
4661
+ stretchy false
4662
+ }
4663
+ @min_spinbox = spinbox(0, MINUTE_MAX) {
4664
+ stretchy false
4665
+ value 0
4666
+ }
4667
+ label(':') {
4668
+ stretchy false
4669
+ }
4670
+ @sec_spinbox = spinbox(0, SECOND_MAX) {
4671
+ stretchy false
4672
+ value 0
4673
+ }
4674
+ }
4675
+ horizontal_box {
4676
+ @start_button = button('Start') {
4677
+ on_clicked do
4678
+ @start_button.enabled = false
4679
+ @stop_button.enabled = true
4680
+ @started = true
4681
+ @played = false
4682
+ end
4683
+ }
4684
+
4685
+ @stop_button = button('Stop') {
4686
+ enabled false
4687
+
4688
+ on_clicked do
4689
+ @start_button.enabled = true
4690
+ @stop_button.enabled = false
4691
+ @started = false
4692
+ end
4693
+ }
4694
+ }
4695
+ }
4696
+ }
4697
+ }.show
4698
+ end
4699
+ end
4700
+
4701
+ Timer.new
4702
+ ```
4703
+
4704
+ ### Color The Circles
4705
+
4706
+ [examples/color_the_circles.rb](examples/color_the_circles.rb)
4707
+
4708
+ Run with this command from the root of the project if you cloned the project:
4709
+
4710
+ ```
4711
+ ruby -r './lib/glimmer-dsl-libui' examples/color_the_circles.rb
4712
+ ```
4713
+
4714
+ Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/glimmer-dsl-libui):
4715
+
4716
+ ```
4717
+ ruby -r glimmer-dsl-libui -e "require 'examples/color_the_circles'"
4718
+ ```
4719
+
4720
+ Mac
4721
+
4722
+ ![glimmer-dsl-libui-mac-color-the-circles.png](images/glimmer-dsl-libui-mac-color-the-circles.png)
4723
+ ![glimmer-dsl-libui-mac-color-the-circles-lost.png](images/glimmer-dsl-libui-mac-color-the-circles-lost.png)
4724
+ ![glimmer-dsl-libui-mac-color-the-circles-won.png](images/glimmer-dsl-libui-mac-color-the-circles-won.png)
4725
+
4726
+ Linux
4727
+
4728
+ ![glimmer-dsl-libui-linux-color-the-circles.png](images/glimmer-dsl-libui-linux-color-the-circles.png)
4729
+ ![glimmer-dsl-libui-linux-color-the-circles-lost.png](images/glimmer-dsl-libui-linux-color-the-circles-lost.png)
4730
+ ![glimmer-dsl-libui-linux-color-the-circles-won.png](images/glimmer-dsl-libui-linux-color-the-circles-won.png)
4731
+
4732
+ New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
4733
+
4734
+ ```ruby
4735
+ require 'glimmer-dsl-libui'
4736
+
4737
+ class ColorTheCircles
4738
+ include Glimmer
4739
+
4740
+ WINDOW_WIDTH = 800
4741
+ WINDOW_HEIGHT = 600
4742
+ CIRCLE_MIN_RADIUS = 15
4743
+ CIRCLE_MAX_RADIUS = 50
4744
+ MARGIN_WIDTH = 55
4745
+ MARGIN_HEIGHT = 155
4746
+ TIME_MAX_EASY = 4
4747
+ TIME_MAX_MEDIUM = 3
4748
+ TIME_MAX_HARD = 2
4749
+ TIME_MAX_INSANE = 1
4750
+
4751
+ attr_accessor :score
4752
+
4753
+ def initialize
4754
+ @circles_data = []
4755
+ @score = 0
4756
+ @time_max = TIME_MAX_HARD
4757
+ register_observers
4758
+ setup_circle_factory
4759
+ end
4760
+
4761
+ def register_observers
4762
+ observer = Glimmer::DataBinding::Observer.proc do |new_score|
4763
+ @score_label.text = new_score.to_s
4764
+ if new_score == -20
4765
+ msg_box('You Lost!', 'Sorry! Your score reached -20')
4766
+ restart_game
4767
+ elsif new_score == 0
4768
+ msg_box('You Won!', 'Congratulations! Your score reached 0')
4769
+ restart_game
4770
+ end
4771
+ end
4772
+ observer.observe(self, :score) # automatically enhances self to become Glimmer::DataBinding::ObservableModel and notify observer on score attribute changes
4773
+ end
4774
+
4775
+ def setup_circle_factory
4776
+ consumer = Proc.new do
4777
+ if @circles_data.empty?
4778
+ # start with 3 circles to make more challenging
4779
+ add_circle until @circles_data.size > 3
4780
+ else
4781
+ add_circle
4782
+ end
4783
+ delay = rand * @time_max
4784
+ Glimmer::LibUI.timer(delay, repeat: false, &consumer)
4785
+ end
4786
+ Glimmer::LibUI.queue_main(&consumer)
4787
+ end
4788
+
4789
+ def add_circle
4790
+ circle_x_center = rand * (WINDOW_WIDTH - MARGIN_WIDTH - CIRCLE_MAX_RADIUS) + CIRCLE_MAX_RADIUS
4791
+ circle_y_center = rand * (WINDOW_HEIGHT - MARGIN_HEIGHT - CIRCLE_MAX_RADIUS) + CIRCLE_MAX_RADIUS
4792
+ circle_radius = rand * (CIRCLE_MAX_RADIUS - CIRCLE_MIN_RADIUS) + CIRCLE_MIN_RADIUS
4793
+ stroke_color = Glimmer::LibUI.x11_colors.sample
4794
+ @circles_data << {
4795
+ args: [circle_x_center, circle_y_center, circle_radius],
4796
+ fill: nil,
4797
+ stroke: stroke_color
4798
+ }
4799
+ @area.queue_redraw_all
4800
+ self.score -= 1 # notifies score observers automatically of change
4801
+ end
4802
+
4803
+ def restart_game
4804
+ @score = 0 # update variable directly to avoid notifying observers
4805
+ @circles_data.clear
4806
+ end
4807
+
4808
+ def launch
4809
+ menu('Actions') {
4810
+ menu_item('Restart') {
4811
+ on_clicked do
4812
+ restart_game
4813
+ end
4814
+ }
4815
+
4816
+ quit_menu_item
4817
+ }
4818
+
4819
+ menu('Difficulty') {
4820
+ radio_menu_item('Easy') {
4821
+ on_clicked do
4822
+ @time_max = TIME_MAX_EASY
4823
+ end
4824
+ }
4825
+
4826
+ radio_menu_item('Medium') {
4827
+ on_clicked do
4828
+ @time_max = TIME_MAX_MEDIUM
4829
+ end
4830
+ }
4831
+
4832
+ radio_menu_item('Hard') {
4833
+ checked true
4834
+
4835
+ on_clicked do
4836
+ @time_max = TIME_MAX_HARD
4837
+ end
4838
+ }
4839
+
4840
+ radio_menu_item('Insane') {
4841
+ on_clicked do
4842
+ @time_max = TIME_MAX_INSANE
4843
+ end
4844
+ }
4845
+ }
4846
+
4847
+ menu('Help') {
4848
+ menu_item('Instructions') {
4849
+ on_clicked do
4850
+ msg_box('Instructions', "Score goes down as circles are added.\nIf it reaches -20, you lose!\n\nClick circles to color and score!\nOnce score reaches 0, you win!\n\nBeware of concealed light-colored circles!\nThey are revealed once darker circles intersect them.\n\nThere are four levels of difficulty.\nChange via difficulty menu if the game gets too tough.")
4851
+ end
4852
+ }
4853
+ }
4854
+
4855
+ window('Color The Circles', WINDOW_WIDTH, WINDOW_HEIGHT) {
4856
+ margined true
4857
+
4858
+ grid {
4859
+ button('Restart') {
4860
+ left 0
4861
+ top 0
4862
+ halign :center
4863
+
4864
+ on_clicked do
4865
+ restart_game
4866
+ end
4867
+ }
4868
+
4869
+ label('Score goes down as circles are added. If it reaches -20, you lose!') {
4870
+ left 0
4871
+ top 1
4872
+ halign :center
4873
+ }
4874
+
4875
+ label('Click circles to color and score! Once score reaches 0, you win!') {
4876
+ left 0
4877
+ top 2
4878
+ halign :center
4879
+ }
4880
+
4881
+ horizontal_box {
4882
+ left 0
4883
+ top 3
4884
+ halign :center
4885
+
4886
+ label('Score:') {
4887
+ stretchy false
4888
+ }
4889
+
4890
+ @score_label = label(@score.to_s) {
4891
+ stretchy false
4892
+ }
4893
+ }
4894
+
4895
+ vertical_box {
4896
+ left 0
4897
+ top 4
4898
+ hexpand true
4899
+ vexpand true
4900
+ halign :fill
4901
+ valign :fill
4902
+
4903
+ @area = area {
4904
+ on_draw do |area_draw_params|
4905
+ path {
4906
+ rectangle(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT)
4907
+
4908
+ fill :white
4909
+ }
4910
+
4911
+ @circles_data.each do |circle_data|
4912
+ path {
4913
+ circle_data[:circle] = circle(*circle_data[:args])
4914
+
4915
+ fill circle_data[:fill]
4916
+ stroke circle_data[:stroke]
4917
+ }
4918
+ end
4919
+ end
4920
+
4921
+ on_mouse_down do |area_mouse_event|
4922
+ clicked_circle_data = @circles_data.find do |circle_data|
4923
+ circle_data[:fill].nil? && circle_data[:circle].include?(area_mouse_event[:x], area_mouse_event[:y])
4924
+ end
4925
+ if clicked_circle_data
4926
+ clicked_circle_data[:fill] = clicked_circle_data[:stroke]
4927
+ @area.queue_redraw_all
4928
+ self.score += 1 # notifies score observers automatically of change
4929
+ end
4930
+ end
4931
+ }
4932
+ }
4933
+
4934
+ }
4935
+ }.show
4936
+ end
4937
+ end
4938
+
4939
+ ColorTheCircles.new.launch
4940
+ ```
4941
+
4489
4942
  ## Contributing to glimmer-dsl-libui
4490
4943
 
4491
4944
  - Check out the latest master to make sure the feature hasn't been
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.11
1
+ 0.2.1
@@ -41,11 +41,17 @@ window('Area Gallery', 400, 400) {
41
41
  stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
42
42
  }
43
43
  path { # declarative stable path
44
- arc(200, 200, 90, 0, 360, false)
44
+ circle(200, 200, 90)
45
45
 
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
+ path { # declarative stable path
50
+ arc(400, 220, 180, 90, 90, false)
51
+
52
+ fill r: 204, g: 102, b: 204, a: 0.5
53
+ stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
54
+ }
49
55
 
50
56
  on_mouse_event do |area_mouse_event|
51
57
  p area_mouse_event
@@ -95,18 +95,28 @@ window('Area Gallery', 400, 400) {
95
95
  stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
96
96
  }
97
97
  path { # declarative stable path
98
- arc {
98
+ circle {
99
99
  x_center 200
100
100
  y_center 200
101
101
  radius 90
102
- start_angle 0
103
- sweep 360
104
- is_negative false
105
102
  }
106
103
 
107
104
  fill r: 202, g: 102, b: 204, a: 0.5
108
105
  stroke r: 0, g: 0, b: 0, thickness: 2
109
106
  }
107
+ path { # declarative stable path
108
+ arc {
109
+ x_center 400
110
+ y_center 220
111
+ radius 180
112
+ start_angle 90
113
+ sweep 90
114
+ is_negative false
115
+ }
116
+
117
+ fill r: 204, g: 102, b: 204, a: 0.5
118
+ stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
119
+ }
110
120
 
111
121
  on_mouse_event do |area_mouse_event|
112
122
  p area_mouse_event