glimmer-dsl-libui 0.2.3 → 0.2.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 +4 -4
- data/CHANGELOG.md +30 -1
- data/README.md +550 -21
- data/VERSION +1 -1
- data/examples/basic_draw_text.rb +35 -37
- data/examples/basic_draw_text2.rb +68 -0
- data/examples/basic_table_color.rb +39 -0
- data/examples/custom_draw_text.rb +106 -0
- data/examples/custom_draw_text2.rb +120 -0
- data/glimmer-dsl-libui.gemspec +0 -0
- data/icons/glimmer.png +0 -0
- data/lib/glimmer/libui/attributed_string.rb +90 -4
- data/lib/glimmer/libui/control_proxy/color_button_proxy.rb +2 -1
- data/lib/glimmer/libui/control_proxy/column/background_color_column_proxy.rb +38 -0
- data/lib/glimmer/libui/control_proxy/column/checkbox_text_color_column_proxy.rb +82 -0
- data/lib/glimmer/libui/control_proxy/column/image_text_color_column_proxy.rb +50 -0
- data/lib/glimmer/libui/control_proxy/column/text_color_column_proxy.rb +50 -0
- data/lib/glimmer/libui/control_proxy/combobox_proxy.rb +18 -0
- data/lib/glimmer/libui/control_proxy/editable_column.rb +1 -0
- data/lib/glimmer/libui/control_proxy/open_type_features_proxy.rb +53 -0
- data/lib/glimmer/libui/control_proxy/open_type_tag_proxy.rb +59 -0
- data/lib/glimmer/libui/control_proxy/table_proxy.rb +31 -11
- data/lib/glimmer/libui/control_proxy/text_proxy.rb +20 -5
- data/lib/glimmer/libui/control_proxy/triple_column.rb +45 -0
- data/lib/glimmer/libui.rb +1 -1
- metadata +14 -2
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.2.
|
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.7
|
2
2
|
## Prerequisite-Free Ruby Desktop Development GUI Library
|
3
3
|
[](http://badge.fury.io/rb/glimmer-dsl-libui)
|
4
4
|
[](https://codeclimate.com/github/AndyObtiva/glimmer-dsl-libui/maintainability)
|
@@ -197,7 +197,7 @@ Other [Glimmer](https://rubygems.org/gems/glimmer) DSL gems you might be interes
|
|
197
197
|
|
198
198
|
## Table of Contents
|
199
199
|
|
200
|
-
- [Glimmer DSL for LibUI 0.2.
|
200
|
+
- [Glimmer DSL for LibUI 0.2.7](#-glimmer-dsl-for-libui-027)
|
201
201
|
- [Glimmer GUI DSL Concepts](#glimmer-gui-dsl-concepts)
|
202
202
|
- [Usage](#usage)
|
203
203
|
- [Girb (Glimmer IRB)](#girb-glimmer-irb)
|
@@ -235,6 +235,7 @@ Other [Glimmer](https://rubygems.org/gems/glimmer) DSL gems you might be interes
|
|
235
235
|
- [Basic Table Checkbox](#basic-table-checkbox)
|
236
236
|
- [Basic Table Checkbox Text](#basic-table-checkbox-text)
|
237
237
|
- [Basic Table Progress Bar](#basic-table-progress-bar)
|
238
|
+
- [Basic Table Color](#basic-table-color)
|
238
239
|
- [Form Table](#form-table)
|
239
240
|
- [Basic Area](#basic-area)
|
240
241
|
- [Dynamic Area](#dynamic-area)
|
@@ -245,6 +246,7 @@ Other [Glimmer](https://rubygems.org/gems/glimmer) DSL gems you might be interes
|
|
245
246
|
- [Timer](#timer)
|
246
247
|
- [Color The Circles](#color-the-circles)
|
247
248
|
- [Basic Draw Text](#basic-draw-text)
|
249
|
+
- [Custom Draw Text](#custom-draw-text)
|
248
250
|
- [Contributing to glimmer-dsl-libui](#contributing-to-glimmer-dsl-libui)
|
249
251
|
- [Help](#help)
|
250
252
|
- [Issues](#issues)
|
@@ -332,7 +334,7 @@ gem install glimmer-dsl-libui
|
|
332
334
|
Or install via Bundler `Gemfile`:
|
333
335
|
|
334
336
|
```ruby
|
335
|
-
gem 'glimmer-dsl-libui', '~> 0.2.
|
337
|
+
gem 'glimmer-dsl-libui', '~> 0.2.7'
|
336
338
|
```
|
337
339
|
|
338
340
|
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.
|
@@ -408,12 +410,14 @@ Control(Args) | Properties | Listeners
|
|
408
410
|
`about_menu_item` | None | `on_clicked`
|
409
411
|
`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`, `on_key_event(area_key_event)`, `on_key_down(area_key_event)`, `on_key_up(area_key_event)`
|
410
412
|
`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
|
413
|
+
`background_color_column(name as String)` | None | None
|
411
414
|
`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
|
412
415
|
`button(text as String)` | `text` (`String`) | `on_clicked`
|
413
416
|
`button_column(name as String)` | `enabled` (Boolean) | None
|
414
417
|
`checkbox(text as String)` | `checked` (Boolean), `text` (`String`) | `on_toggled`
|
415
418
|
`checkbox_column(name as String)` | `editable` (Boolean) | None
|
416
419
|
`checkbox_text_column(name as String)` | `editable` (Boolean), `editable_checkbox` (Boolean), `editable_text` (Boolean) | None
|
420
|
+
`checkbox_text_color_column(name as String)` | `editable` (Boolean), `editable_checkbox` (Boolean), `editable_text` (Boolean) | None
|
417
421
|
`combobox` | `items` (`Array` of `String`), `selected` (`Integer`) | `on_selected`
|
418
422
|
`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`
|
419
423
|
`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`
|
@@ -431,6 +435,7 @@ Control(Args) | Properties | Listeners
|
|
431
435
|
`image_part(pixels as String [encoded image rgba byte array], width as Numeric, height as Numeric, byte_stride as Numeric [usually width*4])` | None | None
|
432
436
|
`image_column(name as String)` | None | None
|
433
437
|
`image_text_column(name as String)` | None | None
|
438
|
+
`image_text_color_column(name as String)` | None | None
|
434
439
|
`label(text as String)` | `text` (`String`) | None
|
435
440
|
`line(x as Numeric, y as Numeric)` | `x` (`Numeric`), `y` (`Numeric`) | None
|
436
441
|
`matrix(m11 = nil as Numeric, m12 = nil as Numeric, m21 = nil as Numeric, m22 = nil as Numeric, m31 = nil as Numeric, m32 = nil as Numeric)` | `m11` (`Numeric`), `m12` (`Numeric`), `m21` (`Numeric`), `m22` (`Numeric`), `m31` (`Numeric`), `m32` (`Numeric`) | None
|
@@ -452,10 +457,13 @@ Control(Args) | Properties | Listeners
|
|
452
457
|
`slider(min as Numeric, max as Numeric)` | `value` (`Numeric`) | `on_changed`
|
453
458
|
`spinbox(min as Numeric, max as Numeric)` | `value` (`Numeric`) | `on_changed`
|
454
459
|
`square(x as Numeric, y as Numeric, length as Numeric)` | `x` (`Numeric`), `y` (`Numeric`), `length` (`Numeric`) | None
|
460
|
+
`string` | `font`, `color`, `background`, `underline`, `underline_color`, `open_type_features` | None
|
455
461
|
`tab` | `margined` (Boolean), `num_pages` (`Integer`) | None
|
456
462
|
`tab_item(name as String)` | `index` [read-only] (`Integer`), `margined` (Boolean), `name` [read-only] (`String`) | None
|
457
463
|
`table` | `cell_rows` (`Array` (rows) of `Arrays` (row columns) of cell values (e.g. `String` values for `text_column` cells or `Array` of `image`/`String` for `image_text_column`)), `editable` as Boolean | None
|
464
|
+
`text(x = 0 as Numeric, y = 0 as Numeric, width = area_width as Numeric)` | `align`, `default_font` | None
|
458
465
|
`text_column(name as String)` | `editable` (Boolean) | None
|
466
|
+
`text_color_column(name as String)` | `editable` (Boolean) | None
|
459
467
|
`time_picker` | `time` (`Hash` of keys: `sec` as `Integer`, `min` as `Integer`, `hour` as `Integer`) | `on_changed`
|
460
468
|
`vertical_box` | `padded` (Boolean) | None
|
461
469
|
`vertical_separator` | None | None
|
@@ -509,12 +517,16 @@ All operations that could normally be called on `LibUI` can also be called on `G
|
|
509
517
|
### Table API
|
510
518
|
|
511
519
|
The `table` control must first declare its columns via one of these column keywords (mentioned in [Supported Controls](#supported-controls)):
|
520
|
+
- `background_color_column`: expects color cell values
|
512
521
|
- `button_column`: expects `String` cell values
|
513
522
|
- `checkbox_column`: expects Boolean cell values
|
514
523
|
- `checkbox_text_column`: expects dual-element `Array` of Boolean and `String` cell values
|
524
|
+
- `checkbox_text_color_column`: expects triple-element `Array` of Boolean, `String`, and color cell values
|
515
525
|
- `image_column`: expects `image` cell values (produced by `image` and `image_part` keywords as per [Supported Controls](#supported-controls))
|
516
526
|
- `image_text_column`: expects dual-element `Array` of `image` and `String` cell values
|
527
|
+
- `image_text_color_column`: expects triple-element `Array` of `image`, `String`, and color cell values
|
517
528
|
- `text_column`: expects `String` cell values
|
529
|
+
- `text_color_column`: expects dual-element `Array` of `String` and color cell values
|
518
530
|
- `progress_bar_column`: expects `Integer` cell values
|
519
531
|
|
520
532
|
Afterwards, it must declare its `cell_rows` array (`Array` of `Array`s of column cell values) and whether it is `editable` (Boolean) for all its columns.
|
@@ -789,6 +801,50 @@ Check [Basic Transform](#basic-transform) example for use of [X11](https://en.wi
|
|
789
801
|
|
790
802
|
Check [Histogram](#histogram) example for use of hex colors.
|
791
803
|
|
804
|
+
To draw `text` in an `area`, you simply nest a `text(x, y, width)` control directly under `area` or inside a `on_draw` listener, and then nest attributed `string {string_value}` controls underneath it returning an actual `String` (think of them as the `<span>` element in html, which contains a string of text).
|
805
|
+
|
806
|
+
`text` control can have the following properties:
|
807
|
+
- `default_font`:
|
808
|
+
- `align`: `:left` (default), `:center`, or `:right` (`align` currently seems not to work on the Mac)
|
809
|
+
|
810
|
+
`string` can have the following properties:
|
811
|
+
- `font`: font descriptor hash consisting of `:family`, `:size`, `:weight` (`[:minimum, :thin, :ultra_light, :light, :book, :normal, :medium, :semi_bold, :bold, :ultra_bold, :heavy, :ultra_heavy, :maximum]`), `:italic` (`[:normal, :oblique, :italic]`), and `:stretch` (`[:ultra_condensed, :extra_condensed, :condensed, :semi_condensed, :normal, :semi_expanded, :expanded, :extra_expanded, :ultra_expanded]`) key values
|
812
|
+
- `color`: rgba, hex, or [X11](https://en.wikipedia.org/wiki/X11_color_names) color
|
813
|
+
- `background`: rgba, hex, or [X11](https://en.wikipedia.org/wiki/X11_color_names) color
|
814
|
+
- `underline`: one of `:none`, `:single`, `:double`, `:suggestion`, `:color_custom`, `:color_spelling`, `:color_grammar`, `:color_auxiliary`
|
815
|
+
- `underline_color`: one of `:spelling`, `:grammar`, `:auxiliary`, rgba, hex, or [X11](https://en.wikipedia.org/wiki/X11_color_names) color
|
816
|
+
- `open_type_features`: it must have a block containing `open_type_tag` occurrances, which take the a, b, c, d arguments plus a number at the end.
|
817
|
+
|
818
|
+
Example (you may copy/paste in [`girb`](#girb-glimmer-irb)):
|
819
|
+
|
820
|
+
```ruby
|
821
|
+
window('area text drawing') {
|
822
|
+
area {
|
823
|
+
text {
|
824
|
+
default_font family: 'Helvetica', size: 12, weight: :normal, italic: :normal, stretch: :normal
|
825
|
+
|
826
|
+
string {
|
827
|
+
font family: 'Georgia', size: 13, weight: :medium, italic: :normal, stretch: :normal
|
828
|
+
color r: 230, g: 100, b: 50, a: 0.5
|
829
|
+
background r: 230, g: 200, b: 250, a: 0.8
|
830
|
+
underline :single
|
831
|
+
underline_color :spelling
|
832
|
+
open_type_features {
|
833
|
+
open_type_tag 'l', 'i', 'g', 'a', 0
|
834
|
+
open_type_tag 'l', 'i', 'g', 'a', 1
|
835
|
+
}
|
836
|
+
|
837
|
+
"This is a test\n\n"
|
838
|
+
}
|
839
|
+
|
840
|
+
string {
|
841
|
+
'This is another test'
|
842
|
+
}
|
843
|
+
}
|
844
|
+
}
|
845
|
+
}.show
|
846
|
+
```
|
847
|
+
|
792
848
|
### Smart Defaults and Conventions
|
793
849
|
|
794
850
|
- `horizontal_box`, `vertical_box`, `grid`, and `form` controls have `padded` as `true` upon instantiation to ensure more user-friendly GUI by default
|
@@ -830,7 +886,7 @@ Check [Histogram](#histogram) example for use of hex colors.
|
|
830
886
|
|
831
887
|
- There is no proper way to destroy `grid` children due to [libui](https://github.com/andlabs/libui) not offering any API for deleting them from `grid` (no `grid_delete` similar to `box_delete` for `horizontal_box` and `vertical_box`).
|
832
888
|
- `table` `checkbox_column` and `checkbox_text_column` checkbox editing only works on Windows and Linux (not Mac) due to a current limitation in [libui](https://github.com/andlabs/ui/issues/357).
|
833
|
-
-
|
889
|
+
- `text` `align` property seems not to work on the Mac ([libui](https://github.com/andlabs/libui) has an [issue](https://github.com/andlabs/libui/pull/407) about it)
|
834
890
|
|
835
891
|
### Original API
|
836
892
|
|
@@ -2539,7 +2595,7 @@ window('Editable column animal sounds', 400, 200) {
|
|
2539
2595
|
|
2540
2596
|
### Basic Table Image
|
2541
2597
|
|
2542
|
-
This example
|
2598
|
+
This example requires pre-installing `chunky_png` Ruby gem:
|
2543
2599
|
|
2544
2600
|
```
|
2545
2601
|
gem install chunky_png -v1.4.0
|
@@ -2996,6 +3052,78 @@ window('Task Progress', 300, 200) {
|
|
2996
3052
|
}.show
|
2997
3053
|
```
|
2998
3054
|
|
3055
|
+
### Basic Table Color
|
3056
|
+
|
3057
|
+
This example requires pre-installing `chunky_png` Ruby gem:
|
3058
|
+
|
3059
|
+
```
|
3060
|
+
gem install chunky_png -v1.4.0
|
3061
|
+
```
|
3062
|
+
|
3063
|
+
[examples/basic_table_color.rb](examples/basic_table_color.rb)
|
3064
|
+
|
3065
|
+
Run with this command from the root of the project if you cloned the project:
|
3066
|
+
|
3067
|
+
```
|
3068
|
+
ruby -r './lib/glimmer-dsl-libui' examples/basic_table_color.rb
|
3069
|
+
```
|
3070
|
+
|
3071
|
+
Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/glimmer-dsl-libui):
|
3072
|
+
|
3073
|
+
```
|
3074
|
+
ruby -r glimmer-dsl-libui -e "require 'examples/basic_table_color'"
|
3075
|
+
```
|
3076
|
+
|
3077
|
+
Mac
|
3078
|
+
|
3079
|
+

|
3080
|
+
|
3081
|
+
Linux
|
3082
|
+
|
3083
|
+

|
3084
|
+
|
3085
|
+
New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
|
3086
|
+
|
3087
|
+
```ruby
|
3088
|
+
require 'glimmer-dsl-libui'
|
3089
|
+
require 'chunky_png'
|
3090
|
+
|
3091
|
+
include Glimmer
|
3092
|
+
|
3093
|
+
f = File.open(File.expand_path('../icons/glimmer.png', __dir__))
|
3094
|
+
canvas = ChunkyPNG::Canvas.from_io(f)
|
3095
|
+
f.close
|
3096
|
+
canvas.resample_nearest_neighbor!(24, 24)
|
3097
|
+
data = canvas.to_rgba_stream
|
3098
|
+
width = canvas.width
|
3099
|
+
height = canvas.height
|
3100
|
+
img = image {
|
3101
|
+
image_part(data, width, height, width * 4)
|
3102
|
+
}
|
3103
|
+
|
3104
|
+
data = [
|
3105
|
+
[['cat', :red] , ['meow', :blue] , [true, 'mammal', :green], [img, 'Glimmer', :dark_blue], {r: 255, g: 120, b: 0, a: 0.5}],
|
3106
|
+
[['dog', :yellow] , ['woof', {r: 240, g: 32, b: 32}] , [true, 'mammal', :green], [img, 'Glimmer', :dark_blue], :skyblue],
|
3107
|
+
[['chicken', :beige], ['cock-a-doodle-doo', :blue] , [false, 'mammal', :red] , [img, 'Glimmer', :beige], {r: 5, g: 120, b: 110}],
|
3108
|
+
[['horse', :purple] , ['neigh', {r: 240, g: 32, b: 32}], [true, 'mammal', :green], [img, 'Glimmer', :dark_blue], '13a1fb'],
|
3109
|
+
[['cow', :gray] , ['moo', :blue] , [true, 'mammal', :green], [img, 'Glimmer', :brown], 0x12ff02]
|
3110
|
+
]
|
3111
|
+
|
3112
|
+
window('Animals', 500, 200) {
|
3113
|
+
horizontal_box {
|
3114
|
+
table {
|
3115
|
+
text_color_column('Animal')
|
3116
|
+
text_color_column('Sound')
|
3117
|
+
checkbox_text_color_column('Description')
|
3118
|
+
image_text_color_column('GUI')
|
3119
|
+
background_color_column('Mammal')
|
3120
|
+
|
3121
|
+
cell_rows data
|
3122
|
+
}
|
3123
|
+
}
|
3124
|
+
}.show
|
3125
|
+
```
|
3126
|
+
|
2999
3127
|
### Form Table
|
3000
3128
|
|
3001
3129
|
[examples/form_table.rb](examples/form_table.rb)
|
@@ -4566,8 +4694,6 @@ Linux
|
|
4566
4694
|
New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
|
4567
4695
|
|
4568
4696
|
```ruby
|
4569
|
-
# frozen_string_literal: true
|
4570
|
-
|
4571
4697
|
require 'glimmer-dsl-libui'
|
4572
4698
|
|
4573
4699
|
class Timer
|
@@ -4579,13 +4705,13 @@ class Timer
|
|
4579
4705
|
|
4580
4706
|
def initialize
|
4581
4707
|
@pid = nil
|
4582
|
-
@
|
4583
|
-
at_exit {
|
4708
|
+
@alarm_file = File.expand_path('../sounds/AlanWalker-Faded.mid', __dir__)
|
4709
|
+
at_exit { stop_alarm }
|
4584
4710
|
setup_timer
|
4585
4711
|
create_gui
|
4586
4712
|
end
|
4587
4713
|
|
4588
|
-
def
|
4714
|
+
def stop_alarm
|
4589
4715
|
if @pid
|
4590
4716
|
if @th.alive?
|
4591
4717
|
Process.kill(:SIGKILL, @pid)
|
@@ -4596,11 +4722,11 @@ class Timer
|
|
4596
4722
|
end
|
4597
4723
|
end
|
4598
4724
|
|
4599
|
-
def
|
4600
|
-
|
4725
|
+
def play_alarm
|
4726
|
+
stop_alarm
|
4601
4727
|
if @pid.nil?
|
4602
4728
|
begin
|
4603
|
-
@pid = spawn "timidity -G 0.0-10.0 #{@
|
4729
|
+
@pid = spawn "timidity -G 0.0-10.0 #{@alarm_file}"
|
4604
4730
|
@th = Process.detach @pid
|
4605
4731
|
rescue Errno::ENOENT
|
4606
4732
|
warn 'Timidty++ not found. Please install Timidity++.'
|
@@ -4635,7 +4761,8 @@ class Timer
|
|
4635
4761
|
@stop_button.enabled = false
|
4636
4762
|
@started = false
|
4637
4763
|
unless @played
|
4638
|
-
|
4764
|
+
play_alarm
|
4765
|
+
msg_box('Alarm', 'Countdown Is Finished!')
|
4639
4766
|
@played = true
|
4640
4767
|
end
|
4641
4768
|
end
|
@@ -4964,7 +5091,123 @@ Linux
|
|
4964
5091
|
|
4965
5092
|

|
4966
5093
|
|
4967
|
-
|
5094
|
+
[LibUI](https://github.com/kojix2/LibUI) Original Version:
|
5095
|
+
|
5096
|
+
```ruby
|
5097
|
+
require 'libui'
|
5098
|
+
|
5099
|
+
UI = LibUI
|
5100
|
+
|
5101
|
+
UI.init
|
5102
|
+
|
5103
|
+
handler = UI::FFI::AreaHandler.malloc
|
5104
|
+
area = UI.new_area(handler)
|
5105
|
+
|
5106
|
+
# Michael Ende (1929-1995)
|
5107
|
+
# The Neverending Story is a fantasy novel by German writer Michael Ende,
|
5108
|
+
# The English version, translated by Ralph Manheim, was published in 1983.
|
5109
|
+
|
5110
|
+
TITLE = 'Michael Ende (1929-1995) The Neverending Story'
|
5111
|
+
|
5112
|
+
str1 = \
|
5113
|
+
' At last Ygramul sensed that something was coming toward ' \
|
5114
|
+
'her. With the speed of lightning, she turned about, confronting ' \
|
5115
|
+
'Atreyu with an enormous steel-blue face. Her single eye had a ' \
|
5116
|
+
'vertical pupil, which stared at Atreyu with inconceivable malignancy. '
|
5117
|
+
|
5118
|
+
str2 = \
|
5119
|
+
' A cry of fear escaped Bastian. '
|
5120
|
+
|
5121
|
+
str3 = \
|
5122
|
+
' A cry of terror passed through the ravine and echoed from ' \
|
5123
|
+
'side to side. Ygramul turned her eye to left and right, to see if ' \
|
5124
|
+
'someone else had arrived, for that sound could not have been ' \
|
5125
|
+
'made by the boy who stood there as though paralyzed with ' \
|
5126
|
+
'horror. '
|
5127
|
+
|
5128
|
+
str4 = \
|
5129
|
+
' Could she have heard my cry? Bastion wondered in alarm. ' \
|
5130
|
+
"But that's not possible. "
|
5131
|
+
|
5132
|
+
str5 = \
|
5133
|
+
' And then Atreyu heard Ygramuls voice. It was very high ' \
|
5134
|
+
'and slightly hoarse, not at all the right kind of voice for that ' \
|
5135
|
+
'enormous face. Her lips did not move as she spoke. It was the ' \
|
5136
|
+
'buzzing of a great swarm of hornets that shaped itself into ' \
|
5137
|
+
'words. '
|
5138
|
+
|
5139
|
+
str = ''
|
5140
|
+
attr_str = UI.new_attributed_string(str)
|
5141
|
+
|
5142
|
+
def attr_str.append(what, color)
|
5143
|
+
case color
|
5144
|
+
when :red
|
5145
|
+
color_attribute = UI.new_color_attribute(0.0, 0.5, 0.0, 0.7)
|
5146
|
+
when :green
|
5147
|
+
color_attribute = UI.new_color_attribute(0.5, 0.0, 0.25, 0.7)
|
5148
|
+
end
|
5149
|
+
start = UI.attributed_string_len(self)
|
5150
|
+
UI.attributed_string_append_unattributed(self, what)
|
5151
|
+
UI.attributed_string_set_attribute(self, color_attribute, start, start + what.size)
|
5152
|
+
UI.attributed_string_append_unattributed(self, "\n\n")
|
5153
|
+
end
|
5154
|
+
|
5155
|
+
attr_str.append(str1, :green)
|
5156
|
+
attr_str.append(str2, :red)
|
5157
|
+
attr_str.append(str3, :green)
|
5158
|
+
attr_str.append(str4, :red)
|
5159
|
+
attr_str.append(str5, :green)
|
5160
|
+
|
5161
|
+
Georgia = 'Georgia'
|
5162
|
+
|
5163
|
+
handler_draw_event = Fiddle::Closure::BlockCaller.new(0, [1, 1, 1]) do |_, _, adp|
|
5164
|
+
area_draw_params = UI::FFI::AreaDrawParams.new(adp)
|
5165
|
+
default_font = UI::FFI::FontDescriptor.malloc
|
5166
|
+
default_font.Family = Georgia
|
5167
|
+
default_font.Size = 13
|
5168
|
+
default_font.Weight = 500
|
5169
|
+
default_font.Italic = 0
|
5170
|
+
default_font.Stretch = 4
|
5171
|
+
params = UI::FFI::DrawTextLayoutParams.malloc
|
5172
|
+
|
5173
|
+
# UI.font_button_font(font_button, default_font)
|
5174
|
+
params.String = attr_str
|
5175
|
+
params.DefaultFont = default_font
|
5176
|
+
params.Width = area_draw_params.AreaWidth
|
5177
|
+
params.Align = 0
|
5178
|
+
text_layout = UI.draw_new_text_layout(params)
|
5179
|
+
UI.draw_text(area_draw_params.Context, text_layout, 0, 0)
|
5180
|
+
UI.draw_free_text_layout(text_layout)
|
5181
|
+
end
|
5182
|
+
|
5183
|
+
handler.Draw = handler_draw_event
|
5184
|
+
# Assigning to local variables
|
5185
|
+
# This is intended to protect Fiddle::Closure from garbage collection.
|
5186
|
+
handler.MouseEvent = (c1 = Fiddle::Closure::BlockCaller.new(0, [0]) {})
|
5187
|
+
handler.MouseCrossed = (c2 = Fiddle::Closure::BlockCaller.new(0, [0]) {})
|
5188
|
+
handler.DragBroken = (c3 = Fiddle::Closure::BlockCaller.new(0, [0]) {})
|
5189
|
+
handler.KeyEvent = (c4 = Fiddle::Closure::BlockCaller.new(0, [0]) {})
|
5190
|
+
|
5191
|
+
box = UI.new_vertical_box
|
5192
|
+
UI.box_set_padded(box, 1)
|
5193
|
+
UI.box_append(box, area, 1)
|
5194
|
+
|
5195
|
+
main_window = UI.new_window(TITLE, 600, 400, 1)
|
5196
|
+
UI.window_set_margined(main_window, 1)
|
5197
|
+
UI.window_set_child(main_window, box)
|
5198
|
+
|
5199
|
+
UI.window_on_closing(main_window) do
|
5200
|
+
UI.control_destroy(main_window)
|
5201
|
+
UI.quit
|
5202
|
+
0
|
5203
|
+
end
|
5204
|
+
UI.control_show(main_window)
|
5205
|
+
|
5206
|
+
UI.main
|
5207
|
+
UI.quit
|
5208
|
+
```
|
5209
|
+
|
5210
|
+
[Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
|
4968
5211
|
|
4969
5212
|
```ruby
|
4970
5213
|
require 'glimmer-dsl-libui'
|
@@ -4975,8 +5218,78 @@ require 'glimmer-dsl-libui'
|
|
4975
5218
|
class BasicDrawText
|
4976
5219
|
include Glimmer
|
4977
5220
|
|
4978
|
-
def alternating_color_string(&block)
|
4979
|
-
@index
|
5221
|
+
def alternating_color_string(initial: false, &block)
|
5222
|
+
@index = 0 if initial
|
5223
|
+
@index += 1
|
5224
|
+
string {
|
5225
|
+
if @index.odd?
|
5226
|
+
color r: 0.5, g: 0, b: 0.25, a: 0.7
|
5227
|
+
else
|
5228
|
+
color r: 0, g: 0.5, b: 0, a: 0.7
|
5229
|
+
end
|
5230
|
+
|
5231
|
+
block.call + "\n\n"
|
5232
|
+
}
|
5233
|
+
end
|
5234
|
+
|
5235
|
+
def launch
|
5236
|
+
window('Michael Ende (1929-1995) The Neverending Story', 600, 400) {
|
5237
|
+
margined true
|
5238
|
+
|
5239
|
+
area {
|
5240
|
+
text { # default arguments for x, y, and width are (0, 0, area_draw_params[:area_width])
|
5241
|
+
# align :left # default alignment
|
5242
|
+
default_font family: 'Georgia', size: 13, weight: :medium, italic: :normal, stretch: :normal
|
5243
|
+
|
5244
|
+
alternating_color_string(initial: true) {
|
5245
|
+
' At last Ygramul sensed that something was coming toward ' \
|
5246
|
+
'her. With the speed of lightning, she turned about, confronting ' \
|
5247
|
+
'Atreyu with an enormous steel-blue face. Her single eye had a ' \
|
5248
|
+
'vertical pupil, which stared at Atreyu with inconceivable malignancy. '
|
5249
|
+
}
|
5250
|
+
alternating_color_string {
|
5251
|
+
' A cry of fear escaped Bastian. '
|
5252
|
+
}
|
5253
|
+
alternating_color_string {
|
5254
|
+
' A cry of terror passed through the ravine and echoed from ' \
|
5255
|
+
'side to side. Ygramul turned her eye to left and right, to see if ' \
|
5256
|
+
'someone else had arrived, for that sound could not have been ' \
|
5257
|
+
'made by the boy who stood there as though paralyzed with ' \
|
5258
|
+
'horror. '
|
5259
|
+
}
|
5260
|
+
alternating_color_string {
|
5261
|
+
' Could she have heard my cry? Bastion wondered in alarm. ' \
|
5262
|
+
"But that's not possible. "
|
5263
|
+
}
|
5264
|
+
alternating_color_string {
|
5265
|
+
' And then Atreyu heard Ygramuls voice. It was very high ' \
|
5266
|
+
'and slightly hoarse, not at all the right kind of voice for that ' \
|
5267
|
+
'enormous face. Her lips did not move as she spoke. It was the ' \
|
5268
|
+
'buzzing of a great swarm of hornets that shaped itself into ' \
|
5269
|
+
'words. '
|
5270
|
+
}
|
5271
|
+
}
|
5272
|
+
}
|
5273
|
+
}.show
|
5274
|
+
end
|
5275
|
+
end
|
5276
|
+
|
5277
|
+
BasicDrawText.new.launch
|
5278
|
+
```
|
5279
|
+
|
5280
|
+
[Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version 2:
|
5281
|
+
|
5282
|
+
```ruby
|
5283
|
+
require 'glimmer-dsl-libui'
|
5284
|
+
|
5285
|
+
# Michael Ende (1929-1995)
|
5286
|
+
# The Neverending Story is a fantasy novel by German writer Michael Ende,
|
5287
|
+
# The English version, translated by Ralph Manheim, was published in 1983.
|
5288
|
+
class BasicDrawText
|
5289
|
+
include Glimmer
|
5290
|
+
|
5291
|
+
def alternating_color_string(initial: false, &block)
|
5292
|
+
@index = 0 if initial
|
4980
5293
|
@index += 1
|
4981
5294
|
string {
|
4982
5295
|
if @index.odd?
|
@@ -4995,11 +5308,11 @@ class BasicDrawText
|
|
4995
5308
|
|
4996
5309
|
area {
|
4997
5310
|
on_draw do |area_draw_params|
|
4998
|
-
text(0, 0, area_draw_params[:area_width])
|
4999
|
-
align
|
5000
|
-
default_font family: 'Georgia', size: 13, weight:
|
5311
|
+
text { # default arguments for x, y, and width are (0, 0, area_draw_params[:area_width])
|
5312
|
+
# align :left # default alignment
|
5313
|
+
default_font family: 'Georgia', size: 13, weight: :medium, italic: :normal, stretch: :normal
|
5001
5314
|
|
5002
|
-
alternating_color_string {
|
5315
|
+
alternating_color_string(initial: true) {
|
5003
5316
|
' At last Ygramul sensed that something was coming toward ' \
|
5004
5317
|
'her. With the speed of lightning, she turned about, confronting ' \
|
5005
5318
|
'Atreyu with an enormous steel-blue face. Her single eye had a ' \
|
@@ -5036,6 +5349,222 @@ end
|
|
5036
5349
|
BasicDrawText.new.launch
|
5037
5350
|
```
|
5038
5351
|
|
5352
|
+
### Custom Draw Text
|
5353
|
+
|
5354
|
+
[examples/custom_draw_text.rb](examples/custom_draw_text.rb)
|
5355
|
+
|
5356
|
+
Run with this command from the root of the project if you cloned the project:
|
5357
|
+
|
5358
|
+
```
|
5359
|
+
ruby -r './lib/glimmer-dsl-libui' examples/custom_draw_text.rb
|
5360
|
+
```
|
5361
|
+
|
5362
|
+
Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/glimmer-dsl-libui):
|
5363
|
+
|
5364
|
+
```
|
5365
|
+
ruby -r glimmer-dsl-libui -e "require 'examples/custom_draw_text'"
|
5366
|
+
```
|
5367
|
+
|
5368
|
+
Mac
|
5369
|
+
|
5370
|
+

|
5371
|
+

|
5372
|
+
|
5373
|
+
Linux
|
5374
|
+
|
5375
|
+

|
5376
|
+

|
5377
|
+
|
5378
|
+
New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
|
5379
|
+
|
5380
|
+
```ruby
|
5381
|
+
require 'glimmer-dsl-libui'
|
5382
|
+
|
5383
|
+
# Michael Ende (1929-1995)
|
5384
|
+
# The Neverending Story is a fantasy novel by German writer Michael Ende,
|
5385
|
+
# The English version, translated by Ralph Manheim, was published in 1983.
|
5386
|
+
class CustomDrawText
|
5387
|
+
include Glimmer
|
5388
|
+
|
5389
|
+
def launch
|
5390
|
+
window('Michael Ende (1929-1995) The Neverending Story', 600, 500) {
|
5391
|
+
margined true
|
5392
|
+
|
5393
|
+
vertical_box {
|
5394
|
+
form {
|
5395
|
+
stretchy false
|
5396
|
+
|
5397
|
+
font_button { |fb|
|
5398
|
+
label 'Font'
|
5399
|
+
|
5400
|
+
on_changed do
|
5401
|
+
@string.font = fb.font
|
5402
|
+
end
|
5403
|
+
}
|
5404
|
+
color_button { |cb|
|
5405
|
+
label 'Color'
|
5406
|
+
|
5407
|
+
on_changed do
|
5408
|
+
@string.color = cb.color
|
5409
|
+
end
|
5410
|
+
}
|
5411
|
+
color_button { |cb|
|
5412
|
+
label 'Background'
|
5413
|
+
|
5414
|
+
on_changed do
|
5415
|
+
@string.background = cb.color
|
5416
|
+
end
|
5417
|
+
}
|
5418
|
+
combobox { |c|
|
5419
|
+
label 'Underline'
|
5420
|
+
items Glimmer::LibUI.enum_symbols(:underline).map(&:to_s).map {|word| word.split('_').map(&:capitalize).join(' ')}
|
5421
|
+
selected 'None'
|
5422
|
+
|
5423
|
+
on_selected do
|
5424
|
+
@string.underline = c.selected_item.underscore
|
5425
|
+
end
|
5426
|
+
}
|
5427
|
+
}
|
5428
|
+
|
5429
|
+
area {
|
5430
|
+
text { # default arguments for x, y, and width are (0, 0, area_draw_params[:area_width])
|
5431
|
+
# align :left # default alignment
|
5432
|
+
|
5433
|
+
@string = string {
|
5434
|
+
' At last Ygramul sensed that something was coming toward ' \
|
5435
|
+
'her. With the speed of lightning, she turned about, confronting ' \
|
5436
|
+
'Atreyu with an enormous steel-blue face. Her single eye had a ' \
|
5437
|
+
'vertical pupil, which stared at Atreyu with inconceivable malignancy. ' \
|
5438
|
+
"\n\n" \
|
5439
|
+
' A cry of fear escaped Bastian. ' \
|
5440
|
+
"\n\n" \
|
5441
|
+
' A cry of terror passed through the ravine and echoed from ' \
|
5442
|
+
'side to side. Ygramul turned her eye to left and right, to see if ' \
|
5443
|
+
'someone else had arrived, for that sound could not have been ' \
|
5444
|
+
'made by the boy who stood there as though paralyzed with ' \
|
5445
|
+
'horror. ' \
|
5446
|
+
"\n\n" \
|
5447
|
+
' Could she have heard my cry? Bastion wondered in alarm. ' \
|
5448
|
+
"But that's not possible. " \
|
5449
|
+
"\n\n" \
|
5450
|
+
' And then Atreyu heard Ygramuls voice. It was very high ' \
|
5451
|
+
'and slightly hoarse, not at all the right kind of voice for that ' \
|
5452
|
+
'enormous face. Her lips did not move as she spoke. It was the ' \
|
5453
|
+
'buzzing of a great swarm of hornets that shaped itself into ' \
|
5454
|
+
'words. ' \
|
5455
|
+
"\n\n"
|
5456
|
+
}
|
5457
|
+
}
|
5458
|
+
}
|
5459
|
+
}
|
5460
|
+
}.show
|
5461
|
+
end
|
5462
|
+
end
|
5463
|
+
|
5464
|
+
CustomDrawText.new.launch
|
5465
|
+
```
|
5466
|
+
|
5467
|
+
New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version 2:
|
5468
|
+
|
5469
|
+
```ruby
|
5470
|
+
require 'glimmer-dsl-libui'
|
5471
|
+
|
5472
|
+
# Michael Ende (1929-1995)
|
5473
|
+
# The Neverending Story is a fantasy novel by German writer Michael Ende,
|
5474
|
+
# The English version, translated by Ralph Manheim, was published in 1983.
|
5475
|
+
class CustomDrawText
|
5476
|
+
include Glimmer
|
5477
|
+
|
5478
|
+
def launch
|
5479
|
+
window('Michael Ende (1929-1995) The Neverending Story', 600, 500) {
|
5480
|
+
margined true
|
5481
|
+
|
5482
|
+
vertical_box {
|
5483
|
+
form {
|
5484
|
+
stretchy false
|
5485
|
+
|
5486
|
+
font_button { |fb|
|
5487
|
+
label 'Font'
|
5488
|
+
|
5489
|
+
on_changed do
|
5490
|
+
@font = fb.font
|
5491
|
+
@area.queue_redraw_all
|
5492
|
+
end
|
5493
|
+
}
|
5494
|
+
color_button { |cb|
|
5495
|
+
label 'Color'
|
5496
|
+
|
5497
|
+
on_changed do
|
5498
|
+
@color = cb.color
|
5499
|
+
@area.queue_redraw_all
|
5500
|
+
end
|
5501
|
+
}
|
5502
|
+
color_button { |cb|
|
5503
|
+
label 'Background'
|
5504
|
+
|
5505
|
+
on_changed do
|
5506
|
+
@background = cb.color
|
5507
|
+
@area.queue_redraw_all
|
5508
|
+
end
|
5509
|
+
}
|
5510
|
+
combobox { |c|
|
5511
|
+
label 'Underline'
|
5512
|
+
items Glimmer::LibUI.enum_symbols(:underline).map(&:to_s).map {|word| word.split('_').map(&:capitalize).join(' ')}
|
5513
|
+
selected 'None'
|
5514
|
+
|
5515
|
+
on_selected do
|
5516
|
+
@underline = c.selected_item.underscore
|
5517
|
+
@area.queue_redraw_all
|
5518
|
+
end
|
5519
|
+
}
|
5520
|
+
}
|
5521
|
+
|
5522
|
+
@area = area {
|
5523
|
+
on_draw do |area_draw_params|
|
5524
|
+
text { # default arguments for x, y, and width are (0, 0, area_draw_params[:area_width])
|
5525
|
+
# align :left # default alignment
|
5526
|
+
|
5527
|
+
string {
|
5528
|
+
font @font
|
5529
|
+
color @color
|
5530
|
+
background @background
|
5531
|
+
underline @underline
|
5532
|
+
|
5533
|
+
' At last Ygramul sensed that something was coming toward ' \
|
5534
|
+
'her. With the speed of lightning, she turned about, confronting ' \
|
5535
|
+
'Atreyu with an enormous steel-blue face. Her single eye had a ' \
|
5536
|
+
'vertical pupil, which stared at Atreyu with inconceivable malignancy. ' \
|
5537
|
+
"\n\n" \
|
5538
|
+
' A cry of fear escaped Bastian. ' \
|
5539
|
+
"\n\n" \
|
5540
|
+
' A cry of terror passed through the ravine and echoed from ' \
|
5541
|
+
'side to side. Ygramul turned her eye to left and right, to see if ' \
|
5542
|
+
'someone else had arrived, for that sound could not have been ' \
|
5543
|
+
'made by the boy who stood there as though paralyzed with ' \
|
5544
|
+
'horror. ' \
|
5545
|
+
"\n\n" \
|
5546
|
+
' Could she have heard my cry? Bastion wondered in alarm. ' \
|
5547
|
+
"But that's not possible. " \
|
5548
|
+
"\n\n" \
|
5549
|
+
' And then Atreyu heard Ygramuls voice. It was very high ' \
|
5550
|
+
'and slightly hoarse, not at all the right kind of voice for that ' \
|
5551
|
+
'enormous face. Her lips did not move as she spoke. It was the ' \
|
5552
|
+
'buzzing of a great swarm of hornets that shaped itself into ' \
|
5553
|
+
'words. ' \
|
5554
|
+
"\n\n"
|
5555
|
+
}
|
5556
|
+
}
|
5557
|
+
end
|
5558
|
+
}
|
5559
|
+
}
|
5560
|
+
}.show
|
5561
|
+
end
|
5562
|
+
end
|
5563
|
+
|
5564
|
+
CustomDrawText.new.launch
|
5565
|
+
|
5566
|
+
```
|
5567
|
+
|
5039
5568
|
## Contributing to glimmer-dsl-libui
|
5040
5569
|
|
5041
5570
|
- Check out the latest master to make sure the feature hasn't been
|