glimmer-dsl-libui 0.4.11 → 0.4.12

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: 3e70a639d4f55c50b7e18b15c8122969c08dd4e50c8517048d9167bb8e7f1a4e
4
- data.tar.gz: 7c774b5f04f58306113c89355201026585c6b5701dcad7c911fa541044423196
3
+ metadata.gz: d49e65f2fefc1a5ef7d91c52bee0257bc03bd2ddd989d560b8887bfa9b24a3c5
4
+ data.tar.gz: c89fd384832f204d9f2edfb3faa99e526c0541817515286333dcdc89f9cb0ef6
5
5
  SHA512:
6
- metadata.gz: de3cca63789bd2d0818ad65350dc1e8ae79206c11d1f6f38b2bd4f7702f846b2ee160ca34456889d9a19dc958e5c768b3d6c8f0deb52f9b2c6205e1d719c3ef2
7
- data.tar.gz: 9fae92e29083d58ae527d548084f7da5187170aa3f0c66796649edffaf53ee7d7d0a948d586ea9a3310c34c5213125bbe5c6883f7f1c1fdc2e8dad1ec83ec96c
6
+ metadata.gz: 3c55ae21fadef21af8a3fbf36a20e08b5454a9ab9bd9bad4c2f3ac1097b2684e675c593187e8b4c8a87596e2ca8a354c71846a80452a8e9c75c01aca811af9ca
7
+ data.tar.gz: 91616b1ffa09f0d92d807c2f1e25edf4b0e5145ec68e73dbc2b1fbf3f3f82f25a44613d9e7e67129c12751f6085fac68ae7ae6fc7a633c58404b73a30f0caade
data/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # Change Log
2
2
 
3
+ ## 0.4.12
4
+
5
+ - Support `table` data-binding to model rows when utilizing dual-columns or triple-columns (e.g. columns having color and/or a checkbox in addition to text)
6
+ - Support passing `table` `image`/`image_text` `cell_rows` `image` data as file path/image args directly (without using `image` keyword)
7
+ - Add examples/basic_table_color.rb version that data-binds to model rows instead of raw data
8
+ - Simplify examples/basic_table_color.rb to pass image data as file-path/width/height arguments directly
9
+ - Simplify examples/basic_table_image.rb to pass image data as file url directly
10
+ - Simplify examples/basic_table_image_text.rb to pass image data as file url directly
11
+ - Fix issue with hex color support for colors starting with `'#'`
12
+
3
13
  ## 0.4.11
4
14
 
5
15
  - Support `table` `cell_rows` explicit bidirectional data-binding (with `<=>` sign)
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.4.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.4.12
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)
@@ -356,6 +356,11 @@ Other [Glimmer](https://rubygems.org/gems/glimmer) DSL gems you might be interes
356
356
  - [Custom Keywords](#custom-keywords)
357
357
  - [Observer Pattern](#observer-pattern)
358
358
  - [Data-Binding](#data-binding)
359
+ - [Bidirectional (Two-Way) Data-Binding](#bidirectional-two-way-data-binding)
360
+ - [Table Data-Binding](#table-data-binding)
361
+ - [Unidirectional (One-Way) Data-Binding](#unidirectional-one-way-data-binding)
362
+ - [Data-Binding API](#data-binding-api)
363
+ - [Data-Binding Gotchas](#data-binding-gotchas)
359
364
  - [API Gotchas](#api-gotchas)
360
365
  - [Original API](#original-api)
361
366
  - [Packaging](#packaging)
@@ -495,7 +500,7 @@ gem install glimmer-dsl-libui
495
500
  Or install via Bundler `Gemfile`:
496
501
 
497
502
  ```ruby
498
- gem 'glimmer-dsl-libui', '~> 0.4.11'
503
+ gem 'glimmer-dsl-libui', '~> 0.4.12'
499
504
  ```
500
505
 
501
506
  Test that installation worked by running the [Meta-Example](#examples):
@@ -848,7 +853,9 @@ window('Contacts', 600, 600) { |w|
848
853
  }.show
849
854
  ```
850
855
 
851
- ![glimmer-dsl-libui-linux-form-table.png](images/glimmer-dsl-libui-linux-form-table.png)
856
+ Mac | Windows | Linux
857
+ ----|---------|------
858
+ ![glimmer-dsl-libui-mac-form-table.png](images/glimmer-dsl-libui-mac-form-table.png) | ![glimmer-dsl-libui-windows-form-table.png](images/glimmer-dsl-libui-windows-form-table.png) | ![glimmer-dsl-libui-linux-form-table.png](images/glimmer-dsl-libui-linux-form-table.png)
852
859
 
853
860
  Learn more by checking out [examples](#examples).
854
861
 
@@ -1502,6 +1509,8 @@ Data-binding supports utilizing the [MVP (Model View Presenter)](https://en.wiki
1502
1509
 
1503
1510
  ![MVP](https://www.researchgate.net/profile/Gilles-Perrouin/publication/320249584/figure/fig8/AS:668260987068418@1536337243385/Model-view-presenter-architecture.png)
1504
1511
 
1512
+ #### Bidirectional (Two-Way) Data-Binding
1513
+
1505
1514
  [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):
1506
1515
  - `checkbox`: `checked`
1507
1516
  - `check_menu_item`: `checked`
@@ -1542,6 +1551,162 @@ entry {
1542
1551
 
1543
1552
  That is data-binding `entered_text` attribute on `self` to `entry` `text` property and printing text after write to the model.
1544
1553
 
1554
+ ##### Table Data-Binding
1555
+
1556
+ One note about `table` `cell_rows` data-binding is that it works with either:
1557
+ - Raw data `Array` (rows) of `Array`s (column cells)
1558
+ - Model `Array` (rows) of objects having attributes (column cells) matching the underscored names of `table` columns by convention. Model attribute names can be overridden when needed by passing an `Array` enumerating all mapped model attributes in the order of `table` columns or alternatively a `Hash` mapping only the column names that have model attribute names different from their table column underscored version.
1559
+
1560
+ Example of `table` implicit data-binding of `cell_rows` to raw data `Array` of `Array`s (you may copy/paste in [`girb`](#girb-glimmer-irb)):
1561
+
1562
+ ```ruby
1563
+ require 'glimmer-dsl-libui'
1564
+
1565
+ include Glimmer
1566
+
1567
+ data = [
1568
+ ['Lisa Sky', 'lisa@sky.com', '720-523-4329', 'Denver', 'CO'],
1569
+ ['Jordan Biggins', 'jordan@biggins.com', '617-528-5399', 'Boston', 'MA'],
1570
+ ['Mary Glass', 'mary@glass.com', '847-589-8788', 'Elk Grove Village', 'IL'],
1571
+ ['Darren McGrath', 'darren@mcgrath.com', '206-539-9283', 'Seattle', 'WA'],
1572
+ ['Melody Hanheimer', 'melody@hanheimer.com', '213-493-8274', 'Los Angeles', 'CA'],
1573
+ ]
1574
+
1575
+ window('Contacts', 600, 600) {
1576
+ table {
1577
+ text_column('Name')
1578
+ text_column('Email')
1579
+ text_column('Phone')
1580
+ text_column('City')
1581
+ text_column('State')
1582
+
1583
+ cell_rows data
1584
+ }
1585
+ }.show
1586
+ ```
1587
+
1588
+ Example of `table` explicit data-binding of `cell_rows` to Model `Array` (you may copy/paste in [`girb`](#girb-glimmer-irb)):
1589
+
1590
+ ```ruby
1591
+ require 'glimmer-dsl-libui'
1592
+
1593
+ class SomeTable
1594
+ Contact = Struct.new(:name, :email, :phone, :city, :state)
1595
+
1596
+ include Glimmer
1597
+
1598
+ attr_accessor :contacts
1599
+
1600
+ def initialize
1601
+ @contacts = [
1602
+ Contact.new('Lisa Sky', 'lisa@sky.com', '720-523-4329', 'Denver', 'CO'),
1603
+ Contact.new('Jordan Biggins', 'jordan@biggins.com', '617-528-5399', 'Boston', 'MA'),
1604
+ Contact.new('Mary Glass', 'mary@glass.com', '847-589-8788', 'Elk Grove Village', 'IL'),
1605
+ Contact.new('Darren McGrath', 'darren@mcgrath.com', '206-539-9283', 'Seattle', 'WA'),
1606
+ Contact.new('Melody Hanheimer', 'melody@hanheimer.com', '213-493-8274', 'Los Angeles', 'CA'),
1607
+ ]
1608
+ end
1609
+
1610
+ def launch
1611
+ window('Contacts', 600, 200) {
1612
+ table {
1613
+ text_column('Name')
1614
+ text_column('Email')
1615
+ text_column('Phone')
1616
+ text_column('City')
1617
+ text_column('State')
1618
+
1619
+ cell_rows <=> [self, :contacts] # explicit data-binding to Model Array auto-inferring model attribute names from underscored table column names by convention
1620
+ }
1621
+ }.show
1622
+ end
1623
+ end
1624
+
1625
+ SomeTable.new.launch
1626
+ ```
1627
+
1628
+ Example of `table` explicit data-binding of `cell_rows` to Model `Array` with `column_attributes` `Hash` mapping for custom column names (you may copy/paste in [`girb`](#girb-glimmer-irb)):
1629
+
1630
+ ```ruby
1631
+ require 'glimmer-dsl-libui'
1632
+
1633
+ class SomeTable
1634
+ Contact = Struct.new(:name, :email, :phone, :city, :state)
1635
+
1636
+ include Glimmer
1637
+
1638
+ attr_accessor :contacts
1639
+
1640
+ def initialize
1641
+ @contacts = [
1642
+ Contact.new('Lisa Sky', 'lisa@sky.com', '720-523-4329', 'Denver', 'CO'),
1643
+ Contact.new('Jordan Biggins', 'jordan@biggins.com', '617-528-5399', 'Boston', 'MA'),
1644
+ Contact.new('Mary Glass', 'mary@glass.com', '847-589-8788', 'Elk Grove Village', 'IL'),
1645
+ Contact.new('Darren McGrath', 'darren@mcgrath.com', '206-539-9283', 'Seattle', 'WA'),
1646
+ Contact.new('Melody Hanheimer', 'melody@hanheimer.com', '213-493-8274', 'Los Angeles', 'CA'),
1647
+ ]
1648
+ end
1649
+
1650
+ def launch
1651
+ window('Contacts', 600, 200) {
1652
+ table {
1653
+ text_column('Name')
1654
+ text_column('Email')
1655
+ text_column('Phone')
1656
+ text_column('City/Town')
1657
+ text_column('State/Province')
1658
+
1659
+ cell_rows <=> [self, :contacts, column_attributes: {'City/Town' => :city, 'State/Province' => :state}]
1660
+ }
1661
+ }.show
1662
+ end
1663
+ end
1664
+
1665
+ SomeTable.new.launch
1666
+ ```
1667
+
1668
+ Example of `table` explicit data-binding of `cell_rows` to Model `Array` with complete `column_attributes` `Array` mapping (you may copy/paste in [`girb`](#girb-glimmer-irb)):
1669
+
1670
+ ```ruby
1671
+ require 'glimmer-dsl-libui'
1672
+
1673
+ class SomeTable
1674
+ Contact = Struct.new(:name, :email, :phone, :city, :state)
1675
+
1676
+ include Glimmer
1677
+
1678
+ attr_accessor :contacts
1679
+
1680
+ def initialize
1681
+ @contacts = [
1682
+ Contact.new('Lisa Sky', 'lisa@sky.com', '720-523-4329', 'Denver', 'CO'),
1683
+ Contact.new('Jordan Biggins', 'jordan@biggins.com', '617-528-5399', 'Boston', 'MA'),
1684
+ Contact.new('Mary Glass', 'mary@glass.com', '847-589-8788', 'Elk Grove Village', 'IL'),
1685
+ Contact.new('Darren McGrath', 'darren@mcgrath.com', '206-539-9283', 'Seattle', 'WA'),
1686
+ Contact.new('Melody Hanheimer', 'melody@hanheimer.com', '213-493-8274', 'Los Angeles', 'CA'),
1687
+ ]
1688
+ end
1689
+
1690
+ def launch
1691
+ window('Contacts', 600, 200) {
1692
+ table {
1693
+ text_column('Full Name')
1694
+ text_column('Email Address')
1695
+ text_column('Phone Number')
1696
+ text_column('City or Town')
1697
+ text_column('State or Province')
1698
+
1699
+ cell_rows <=> [self, :contacts, column_attributes: [:name, :email, :phone, :city, :state]]
1700
+ }
1701
+ }.show
1702
+ end
1703
+ end
1704
+
1705
+ SomeTable.new.launch
1706
+ ```
1707
+
1708
+ #### Unidirectional (One-Way) Data-Binding
1709
+
1545
1710
  [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) supports unidirectional (one-way) data-binding of any control/shape/attributed-string property via the `<=` operator (indicating data is moving from the right side, which is the Model, to the left side, which is the GUI View object).
1546
1711
 
1547
1712
  Example of unidirectional data-binding:
@@ -1564,6 +1729,8 @@ window {
1564
1729
 
1565
1730
  That is data-binding the `window` `title` property to the `score` attribute of a `@game`, but converting on read from the Model to a `String`.
1566
1731
 
1732
+ #### Data-Binding API
1733
+
1567
1734
  To summarize the data-binding API:
1568
1735
  - `view_property <=> [model, attribute, *read_or_write_options]`: Bidirectional (two-way) data-binding to Model attribute accessor
1569
1736
  - `view_property <= [model, attribute, *read_only_options]`: Unidirectional (one-way) data-binding to Model attribute reader
@@ -1594,12 +1761,13 @@ entry {
1594
1761
  }
1595
1762
  ```
1596
1763
 
1597
- Data-binding gotchas:
1764
+ Learn more from data-binding usage in [Login](#login) (4 data-binding versions), [Basic Entry](#basic-entry), [Form](#form), [Form Table](#form-table) (5 data-binding versions), [Method-Based Custom Keyword](#method-based-custom-keyword), [Snake](#snake) and [Tic Tac Toe](#tic_tac_toe) examples.
1765
+
1766
+ #### Data-Binding Gotchas
1767
+
1598
1768
  - Never data-bind a control property to an attribute on the same view object with the same exact name (e.g. binding `entry` `text` property to `self` `text` attribute) as it would conflict with it. Instead, data-bind view property to an attribute with a different name on the view object or with the same name, but on a presenter or model object (e.g. data-bind `entry` `text` to `self` `legal_text` attribute or to `contract` model `text` attribute)
1599
1769
  - Data-binding a property utilizes the control's listener associated with the property (e.g. `on_changed` for `entry` `text`), so you cannot hook into the listener directly anymore as that would negate data-binding. Instead, you can add an `after_write: ->(val) {}` option to perform something on trigger of the control listener instead.
1600
1770
 
1601
- Learn more from data-binding usage in [Login](#login) (4 data-binding versions), [Basic Entry](#basic-entry), [Form](#form), [Form Table](#form-table), [Method-Based Custom Keyword](#method-based-custom-keyword), [Snake](#snake) and [Tic Tac Toe](#tic_tac_toe) examples.
1602
-
1603
1771
  ### API Gotchas
1604
1772
 
1605
1773
  - 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`).
@@ -2925,7 +3093,44 @@ UI.main
2925
3093
  UI.quit
2926
3094
  ```
2927
3095
 
2928
- [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
3096
+ [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version (passing file url as image):
3097
+
3098
+ ```ruby
3099
+ # frozen_string_literal: true
3100
+
3101
+ # NOTE:
3102
+ # This example displays images that can be freely downloaded from the Studio Ghibli website.
3103
+
3104
+ require 'glimmer-dsl-libui'
3105
+
3106
+ include Glimmer
3107
+
3108
+ IMAGE_ROWS = []
3109
+
3110
+ 50.times do |i|
3111
+ url = format('https://www.ghibli.jp/gallery/thumb-redturtle%03d.png', (i + 1))
3112
+ puts "Processing Image: #{url}"; $stdout.flush # for Windows
3113
+ IMAGE_ROWS << [url] # array of one column cell
3114
+ rescue StandardError => e
3115
+ warn url, e.message
3116
+ end
3117
+
3118
+ window('The Red Turtle', 310, 350, false) {
3119
+ horizontal_box {
3120
+ table {
3121
+ image_column('www.ghibli.jp/works/red-turtle')
3122
+
3123
+ cell_rows IMAGE_ROWS
3124
+ }
3125
+ }
3126
+
3127
+ on_closing do
3128
+ puts 'Bye Bye'
3129
+ end
3130
+ }.show
3131
+ ```
3132
+
3133
+ [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version 2 (automatic construction of `image`):
2929
3134
 
2930
3135
  ```ruby
2931
3136
  # NOTE:
@@ -2960,7 +3165,7 @@ window('The Red Turtle', 310, 350, false) {
2960
3165
  }.show
2961
3166
  ```
2962
3167
 
2963
- [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version 2 (manual construction of `image` from `image_part`):
3168
+ [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version 3 (manual construction of `image` from `image_part`):
2964
3169
 
2965
3170
  ```ruby
2966
3171
  # NOTE:
@@ -3028,7 +3233,44 @@ Mac | Windows | Linux
3028
3233
  ----|---------|------
3029
3234
  ![glimmer-dsl-libui-mac-basic-table-image-text.png](images/glimmer-dsl-libui-mac-basic-table-image-text.png) | ![glimmer-dsl-libui-windows-basic-table-image-text.png](images/glimmer-dsl-libui-windows-basic-table-image-text.png) | ![glimmer-dsl-libui-linux-basic-table-image-text.png](images/glimmer-dsl-libui-linux-basic-table-image-text.png)
3030
3235
 
3031
- New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
3236
+ New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version (passing file url as image):
3237
+
3238
+ ```ruby
3239
+ # frozen_string_literal: true
3240
+
3241
+ # NOTE:
3242
+ # This example displays images that can be freely downloaded from the Studio Ghibli website.
3243
+
3244
+ require 'glimmer-dsl-libui'
3245
+
3246
+ include Glimmer
3247
+
3248
+ IMAGE_ROWS = []
3249
+
3250
+ 5.times do |i|
3251
+ url = format('https://www.ghibli.jp/gallery/thumb-redturtle%03d.png', (i + 1))
3252
+ puts "Processing Image: #{url}"; $stdout.flush # for Windows
3253
+ text = url.sub('https://www.ghibli.jp/gallery/thumb-redturtle', '').sub('.png', '')
3254
+ IMAGE_ROWS << [[url, text], [url, text]] # cell values are dual-element arrays
3255
+ rescue StandardError => e
3256
+ warn url, e.message
3257
+ end
3258
+
3259
+ window('The Red Turtle', 670, 350) {
3260
+ horizontal_box {
3261
+ table {
3262
+ image_text_column('image/number')
3263
+ image_text_column('image/number (editable)') {
3264
+ editable true
3265
+ }
3266
+
3267
+ cell_rows IMAGE_ROWS
3268
+ }
3269
+ }
3270
+ }.show
3271
+ ```
3272
+
3273
+ New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version 2 (automatic construction of `image`):
3032
3274
 
3033
3275
  ```ruby
3034
3276
  # NOTE:
@@ -3402,16 +3644,126 @@ Mac | Windows | Linux
3402
3644
  ----|---------|------
3403
3645
  ![glimmer-dsl-libui-mac-basic-table-color.png](images/glimmer-dsl-libui-mac-basic-table-color.png) | ![glimmer-dsl-libui-windows-basic-table-color.png](images/glimmer-dsl-libui-windows-basic-table-color.png) | ![glimmer-dsl-libui-linux-basic-table-color.png](images/glimmer-dsl-libui-linux-basic-table-color.png)
3404
3646
 
3405
- New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
3647
+ New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version (with explicit [data-binding](#data-binding) to model rows using a presenter):
3406
3648
 
3407
3649
  ```ruby
3408
- # frozen_string_literal: true
3650
+ require 'glimmer-dsl-libui'
3651
+
3652
+ class BasicTableColor
3653
+ Animal = Struct.new(:name, :sound, :mammal)
3654
+
3655
+ class AnimalPresenter < Animal
3656
+ def name_color
3657
+ color = case name
3658
+ when 'cat'
3659
+ :red
3660
+ when 'dog'
3661
+ :yellow
3662
+ when 'chicken'
3663
+ :beige
3664
+ when 'horse'
3665
+ :purple
3666
+ when 'cow'
3667
+ :gray
3668
+ end
3669
+ [name, color]
3670
+ end
3671
+
3672
+ def sound_color
3673
+ color = case name
3674
+ when 'cat', 'chicken', 'cow'
3675
+ :blue
3676
+ when 'dog', 'horse'
3677
+ {r: 240, g: 32, b: 32}
3678
+ end
3679
+ [sound, color]
3680
+ end
3681
+
3682
+ def mammal_description_color
3683
+ color = case name
3684
+ when 'cat', 'dog', 'horse', 'cow'
3685
+ :green
3686
+ when 'chicken'
3687
+ :red
3688
+ end
3689
+ [mammal, 'mammal', color]
3690
+ end
3691
+
3692
+ def image_description_color
3693
+ color = case name
3694
+ when 'cat', 'dog', 'horse'
3695
+ :dark_blue
3696
+ when 'chicken'
3697
+ :beige
3698
+ when 'cow'
3699
+ :brown
3700
+ end
3701
+ [img, 'Glimmer', color]
3702
+ end
3703
+
3704
+ def img
3705
+ # scale image to 24x24 (can be passed as file path String only instead of Array to avoid scaling)
3706
+ [File.expand_path('../icons/glimmer.png', __dir__), 24, 24]
3707
+ end
3708
+
3709
+ def background_color
3710
+ case name
3711
+ when 'cat'
3712
+ {r: 255, g: 120, b: 0, a: 0.5}
3713
+ when 'dog'
3714
+ :skyblue
3715
+ when 'chicken'
3716
+ {r: 5, g: 120, b: 110}
3717
+ when 'horse'
3718
+ '#13a1fb'
3719
+ when 'cow'
3720
+ 0x12ff02
3721
+ end
3722
+ end
3723
+ end
3724
+
3725
+ include Glimmer
3726
+
3727
+ attr_accessor :animals
3728
+
3729
+ def initialize
3730
+ @animals = [
3731
+ AnimalPresenter.new('cat', 'meow', true),
3732
+ AnimalPresenter.new('dog', 'woof', true),
3733
+ AnimalPresenter.new('chicken', 'cock-a-doodle-doo', false),
3734
+ AnimalPresenter.new('horse', 'neigh', true),
3735
+ AnimalPresenter.new('cow', 'moo', true),
3736
+ ]
3737
+ end
3738
+
3739
+ def launch
3740
+ window('Animals', 500, 200) {
3741
+ horizontal_box {
3742
+ table {
3743
+ text_color_column('Animal')
3744
+ text_color_column('Sound')
3745
+ checkbox_text_color_column('Description')
3746
+ image_text_color_column('GUI')
3747
+ background_color_column # must always be the last column and always expects data-binding model attribute `background_color` when binding to Array of models
3748
+
3749
+ cell_rows <= [self, :animals, column_attributes: {'Animal' => :name_color, 'Sound' => :sound_color, 'Description' => :mammal_description_color, 'GUI' => :image_description_color}]
3750
+ }
3751
+ }
3752
+ }.show
3753
+ end
3754
+ end
3755
+
3756
+ BasicTableColor.new.launch
3757
+ ```
3409
3758
 
3759
+ New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version 2 (with implicit [data-binding](#data-binding) to raw data rows):
3760
+
3761
+ ```ruby
3410
3762
  require 'glimmer-dsl-libui'
3411
3763
 
3412
3764
  include Glimmer
3413
3765
 
3414
- img = image(File.expand_path('../icons/glimmer.png', __dir__), 24, 24)
3766
+ img = [File.expand_path('../icons/glimmer.png', __dir__), 24, 24] # scales image to 24x24 (can be passed as file path String only instead of Array to avoid scaling)
3415
3767
 
3416
3768
  data = [
3417
3769
  [['cat', :red] , ['meow', :blue] , [true, 'mammal', :green], [img, 'Glimmer', :dark_blue], {r: 255, g: 120, b: 0, a: 0.5}],
@@ -3436,7 +3788,7 @@ window('Animals', 500, 200) {
3436
3788
  }.show
3437
3789
  ```
3438
3790
 
3439
- New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version 2 (manual construction of [libui](https://github.com/andlabs/libui) `image` from `image_part`):
3791
+ New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version 3 (with implicit [data-binding](#data-binding) to raw data rows and manual construction of [libui](https://github.com/andlabs/libui) `image` from `image_part`):
3440
3792
 
3441
3793
  ```ruby
3442
3794
  require 'glimmer-dsl-libui'
@@ -6536,7 +6888,7 @@ class FormTable
6536
6888
  text_column('State')
6537
6889
 
6538
6890
  editable true
6539
- cell_rows <=> [self, :contacts] # explicit data-binding to Model Array
6891
+ cell_rows <=> [self, :contacts] # explicit data-binding to Model Array auto-inferring model attribute names from underscored table column names by convention
6540
6892
 
6541
6893
  on_changed do |row, type, row_data|
6542
6894
  puts "Row #{row} #{type}: #{row_data}"
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.11
1
+ 0.4.12
@@ -1,29 +1,107 @@
1
- # frozen_string_literal: true
2
-
3
1
  require 'glimmer-dsl-libui'
4
2
 
5
- include Glimmer
6
-
7
- img = image(File.expand_path('../icons/glimmer.png', __dir__), 24, 24)
8
-
9
- data = [
10
- [['cat', :red] , ['meow', :blue] , [true, 'mammal', :green], [img, 'Glimmer', :dark_blue], {r: 255, g: 120, b: 0, a: 0.5}],
11
- [['dog', :yellow] , ['woof', {r: 240, g: 32, b: 32}] , [true, 'mammal', :green], [img, 'Glimmer', :dark_blue], :skyblue],
12
- [['chicken', :beige], ['cock-a-doodle-doo', :blue] , [false, 'mammal', :red] , [img, 'Glimmer', :beige], {r: 5, g: 120, b: 110}],
13
- [['horse', :purple] , ['neigh', {r: 240, g: 32, b: 32}], [true, 'mammal', :green], [img, 'Glimmer', :dark_blue], '13a1fb'],
14
- [['cow', :gray] , ['moo', :blue] , [true, 'mammal', :green], [img, 'Glimmer', :brown], 0x12ff02]
15
- ]
16
-
17
- window('Animals', 500, 200) {
18
- horizontal_box {
19
- table {
20
- text_color_column('Animal')
21
- text_color_column('Sound')
22
- checkbox_text_color_column('Description')
23
- image_text_color_column('GUI')
24
- background_color_column # must be the last column
3
+ class BasicTableColor
4
+ Animal = Struct.new(:name, :sound, :mammal)
5
+
6
+ class AnimalPresenter < Animal
7
+ def name_color
8
+ color = case name
9
+ when 'cat'
10
+ :red
11
+ when 'dog'
12
+ :yellow
13
+ when 'chicken'
14
+ :beige
15
+ when 'horse'
16
+ :purple
17
+ when 'cow'
18
+ :gray
19
+ end
20
+ [name, color]
21
+ end
22
+
23
+ def sound_color
24
+ color = case name
25
+ when 'cat', 'chicken', 'cow'
26
+ :blue
27
+ when 'dog', 'horse'
28
+ {r: 240, g: 32, b: 32}
29
+ end
30
+ [sound, color]
31
+ end
32
+
33
+ def mammal_description_color
34
+ color = case name
35
+ when 'cat', 'dog', 'horse', 'cow'
36
+ :green
37
+ when 'chicken'
38
+ :red
39
+ end
40
+ [mammal, 'mammal', color]
41
+ end
42
+
43
+ def image_description_color
44
+ color = case name
45
+ when 'cat', 'dog', 'horse'
46
+ :dark_blue
47
+ when 'chicken'
48
+ :beige
49
+ when 'cow'
50
+ :brown
51
+ end
52
+ [img, 'Glimmer', color]
53
+ end
54
+
55
+ def img
56
+ # scale image to 24x24 (can be passed as file path String only instead of Array to avoid scaling)
57
+ [File.expand_path('../icons/glimmer.png', __dir__), 24, 24]
58
+ end
59
+
60
+ def background_color
61
+ case name
62
+ when 'cat'
63
+ {r: 255, g: 120, b: 0, a: 0.5}
64
+ when 'dog'
65
+ :skyblue
66
+ when 'chicken'
67
+ {r: 5, g: 120, b: 110}
68
+ when 'horse'
69
+ '#13a1fb'
70
+ when 'cow'
71
+ 0x12ff02
72
+ end
73
+ end
74
+ end
75
+
76
+ include Glimmer
77
+
78
+ attr_accessor :animals
79
+
80
+ def initialize
81
+ @animals = [
82
+ AnimalPresenter.new('cat', 'meow', true),
83
+ AnimalPresenter.new('dog', 'woof', true),
84
+ AnimalPresenter.new('chicken', 'cock-a-doodle-doo', false),
85
+ AnimalPresenter.new('horse', 'neigh', true),
86
+ AnimalPresenter.new('cow', 'moo', true),
87
+ ]
88
+ end
89
+
90
+ def launch
91
+ window('Animals', 500, 200) {
92
+ horizontal_box {
93
+ table {
94
+ text_color_column('Animal')
95
+ text_color_column('Sound')
96
+ checkbox_text_color_column('Description')
97
+ image_text_color_column('GUI')
98
+ background_color_column # must always be the last column and always expects data-binding model attribute `background_color` when binding to Array of models
99
+
100
+ cell_rows <= [self, :animals, column_attributes: {'Animal' => :name_color, 'Sound' => :sound_color, 'Description' => :mammal_description_color, 'GUI' => :image_description_color}]
101
+ }
102
+ }
103
+ }.show
104
+ end
105
+ end
25
106
 
26
- cell_rows data
27
- }
28
- }
29
- }.show
107
+ BasicTableColor.new.launch
@@ -1,20 +1,8 @@
1
- # frozen_string_literal: true
2
-
3
1
  require 'glimmer-dsl-libui'
4
- require 'chunky_png'
5
2
 
6
3
  include Glimmer
7
4
 
8
- f = File.open(File.expand_path('../icons/glimmer.png', __dir__))
9
- canvas = ChunkyPNG::Canvas.from_io(f)
10
- f.close
11
- canvas.resample_nearest_neighbor!(24, 24)
12
- data = canvas.to_rgba_stream
13
- width = canvas.width
14
- height = canvas.height
15
- img = image {
16
- image_part(data, width, height, width * 4)
17
- }
5
+ img = [File.expand_path('../icons/glimmer.png', __dir__), 24, 24] # scales image to 24x24 (can be passed as file path String only instead of Array to avoid scaling)
18
6
 
19
7
  data = [
20
8
  [['cat', :red] , ['meow', :blue] , [true, 'mammal', :green], [img, 'Glimmer', :dark_blue], {r: 255, g: 120, b: 0, a: 0.5}],
@@ -31,7 +19,7 @@ window('Animals', 500, 200) {
31
19
  text_color_column('Sound')
32
20
  checkbox_text_color_column('Description')
33
21
  image_text_color_column('GUI')
34
- background_color_column('Mammal')
22
+ background_color_column # must be the last column
35
23
 
36
24
  cell_rows data
37
25
  }
@@ -0,0 +1,37 @@
1
+ require 'glimmer-dsl-libui'
2
+ require 'chunky_png'
3
+
4
+ include Glimmer
5
+
6
+ f = File.open(File.expand_path('../icons/glimmer.png', __dir__))
7
+ canvas = ChunkyPNG::Canvas.from_io(f)
8
+ f.close
9
+ canvas.resample_nearest_neighbor!(24, 24)
10
+ data = canvas.to_rgba_stream
11
+ width = canvas.width
12
+ height = canvas.height
13
+ img = image {
14
+ image_part(data, width, height, width * 4)
15
+ }
16
+
17
+ data = [
18
+ [['cat', :red] , ['meow', :blue] , [true, 'mammal', :green], [img, 'Glimmer', :dark_blue], {r: 255, g: 120, b: 0, a: 0.5}],
19
+ [['dog', :yellow] , ['woof', {r: 240, g: 32, b: 32}] , [true, 'mammal', :green], [img, 'Glimmer', :dark_blue], :skyblue],
20
+ [['chicken', :beige], ['cock-a-doodle-doo', :blue] , [false, 'mammal', :red] , [img, 'Glimmer', :beige], {r: 5, g: 120, b: 110}],
21
+ [['horse', :purple] , ['neigh', {r: 240, g: 32, b: 32}], [true, 'mammal', :green], [img, 'Glimmer', :dark_blue], '13a1fb'],
22
+ [['cow', :gray] , ['moo', :blue] , [true, 'mammal', :green], [img, 'Glimmer', :brown], 0x12ff02]
23
+ ]
24
+
25
+ window('Animals', 500, 200) {
26
+ horizontal_box {
27
+ table {
28
+ text_color_column('Animal')
29
+ text_color_column('Sound')
30
+ checkbox_text_color_column('Description')
31
+ image_text_color_column('GUI')
32
+ background_color_column('Mammal')
33
+
34
+ cell_rows data
35
+ }
36
+ }
37
+ }.show
@@ -12,7 +12,7 @@ IMAGE_ROWS = []
12
12
  50.times do |i|
13
13
  url = format('https://www.ghibli.jp/gallery/thumb-redturtle%03d.png', (i + 1))
14
14
  puts "Processing Image: #{url}"; $stdout.flush # for Windows
15
- IMAGE_ROWS << [image(url)] # array of one column cell
15
+ IMAGE_ROWS << [url] # array of one column cell
16
16
  rescue StandardError => e
17
17
  warn url, e.message
18
18
  end
@@ -4,8 +4,6 @@
4
4
  # This example displays images that can be freely downloaded from the Studio Ghibli website.
5
5
 
6
6
  require 'glimmer-dsl-libui'
7
- require 'chunky_png'
8
- require 'open-uri'
9
7
 
10
8
  include Glimmer
11
9
 
@@ -13,18 +11,8 @@ IMAGE_ROWS = []
13
11
 
14
12
  50.times do |i|
15
13
  url = format('https://www.ghibli.jp/gallery/thumb-redturtle%03d.png', (i + 1))
16
- puts "Processing Image: #{url}"
17
- $stdout.flush # for Windows
18
- f = URI.open(url)
19
- canvas = ChunkyPNG::Canvas.from_io(f)
20
- f.close
21
- data = canvas.to_rgba_stream
22
- width = canvas.width
23
- height = canvas.height
24
- img = image {
25
- image_part(data, width, height, width * 4)
26
- }
27
- IMAGE_ROWS << [img] # array of one column cell
14
+ puts "Processing Image: #{url}"; $stdout.flush # for Windows
15
+ IMAGE_ROWS << [image(url)] # array of one column cell
28
16
  rescue StandardError => e
29
17
  warn url, e.message
30
18
  end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ # NOTE:
4
+ # This example displays images that can be freely downloaded from the Studio Ghibli website.
5
+
6
+ require 'glimmer-dsl-libui'
7
+ require 'chunky_png'
8
+ require 'open-uri'
9
+
10
+ include Glimmer
11
+
12
+ IMAGE_ROWS = []
13
+
14
+ 50.times do |i|
15
+ url = format('https://www.ghibli.jp/gallery/thumb-redturtle%03d.png', (i + 1))
16
+ puts "Processing Image: #{url}"
17
+ $stdout.flush # for Windows
18
+ f = URI.open(url)
19
+ canvas = ChunkyPNG::Canvas.from_io(f)
20
+ f.close
21
+ data = canvas.to_rgba_stream
22
+ width = canvas.width
23
+ height = canvas.height
24
+ img = image {
25
+ image_part(data, width, height, width * 4)
26
+ }
27
+ IMAGE_ROWS << [img] # array of one column cell
28
+ rescue StandardError => e
29
+ warn url, e.message
30
+ end
31
+
32
+ window('The Red Turtle', 310, 350, false) {
33
+ horizontal_box {
34
+ table {
35
+ image_column('www.ghibli.jp/works/red-turtle')
36
+
37
+ cell_rows IMAGE_ROWS
38
+ }
39
+ }
40
+
41
+ on_closing do
42
+ puts 'Bye Bye'
43
+ end
44
+ }.show
@@ -13,8 +13,7 @@ IMAGE_ROWS = []
13
13
  url = format('https://www.ghibli.jp/gallery/thumb-redturtle%03d.png', (i + 1))
14
14
  puts "Processing Image: #{url}"; $stdout.flush # for Windows
15
15
  text = url.sub('https://www.ghibli.jp/gallery/thumb-redturtle', '').sub('.png', '')
16
- img = image(url)
17
- IMAGE_ROWS << [[img, text], [img, text]] # cell values are dual-element arrays
16
+ IMAGE_ROWS << [[url, text], [url, text]] # cell values are dual-element arrays
18
17
  rescue StandardError => e
19
18
  warn url, e.message
20
19
  end
@@ -4,8 +4,6 @@
4
4
  # This example displays images that can be freely downloaded from the Studio Ghibli website.
5
5
 
6
6
  require 'glimmer-dsl-libui'
7
- require 'chunky_png'
8
- require 'open-uri'
9
7
 
10
8
  include Glimmer
11
9
 
@@ -13,18 +11,9 @@ IMAGE_ROWS = []
13
11
 
14
12
  5.times do |i|
15
13
  url = format('https://www.ghibli.jp/gallery/thumb-redturtle%03d.png', (i + 1))
16
- puts "Processing Image: #{url}"
17
- $stdout.flush # for Windows
18
- f = URI.open(url)
19
- canvas = ChunkyPNG::Canvas.from_io(f)
20
- f.close
21
- data = canvas.to_rgba_stream
22
- width = canvas.width
23
- height = canvas.height
24
- img = image {
25
- image_part(data, width, height, width * 4)
26
- }
14
+ puts "Processing Image: #{url}"; $stdout.flush # for Windows
27
15
  text = url.sub('https://www.ghibli.jp/gallery/thumb-redturtle', '').sub('.png', '')
16
+ img = image(url)
28
17
  IMAGE_ROWS << [[img, text], [img, text]] # cell values are dual-element arrays
29
18
  rescue StandardError => e
30
19
  warn url, e.message
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ # NOTE:
4
+ # This example displays images that can be freely downloaded from the Studio Ghibli website.
5
+
6
+ require 'glimmer-dsl-libui'
7
+ require 'chunky_png'
8
+ require 'open-uri'
9
+
10
+ include Glimmer
11
+
12
+ IMAGE_ROWS = []
13
+
14
+ 5.times do |i|
15
+ url = format('https://www.ghibli.jp/gallery/thumb-redturtle%03d.png', (i + 1))
16
+ puts "Processing Image: #{url}"
17
+ $stdout.flush # for Windows
18
+ f = URI.open(url)
19
+ canvas = ChunkyPNG::Canvas.from_io(f)
20
+ f.close
21
+ data = canvas.to_rgba_stream
22
+ width = canvas.width
23
+ height = canvas.height
24
+ img = image {
25
+ image_part(data, width, height, width * 4)
26
+ }
27
+ text = url.sub('https://www.ghibli.jp/gallery/thumb-redturtle', '').sub('.png', '')
28
+ IMAGE_ROWS << [[img, text], [img, text]] # cell values are dual-element arrays
29
+ rescue StandardError => e
30
+ warn url, e.message
31
+ end
32
+
33
+ window('The Red Turtle', 670, 350) {
34
+ horizontal_box {
35
+ table {
36
+ image_text_column('image/number')
37
+ image_text_column('image/number (editable)') {
38
+ editable true
39
+ }
40
+
41
+ cell_rows IMAGE_ROWS
42
+ }
43
+ }
44
+ }.show
Binary file
@@ -31,6 +31,10 @@ module Glimmer
31
31
  # Follows the Proxy Design Pattern
32
32
  class BackgroundColorColumnProxy < ControlProxy
33
33
  include Column
34
+
35
+ def name
36
+ 'Background Color'
37
+ end
34
38
  end
35
39
  end
36
40
  end
@@ -145,7 +145,7 @@ module Glimmer
145
145
  @column_attributes = model_binding.binding_options[:column_attributes]
146
146
  else
147
147
  column_attribute_mapping = model_binding.binding_options[:column_attributes].is_a?(Hash) ? model_binding.binding_options[:column_attributes] : {}
148
- @column_attributes = columns.map(&:name).map {|column_name| column_attribute_mapping[column_name] || column_name.underscore}
148
+ @column_attributes = columns.select {|column| column.is_a?(Column)}.map(&:name).map {|column_name| column_attribute_mapping[column_name] || column_name.underscore}
149
149
  end
150
150
  model_attribute_observer = model_attribute_observer_registration = nil
151
151
  model_attribute_observer = Glimmer::DataBinding::Observer.proc do
@@ -208,11 +208,13 @@ module Glimmer
208
208
  when Column::TextColumnProxy, Column::ButtonColumnProxy, Column::TextColorColumnProxy, :text
209
209
  ::LibUI.new_table_value_string((expanded_cell_rows[row] && expanded_cell_rows[row][column]).to_s)
210
210
  when Column::ImageColumnProxy, Column::ImageTextColumnProxy, Column::ImageTextColorColumnProxy
211
- if OS.windows? && row == cell_rows.count
212
- ::LibUI.new_table_value_image((expanded_cell_rows[row - 1] && (expanded_cell_rows[row - 1][column].respond_to?(:libui) ? expanded_cell_rows[row - 1][column].libui : expanded_cell_rows[row - 1][column])))
213
- else
214
- ::LibUI.new_table_value_image((expanded_cell_rows[row] && (expanded_cell_rows[row][column].respond_to?(:libui) ? expanded_cell_rows[row][column].libui : expanded_cell_rows[row][column])))
215
- end
211
+ # TODO refactor to eliminate redundancy and share similar code
212
+ row = row - 1 if OS.windows? && row == cell_rows.count
213
+ img = expanded_cell_rows[row][column]
214
+ img = ControlProxy::ImageProxy.new('image', nil, img) if img.is_a?(Array)
215
+ img = ControlProxy::ImageProxy.new('image', nil, [img]) if img.is_a?(String)
216
+ img = img.respond_to?(:libui) ? img.libui : img
217
+ ::LibUI.new_table_value_image(img)
216
218
  when Column::CheckboxColumnProxy, Column::CheckboxTextColumnProxy, Column::CheckboxTextColorColumnProxy
217
219
  ::LibUI.new_table_value_int(((expanded_cell_rows[row] && (expanded_cell_rows[row][column] == 1 || expanded_cell_rows[row][column].to_s.strip.downcase == 'true' ? 1 : 0))) || 0)
218
220
  when Column::ProgressBarColumnProxy
data/lib/glimmer/libui.rb CHANGED
@@ -63,7 +63,7 @@ module Glimmer
63
63
  value[:b] = value.delete(:blue) if value[:blue]
64
64
  value[:a] = value.delete(:alpha) if value[:alpha]
65
65
  value
66
- elsif value.is_a?(String) && !value.start_with?('0x') && !value.downcase.match(/^((([1-9a-f]){6})|(([1-9a-f]){3}))$/)
66
+ elsif value.is_a?(String) && !value.start_with?('0x') && !value.start_with?('#') && !value.downcase.match(/^((([1-9a-f]){6})|(([1-9a-f]){3}))$/)
67
67
  color = Color::RGB.extract_colors(value).first
68
68
  color.nil? ? {} : {
69
69
  r: color.red,
@@ -79,11 +79,11 @@ module Glimmer
79
79
 
80
80
  def hex_to_rgb(value)
81
81
  if value.is_a?(String)
82
+ value = "0x#{value[1..-1]}" if value.start_with?('#')
82
83
  if !value.start_with?('0x')
83
84
  value = value.chars.map {|char| [char, char]}.flatten.join if value.length == 3
84
85
  value = "0x#{value}"
85
86
  end
86
- value = "0x#{value[1..-1]}" if value.start_with?('#')
87
87
  value = value.to_i(16)
88
88
  end
89
89
  if value.is_a?(Integer)
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.4.11
4
+ version: 0.4.12
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-12-01 00:00:00.000000000 Z
11
+ date: 2021-12-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: glimmer
@@ -237,10 +237,13 @@ files:
237
237
  - examples/basic_table_checkbox_text.rb
238
238
  - examples/basic_table_color.rb
239
239
  - examples/basic_table_color2.rb
240
+ - examples/basic_table_color3.rb
240
241
  - examples/basic_table_image.rb
241
242
  - examples/basic_table_image2.rb
243
+ - examples/basic_table_image3.rb
242
244
  - examples/basic_table_image_text.rb
243
245
  - examples/basic_table_image_text2.rb
246
+ - examples/basic_table_image_text3.rb
244
247
  - examples/basic_table_progress_bar.rb
245
248
  - examples/basic_transform.rb
246
249
  - examples/basic_transform2.rb