glimmer 0.5.9 → 0.5.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d1c351e3623c60e0ae9e52ce1f33b1579b5a3bb1cfc161c1eb2b6883bfe905b6
4
- data.tar.gz: 4bb0c04faf2a1a9c68ac58f2acb386112f3706c7fae34c2e1c7dba9c99783f60
3
+ metadata.gz: 07ac7dc0e7c7beab5855763da9b232037f6561b93c0b8240db5a96fc74a3e026
4
+ data.tar.gz: 934ff722e09b38eec4c4ede3c369f910ead8d070bbb151f42ec59feac7d66328
5
5
  SHA512:
6
- metadata.gz: 42f75cb443468b0b4f9487b333882c1517803b66ce326c63b28780c9c98e809b27ce6cd2ce9928c61dc9f399c9ac2bd859a4c1910040869963e912893f87ddca
7
- data.tar.gz: 5b4bed4b26bc8aed20c996bf21b24bcc26860ea06433a053faf0ad011921fb63f84f963750a5a03e64b089602a27a28b6fcee72a08f09a21a4a5d26ed29b9575
6
+ metadata.gz: abd9390fb32d7e5aaa099d8002527371825d7109e69adeb1fc91e2440dd8b92010691839983bcbed177ce27d5b7c469f9294a62a77261b971eba301986e0e3ae
7
+ data.tar.gz: c75edc6edce8909868465a75d26ba9cd054192ac256d34f2bc8f271e129326e504e91c3ca1f84b7a0be1c0079f609ab05995e21091002a4aa2d29d8f91a38d28
data/README.markdown CHANGED
@@ -1,4 +1,4 @@
1
- # Glimmer 0.5.9 Beta (JRuby Desktop UI DSL + Data-Binding)
1
+ # Glimmer 0.5.10 Beta (JRuby Desktop UI DSL + Data-Binding)
2
2
  [![Coverage Status](https://coveralls.io/repos/github/AndyObtiva/glimmer/badge.svg?branch=master)](https://coveralls.io/github/AndyObtiva/glimmer?branch=master)
3
3
 
4
4
  Glimmer is a native-UI cross-platform desktop development library written in Ruby. Glimmer's main innovation is a JRuby DSL that enables productive and efficient authoring of desktop application user-interfaces while relying on the robust platform-native Eclipse SWT library. Glimmer additionally innovates by having built-in data-binding support to greatly facilitate synchronizing the UI with domain models. As a result, that achieves true decoupling of object oriented components, enabling developers to solve business problems without worrying about UI concerns, or alternatively drive development UI-first, and then write clean business components test-first afterwards.
@@ -70,7 +70,7 @@ NOTE: Glimmer is in beta mode. Please help make better by adopting for small or
70
70
  ## Table of Contents
71
71
 
72
72
  <!-- TOC START min:1 max:3 link:true asterisk:false update:true -->
73
- - [Glimmer 0.5.9 Beta (JRuby Desktop UI DSL + Data-Binding)](#glimmer-058-beta-jruby-desktop-ui-dsl--data-binding)
73
+ - [Glimmer 0.5.10 Beta (JRuby Desktop UI DSL + Data-Binding)](#glimmer-058-beta-jruby-desktop-ui-dsl--data-binding)
74
74
  - [Examples](#examples)
75
75
  - [Hello World](#hello-world)
76
76
  - [Tic Tac Toe](#tic-tac-toe)
@@ -163,14 +163,14 @@ Please follow these instructions to make the `glimmer` command available on your
163
163
 
164
164
  Run this command to install directly:
165
165
  ```
166
- jgem install glimmer -v 0.5.9
166
+ jgem install glimmer -v 0.5.10
167
167
  ```
168
168
 
169
169
  ### Option 2: Bundler
170
170
 
171
171
  Add the following to `Gemfile`:
172
172
  ```
173
- gem 'glimmer', '~> 0.5.9'
173
+ gem 'glimmer', '~> 0.5.10'
174
174
  ```
175
175
 
176
176
  And, then run:
@@ -598,17 +598,37 @@ You may check out all available `SWT` styles here:
598
598
 
599
599
  https://help.eclipse.org/2019-12/nftopic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/swt/SWT.html
600
600
 
601
- #### Advanced case outside of standard Glimmer DSL
601
+ #### Explicit SWT Style Bit
602
602
 
603
603
  When building a widget-related SWT object manually (e.g. `GridData.new(...)`), you are expected to use `SWT::CONSTANT` directly or BIT-OR a few SWT constants together like `SWT::BORDER | SWT::V_SCROLL`.
604
604
 
605
- Glimmer facilitates that with `SWTProxy` class by allowing you to pass multiple styles as an argument array of symbols instead of dealing with BIT-OR. For example: `SWTProxy[:border, :v_scroll]`
605
+ Glimmer facilitates that with `swt` keyword by allowing you to pass multiple styles as an argument array of symbols instead of dealing with BIT-OR.
606
+ Example:
606
607
 
607
- #### Non-resizable Window
608
+ ```ruby
609
+ style = swt(:border, :v_scroll)
610
+ ```
611
+
612
+ #### Negative SWT Style Bits
608
613
 
609
- SWT Shell widget by default is resizable. To make it non-resizable, one must pass a complicated style bit concoction like `SWTProxy[:shell_trim] & (~SWTProxy[:resize]) & (~SWTProxy[:max])`.
614
+ In rare occasions, you might need to apply & with a negative (not) style bit to negate it from another style bit that includes it.
615
+ Glimmer facilitates that by declaring the negative style bit via postfixing a symbol with `!`.
616
+
617
+ Example:
618
+
619
+ ```ruby
620
+ style = swt(:shell_trim, :max!) # creates a shell trim style without the maximize button (negated)
621
+ ```
622
+
623
+ #### Extra SWT Styles
624
+
625
+ ##### Non-resizable Window
626
+
627
+ SWT Shell widget by default is resizable. To make it non-resizable, one must pass a complicated style bit concoction like `swt(:shell_trim, :resize!, :max!)`.
628
+
629
+ Glimmer makes this easier by alternatively offering a `:no_resize` extra SWT style, added for convenience.
630
+ This makes declaring a non-resizable window as easy as:
610
631
 
611
- Glimmer makes this easier by alternatively offering `:no_resize` extra SWT style, added for convenience. This makes declaring an non-resizable window as easy as:
612
632
  ```ruby
613
633
  shell(:no_resize) {
614
634
  # ...
@@ -889,7 +909,7 @@ composite {
889
909
  grid_layout 3, false # grid layout with 3 columns not of equal width
890
910
  label {
891
911
  # layout data set explicitly via an object (helps in rare cases that break convention)
892
- layout_data GridData.new(SWTProxy[:fill], SWTProxy[:end], true, false)
912
+ layout_data GridData.new(swt(:fill), swt(:end), true, false)
893
913
  }
894
914
  }
895
915
  # ...
@@ -1312,6 +1332,8 @@ shell {
1312
1332
 
1313
1333
  Notice how `Red::Composite` became `red__composite` with double-underscore, which is how Glimmer Custom Widgets signify namespaces by convention. Additionally, `before_body` hook was utilized to set a `@color` variable and use inside the `body`.
1314
1334
 
1335
+ Keep in mind that namespaces are not needed to be specified if the Custom Widget class has a unique name, not clashing with a basic SWT widget or another custom widget name.
1336
+
1315
1337
  Custom Widgets have the following attributes (attribute readers) available to call from inside the `#body` method:
1316
1338
  - `#parent`: Glimmer object parenting custom widget
1317
1339
  - `#swt_style`: SWT style integer. Can be useful if you want to allow consumers to customize a widget inside the custom widget body
@@ -1711,15 +1733,31 @@ glimmer samples/gladiator.rb # demonstrates a text editor with tree/list data-bi
1711
1733
 
1712
1734
  ![Gladiator](images/glimmer-gladiator.png)
1713
1735
 
1714
- Gladiator (short for Glimmer Editor) is an on-going sample project with continuous development.
1715
- It is also used as the main text editor for coding Glimmer.
1716
- As such, it has been made available in [Glimmer's gem](https://rubygems.org/gems/glimmer) via the `gladiator` command should others find useful too.
1736
+ Gladiator (short for Glimmer Editor) is an on-going sample project under continuous development. It is used as the main text editor for developing Glimmer.
1737
+
1738
+ It currently supports the following text editing features:
1739
+ - File explorer navigation to open file
1740
+ - File lookup by name
1741
+ - Find & Replace
1742
+ - Show Line Numbers
1743
+ - Jump to Line
1744
+ - Remember last opened file, caret position, and top line
1745
+ - Autosave on focus out/quit/open new file
1746
+ - Watch open file for external changes to reflect in editor
1747
+ - Duplicate Line(s)
1748
+ - Kill Line(s)
1749
+ - Move up one line
1750
+ - Move down one line
1751
+
1752
+ Gladiator has been made available in [Glimmer's gem](https://rubygems.org/gems/glimmer) via the `gladiator` command should others find useful too.
1753
+
1717
1754
  If you cloned this project and followed [CONTRIBUTING.md](CONTRIBUTING.md) instructions, you may invoke via `bin/gladiator` instead.
1718
1755
 
1719
1756
  ## In Production
1720
1757
 
1721
1758
  The following production apps have been built with Glimmer:
1722
- - [Math Bowling](https://github.com/AndyObtiva/MathBowling): an educational math game for elementary level kids
1759
+
1760
+ [<img alt="Math Bowling Logo" src="https://raw.githubusercontent.com/AndyObtiva/MathBowling/master/images/math-bowling-logo.png" width="40" />Math Bowling](https://github.com/AndyObtiva/MathBowling): an educational math game for elementary level kids
1723
1761
 
1724
1762
  ## SWT Reference
1725
1763
 
data/lib/glimmer.rb CHANGED
@@ -9,6 +9,7 @@ require 'java'
9
9
  require 'set'
10
10
  require 'nested_inherited_jruby_include_package'
11
11
  require 'fileutils'
12
+ require 'os'
12
13
 
13
14
  # Glimmer provides a JRuby Desktop UI DSL + Data-Binding functionality
14
15
  #
@@ -69,8 +69,8 @@ module Glimmer
69
69
  if the_glimmer_lib == GLIMMER_LIB_LOCAL
70
70
  devmode_require = '-r puts_debuggerer '
71
71
  end
72
- puts "#{env_vars_string} jruby #{jruby_options_string}#{jruby_os_specific_options} -r #{the_glimmer_lib} #{devmode_require}-S \"#{application}\"" if jruby_options_string.to_s.include?('--debug')
73
- system "#{env_vars_string} jruby #{jruby_options_string}#{jruby_os_specific_options} -r #{the_glimmer_lib} #{devmode_require}-S \"#{application}\""
72
+ puts "#{env_vars_string} jruby #{jruby_options_string}#{jruby_os_specific_options} #{devmode_require}-r #{the_glimmer_lib} -S #{application}" if jruby_options_string.to_s.include?('--debug')
73
+ system "#{env_vars_string} jruby #{jruby_options_string}#{jruby_os_specific_options} #{devmode_require}-r #{the_glimmer_lib} -S #{application}"
74
74
  end
75
75
  end
76
76
 
@@ -130,9 +130,11 @@ module Glimmer
130
130
  if observation_request.start_with?('on_')
131
131
  event_name = observation_request.sub(/^on_/, '')
132
132
  if OBSERVED_MENU_ITEMS.include?(event_name)
133
- system_menu = DisplayProxy.instance.swt_display.getSystemMenu
134
- menu_item = system_menu.getItems.find {|menu_item| menu_item.getID == SWTProxy["ID_#{event_name.upcase}"]}
135
- menu_item.addListener(SWTProxy[:Selection], &block)
133
+ if OS.mac?
134
+ system_menu = DisplayProxy.instance.swt_display.getSystemMenu
135
+ menu_item = system_menu.getItems.find {|menu_item| menu_item.getID == SWTProxy["ID_#{event_name.upcase}"]}
136
+ menu_item.addListener(SWTProxy[:Selection], &block)
137
+ end
136
138
  else
137
139
  super
138
140
  end
@@ -10,19 +10,24 @@ module Glimmer
10
10
  java_import 'org.eclipse.swt.SWT'
11
11
 
12
12
  ERROR_INVALID_STYLE = " is an invalid SWT style! Please choose a style from org.eclipse.swt.SWT class constants."
13
+ REGEX_SYMBOL_NEGATIVITY = /^([^!]+)(!)?$/
13
14
 
14
15
  # Gets SWT constants as if calling SWT::CONSTANT where constant is
15
16
  # passed in as a lower case symbol
16
17
  def [](*symbols)
17
18
  symbols = symbols.first if symbols.size == 1 && symbols.first.is_a?(Array)
18
- symbols.compact.reduce(0) do |output, symbol|
19
- constant_value = constant(symbol)
20
- if constant_value.is_a?(Integer)
21
- output | constant(symbol)
19
+ result = symbols.compact.map do |symbol|
20
+ constant(symbol).tap do |constant_value|
21
+ raise Error, symbol.to_s + ERROR_INVALID_STYLE unless constant_value.is_a?(Integer)
22
+ end
23
+ end.reduce do |output, constant_value|
24
+ if constant_value < 0
25
+ output & constant_value
22
26
  else
23
- raise Error, symbol.to_s + ERROR_INVALID_STYLE
27
+ output | constant_value
24
28
  end
25
29
  end
30
+ result.nil? ? SWT::NONE : result
26
31
  end
27
32
 
28
33
  # Returns SWT style integer value for passed in symbol or allows
@@ -32,18 +37,43 @@ module Glimmer
32
37
  # (look into [] operator if you want an error raised on invalid values)
33
38
  def constant(symbol)
34
39
  return symbol unless symbol.is_a?(Symbol) || symbol.is_a?(String)
35
- symbol_string = symbol.to_s
40
+ symbol_string, negative = extract_symbol_string_negativity(symbol)
36
41
  swt_constant_symbol = symbol_string.downcase == symbol_string ? symbol_string.upcase.to_sym : symbol_string.to_sym
37
- SWT.const_get(swt_constant_symbol)
38
- rescue
42
+ bit_value = SWT.const_get(swt_constant_symbol)
43
+ negative ? ~bit_value : bit_value
44
+ rescue => e
39
45
  begin
46
+ # Glimmer.logger&.debug(e.full_message)
40
47
  alternative_swt_constant_symbol = SWT.constants.find {|c| c.to_s.upcase == swt_constant_symbol.to_s.upcase}
41
- SWT.const_get(alternative_swt_constant_symbol)
42
- rescue
43
- EXTRA_STYLES[swt_constant_symbol] || symbol
48
+ bit_value = SWT.const_get(alternative_swt_constant_symbol)
49
+ negative ? ~bit_value : bit_value
50
+ rescue => e
51
+ # Glimmer.logger&.debug(e.full_message)
52
+ bit_value = Glimmer::SWT::SWTProxy::EXTRA_STYLES[swt_constant_symbol]
53
+ if bit_value
54
+ negative ? ~bit_value : bit_value
55
+ else
56
+ symbol
57
+ end
44
58
  end
45
59
  end
46
60
 
61
+ def extract_symbol_string_negativity(symbol)
62
+ if symbol.is_a?(Symbol) || symbol.is_a?(String)
63
+ symbol_negativity_match = symbol.to_s.match(REGEX_SYMBOL_NEGATIVITY)
64
+ symbol = symbol_negativity_match[1]
65
+ negative = !!symbol_negativity_match[2]
66
+ [symbol, negative]
67
+ else
68
+ negative = symbol < 0
69
+ [symbol, negative]
70
+ end
71
+ end
72
+
73
+ def negative?(symbol)
74
+ extract_symbol_string_negativity(symbol)[1]
75
+ end
76
+
47
77
  def has_constant?(symbol)
48
78
  return false unless symbol.is_a?(Symbol) || symbol.is_a?(String)
49
79
  constant(symbol).is_a?(Integer)
@@ -69,7 +99,7 @@ module Glimmer
69
99
  end
70
100
 
71
101
  EXTRA_STYLES = {
72
- NO_RESIZE: SWTProxy[:shell_trim] & (~SWTProxy[:resize]) & (~SWTProxy[:max])
102
+ NO_RESIZE: self[:shell_trim, :resize!, :max!]
73
103
  }
74
104
  end
75
105
  end
@@ -1,7 +1,7 @@
1
1
  require 'glimmer/ui/custom_widget'
2
2
  require 'glimmer/swt/color_proxy'
3
3
 
4
- #TODO display progress wheel while loading video
4
+ #TODO consider the need to display a progress wheel while loading video as an option
5
5
 
6
6
  module Glimmer
7
7
  module UI
@@ -26,7 +26,7 @@ module Glimmer
26
26
  alias fit_to_height? fit_to_height
27
27
 
28
28
  body {
29
- browser {
29
+ browser(:no_scroll) {
30
30
  text <<~HTML
31
31
  <html>
32
32
  <head>
@@ -34,6 +34,7 @@ module Glimmer
34
34
  body {
35
35
  margin: 0;
36
36
  padding: 0;
37
+ overflow: hidden;
37
38
  }
38
39
  </style>
39
40
  <style id="style-body-background">
data/samples/gladiator.rb CHANGED
@@ -3,6 +3,7 @@ require 'filewatcher'
3
3
  require 'clipboard'
4
4
 
5
5
  Clipboard.implementation = Clipboard::Java
6
+ Clipboard.copy(Clipboard.paste) # pre-initialize library to avoid slowdown during use
6
7
 
7
8
  # Gladiator (Glimmer Editor)
8
9
  class Gladiator
@@ -370,11 +371,11 @@ class Gladiator
370
371
  end
371
372
 
372
373
  def line_for_caret_position(caret_position)
373
- lines[line_index_for_caret_position(caret_position)]
374
+ lines[line_index_for_caret_position(caret_position.to_i)]
374
375
  end
375
376
 
376
377
  def line_index_for_caret_position(caret_position)
377
- dirty_content[0...caret_position].count("\n")
378
+ dirty_content[0...caret_position.to_i].count("\n")
378
379
  end
379
380
 
380
381
  def caret_position_for_line_index(line_index)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: glimmer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.9
4
+ version: 0.5.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - AndyMaleh
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-04-23 00:00:00.000000000 Z
11
+ date: 2020-04-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement