glimmer-dsl-opal 0.10.2 → 0.10.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +5 -5
- data/VERSION +1 -1
- data/lib/glimmer-dsl-opal.rb +1 -1
- data/lib/glimmer/dsl/opal/custom_widget_expression.rb +1 -1
- data/lib/glimmer/dsl/opal/dsl.rb +2 -0
- data/lib/glimmer/dsl/opal/shape_expression.rb +26 -0
- data/lib/glimmer/swt/composite_proxy.rb +2 -0
- data/lib/glimmer/swt/display_proxy.rb +62 -1
- data/lib/glimmer/swt/grid_layout_proxy.rb +17 -17
- data/lib/glimmer/swt/row_layout_proxy.rb +12 -3
- data/lib/glimmer/ui/custom_shell.rb +15 -1
- metadata +7 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: be56447c904415b875ba3b0005c9b976eb942f0104aa5b8ab38ecb9ae5c2ea3c
|
4
|
+
data.tar.gz: 7dbfaa89ea361d08fed055ff163b723a3b0b8ae8ffd298d878175f5e2b78954f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8b1917799d722e876c3fa77e8d0b93bd0fe0eafa05c1fc0a7faebc4241e91bad634b2968adc9e4ffdad0541c8a11aa2d31fd56d5c819644a877d72f6deab2201
|
7
|
+
data.tar.gz: 571cc3bd410695e8c542334968a07503ee1a492e408cceccfb0f82a6681f6cdb9674924bbf7e7f794f394439fc55fbc7eae6012c04d8fc8bee2943e391b23541
|
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 Opal 0.10.
|
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 Opal 0.10.3 (Pure Ruby Web GUI)
|
2
2
|
[![Gem Version](https://badge.fury.io/rb/glimmer-dsl-opal.svg)](http://badge.fury.io/rb/glimmer-dsl-opal)
|
3
3
|
[![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)
|
4
4
|
|
@@ -141,7 +141,7 @@ Hello, Table! Game Booked
|
|
141
141
|
|
142
142
|
NOTE: Glimmer DSL for Opal is an alpha project. Please help make better by contributing, adopting for small or low risk projects, and providing feedback. It is still an early alpha, so the more feedback and issues you report the better.
|
143
143
|
|
144
|
-
**Alpha Version** 0.10.
|
144
|
+
**Alpha Version** 0.10.3 only supports bare-minimum capabilities for the included [samples](https://github.com/AndyObtiva/glimmer-dsl-opal#samples) (originally written for [glimmer-dsl-swt](https://github.com/AndyObtiva/glimmer-dsl-swt))
|
145
145
|
|
146
146
|
Other [Glimmer](https://github.com/AndyObtiva/glimmer) DSL gems:
|
147
147
|
- [glimmer-dsl-swt](https://github.com/AndyObtiva/glimmer-dsl-swt): Glimmer DSL for SWT (JRuby Desktop Development GUI Framework)
|
@@ -151,7 +151,7 @@ Other [Glimmer](https://github.com/AndyObtiva/glimmer) DSL gems:
|
|
151
151
|
|
152
152
|
## Table of Contents
|
153
153
|
|
154
|
-
- [Glimmer DSL for Opal 0.10.
|
154
|
+
- [Glimmer DSL for Opal 0.10.3 (Pure Ruby Web GUI)](#-glimmer-dsl-for-opal-0101-pure-ruby-web-gui)
|
155
155
|
- [Principles](#principles)
|
156
156
|
- [Background](#background)
|
157
157
|
- [Pre-requisites](#pre-requisites)
|
@@ -249,7 +249,7 @@ Add the following to `Gemfile`:
|
|
249
249
|
gem 'opal-rails', '~> 1.1.2'
|
250
250
|
gem 'opal-async', '~> 1.2.0'
|
251
251
|
gem 'opal-jquery', '~> 0.4.4'
|
252
|
-
gem 'glimmer-dsl-opal', '~> 0.10.
|
252
|
+
gem 'glimmer-dsl-opal', '~> 0.10.3'
|
253
253
|
gem 'glimmer-dsl-xml', '~> 1.1.0', require: false
|
254
254
|
gem 'glimmer-dsl-css', '~> 1.1.0', require: false
|
255
255
|
|
@@ -310,7 +310,7 @@ shell {
|
|
310
310
|
|
311
311
|
## Supported Glimmer DSL Keywords
|
312
312
|
|
313
|
-
The following keywords from [glimmer-dsl-swt](https://github.com/AndyObtiva/glimmer-dsl-swt) have partial support in Opal:
|
313
|
+
The following keywords from [glimmer-dsl-swt](https://github.com/AndyObtiva/glimmer-dsl-swt) have fully functional partial support in Opal:
|
314
314
|
|
315
315
|
Widgets:
|
316
316
|
- `button`: featured in [Hello, Checkbox!](#hello-checkbox) / [Hello, Button!](#hello-button) / [Hello, Table!](#hello-table) / [Hello, Radio Group!](#hello-radio-group) / [Hello, Radio!](#hello-radio) / [Hello, Message Box!](#hello-message-box) / [Hello, List Single Selection!](#hello-list-single-selection) / [Hello, List Multi Selection!](#hello-list-multi-selection) / [Hello, Group!](#hello-group) / [Hello, Combo!](#hello-combo) / [Hello, Checkbox Group!](#hello-checkbox-group) / [Contact Manager](#contact-manager) / [Tic Tac Toe](#tic-tac-toe) / [Login](#login)
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.10.
|
1
|
+
0.10.3
|
data/lib/glimmer-dsl-opal.rb
CHANGED
@@ -84,7 +84,7 @@ if RUBY_ENGINE == 'opal'
|
|
84
84
|
Element.alias_native :select
|
85
85
|
Element.alias_native :dialog
|
86
86
|
|
87
|
-
Glimmer::Config.loop_max_count =
|
87
|
+
Glimmer::Config.loop_max_count = 300 # TODO disable
|
88
88
|
|
89
89
|
original_logger_level = Glimmer::Config.logger.level
|
90
90
|
Glimmer::Config.logger = Glimmer::Config::OpalLogger.new(STDOUT)
|
@@ -51,7 +51,7 @@ module Glimmer
|
|
51
51
|
custom_widget_class = UI::CustomWidget.for(keyword)
|
52
52
|
# TODO clean code by extracting methods into CustomShell
|
53
53
|
if !Glimmer::UI::CustomShell.requested? && custom_widget_class&.ancestors&.to_a.include?(Glimmer::UI::CustomShell)
|
54
|
-
if Glimmer::SWT::DisplayProxy.instance.shells.empty?
|
54
|
+
if Glimmer::SWT::DisplayProxy.instance.shells.empty? || Glimmer::SWT::DisplayProxy.open_custom_shells_in_current_window?
|
55
55
|
custom_widget_class.new(parent, *args, {}, &block)
|
56
56
|
else
|
57
57
|
options = args.last.is_a?(Hash) ? args.pop : {}
|
data/lib/glimmer/dsl/opal/dsl.rb
CHANGED
@@ -28,6 +28,7 @@ require 'glimmer/dsl/opal/checkbox_group_selection_data_binding_expression'
|
|
28
28
|
require 'glimmer/dsl/opal/block_property_expression'
|
29
29
|
require 'glimmer/dsl/opal/menu_expression'
|
30
30
|
require 'glimmer/dsl/opal/dialog_expression'
|
31
|
+
require 'glimmer/dsl/opal/shape_expression'
|
31
32
|
|
32
33
|
module Glimmer
|
33
34
|
module DSL
|
@@ -47,6 +48,7 @@ module Glimmer
|
|
47
48
|
layout
|
48
49
|
block_property
|
49
50
|
property
|
51
|
+
shape
|
50
52
|
widget
|
51
53
|
]
|
52
54
|
)
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'glimmer/dsl/expression'
|
2
|
+
require 'glimmer/dsl/parent_expression'
|
3
|
+
|
4
|
+
module Glimmer
|
5
|
+
module DSL
|
6
|
+
module Opal
|
7
|
+
class ShapeExpression < Expression
|
8
|
+
include ParentExpression
|
9
|
+
|
10
|
+
INCLUDED_KEYWORDS = %w[rectangle polygon]
|
11
|
+
|
12
|
+
def can_interpret?(parent, keyword, *args, &block)
|
13
|
+
INCLUDED_KEYWORDS.include?(keyword)
|
14
|
+
end
|
15
|
+
|
16
|
+
def interpret(parent, keyword, *args, &block)
|
17
|
+
# TODO
|
18
|
+
end
|
19
|
+
|
20
|
+
def add_content(parent, &block)
|
21
|
+
# TODO
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -7,6 +7,9 @@ module Glimmer
|
|
7
7
|
def instance
|
8
8
|
@instance ||= new
|
9
9
|
end
|
10
|
+
|
11
|
+
attr_accessor :open_custom_shells_in_current_window
|
12
|
+
alias open_custom_shells_in_current_window? open_custom_shells_in_current_window
|
10
13
|
end
|
11
14
|
|
12
15
|
def initialize
|
@@ -62,6 +65,10 @@ module Glimmer
|
|
62
65
|
# No rendering as body is rendered as part of ShellProxy.. this class only serves as an SWT Display utility
|
63
66
|
end
|
64
67
|
|
68
|
+
def beep
|
69
|
+
# TODO (simulate beep from SWT display flashing the screen and making a noise if possible)
|
70
|
+
end
|
71
|
+
|
65
72
|
def async_exec(proc_tracker = nil, &block)
|
66
73
|
block = proc_tracker unless proc_tracker.nil?
|
67
74
|
queue = nil # general queue
|
@@ -87,7 +94,34 @@ module Glimmer
|
|
87
94
|
event.singleton_class.define_method(:character) do
|
88
95
|
which || key_code
|
89
96
|
end
|
97
|
+
event.define_singleton_method(:keyCode) {event.which}
|
98
|
+
event.define_singleton_method(:key_code, &event.method(:keyCode))
|
99
|
+
event.define_singleton_method(:character) {event.which.chr}
|
100
|
+
event.define_singleton_method(:stateMask) do
|
101
|
+
state_mask = 0
|
102
|
+
state_mask |= SWTProxy[:alt] if event.alt_key
|
103
|
+
state_mask |= SWTProxy[:ctrl] if event.ctrl_key
|
104
|
+
state_mask |= SWTProxy[:shift] if event.shift_key
|
105
|
+
state_mask |= SWTProxy[:command] if event.meta_key
|
106
|
+
state_mask
|
107
|
+
end
|
108
|
+
event.define_singleton_method(:state_mask, &event.method(:stateMask))
|
109
|
+
doit = true
|
110
|
+
event.define_singleton_method(:doit=) do |value|
|
111
|
+
doit = value
|
112
|
+
end
|
113
|
+
event.define_singleton_method(:doit) { doit }
|
90
114
|
event_listener.call(event)
|
115
|
+
|
116
|
+
# TODO Fix doit false, it's not stopping input
|
117
|
+
unless doit
|
118
|
+
event.prevent
|
119
|
+
event.prevent_default
|
120
|
+
event.stop_propagation
|
121
|
+
event.stop_immediate_propagation
|
122
|
+
end
|
123
|
+
|
124
|
+
doit
|
91
125
|
}
|
92
126
|
}
|
93
127
|
},
|
@@ -98,7 +132,34 @@ module Glimmer
|
|
98
132
|
event.singleton_class.define_method(:character) do
|
99
133
|
which || key_code
|
100
134
|
end
|
135
|
+
event.define_singleton_method(:keyCode) {event.which}
|
136
|
+
event.define_singleton_method(:key_code, &event.method(:keyCode))
|
137
|
+
event.define_singleton_method(:character) {event.which.chr}
|
138
|
+
event.define_singleton_method(:stateMask) do
|
139
|
+
state_mask = 0
|
140
|
+
state_mask |= SWTProxy[:alt] if event.alt_key
|
141
|
+
state_mask |= SWTProxy[:ctrl] if event.ctrl_key
|
142
|
+
state_mask |= SWTProxy[:shift] if event.shift_key
|
143
|
+
state_mask |= SWTProxy[:command] if event.meta_key
|
144
|
+
state_mask
|
145
|
+
end
|
146
|
+
event.define_singleton_method(:state_mask, &event.method(:stateMask))
|
147
|
+
doit = true
|
148
|
+
event.define_singleton_method(:doit=) do |value|
|
149
|
+
doit = value
|
150
|
+
end
|
151
|
+
event.define_singleton_method(:doit) { doit }
|
101
152
|
event_listener.call(event) if event.key_code != 13 && (event.key_code == 127 || event.key_code <= 31)
|
153
|
+
|
154
|
+
# TODO Fix doit false, it's not stopping input
|
155
|
+
unless doit
|
156
|
+
event.prevent
|
157
|
+
event.prevent_default
|
158
|
+
event.stop_propagation
|
159
|
+
event.stop_immediate_propagation
|
160
|
+
end
|
161
|
+
|
162
|
+
doit
|
102
163
|
}
|
103
164
|
}
|
104
165
|
}
|
@@ -130,7 +191,7 @@ module Glimmer
|
|
130
191
|
# TODO see if there are more intricate cases of opening a dialog from a widget listener handler
|
131
192
|
if !message_box_open? && (!dialog_open? || queue&.dialog_ancestor == opened_dialogs.last) && ((!queue.nil? && async_exec_queues.keys.last == queue) || no_widget_handling_listener_work?)
|
132
193
|
block = async_exec_queue(queue).pop
|
133
|
-
block
|
194
|
+
block&.call
|
134
195
|
Async::Task.new(delay: 1, &executer) if async_exec_queue(queue).any?
|
135
196
|
else
|
136
197
|
Async::Task.new(delay: 100, &executer)
|
@@ -19,6 +19,23 @@ module Glimmer
|
|
19
19
|
# TODO do the following instead of reapply
|
20
20
|
# @parent.add_css_class("num-columns-#{@num_columns}")
|
21
21
|
# reinitialize # TODO reimplement without using reinitialize
|
22
|
+
layout_css = <<~CSS
|
23
|
+
grid-template-columns: #{'auto ' * @num_columns.to_i};
|
24
|
+
grid-row-gap: #{@vertical_spacing}px;
|
25
|
+
grid-column-gap: #{@horizontal_spacing}px;
|
26
|
+
CSS
|
27
|
+
if @parent.css_classes.include?('grid-layout')
|
28
|
+
layout_css.split(";").map(&:strip).map {|l| l.split(':').map(&:strip)}.each do |key, value|
|
29
|
+
@parent.dom_element.css(key, value) unless key.nil?
|
30
|
+
end
|
31
|
+
if @parent.is_a?(GroupProxy)
|
32
|
+
@parent.dom_element.find('legend').css('grid-column-start', "span #{@num_columns.to_i}")
|
33
|
+
end
|
34
|
+
else
|
35
|
+
layout_css.split(";").map(&:strip).map {|l| l.split(':').map(&:strip)}.each do |key, value|
|
36
|
+
@parent.dom_element.css(key, 'initial') unless key.nil?
|
37
|
+
end
|
38
|
+
end
|
22
39
|
end
|
23
40
|
|
24
41
|
def make_columns_equal_width=(equal_width)
|
@@ -63,23 +80,6 @@ module Glimmer
|
|
63
80
|
self.margin_width = 15
|
64
81
|
self.margin_height = 15
|
65
82
|
self.num_columns = @args.first || 1
|
66
|
-
layout_css = <<~CSS
|
67
|
-
grid-template-columns: #{'auto ' * @num_columns.to_i};
|
68
|
-
grid-row-gap: #{@vertical_spacing}px;
|
69
|
-
grid-column-gap: #{@horizontal_spacing}px;
|
70
|
-
CSS
|
71
|
-
if @parent.css_classes.include?('grid-layout')
|
72
|
-
layout_css.split(";").map(&:strip).map {|l| l.split(':').map(&:strip)}.each do |key, value|
|
73
|
-
@parent.dom_element.css(key, value) unless key.nil?
|
74
|
-
end
|
75
|
-
if @parent.is_a?(GroupProxy)
|
76
|
-
@parent.dom_element.find('legend').css('grid-column-start', "span #{@num_columns.to_i}")
|
77
|
-
end
|
78
|
-
else
|
79
|
-
layout_css.split(";").map(&:strip).map {|l| l.split(':').map(&:strip)}.each do |key, value|
|
80
|
-
@parent.dom_element.css(key, 'initial') unless key.nil?
|
81
|
-
end
|
82
|
-
end
|
83
83
|
end
|
84
84
|
end
|
85
85
|
end
|
@@ -42,13 +42,17 @@ module Glimmer
|
|
42
42
|
}
|
43
43
|
CSS
|
44
44
|
|
45
|
-
attr_reader :type, :margin_width, :margin_height, :margin_top, :margin_right, :margin_bottom, :margin_left, :spacing, :pack, :center
|
45
|
+
attr_reader :type, :fill, :margin_width, :margin_height, :margin_top, :margin_right, :margin_bottom, :margin_left, :spacing, :pack, :center
|
46
46
|
|
47
47
|
def initialize(parent, args)
|
48
48
|
super(parent, args)
|
49
|
-
@type = args.first || :horizontal
|
50
|
-
self.pack = true
|
51
49
|
@parent.dom_element.add_class('row-layout')
|
50
|
+
self.type = args.first || :horizontal
|
51
|
+
self.pack = true
|
52
|
+
end
|
53
|
+
|
54
|
+
def type=(value)
|
55
|
+
@type = value
|
52
56
|
@parent.dom_element.add_class(horizontal? ? 'row-layout-horizontal' : 'row-layout-vertical')
|
53
57
|
end
|
54
58
|
|
@@ -75,6 +79,11 @@ module Glimmer
|
|
75
79
|
end
|
76
80
|
end
|
77
81
|
|
82
|
+
def fill=(value)
|
83
|
+
# TODO verify this is a correct implementation and interpretation of RowLayout in SWT
|
84
|
+
self.pack(!value)
|
85
|
+
end
|
86
|
+
|
78
87
|
def center=(center_value)
|
79
88
|
@center = center_value
|
80
89
|
# Using padding for width since margin-right isn't getting respected with width 100%
|
@@ -28,15 +28,29 @@ module Glimmer
|
|
28
28
|
module CustomShell
|
29
29
|
include Glimmer::UI::CustomWidget
|
30
30
|
|
31
|
+
module ClassMethods
|
32
|
+
attr_reader :custom_shell
|
33
|
+
|
34
|
+
def launch
|
35
|
+
@custom_shell = send(self.name.underscore.gsub('::', '__'))
|
36
|
+
@custom_shell.open
|
37
|
+
end
|
38
|
+
|
39
|
+
def shutdown
|
40
|
+
@custom_shell.close
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
31
44
|
class << self
|
32
45
|
def included(klass)
|
33
46
|
klass.extend(CustomWidget::ClassMethods)
|
47
|
+
klass.extend(CustomShell::ClassMethods)
|
34
48
|
klass.include(Glimmer)
|
35
49
|
Glimmer::UI::CustomWidget.add_custom_widget_namespaces_for(klass)
|
36
50
|
keyword = klass.name.split(':').last.underscore
|
37
51
|
LocalStorage[keyword] = $LOADED_FEATURES.last
|
38
52
|
end
|
39
|
-
|
53
|
+
|
40
54
|
def request_parameter_string
|
41
55
|
URI.decode_www_form_component(`document.location.href`.match(/\?(.*)$/).to_a[1].to_s)
|
42
56
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: glimmer-dsl-opal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.10.
|
4
|
+
version: 0.10.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- AndyMaleh
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-01-
|
11
|
+
date: 2021-01-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: glimmer
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 1.0.
|
19
|
+
version: 1.0.10
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 1.0.
|
26
|
+
version: 1.0.10
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: glimmer-dsl-xml
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -58,14 +58,14 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 1.2
|
61
|
+
version: '1.2'
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 1.2
|
68
|
+
version: '1.2'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: to_collection
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -347,6 +347,7 @@ files:
|
|
347
347
|
- lib/glimmer/dsl/opal/radio_group_selection_data_binding_expression.rb
|
348
348
|
- lib/glimmer/dsl/opal/rgb_expression.rb
|
349
349
|
- lib/glimmer/dsl/opal/rgba_expression.rb
|
350
|
+
- lib/glimmer/dsl/opal/shape_expression.rb
|
350
351
|
- lib/glimmer/dsl/opal/shell_expression.rb
|
351
352
|
- lib/glimmer/dsl/opal/swt_expression.rb
|
352
353
|
- lib/glimmer/dsl/opal/sync_exec_expression.rb
|