glimmer-dsl-swt 4.18.5.1 → 4.18.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +44 -0
  3. data/README.md +15 -12
  4. data/VERSION +1 -1
  5. data/docs/reference/GLIMMER_GUI_DSL_SYNTAX.md +205 -24
  6. data/docs/reference/GLIMMER_SAMPLES.md +8 -0
  7. data/glimmer-dsl-swt.gemspec +8 -3
  8. data/lib/glimmer/dsl/swt/shape_expression.rb +1 -1
  9. data/lib/glimmer/swt/custom/drawable.rb +10 -2
  10. data/lib/glimmer/swt/custom/shape.rb +449 -54
  11. data/lib/glimmer/swt/custom/shape/arc.rb +35 -0
  12. data/lib/glimmer/swt/custom/shape/cubic.rb +108 -0
  13. data/lib/glimmer/swt/custom/shape/focus.rb +2 -2
  14. data/lib/glimmer/swt/custom/shape/image.rb +35 -9
  15. data/lib/glimmer/swt/custom/shape/line.rb +121 -4
  16. data/lib/glimmer/swt/custom/shape/oval.rb +18 -0
  17. data/lib/glimmer/swt/custom/shape/path.rb +197 -0
  18. data/lib/glimmer/swt/custom/shape/path_segment.rb +86 -0
  19. data/lib/glimmer/swt/custom/shape/point.rb +42 -4
  20. data/lib/glimmer/swt/custom/shape/polygon.rb +105 -15
  21. data/lib/glimmer/swt/custom/shape/polyline.rb +88 -15
  22. data/lib/glimmer/swt/custom/shape/quad.rb +104 -0
  23. data/lib/glimmer/swt/custom/shape/rectangle.rb +19 -0
  24. data/lib/glimmer/swt/custom/shape/text.rb +13 -3
  25. data/lib/glimmer/swt/dialog_proxy.rb +4 -0
  26. data/lib/glimmer/swt/proxy_properties.rb +1 -1
  27. data/lib/glimmer/swt/transform_proxy.rb +20 -4
  28. data/lib/glimmer/swt/widget_proxy.rb +17 -1
  29. data/samples/elaborate/contact_manager.rb +2 -0
  30. data/samples/elaborate/login.rb +2 -0
  31. data/samples/elaborate/mandelbrot_fractal.rb +2 -1
  32. data/samples/elaborate/meta_sample.rb +1 -0
  33. data/samples/elaborate/tetris.rb +2 -1
  34. data/samples/elaborate/tic_tac_toe.rb +2 -0
  35. data/samples/elaborate/user_profile.rb +10 -8
  36. data/samples/hello/hello_browser.rb +2 -0
  37. data/samples/hello/hello_button.rb +2 -0
  38. data/samples/hello/hello_canvas.rb +40 -23
  39. data/samples/hello/hello_canvas_animation.rb +2 -0
  40. data/samples/hello/hello_canvas_path.rb +223 -0
  41. data/samples/hello/hello_canvas_transform.rb +2 -0
  42. data/samples/hello/hello_checkbox.rb +2 -0
  43. data/samples/hello/hello_checkbox_group.rb +2 -0
  44. data/samples/hello/hello_code_text.rb +2 -0
  45. data/samples/hello/hello_color_dialog.rb +2 -0
  46. data/samples/hello/hello_combo.rb +2 -0
  47. data/samples/hello/hello_computed.rb +2 -0
  48. data/samples/hello/hello_cursor.rb +2 -0
  49. data/samples/hello/hello_custom_shell.rb +1 -0
  50. data/samples/hello/hello_custom_widget.rb +2 -0
  51. data/samples/hello/hello_date_time.rb +2 -0
  52. data/samples/hello/hello_dialog.rb +2 -0
  53. data/samples/hello/hello_directory_dialog.rb +2 -0
  54. data/samples/hello/hello_drag_and_drop.rb +5 -3
  55. data/samples/hello/hello_expand_bar.rb +2 -0
  56. data/samples/hello/hello_file_dialog.rb +2 -0
  57. data/samples/hello/hello_font_dialog.rb +2 -0
  58. data/samples/hello/hello_group.rb +2 -0
  59. data/samples/hello/hello_link.rb +2 -0
  60. data/samples/hello/hello_list_multi_selection.rb +2 -0
  61. data/samples/hello/hello_list_single_selection.rb +2 -0
  62. data/samples/hello/hello_menu_bar.rb +2 -0
  63. data/samples/hello/hello_message_box.rb +2 -0
  64. data/samples/hello/hello_pop_up_context_menu.rb +2 -0
  65. data/samples/hello/hello_progress_bar.rb +2 -0
  66. data/samples/hello/hello_radio.rb +2 -0
  67. data/samples/hello/hello_radio_group.rb +2 -0
  68. data/samples/hello/hello_sash_form.rb +2 -0
  69. data/samples/hello/hello_spinner.rb +2 -0
  70. data/samples/hello/hello_styled_text.rb +19 -17
  71. data/samples/hello/hello_tab.rb +2 -0
  72. data/samples/hello/hello_table.rb +2 -0
  73. data/samples/hello/hello_world.rb +2 -0
  74. metadata +7 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e3086c3823faac7765ca33e069111da2f027462fc9d09a2a9799a2ff094d6692
4
- data.tar.gz: be7070377808b55cfa4bde48543b8a98fdff77205c9db0c07d0f4ac42078e00e
3
+ metadata.gz: 2b3fe4c65726425f091b0660bbf4dd4c55543c5c515bed56487aacb7e1458b7e
4
+ data.tar.gz: 71580957a753685f1eac22fb60ea13c2e2f289bb47017293980d4d06d78d5eec
5
5
  SHA512:
6
- metadata.gz: 79e966ac5b7c342d8a9b936387e59f299f4895ae93c01600f8289cc06448b4d90beb0bd6e24073728d7a379172e1513b3cdf05fb3cdd4361ee08bd337870f491
7
- data.tar.gz: 3c89781755c57a6cfc2990d85352bb37674e41a8d2f55f50c26c0d44f948ab26342b58bc98fcc9f93818cf19036ea0032a84b1565397abc7b7aa93a029b8c851
6
+ metadata.gz: 974be0abde39dbacdabe5d560c319a049907791e280f03aa6192e945b64057f814cbc57346f51cead9627ee98db52276367f4ca1f8f497b2882846d280a7f103
7
+ data.tar.gz: 7b9c169a4705c8bfa390ef440e31100e40560eabca4f204d18d8e5197174d9834827fd9f76907384c2d8e3873f968c11b94f6a985c3a43eda0bbf9b8fc7b8bc9
data/CHANGELOG.md CHANGED
@@ -1,5 +1,49 @@
1
1
  # Change Log
2
2
 
3
+ ### 4.18.6.0
4
+
5
+ - Canvas Path DSL support (Alpha) for `path` as drawn or filled (`fill: true`) to the Canvas Shape DSL, supporting `point`, `line` (first point is auto-derived from previous point if not specified)
6
+ - Hello, Canvas Path! sample showing a Stock Ticker with line curves for multiple company stocks, animated with randomly generated data, moving to the left out of screen second by second. Has multiple tabs demonstrating different types of paths for graphing/charting of different real world business applications: point, line, quad, cubic.
7
+ - Fix issue to allow invocation of `set_min_size` off of `scrolled_composite` proxy directly (not just swt_widget), thus taking advantage of implicit `auto_exec`
8
+ - Support `Shape#content {}` method just like `WidgetProxy#content` to enable reopening and adding nested shapes at runtime after initial construction
9
+ - Support a path containing a `quad` bezier curve with `point_array` property
10
+ - Support a path containing a `cubic` bezier curve with `point_array` property
11
+
12
+ ### 4.18.5.5
13
+
14
+ - Automatically recalculate default size (width/height) to accomodate nested shapes when changing x/y/width/height sticking out of parent from right or bottom.
15
+ - Support special case of centering a nested shape with default x/y within a parent with default width/height calculated from nested shape
16
+ - Consider Canvas Shape DSL support for LineAttributes `line_dash_offset` and `line_miter_limit`
17
+ - Canvas Shape DSL Polygon `include?` does an outer/inner check of edge detection only
18
+ - Ensure all Canvas Shape DSL properties are restored upon painting a shape to what they were prior to painting that shape
19
+ - Fix issue with bringing high score dialog up in Tetris caused by latest dialog changes for supporting the new `color_dialog` and `font_dialog`
20
+
21
+ ### 4.18.5.4
22
+
23
+ - Support passing width, height as :default (or nil or not passed in if they are the last args) in all shapes that include other shapes to indicate they are calculated automatically from nested shapes, text/string extent, or otherwise defaulting to 0, 0
24
+ - Support [:default, width_delta], [:default, height_delta] attributes for width and height, which add/subtract from defaults used for shape
25
+ - Switch from use of `:default` with x_delta/y_delta to passing `[:default, x_delta]` or `[:default, y_delta]` (e.g. `image(file, [:default, -30], :default)` for x = default - 30 and y = default + 0)
26
+ - Support a bounding box for all shapes, implementing `#bounds` (x, y, width, and height) and `#size` (width, height) for the ones that don't receive as parameters (like polygon)
27
+
28
+ ### 4.18.5.3
29
+
30
+ - Support nesting shapes within shapes, with relative positioning (meaning x, y coordinates are assumed relative to parent's x, y in nested shapes)
31
+ - Support passing x, y coordinates as :default (or nil or not passed in if they are the last args) in all shapes, meaning they are centered within parent taking their width and height into account
32
+ - Support default_x_delta, y_delta attributes, which add/subtract from defaults used for shape
33
+
34
+ ### 4.18.5.2
35
+
36
+ - Support checking if an `arc` shape accurately includes a point x,y coordinates within pie region only
37
+ - Support checking if an `oval` shape includes a point x,y coordinates in oval region only (not its rectangular region)
38
+ - Support checking if a `focus` shape includes a point x,y coordinates
39
+ - Support checking point inclusion differently in drawed vs filled Rectangle (only check the drawn border when not filled)
40
+ - Support checking point inclusion differently in drawed vs filled Oval (only check the drawn border when not filled)
41
+ - Support checking point inclusion differently in drawed vs filled Arc (only check the drawn border when not filled)
42
+ - Support `#include?(x, y)` and `#contain?(x, y)` methods in `text` shape
43
+ - Fix point inclusion check for polyline
44
+ - Fix issue with `polygon` check if it includes a point x,y coordinates (replace with available `java.awt` robust geometry algorithms)
45
+ - Fix issue with transforms not working after the latest changes
46
+
3
47
  ### 4.18.5.1
4
48
 
5
49
  - Hello, Color Dialog! Sample
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 SWT 4.18.5.1
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 SWT 4.18.6.0
2
2
  ## JRuby Desktop Development GUI Framework
3
3
  [![Gem Version](https://badge.fury.io/rb/glimmer-dsl-swt.svg)](http://badge.fury.io/rb/glimmer-dsl-swt)
4
4
  [![Travis CI](https://travis-ci.com/AndyObtiva/glimmer-dsl-swt.svg?branch=master)](https://travis-ci.com/github/AndyObtiva/glimmer-dsl-swt)
@@ -8,17 +8,15 @@
8
8
 
9
9
  **[Contributors Wanted! (Submit a Glimmer App Sample to Get Started)](#contributing)**
10
10
 
11
- [Glimmer DSL for SWT](https://github.com/AndyObtiva/glimmer) is a native-GUI cross-platform desktop development library written in [JRuby](https://www.jruby.org/), an OS-threaded faster JVM version of [Ruby](https://www.ruby-lang.org/en/). [Glimmer](https://github.com/AndyObtiva/glimmer)'s main innovation is a declarative [Ruby DSL](docs/reference/GLIMMER_GUI_DSL_SYNTAX.md#glimmer-dsl-syntax) that enables productive and efficient authoring of desktop application user-interfaces by relying on the robust [Eclipse SWT library](https://www.eclipse.org/swt/). [Glimmer](https://rubygems.org/gems/glimmer) additionally innovates by having built-in [data-binding](docs/reference/GLIMMER_GUI_DSL_SYNTAX.md#data-binding) support, which greatly facilitates synchronizing the GUI with domain models, thus achieving true decoupling of object oriented components and enabling developers to solve business problems (test-first) without worrying about GUI concerns, or alternatively drive development GUI-first, and then write clean business models (test-first) afterwards. Not only does Glimmer provide a large set of GUI [widgets](docs/reference/GLIMMER_GUI_DSL_SYNTAX.md#widgets), but it also supports drawing Canvas Graphics like [Shapes](docs/reference/GLIMMER_GUI_DSL_SYNTAX.md#canvas-shape-dsl) and [Animations](docs/reference/GLIMMER_GUI_DSL_SYNTAX.md#canvas-animation-dsl). To get started quickly, [Glimmer](https://rubygems.org/gems/glimmer) offers [scaffolding](docs/reference/GLIMMER_COMMAND.md#scaffolding) options for [Apps](#in-production), [Gems](docs/reference/GLIMMER_COMMAND.md#custom-shell-gem), and [Custom Widgets](docs/reference/GLIMMER_GUI_DSL_SYNTAX.md#custom-widgets). [Glimmer](https://rubygems.org/gems/glimmer) also includes native-executable [packaging](docs/reference/GLIMMER_PACKAGING_AND_DISTRIBUTION.md) support, sorely lacking in other libraries, thus enabling the delivery of desktop apps written in [Ruby](https://www.ruby-lang.org/en/) as truly native DMG/PKG/APP files on the [Mac](https://www.apple.com/ca/macos) + [App Store](https://developer.apple.com/macos/distribution/), MSI/EXE files on [Windows](https://www.microsoft.com/en-ca/windows), and [Gem Packaged Shell Scripts](docs/reference/GLIMMER_COMMAND.md#packaging) on [Linux](https://www.linux.org/).
12
-
13
- [Glimmer receives two updates per month](https://rubygems.org/gems/glimmer-dsl-swt/versions). You can trust [Glimmer](https://rubygems.org/gems/glimmer) with your Ruby desktop GUI development needs. Please make [Glimmer](https://rubygems.org/gems/glimmer) even better by providing feedback and [contributing](#contributing) when possible.
14
-
15
- Gem version numbers are in sync with the SWT library versions. The first two digits represent the SWT version number. The last two digits represent the minor and patch versions of Glimmer DSL for SWT.
16
-
17
- [Glimmer DSL for SWT](https://rubygems.org/gems/glimmer-dsl-swt) versions 4.18.x.y come with [SWT 4.18](https://download.eclipse.org/eclipse/downloads/drops4/R-4.18-202012021800/), which was released on December 2, 2020.
11
+ [Glimmer](https://github.com/AndyObtiva/glimmer) DSL for SWT is a native-GUI cross-platform desktop development library written in [JRuby](https://www.jruby.org/), an OS-threaded faster JVM version of [Ruby](https://www.ruby-lang.org/en/). [Glimmer](https://github.com/AndyObtiva/glimmer)'s main innovation is a declarative [Ruby DSL](docs/reference/GLIMMER_GUI_DSL_SYNTAX.md#glimmer-dsl-syntax) that enables productive and efficient authoring of desktop application user-interfaces by relying on the robust [Eclipse SWT library](https://www.eclipse.org/swt/). [Glimmer](https://rubygems.org/gems/glimmer) additionally innovates by having built-in [data-binding](docs/reference/GLIMMER_GUI_DSL_SYNTAX.md#data-binding) support, which greatly facilitates synchronizing the GUI with domain models, thus achieving true decoupling of object oriented components and enabling developers to solve business problems (test-first) without worrying about GUI concerns, or alternatively drive development GUI-first, and then write clean business models (test-first) afterwards. Not only does Glimmer provide a large set of GUI [widgets](docs/reference/GLIMMER_GUI_DSL_SYNTAX.md#widgets), but it also supports drawing Canvas Graphics like [Shapes](docs/reference/GLIMMER_GUI_DSL_SYNTAX.md#canvas-shape-dsl) and [Animations](docs/reference/GLIMMER_GUI_DSL_SYNTAX.md#canvas-animation-dsl). To get started quickly, [Glimmer](https://rubygems.org/gems/glimmer) offers [scaffolding](docs/reference/GLIMMER_COMMAND.md#scaffolding) options for [Apps](#in-production), [Gems](docs/reference/GLIMMER_COMMAND.md#custom-shell-gem), and [Custom Widgets](docs/reference/GLIMMER_GUI_DSL_SYNTAX.md#custom-widgets). [Glimmer](https://rubygems.org/gems/glimmer) also includes native-executable [packaging](docs/reference/GLIMMER_PACKAGING_AND_DISTRIBUTION.md) support, sorely lacking in other libraries, thus enabling the delivery of desktop apps written in [Ruby](https://www.ruby-lang.org/en/) as truly native DMG/PKG/APP files on the [Mac](https://www.apple.com/ca/macos) + [App Store](https://developer.apple.com/macos/distribution/), MSI/EXE files on [Windows](https://www.microsoft.com/en-ca/windows), and [Gem Packaged Shell Scripts](docs/reference/GLIMMER_COMMAND.md#packaging) on [Linux](https://www.linux.org/).
18
12
 
19
13
  [<img src="https://covers.oreillystatic.com/images/9780596519650/lrg.jpg" width=105 /><br />
20
14
  Featured in JRuby Cookbook](http://shop.oreilly.com/product/9780596519650.do) and [Chalmers/Gothenburg University Software Engineering Master's Lecture Material](http://www.cse.chalmers.se/~bergert/slides/guest_lecture_DSLs.pdf)
21
15
 
16
+ [Glimmer DSL for SWT](https://rubygems.org/gems/glimmer-dsl-swt) 4.18.6.0 includes [SWT 4.18](https://download.eclipse.org/eclipse/downloads/drops4/R-4.18-202012021800/), which was released on December 2, 2020. Gem version numbers are in sync with the SWT library versions. The first two digits represent the SWT version number. The last two digits represent the minor and patch versions of Glimmer DSL for SWT.
17
+
18
+ [Glimmer DSL for SWT receives two updates per month](https://rubygems.org/gems/glimmer-dsl-swt/versions). You can trust [Glimmer DSL for SWT](https://rubygems.org/gems/glimmer-dsl-swt) with your Ruby desktop GUI development needs! [Glimmer DSL for SWT](https://rubygems.org/gems/glimmer-dsl-swt) brings great ideas to the table, such as declarative programming via domain specific languages, currently under-utilized in the GUI domain. That said, it may not be feature complete enough for everybody's needs, so please help make [Glimmer DSL for SWT](https://rubygems.org/gems/glimmer-dsl-swt) even better by providing feedback and [contributing](#contributing) when possible. The project is very active, so any feature suggestions that are accepted could be implemented within weeks if not days. Also, you are welcome to [hire me](#hire-me) full-time if you want long-term development of [Glimmer DSL for SWT](https://rubygems.org/gems/glimmer-dsl-swt) for your project needs.
19
+
22
20
  Glimmer DSL gems:
23
21
  - [glimmer-dsl-swt](https://github.com/AndyObtiva/glimmer-dsl-swt): Glimmer DSL for SWT (JRuby Desktop Development GUI Framework)
24
22
  - [glimmer-dsl-opal](https://github.com/AndyObtiva/glimmer-dsl-opal): Glimmer DSL for Opal (Pure Ruby Web GUI and Auto-Webifier of Desktop Apps)
@@ -342,7 +340,7 @@ jgem install glimmer-dsl-swt
342
340
 
343
341
  Or this command if you want a specific version:
344
342
  ```
345
- jgem install glimmer-dsl-swt -v 4.18.5.1
343
+ jgem install glimmer-dsl-swt -v 4.18.6.0
346
344
  ```
347
345
 
348
346
  `jgem` is JRuby's version of `gem` command.
@@ -360,7 +358,7 @@ Note: if you're using activerecord or activesupport, keep in mind that Glimmer u
360
358
 
361
359
  Add the following to `Gemfile`:
362
360
  ```
363
- gem 'glimmer-dsl-swt', '~> 4.18.5.1'
361
+ gem 'glimmer-dsl-swt', '~> 4.18.6.0'
364
362
  ```
365
363
 
366
364
  And, then run:
@@ -404,11 +402,16 @@ Glimmer configuration may be done via the `Glimmer::Config` module.
404
402
 
405
403
  ## Samples
406
404
 
407
- See a listing of Glimmer DSL for SWT samples over here, including screenshots and explanations of what each sample demonstrates:
405
+ See a listing of samples over here, including screenshots and explanations of what each sample demonstrates:
408
406
 
409
407
  [docs/reference/GLIMMER_SAMPLES.md](docs/reference/GLIMMER_SAMPLES.md)
410
408
 
411
- Check the [samples](samples) directory in [glimmer-dsl-swt](https://github.com/AndyObtiva/glimmer-dsl-swt) for examples on how to write Glimmer applications. To run a sample, make sure to install the `glimmer-dsl-swt` gem first and then use the `glimmer samples` command to run it (alternatively, you may clone the repo, follow [CONTRIBUTING.md](CONTRIBUTING.md) instructions, and run samples locally with development glimmer command: `bin/glimmer`).
409
+ Check the [samples](samples) directory in [glimmer-dsl-swt](https://github.com/AndyObtiva/glimmer-dsl-swt) for examples on how to write Glimmer applications. To run a sample, make sure to install the `glimmer-dsl-swt` gem first and then run:
410
+ ```
411
+ glimmer samples
412
+ ```
413
+
414
+ (alternatively, you may clone the repo, follow [CONTRIBUTING.md](CONTRIBUTING.md) instructions, and run samples locally with development glimmer command: `bin/glimmer`)
412
415
 
413
416
  ![Glimmer Meta-Sample](/images/glimmer-meta-sample.png)
414
417
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 4.18.5.1
1
+ 4.18.6.0
@@ -36,10 +36,12 @@ This guide should help you get started with Glimmer DSL for SWT. For more advanc
36
36
  - [Layouts](#layouts)
37
37
  - [Layout Data](#layout-data)
38
38
  - [Canvas Shape DSL](#canvas-shape-dsl)
39
+ - [Shapes inside a Shape](#shapes-inside-a-shape)
39
40
  - [Shapes inside a Widget](#shapes-inside-a-widget)
40
41
  - [Shapes inside an Image](#shapes-inside-an-image)
41
42
  - [Canvas Shape API](#canvas-shape-api)
42
43
  - [Pixel Graphics](#pixel-graphics)
44
+ - [Canvas Path DSL](#canvas-path-dsl)
43
45
  - [Canvas Transform DSL](#canvas-transform-dsl)
44
46
  - [Top-Level Transform Fluent Interface](#top-level-transform-fluent-interface)
45
47
  - [Canvas Animation DSL](#canvas-animation-dsl)
@@ -1385,11 +1387,9 @@ https://help.eclipse.org/2019-12/nftopic/org.eclipse.platform.doc.isv/reference/
1385
1387
 
1386
1388
  **(ALPHA FEATURE)**
1387
1389
 
1388
- Glimmer supports drawing graphics directly on a `canvas` widget via SWT (or any widget for that matter though `canvas` is recommended for drawing).
1390
+ While other GUI toolkits only offer a way to draw graphics imperatively (e.g. fill_rectangle, draw_point, etc...), Glimmer DSL for SWT breaks away from the mold by enabling software engineers to draw graphics declaratively. Simply declare all the shapes you want to see with their attributes, like background/foreground colors, and Glimmer DSL for SWT takes care of the rest, painting graphics on a blank `canvas` widget or amending/decorating an existing widget. This is accomplished through the Canvas Shape DSL, a sub-DSL of the Glimmer GUI DSL, which makes it possible to draw graphics declaratively with very understandable and maintainable syntax. Still, for the rare cases where imperative logic is needed, Glimmer DSL for SWT supports imperative painting of graphics through direct usage of SWT.
1389
1391
 
1390
- `canvas` has the `:double_buffered` SWT style by default to ensure flicker-free rendering. If you need to disable it for whatever reason, just pass the `:none` SWT style instead (e.g. `canvas(:none)`)
1391
-
1392
- This is accomplished via the Shape DSL a sub-DSL of the Glimmer GUI DSL, which makes it possible to draw graphics declaratively with very understandable and maintainable syntax.
1392
+ `canvas` has the `:double_buffered` SWT style by default on platforms that need it (Windows & Linux) to ensure flicker-free rendering. If you need to disable it for whatever reason, just pass the `:none` SWT style instead (e.g. `canvas(:none)`)
1393
1393
 
1394
1394
  Shape keywords and their args (including defaults) are listed below (they basically match method names and arguments on [org.eclipse.swt.graphics.GC](https://help.eclipse.org/2020-12/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/swt/graphics/GC.html) minus the `draw` or `fill` prefix in downcase):
1395
1395
  - `arc(x, y, width, height, startAngle, arcAngle, fill: false)` arc is part of a circle within an oval area, denoted by start angle (degrees) and end angle (degrees)
@@ -1404,9 +1404,10 @@ Shape keywords and their args (including defaults) are listed below (they basica
1404
1404
  - `rectangle(x, y, width, height, fill: false)` standard rectangle, which can be optionally filled
1405
1405
  - `rectangle(x, y, width, height, arcWidth = 60, arcHeight = 60, fill: false, round: true)` round rectangle, which can be optionally filled, and takes optional extra round angle arguments
1406
1406
  - `rectangle(x, y, width, height, vertical = true, fill: true, gradient: true)` gradient rectangle, which is always filled, and takes an optional extra argument to specify true for vertical gradient (default) and false for horizontal gradient
1407
- - `text(string, x, y, flags = nil)` text with optional flags (flag format is `swt(comma_separated_flags)` where flags can be :draw_delimiter (i.e. new lines), :draw_tab, :draw_mnemonic, and :draw_transparent as explained in [GC API](https://help.eclipse.org/2020-12/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/swt/graphics/GC.html))
1407
+ - `text(string, x, y, is_transparent = true)` text with optional is_transparent to indicate if background is transparent (default is true)
1408
+ - `text(string, x, y, flags)` text with optional flags (flag format is `swt(comma_separated_flags)` where flags can be `:draw_delimiter` (i.e. new lines), `:draw_tab`, `:draw_mnemonic`, and `:draw_transparent` as explained in [GC API](https://help.eclipse.org/2020-12/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/swt/graphics/GC.html))
1408
1409
 
1409
- Shape keywords that can be filled with color can take an keyword argument `fill: true`. Defaults to false when not specified unless background is set with no foreground (or foreground is set with no background), in which case a smart default is applied.
1410
+ Shape keywords that can be filled with color can take a keyword argument `fill: true`. Defaults to false when not specified unless background is set with no foreground (or foreground is set with no background), in which case a smart default is applied.
1410
1411
  Smart defaults can be applied to automatically infer `gradient: true` (rectangle with both foreground and background) and `round: true` (rectangle with more than 4 args, the extra args are numeric) as well.
1411
1412
 
1412
1413
  Optionally, a shape keyword takes a block that can set any attributes from [org.eclipse.swt.graphics.GC](https://help.eclipse.org/2020-12/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/swt/graphics/GC.html) (methods starting with `set`), which enable setting the `background` for filling and `foreground` for drawing.
@@ -1461,7 +1462,7 @@ shell {
1461
1462
  font height: 25, style: :bold
1462
1463
  }
1463
1464
  rectangle(200, 80, 108, 36) {
1464
- foreground :black
1465
+ foreground rgb(0, 0, 0)
1465
1466
  line_width 3
1466
1467
  }
1467
1468
  image(image_object, 70, 50)
@@ -1473,6 +1474,114 @@ Screenshot:
1473
1474
 
1474
1475
  ![Canvas Animation Example](/images/glimmer-example-canvas.png)
1475
1476
 
1477
+ If you specify the x and y coordinates as `:default`, `nil`, or leave them out, they get calculated automatically by centering the shape within its parent `canvas`.
1478
+
1479
+ Note that you could shift a shape off its centered position within its parent `canvas` by using `x_delta` and `y_delta` instead of `x` and `y`
1480
+
1481
+ The round and gradient options could be dropped since Glimmer DSL for SWT supports auto-inference of them based on shape parameters.
1482
+
1483
+ Example (you may copy/paste in [`girb`](GLIMMER_GIRB.md)):
1484
+
1485
+ ```ruby
1486
+ include Glimmer
1487
+
1488
+ # image object has to be declared outside the canvas and shell to avoid confusing with canvas image property
1489
+ image_object = image(File.expand_path('./icons/scaffold_app.png'), width: 100)
1490
+
1491
+ shell {
1492
+ text 'Canvas Example'
1493
+ minimum_size 320, 400
1494
+
1495
+ canvas {
1496
+ background :dark_yellow
1497
+ rectangle(0, 0, 220, 400) {
1498
+ background :dark_red
1499
+ }
1500
+ rectangle(50, 20, 300, 150, 30, 50) {
1501
+ background :yellow
1502
+ }
1503
+ rectangle(150, 200, 100, 70, true) {
1504
+ background :dark_red
1505
+ foreground :yellow
1506
+ }
1507
+ text('Glimmer', 208, 83) {
1508
+ font height: 25, style: :bold
1509
+ }
1510
+ rectangle(200, 80, 108, 36) {
1511
+ foreground rgb(0, 0, 0)
1512
+ line_width 3
1513
+ }
1514
+ image(image_object, 70, 50)
1515
+ }
1516
+ }.open
1517
+ ```
1518
+
1519
+ Notice how the shape declaration parameters perfectly match the method parameters in the [SWT org.eclipse.swt.graphics.GC API](https://help.eclipse.org/2020-12/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/swt/graphics/GC.html). This is useful for developers coming to Glimmer DSL for SWT from SWT.
1520
+
1521
+ Of course, Glimmer DSL for SWT still supports an alternative syntax that is more declarative and consistent with the rest of the Glimmer GUI DSL syntax. This syntax in fact offers the extra-benefit of data-binding for shape parameter values (meaning you could use `bind(...)` syntax with them instead of setting values directly)
1522
+
1523
+ Example (you may copy/paste in [`girb`](GLIMMER_GIRB.md)):
1524
+
1525
+ ```ruby
1526
+ include Glimmer
1527
+
1528
+ # image object has to be declared outside the canvas and shell to avoid confusing with canvas image property
1529
+ image_object = image(File.expand_path('./icons/scaffold_app.png'), width: 100)
1530
+
1531
+ shell {
1532
+ text 'Canvas Example'
1533
+ minimum_size 320, 400
1534
+
1535
+ canvas {
1536
+ background :dark_yellow
1537
+ rectangle {
1538
+ x 0
1539
+ y 0
1540
+ width 220
1541
+ height 400
1542
+ background :dark_red
1543
+ }
1544
+ rectangle {
1545
+ x 50
1546
+ y 20
1547
+ width 300
1548
+ height 150
1549
+ arc_width 30
1550
+ arc_height 50
1551
+ background :yellow
1552
+ }
1553
+ rectangle {
1554
+ x 150
1555
+ y 200
1556
+ width 100
1557
+ height 70
1558
+ vertical true
1559
+ background :dark_red
1560
+ foreground :yellow
1561
+ }
1562
+ text {
1563
+ string 'Glimmer'
1564
+ x 208
1565
+ y 83
1566
+ font height: 25, style: :bold
1567
+ }
1568
+ rectangle {
1569
+ x 200
1570
+ y 80
1571
+ width 108
1572
+ height 36
1573
+ foreground :black
1574
+ line_width 3
1575
+ }
1576
+ image {
1577
+ image image_object
1578
+ x 70
1579
+ y 50
1580
+ }
1581
+ }
1582
+ }.open
1583
+ ```
1584
+
1476
1585
  Learn more at the [Hello, Canvas! Sample](GLIMMER_SAMPLES.md#hello-canvas).
1477
1586
 
1478
1587
  If you ever have special needs or optimizations, you could always default to direct SWT painting via [org.eclipse.swt.graphics.GC](https://help.eclipse.org/2020-12/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/swt/graphics/GC.html) instead. Learn more at the [SWT Graphics Guide](https://www.eclipse.org/articles/Article-SWT-graphics/SWT_graphics.html) and [SWT Image Guide](https://www.eclipse.org/articles/Article-SWT-images/graphics-resources.html#Saving%20Images).
@@ -1489,23 +1598,26 @@ shell {
1489
1598
  minimum_size 320, 400
1490
1599
 
1491
1600
  canvas {
1492
- background :yellow
1601
+ background :dark_yellow
1493
1602
 
1494
1603
  on_paint_control { |paint_event|
1495
1604
  gc = paint_event.gc
1496
- gc.background = color(:red).swt_color
1497
- gc.fill_rectangle(0, 0, 220, 400)
1498
1605
 
1499
- gc.background = color(:magenta).swt_color
1500
- gc.fill_roundRectangle(50, 20, 300, 150, 30, 50)
1606
+ gc.background = color(:dark_red).swt_color
1607
+ gc.fill_rectangle(0, 0, 220, 400)
1501
1608
 
1502
- gc.background = color(:dark_magenta).swt_color
1503
- gc.fill_gradientRectangle(150, 200, 100, 70, true)
1609
+ gc.background = color(:yellow).swt_color
1610
+ gc.fill_round_rectangle(50, 20, 300, 150, 30, 50)
1504
1611
 
1505
- gc.foreground = color(:dark_blue).swt_color
1506
- gc.draw_rectangle(200, 80, 108, 36)
1612
+ gc.background = color(:dark_red).swt_color
1613
+ gc.foreground = color(:yellow).swt_color
1614
+ gc.fill_gradient_rectangle(150, 200, 100, 70, true)
1507
1615
 
1616
+ gc.font = font(height: 25, style: :bold).swt_font
1508
1617
  gc.foreground = color(:black).swt_color
1618
+ gc.draw_text('Glimmer', 208, 83, true)
1619
+
1620
+ gc.foreground = rgb(0, 0, 0).swt_color
1509
1621
  gc.line_width = 3
1510
1622
  gc.draw_rectangle(200, 80, 108, 36)
1511
1623
 
@@ -1515,6 +1627,36 @@ shell {
1515
1627
  }.open
1516
1628
  ```
1517
1629
 
1630
+ #### Shapes inside a Shape
1631
+
1632
+ Shapes can be nested within each other. If you nest a shape within another, its coordinates are assumed to be relative to its parent.
1633
+
1634
+ As such, if you move the parent, it moves all its children with it.
1635
+
1636
+ If you specify the x and y coordinates as `:default`, `nil`, or leave them out, they get calculated automatically by centering the shape within its parent shape relatively.
1637
+
1638
+ Note that you could shift a shape off its centered position within its parent shape by using `x_delta` and `y_delta` instead of `x` and `y`
1639
+
1640
+ Check [Hello, Canvas!](GLIMMER_SAMPLES.md#hello-canvas) for an example that nests lines, points, a polyline, and an image within a drawn rectangle parent:
1641
+
1642
+ ```ruby
1643
+ rectangle(205, 50, 88, 96) {
1644
+ foreground :yellow
1645
+ 3.times { |n|
1646
+ line(45, 70 + n*10, 65 + n*10, 30 + n*10) {
1647
+ foreground :yellow
1648
+ }
1649
+ }
1650
+ 10.times {|n|
1651
+ point(15 + n*5, 50 + n*5) {
1652
+ foreground :yellow
1653
+ }
1654
+ }
1655
+ polyline(45, 60, 55, 20, 65, 60, 85, 80, 45, 60)
1656
+ image(@image_object, 0, 5)
1657
+ }
1658
+ ```
1659
+
1518
1660
  #### Shapes inside a Widget
1519
1661
 
1520
1662
  Keep in mind that the Shape DSL can be used inside any widget, not just `canvas`. Unlike shapes on a `canvas`, which are standalone graphics, when included in a widget, which already has its own look and feel, shapes are used as a decorative add-on that complements its look by getting painted on top of it. For example, shapes were used to decorate `composite` blocks in the [Tetris](GLIMMER_SAMPLES.md#tetris) sample to have a more bevel look. In summary, Shapes can be used in a hybrid approach (shapes inside a widget), not just standalone in a `canvas`.
@@ -1619,9 +1761,14 @@ shell {
1619
1761
 
1620
1762
  These Canvas Shape API methods help with manipulating shapes upon user interaction, such as mouse clicking a specific shape.
1621
1763
 
1764
+ They are implemented with the help of the highly robust Java built-in shape geometry algorithms.
1765
+
1622
1766
  - `WidgetProxy#shape_at_location(x, y)` : returns shape object at x, y location from a widget proxy like canvas
1623
- - `Shape#include?(x, y)` : indicates if shape includes x, y point (`arc` and `oval` shapes currently include their entire rectangular region in their checks, `text` shapes always return false)
1767
+ - `Shape#contain?(x, y)` : indicates if shape contains x, y point
1768
+ - `Shape#include?(x, y)` : indicates if shape includes x, y point on the edge if drawn or inside if filled (include uses contain for filled shapes)
1624
1769
  - `Shape#move_by(x_delta, y_delta)` : moves shape object at x, y location
1770
+ - `Shape#size` : calculated size for shape bounding box (e.g. a polygon with an irregular shape will have its bounding box width and height calculated)
1771
+ - `Shape#bounds` : calculated bounds (x, y, width, height) for shape bounding box (e.g. a polygon with an irregular shape will have its bounding box top-left x, y, width and height calculated)
1625
1772
 
1626
1773
  Check [Hello, Canvas!](GLIMMER_SAMPLES.md#hello-canvas) for an example.
1627
1774
 
@@ -1807,6 +1954,40 @@ shell {
1807
1954
 
1808
1955
  As they say, there are many ways to skin a cat! This is in line with the Ruby way of providing more ways than one. Pick and choose the right tool for the job just like true software engineers.
1809
1956
 
1957
+ ### Canvas Path DSL
1958
+
1959
+ **(EARLY ALPHA FEATURE)**
1960
+
1961
+ Unlike common imperative GUI charting toolkits, Glimmer enables declarative rendering of paths with the new Canvas Path DSL (Early Alpha) via the new `path` keyword and by nesting one of the following keywords underneath:
1962
+ - `point(x1, y1)`: renders a Point (Dot) as part of a path.
1963
+ - `line(x1, y1, x2=nil, y2=nil)`: renders a Line as part of a path. If you drop x2, y2, it joins to the previous point automatically. You may repeat for a series of lines forming a curve.
1964
+ - `quad(x1, y1, x2, y2, x3=nil, y3=nil)`: renders a Quadratic Bezier Curve. If you drop x3 and y3, it joins to the previous point automatically.
1965
+ - `cubic(x1, y1, x2, y2, x3, y3, x4=nil, y4=nil)`: renders a Cubic Bezier Curve. If you drop x4 and y4, it joins to the previous point automatically.
1966
+
1967
+ Example:
1968
+
1969
+ ```ruby
1970
+ shell {
1971
+ text 'Canvas Path DSL Example'
1972
+ minimum_size 300, 300
1973
+
1974
+ canvas {
1975
+ path {
1976
+ foreground :black
1977
+ point(0, 0)
1978
+ 250.times {|n|
1979
+ cubic(n + n%30, n+ n%50, 40, 40, 70, 70, n + 20 + n%30, n%30*-1 * n%50)
1980
+ }
1981
+ }
1982
+ }
1983
+
1984
+ }.open
1985
+ ```
1986
+
1987
+ Learn more at the [Hello, Canvas Path! Sample](/samples/hello/hello_canvas_path.rb).
1988
+
1989
+ ![Hello Canvas Path Sample](/images/glimmer-hello-canvas-path.gif)
1990
+
1810
1991
  ### Canvas Transform DSL
1811
1992
 
1812
1993
  **(ALPHA FEATURE)**
@@ -1963,7 +2144,7 @@ If there is anything missing you would like added to the Glimmer Animation DSL t
1963
2144
 
1964
2145
  Animation could be alternatively implemented without the `animation` keyword through a loop that invokes model methods inside `sync_exec {}` (or `async_exec {}`), which indirectly cause updates to the GUI via data-binding.
1965
2146
 
1966
- The [Glimmer Tetris](#tetris) sample provides a good example of that.
2147
+ The [Glimmer Tetris](GLIMMER_SAMPLES.md#tetris) sample provides a good example of that.
1967
2148
 
1968
2149
  ### Data-Binding
1969
2150
 
@@ -2324,7 +2505,7 @@ shell {
2324
2505
  }
2325
2506
  ```
2326
2507
 
2327
- Check out [Hello, Table!](#hello-table) for an actual example including table editors.
2508
+ Check out [Hello, Table!](GLIMMER_SAMPLES.md#hello-table) for an actual example including table editors.
2328
2509
 
2329
2510
  [Are We There Yet?](#are-we-there-yet) is an actual production Glimmer application that takes full advantage of table capabilities, storing model data in a database via ActiveRecord. As such, it's an excellent demonstration of how to use Glimmer DSL for SWT with a database.
2330
2511
 
@@ -2332,7 +2513,7 @@ Check out [Hello, Table!](#hello-table) for an actual example including table ed
2332
2513
 
2333
2514
  Glimmer automatically adds sorting support to the SWT `Table` widget.
2334
2515
 
2335
- Check out the [Contact Manager](#contact-manager) sample for an example.
2516
+ Check out the [Contact Manager](GLIMMER_SAMPLES.md#contact-manager) sample for an example.
2336
2517
  You may click on any column and it will sort by ascending order first and descending if you click again.
2337
2518
 
2338
2519
  Glimmer automatic table sorting supports `String`, `Integer`, and `Float` columns out of the box as well as any column data that is comparable.
@@ -2454,7 +2635,7 @@ You can data-bind any of these properties:
2454
2635
  - `minutes bind(model, :property)`: produces an integer
2455
2636
  - `seconds bind(model, :property)`: produces an integer
2456
2637
 
2457
- Learn more at the [Hello, Date Time!](#hello-date-time) sample.
2638
+ Learn more at the [Hello, Date Time!](GLIMMER_SAMPLES.md#hello-date-time) sample.
2458
2639
 
2459
2640
  If you need a better widget with the ability to customize the date format pattern, check out the [Nebula CDateTime Glimmer Custom Widget](https://github.com/AndyObtiva/glimmer-cw-cdatetime-nebula)
2460
2641
 
@@ -2840,7 +3021,7 @@ The `checkboxes` property returns the list of nested `checkbox` widgets.
2840
3021
 
2841
3022
  When data-binding `selection`, the model property should have a matching property with `_options` suffix (e.g. `activities_options` for `activities`) to provide an `Array` of `String` objects for `checkbox` buttons.
2842
3023
 
2843
- You may see an example at the [Hello, Checkbox Group!](#hello-checkbox-group) sample.
3024
+ You may see an example at the [Hello, Checkbox Group!](GLIMMER_SAMPLES.md#hello-checkbox-group) sample.
2844
3025
 
2845
3026
  ![Hello Checkbox Group](/images/glimmer-hello-checkbox-group.png)
2846
3027
 
@@ -2875,7 +3056,7 @@ radio_group { |radio_group_proxy|
2875
3056
  # ...
2876
3057
  ```
2877
3058
 
2878
- You may see another example at the [Hello, Radio Group!](#hello-radio-group) sample.
3059
+ You may see another example at the [Hello, Radio Group!](GLIMMER_SAMPLES.md#hello-radio-group) sample.
2879
3060
 
2880
3061
  ##### Code Text Custom Widget
2881
3062
 
@@ -3147,7 +3328,7 @@ This adds some default keyboard shortcuts:
3147
3328
 
3148
3329
  If you prefer it to be vanilla with no default key event listeners, then pass the `default_behavior: false` option.
3149
3330
 
3150
- Learn more at [Hello, Code Text!](#hello-code-text)
3331
+ Learn more at [Hello, Code Text!](GLIMMER_SAMPLES.md#hello-code-text)
3151
3332
 
3152
3333
  ##### Video Custom Custom Widget
3153
3334