glimmer-dsl-swt 4.21.1.0 → 4.21.2.2
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 +4 -4
- data/CHANGELOG.md +25 -0
- data/README.md +11 -10
- data/VERSION +1 -1
- data/bin/girb +0 -0
- data/bin/glimmer +0 -0
- data/docs/reference/GLIMMER_COMMAND.md +1 -1
- data/docs/reference/GLIMMER_GUI_DSL_SYNTAX.md +48 -27
- data/docs/reference/GLIMMER_PACKAGING_AND_DISTRIBUTION.md +72 -17
- data/glimmer-dsl-swt.gemspec +0 -0
- data/lib/glimmer/rake_task/package.rb +1 -1
- data/lib/glimmer/rake_task/scaffold.rb +4 -22
- data/lib/glimmer/rake_task.rb +1 -5
- data/lib/glimmer/swt/custom/drawable.rb +2 -0
- data/lib/glimmer/swt/image_proxy.rb +5 -3
- data/lib/glimmer/swt/style_constantizable.rb +2 -0
- data/lib/glimmer/swt/widget_proxy.rb +76 -0
- data/samples/elaborate/battleship/view/grid.rb +3 -3
- data/samples/elaborate/battleship/view/ship.rb +1 -1
- data/samples/elaborate/meta_sample.rb +11 -4
- data/samples/elaborate/tetris/view/tetris_menu_bar.rb +2 -2
- data/samples/elaborate/tetris.rb +12 -14
- data/samples/elaborate/tic_tac_toe.rb +6 -3
- data/samples/elaborate/timer.rb +0 -1
- data/samples/elaborate/weather.rb +3 -0
- data/samples/hello/hello_canvas.rb +1 -1
- data/samples/hello/hello_canvas_transform.rb +1 -1
- data/samples/hello/hello_cool_bar.rb +5 -60
- data/samples/hello/hello_drag_and_drop.rb +208 -11
- data/samples/hello/hello_tool_bar.rb +7 -53
- data/samples/hello/images/copy.png +0 -0
- data/samples/hello/images/cut.png +0 -0
- data/samples/hello/images/paste.png +0 -0
- metadata +10 -7
@@ -110,6 +110,7 @@ module Glimmer
|
|
110
110
|
|
111
111
|
def deregister_shape_painting
|
112
112
|
@paint_listener_proxy&.deregister
|
113
|
+
@resize_listener_proxy&.deregister
|
113
114
|
end
|
114
115
|
|
115
116
|
def setup_shape_painting
|
@@ -143,6 +144,7 @@ module Glimmer
|
|
143
144
|
shape_painter.call(self) # treat self as paint event since image has its own gc and doesn't do repaints (it's a one time deal for now though could be adjusted in the future.)
|
144
145
|
else
|
145
146
|
@paint_listener_proxy = on_swt_paint(&shape_painter)
|
147
|
+
@resize_listener_proxy = on_swt_Resize { shapes.each(&:calculated_args_changed!) }
|
146
148
|
end
|
147
149
|
else
|
148
150
|
redraw if respond_to?(:redraw) && @finished_add_content && !is_disposed
|
@@ -122,9 +122,11 @@ module Glimmer
|
|
122
122
|
def input_stream
|
123
123
|
if @file_path.start_with?('uri:classloader')
|
124
124
|
@jar_file_path = @file_path
|
125
|
-
file_path = @jar_file_path.sub(/^uri\:classloader\:/, '').sub(
|
126
|
-
|
127
|
-
|
125
|
+
file_path = @jar_file_path.sub(/^uri\:classloader\:/, '').sub(/^\/+/, '')
|
126
|
+
require 'jruby'
|
127
|
+
jcl = JRuby.runtime.jruby_class_loader
|
128
|
+
resource = jcl.get_resource_as_stream(file_path)
|
129
|
+
file_input_stream = resource.to_io.to_input_stream
|
128
130
|
else
|
129
131
|
file_input_stream = java.io.FileInputStream.new(@file_path)
|
130
132
|
end
|
@@ -743,6 +743,13 @@ module Glimmer
|
|
743
743
|
|
744
744
|
def handle_observation_request(observation_request, &block)
|
745
745
|
observation_request = normalize_observation_request(observation_request)
|
746
|
+
if observation_request.start_with?('on_drag_enter')
|
747
|
+
original_block = block
|
748
|
+
block = Proc.new do |event|
|
749
|
+
event.detail = DNDProxy[:drop_copy]
|
750
|
+
original_block.call(event)
|
751
|
+
end
|
752
|
+
end
|
746
753
|
if observation_request.start_with?('on_swt_')
|
747
754
|
constant_name = observation_request.sub(/^on_swt_/, '')
|
748
755
|
add_swt_event_listener(constant_name, &block)
|
@@ -886,6 +893,75 @@ module Glimmer
|
|
886
893
|
def widget_custom_attribute_mapping
|
887
894
|
# TODO scope per widget class type just like other mappings
|
888
895
|
@swt_widget_custom_attribute_mapping ||= {
|
896
|
+
'drag_source' => {
|
897
|
+
getter: {name: 'getShell', invoker: lambda { |widget, args|
|
898
|
+
@drag_source
|
899
|
+
}},
|
900
|
+
setter: {name: 'getShell', invoker: lambda { |widget, args|
|
901
|
+
@drag_source = args.first
|
902
|
+
if @drag_source
|
903
|
+
case @swt_widget
|
904
|
+
when List
|
905
|
+
on_drag_set_data do |event|
|
906
|
+
drag_widget = event.widget.control
|
907
|
+
event.data = drag_widget.selection.first
|
908
|
+
end
|
909
|
+
when Label
|
910
|
+
on_drag_set_data do |event|
|
911
|
+
drag_widget = event.widget.control
|
912
|
+
event.data = drag_widget.text
|
913
|
+
end
|
914
|
+
when Text
|
915
|
+
on_drag_set_data do |event|
|
916
|
+
drag_widget = event.widget.control
|
917
|
+
event.data = drag_widget.selection_text
|
918
|
+
end
|
919
|
+
when Spinner
|
920
|
+
on_drag_set_data do |event|
|
921
|
+
drag_widget = event.widget.control
|
922
|
+
event.data = drag_widget.selection.to_s
|
923
|
+
end
|
924
|
+
end
|
925
|
+
end
|
926
|
+
}},
|
927
|
+
},
|
928
|
+
'drop_target' => {
|
929
|
+
getter: {name: 'getShell', invoker: lambda { |widget, args|
|
930
|
+
@drop_target
|
931
|
+
}},
|
932
|
+
setter: {name: 'getShell', invoker: lambda { |widget, args|
|
933
|
+
@drop_target = args.first
|
934
|
+
if @drop_target
|
935
|
+
case @swt_widget
|
936
|
+
when List
|
937
|
+
on_drop do |event|
|
938
|
+
drop_widget = event.widget.control
|
939
|
+
drop_widget.add(event.data) unless @drop_target == :unique && drop_widget.items.include?(event.data)
|
940
|
+
drop_widget.select(drop_widget.items.count - 1)
|
941
|
+
end
|
942
|
+
when Label
|
943
|
+
on_drop do |event|
|
944
|
+
drop_widget = event.widget.control
|
945
|
+
drop_widget.text = event.data
|
946
|
+
end
|
947
|
+
when Text
|
948
|
+
on_drop do |event|
|
949
|
+
drop_widget = event.widget.control
|
950
|
+
if @drop_target == :replace
|
951
|
+
drop_widget.text = event.data
|
952
|
+
else
|
953
|
+
drop_widget.insert(event.data)
|
954
|
+
end
|
955
|
+
end
|
956
|
+
when Spinner
|
957
|
+
on_drop do |event|
|
958
|
+
drop_widget = event.widget.control
|
959
|
+
drop_widget.selection = event.data.to_f
|
960
|
+
end
|
961
|
+
end
|
962
|
+
end
|
963
|
+
}},
|
964
|
+
},
|
889
965
|
'window' => {
|
890
966
|
getter: {name: 'getShell'},
|
891
967
|
setter: {name: 'getShell', invoker: lambda { |widget, args| @swt_widget.getShell }}, # No Op
|
@@ -45,21 +45,21 @@ class Battleship
|
|
45
45
|
}
|
46
46
|
|
47
47
|
text player.to_s.capitalize
|
48
|
-
font height: 20, style: :bold
|
48
|
+
font height: OS.windows? ? 18 : 20, style: :bold
|
49
49
|
}
|
50
50
|
|
51
51
|
label # filler
|
52
52
|
Model::Grid::WIDTH.times do |column_index|
|
53
53
|
label {
|
54
54
|
text (column_index + 1).to_s
|
55
|
-
font height: 16
|
55
|
+
font height: OS.windows? ? 14 : 16
|
56
56
|
}
|
57
57
|
end
|
58
58
|
|
59
59
|
Model::Grid::HEIGHT.times do |row_index|
|
60
60
|
label {
|
61
61
|
text Model::Grid::ROW_ALPHABETS[row_index]
|
62
|
-
font height: 16
|
62
|
+
font height: OS.windows? ? 14 : 16
|
63
63
|
}
|
64
64
|
Model::Grid::WIDTH.times do |column_index|
|
65
65
|
cell(game: game, player: player, row_index: row_index, column_index: column_index) {
|
@@ -23,8 +23,6 @@ require 'glimmer-dsl-swt'
|
|
23
23
|
require 'fileutils'
|
24
24
|
|
25
25
|
class Sample
|
26
|
-
include Glimmer::DataBinding::ObservableModel
|
27
|
-
|
28
26
|
class << self
|
29
27
|
def glimmer_directory
|
30
28
|
File.expand_path('../../..', __FILE__)
|
@@ -42,6 +40,10 @@ class Sample
|
|
42
40
|
end
|
43
41
|
end
|
44
42
|
end
|
43
|
+
|
44
|
+
include Glimmer::DataBinding::ObservableModel
|
45
|
+
|
46
|
+
UNEDITABLE = ['meta_sample.rb'] + (OS.windows? ? ['calculator.rb', 'weather.rb'] : []) # Windows StyledText does not support unicode characters found in certain samples
|
45
47
|
|
46
48
|
attr_accessor :sample_directory, :file, :selected
|
47
49
|
|
@@ -74,9 +76,13 @@ class Sample
|
|
74
76
|
end
|
75
77
|
|
76
78
|
def editable
|
79
|
+
!UNEDITABLE.include?(File.basename(file))
|
80
|
+
end
|
81
|
+
alias editable? editable
|
82
|
+
|
83
|
+
def launchable
|
77
84
|
File.basename(file) != 'meta_sample.rb'
|
78
85
|
end
|
79
|
-
alias launchable editable
|
80
86
|
|
81
87
|
def file_relative_path
|
82
88
|
file.sub(self.class.glimmer_directory, '')
|
@@ -97,6 +103,7 @@ class Sample
|
|
97
103
|
def launch(modified_code)
|
98
104
|
launch_file = user_file
|
99
105
|
begin
|
106
|
+
raise 'Unsupported through editor!' unless editable?
|
100
107
|
FileUtils.cp_r(file, user_file_parent_directory)
|
101
108
|
FileUtils.cp_r(directory, user_file_parent_directory) if File.exist?(directory)
|
102
109
|
File.write(user_file, modified_code)
|
@@ -207,7 +214,7 @@ class MetaSampleApplication
|
|
207
214
|
image File.expand_path('../../icons/scaffold_app.png', __dir__)
|
208
215
|
|
209
216
|
sash_form {
|
210
|
-
weights
|
217
|
+
weights 1, 2
|
211
218
|
|
212
219
|
composite {
|
213
220
|
grid_layout(1, false) {
|
@@ -45,8 +45,8 @@ class Tetris
|
|
45
45
|
menu_item(:check) {
|
46
46
|
text '&Pause'
|
47
47
|
accelerator COMMAND_KEY, :p
|
48
|
-
enabled <= [game, :game_over, on_read: ->(value) { value && !game.show_high_scores }]
|
49
|
-
enabled <= [game, :show_high_scores, on_read: ->(value) { value && !game.game_over }]
|
48
|
+
enabled <= [game, :game_over, on_read: ->(value) { !value && !game.show_high_scores }]
|
49
|
+
enabled <= [game, :show_high_scores, on_read: ->(value) { !value && !game.game_over }]
|
50
50
|
selection <=> [game, :paused]
|
51
51
|
}
|
52
52
|
menu_item {
|
data/samples/elaborate/tetris.rb
CHANGED
@@ -57,7 +57,17 @@ class Tetris
|
|
57
57
|
on_swt_keydown { |key_event|
|
58
58
|
case key_event.keyCode
|
59
59
|
when swt(:arrow_down), 's'.bytes.first
|
60
|
-
|
60
|
+
if OS.mac?
|
61
|
+
game.down!
|
62
|
+
else
|
63
|
+
# rate limit downs in Windows/Linux as they go too fast when key is held
|
64
|
+
@queued_downs ||= 0
|
65
|
+
@queued_downs += 1
|
66
|
+
async_exec do
|
67
|
+
game.down! if @queued_downs < 3
|
68
|
+
@queued_downs -= 1
|
69
|
+
end
|
70
|
+
end
|
61
71
|
when swt(:arrow_up)
|
62
72
|
case game.up_arrow_action
|
63
73
|
when :instant_down
|
@@ -80,16 +90,6 @@ class Tetris
|
|
80
90
|
end
|
81
91
|
}
|
82
92
|
|
83
|
-
# invoke game.down! on keyup with Windows/Linux since they seem to group-render similar events, preventing intermediate renders (causing invisiblity while holding keys)
|
84
|
-
if !OS.mac?
|
85
|
-
on_swt_keyup { |key_event|
|
86
|
-
case key_event.keyCode
|
87
|
-
when swt(:arrow_down), 's'.bytes.first
|
88
|
-
game.down!
|
89
|
-
end
|
90
|
-
}
|
91
|
-
end
|
92
|
-
|
93
93
|
# if running in app mode, set the Mac app about dialog (ignored in platforms)
|
94
94
|
on_about {
|
95
95
|
show_about_dialog
|
@@ -170,9 +170,7 @@ class Tetris
|
|
170
170
|
sleep @game.delay
|
171
171
|
break if @game.game_over? || body_root.disposed?
|
172
172
|
# ensure entire game tetromino down movement happens as one GUI update event with sync_exec (to avoid flicker/stutter)
|
173
|
-
sync_exec {
|
174
|
-
@game.down! unless @game.paused?
|
175
|
-
}
|
173
|
+
sync_exec { @game.down! unless @game.paused? }
|
176
174
|
end
|
177
175
|
end
|
178
176
|
end
|
@@ -41,18 +41,21 @@ class TicTacToe
|
|
41
41
|
shell {
|
42
42
|
text "Tic-Tac-Toe"
|
43
43
|
minimum_size 176, 200
|
44
|
+
|
44
45
|
composite {
|
45
46
|
grid_layout 3, true
|
47
|
+
|
46
48
|
(1..3).each { |row|
|
47
49
|
(1..3).each { |column|
|
48
50
|
button {
|
49
51
|
layout_data :fill, :fill, true, true
|
50
52
|
text <= [@tic_tac_toe_board[row, column], :sign]
|
51
53
|
enabled <= [@tic_tac_toe_board[row, column], :empty]
|
52
|
-
font style: :bold, height: 20
|
53
|
-
|
54
|
+
font style: :bold, height: (OS.windows? ? 18 : 20)
|
55
|
+
|
56
|
+
on_widget_selected do
|
54
57
|
@tic_tac_toe_board.mark(row, column)
|
55
|
-
|
58
|
+
end
|
56
59
|
}
|
57
60
|
}
|
58
61
|
}
|
data/samples/elaborate/timer.rb
CHANGED
@@ -102,6 +102,7 @@ class Weather
|
|
102
102
|
layout_data(:fill, :center, true, false)
|
103
103
|
text <= [self, field_name, on_read: ->(t) { "#{kelvin_to_temp_unit(t, temp_unit).to_f.round}°" }]
|
104
104
|
font height: DEFAULT_FONT_HEIGHT
|
105
|
+
background DEFAULT_BACKGROUND
|
105
106
|
foreground DEFAULT_FOREGROUND
|
106
107
|
}
|
107
108
|
end
|
@@ -112,6 +113,7 @@ class Weather
|
|
112
113
|
layout_data(:fill, :center, true, false)
|
113
114
|
text <= [self, 'humidity', on_read: ->(h) { "#{h.to_f.round}%" }]
|
114
115
|
font height: DEFAULT_FONT_HEIGHT
|
116
|
+
background DEFAULT_BACKGROUND
|
115
117
|
foreground DEFAULT_FOREGROUND
|
116
118
|
}
|
117
119
|
end
|
@@ -121,6 +123,7 @@ class Weather
|
|
121
123
|
layout_data :fill, :center, false, false
|
122
124
|
text field_name.titlecase
|
123
125
|
font height: DEFAULT_FONT_HEIGHT
|
126
|
+
background DEFAULT_BACKGROUND
|
124
127
|
foreground DEFAULT_FOREGROUND
|
125
128
|
}
|
126
129
|
end
|
@@ -65,7 +65,7 @@ class HelloCanvas
|
|
65
65
|
y :default, 1 # add 1 pixel to default y (shape centered within parent vertically)
|
66
66
|
background :yellow
|
67
67
|
foreground :dark_magenta
|
68
|
-
font name: 'Courier', height: 30
|
68
|
+
font name: 'Courier', height: (OS.windows? ? 26 : 30)
|
69
69
|
}
|
70
70
|
}
|
71
71
|
rectangle(155, 30) { # width and height are assumed to be the default (calculated from children)
|
@@ -40,27 +40,28 @@ class HelloCoolBar
|
|
40
40
|
margin_width 0
|
41
41
|
margin_height 0
|
42
42
|
}
|
43
|
-
|
43
|
+
|
44
44
|
text 'Hello, Cool Bar!'
|
45
|
+
minimum_size 280, 50
|
45
46
|
|
46
47
|
cool_bar { # optionally takes a :flat style and/or :vertical style if you need vertical layout
|
47
48
|
tool_bar {
|
48
49
|
tool_item {
|
49
|
-
image
|
50
|
+
image File.expand_path('./images/cut.png', __dir__), height: 16
|
50
51
|
|
51
52
|
on_widget_selected do
|
52
53
|
self.operation = 'Cut'
|
53
54
|
end
|
54
55
|
}
|
55
56
|
tool_item {
|
56
|
-
image
|
57
|
+
image File.expand_path('./images/copy.png', __dir__), height: 16
|
57
58
|
|
58
59
|
on_widget_selected do
|
59
60
|
self.operation = 'Copy'
|
60
61
|
end
|
61
62
|
}
|
62
63
|
tool_item {
|
63
|
-
image
|
64
|
+
image File.expand_path('./images/paste.png', __dir__), height: 16
|
64
65
|
|
65
66
|
on_widget_selected do
|
66
67
|
self.operation = 'Paste'
|
@@ -86,62 +87,6 @@ class HelloCoolBar
|
|
86
87
|
}
|
87
88
|
}
|
88
89
|
}
|
89
|
-
|
90
|
-
def cut_image
|
91
|
-
# building image on the fly with Canvas Shape DSL
|
92
|
-
image(25, 25) {
|
93
|
-
rectangle(0, 0, 25, 25) {
|
94
|
-
background_pattern 0, 0, 0, 25, :white, :gray
|
95
|
-
line(20, 2, 9, 15) {
|
96
|
-
line_width 2
|
97
|
-
}
|
98
|
-
line(5, 2, 16, 15) {
|
99
|
-
line_width 2
|
100
|
-
}
|
101
|
-
oval(2, 15, 8, 8) {
|
102
|
-
line_width 2
|
103
|
-
}
|
104
|
-
oval(16, 15, 8, 8) {
|
105
|
-
line_width 2
|
106
|
-
}
|
107
|
-
}
|
108
|
-
}
|
109
|
-
end
|
110
|
-
|
111
|
-
def copy_image
|
112
|
-
# building image on the fly with Canvas Shape DSL
|
113
|
-
image(25, 25) {
|
114
|
-
rectangle(0, 0, 25, 25) {
|
115
|
-
background_pattern 0, 0, 0, 25, :white, :gray
|
116
|
-
rectangle([:default, 2], [:default, -2], 14, 14, 5, 5) {
|
117
|
-
line_width 2
|
118
|
-
}
|
119
|
-
rectangle([:default, -2], [:default, 2], 14, 14, 5, 5) {
|
120
|
-
line_width 2
|
121
|
-
}
|
122
|
-
}
|
123
|
-
}
|
124
|
-
end
|
125
|
-
|
126
|
-
def paste_image
|
127
|
-
image(25, 25) {
|
128
|
-
rectangle(0, 0, 25, 25) {
|
129
|
-
background_pattern 0, 0, 0, 25, :white, :gray
|
130
|
-
rectangle(:default, [:default, 1], 15, 20, 5, 5) {
|
131
|
-
line_width 2
|
132
|
-
}
|
133
|
-
line(7, 8, 18, 8) {
|
134
|
-
line_width 2
|
135
|
-
}
|
136
|
-
line(7, 13, 18, 13) {
|
137
|
-
line_width 2
|
138
|
-
}
|
139
|
-
line(7, 18, 18, 18) {
|
140
|
-
line_width 2
|
141
|
-
}
|
142
|
-
}
|
143
|
-
}
|
144
|
-
end
|
145
90
|
end
|
146
91
|
|
147
92
|
HelloCoolBar.launch
|
@@ -35,18 +35,215 @@ include Glimmer
|
|
35
35
|
|
36
36
|
shell {
|
37
37
|
text 'Hello, Drag and Drop!'
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
38
|
+
|
39
|
+
tab_folder {
|
40
|
+
tab_item {
|
41
|
+
fill_layout
|
42
|
+
text 'List'
|
43
|
+
|
44
|
+
list {
|
45
|
+
selection <=> [@location, :country]
|
46
|
+
|
47
|
+
# Option 1: Automatic Drag Data Setting
|
48
|
+
drag_source true
|
49
|
+
|
50
|
+
# Option 2: Manual Drag Data Setting
|
51
|
+
# on_drag_set_data do |event|
|
52
|
+
# drag_widget = event.widget.control
|
53
|
+
# event.data = drag_widget.selection.first
|
54
|
+
# end
|
55
|
+
|
56
|
+
# Option 3: Full Customization of Drag Source (details at: https://www.eclipse.org/articles/Article-SWT-DND/DND-in-SWT.html)
|
57
|
+
# drag_source(:drop_copy) { # options: :drop_copy, :drop_link, :drop_move, :drop_target_move
|
58
|
+
# transfer :text # options: :text, :file, :rtf
|
59
|
+
#
|
60
|
+
# on_drag_start do |event|
|
61
|
+
# drag_widget = event.widget.control.data('proxy') # obtain Glimmer widget proxy since it permits nicer syntax for setting cursor via symbol
|
62
|
+
# drag_widget.cursor = :wait
|
63
|
+
# end
|
64
|
+
#
|
65
|
+
# on_drag_set_data do |event|
|
66
|
+
# drag_widget = event.widget.control
|
67
|
+
# event.data = drag_widget.selection.first
|
68
|
+
# end
|
69
|
+
#
|
70
|
+
# on_drag_finished do |event|
|
71
|
+
# drag_widget = event.widget.control.data('proxy') # obtain Glimmer widget proxy since it permits nicer syntax for setting cursor via symbol
|
72
|
+
# drag_widget.cursor = :arrow
|
73
|
+
# end
|
74
|
+
# }
|
75
|
+
}
|
76
|
+
|
77
|
+
list {
|
78
|
+
# Option 1: Automatic Drop Data Consumption
|
79
|
+
drop_target true
|
80
|
+
# drop_target :unique # setting drop_target to :unique makes the list not add the same data twice
|
81
|
+
|
82
|
+
# Option 2: Manual Drop Data Consumption
|
83
|
+
# on_drop do |event|
|
84
|
+
# drop_widget = event.widget.control
|
85
|
+
# drop_widget.add(event.data)
|
86
|
+
# drop_widget.select(drop_widget.items.count - 1)
|
87
|
+
# end
|
88
|
+
|
89
|
+
# Option 3: Full Customization of Drop Target (details at: https://www.eclipse.org/articles/Article-SWT-DND/DND-in-SWT.html)
|
90
|
+
# drop_target(:drop_copy) { # options: :drop_copy, :drop_link, :drop_move, :drop_target_move
|
91
|
+
# transfer :text # options: :text, :file, :rtf
|
92
|
+
#
|
93
|
+
# on_drag_enter do |event|
|
94
|
+
# ### event.detail = DND::DROP_NONE # To reject a drop, you can set event.detail to DND::DROP_NONE
|
95
|
+
# drop_widget = event.widget.control.data('proxy') # obtain Glimmer widget proxy since it permits nicer syntax for setting background via symbol
|
96
|
+
# drop_widget.background = :red
|
97
|
+
# end
|
98
|
+
#
|
99
|
+
# on_drag_leave do |event|
|
100
|
+
# drop_widget = event.widget.control.data('proxy') # obtain Glimmer widget proxy since it permits nicer syntax for setting background via symbol
|
101
|
+
# drop_widget.background = :white
|
102
|
+
# end
|
103
|
+
#
|
104
|
+
# on_drop do |event|
|
105
|
+
# drop_widget = event.widget.control.data('proxy') # obtain Glimmer widget proxy since it permits nicer syntax for setting background/cursor via symbol
|
106
|
+
# drop_widget.background = :white
|
107
|
+
# drop_widget.add(event.data)
|
108
|
+
# drop_widget.select(drop_widget.items.count - 1)
|
109
|
+
# drop_widget.cursor = :arrow
|
110
|
+
# end
|
111
|
+
# }
|
112
|
+
}
|
43
113
|
}
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
114
|
+
|
115
|
+
tab_item {
|
116
|
+
grid_layout 2, true
|
117
|
+
text 'Label'
|
118
|
+
|
119
|
+
label {
|
120
|
+
layout_data {
|
121
|
+
horizontal_span 2
|
122
|
+
}
|
123
|
+
text 'Drag text from any label and drop it unto another label'
|
124
|
+
}
|
125
|
+
|
126
|
+
{
|
127
|
+
Argentina: :green,
|
128
|
+
Brazil: :red,
|
129
|
+
Finland: :yellow,
|
130
|
+
Sweden: :magenta,
|
131
|
+
Denmark: :gray,
|
132
|
+
Iceland: :cyan
|
133
|
+
}.each do |country, color|
|
134
|
+
label {
|
135
|
+
layout_data :fill, :fill, true, true
|
136
|
+
text country
|
137
|
+
font height: 20
|
138
|
+
background color
|
139
|
+
drag_source true
|
140
|
+
drop_target true
|
141
|
+
}
|
142
|
+
end
|
143
|
+
}
|
144
|
+
|
145
|
+
tab_item {
|
146
|
+
grid_layout 2, true
|
147
|
+
text 'Text'
|
148
|
+
|
149
|
+
label {
|
150
|
+
text 'Drag'
|
151
|
+
}
|
152
|
+
|
153
|
+
label {
|
154
|
+
text 'Drop To Insert'
|
155
|
+
}
|
156
|
+
|
157
|
+
text {
|
158
|
+
layout_data :fill, :center, true, false
|
159
|
+
text 'Text1'
|
160
|
+
drag_source true
|
161
|
+
}
|
162
|
+
|
163
|
+
text {
|
164
|
+
layout_data :fill, :center, true, false
|
165
|
+
text 'Drop To Insert'
|
166
|
+
drop_target true
|
167
|
+
}
|
168
|
+
|
169
|
+
label {
|
170
|
+
text 'Drag'
|
171
|
+
}
|
172
|
+
|
173
|
+
label {
|
174
|
+
text 'Drop To Replace'
|
175
|
+
}
|
176
|
+
|
177
|
+
text {
|
178
|
+
layout_data :fill, :center, true, false
|
179
|
+
text 'Text2'
|
180
|
+
drag_source true
|
181
|
+
}
|
182
|
+
|
183
|
+
text {
|
184
|
+
layout_data :fill, :center, true, false
|
185
|
+
text 'Drop To Replace'
|
186
|
+
drop_target :replace
|
187
|
+
}
|
188
|
+
}
|
189
|
+
|
190
|
+
tab_item {
|
191
|
+
grid_layout 2, true
|
192
|
+
text 'Spinner'
|
193
|
+
|
194
|
+
label {
|
195
|
+
text 'Drag'
|
196
|
+
}
|
197
|
+
|
198
|
+
label {
|
199
|
+
text 'Drop To Insert'
|
200
|
+
}
|
201
|
+
|
202
|
+
spinner {
|
203
|
+
layout_data :fill, :center, true, false
|
204
|
+
selection 30
|
205
|
+
drag_source true
|
206
|
+
}
|
207
|
+
|
208
|
+
spinner {
|
209
|
+
layout_data :fill, :center, true, false
|
210
|
+
drop_target true
|
211
|
+
}
|
212
|
+
}
|
213
|
+
tab_item {
|
214
|
+
fill_layout
|
215
|
+
text 'File'
|
216
|
+
|
217
|
+
@drop_zone_label = label(:center, :wrap) {
|
218
|
+
text 'Drop One File Or More Here'
|
219
|
+
background :white
|
220
|
+
|
221
|
+
rectangle {
|
222
|
+
foreground :black
|
223
|
+
line_width 4
|
224
|
+
line_style :dash
|
225
|
+
}
|
226
|
+
|
227
|
+
drop_target(:drop_copy) {
|
228
|
+
transfer :file
|
229
|
+
|
230
|
+
on_drag_enter do |event|
|
231
|
+
drop_widget = event.widget.control.data('proxy') # obtain Glimmer widget proxy since it permits nicer syntax for setting background via symbol
|
232
|
+
drop_widget.background = :yellow
|
233
|
+
end
|
234
|
+
|
235
|
+
on_drag_leave do |event|
|
236
|
+
drop_widget = event.widget.control.data('proxy') # obtain Glimmer widget proxy since it permits nicer syntax for setting background via symbol
|
237
|
+
drop_widget.background = :white
|
238
|
+
end
|
239
|
+
|
240
|
+
on_drop do |event|
|
241
|
+
drop_widget = event.widget.control.data('proxy') # obtain Glimmer widget proxy since it permits nicer syntax for setting background/cursor via symbol
|
242
|
+
drop_widget.background = :white
|
243
|
+
@drop_zone_label.text = event.data.to_a.join("\n")
|
244
|
+
end
|
245
|
+
}
|
246
|
+
}
|
50
247
|
}
|
51
248
|
}
|
52
249
|
}.open
|