glimmer 0.5.9 → 0.5.10

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: 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