glimmer-dsl-swt 4.22.0.0 → 4.22.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +191 -169
- data/README.md +5 -5
- data/VERSION +1 -1
- data/docs/reference/GLIMMER_COMMAND.md +2 -2
- data/docs/reference/GLIMMER_CONFIGURATION.md +14 -3
- data/docs/reference/GLIMMER_GUI_DSL_SYNTAX.md +98 -20
- data/docs/reference/GLIMMER_SAMPLES.md +13 -0
- data/glimmer-dsl-swt.gemspec +0 -0
- data/lib/ext/glimmer/config.rb +41 -24
- data/lib/glimmer/data_binding/observable_widget.rb +6 -6
- data/lib/glimmer/data_binding/widget_binding.rb +2 -1
- data/lib/glimmer/dsl/swt/observe_expression.rb +2 -1
- data/lib/glimmer/dsl/swt/transform_expression.rb +1 -1
- data/lib/glimmer/launcher.rb +15 -14
- data/lib/glimmer/rake_task/scaffold.rb +2 -14
- data/lib/glimmer/swt/color_proxy.rb +5 -5
- data/lib/glimmer/swt/custom/drawable.rb +4 -0
- data/lib/glimmer/swt/custom/shape/line.rb +0 -1
- data/lib/glimmer/swt/custom/shape/path.rb +2 -2
- data/lib/glimmer/swt/custom/shape/path_segment.rb +2 -2
- data/lib/glimmer/swt/custom/shape/point.rb +8 -1
- data/lib/glimmer/swt/custom/shape.rb +170 -69
- data/lib/glimmer/swt/display_proxy.rb +15 -10
- data/lib/glimmer/swt/image_proxy.rb +5 -5
- data/lib/glimmer/swt/message_box_proxy.rb +5 -5
- data/lib/glimmer/swt/shape_listener_proxy.rb +55 -0
- data/lib/glimmer/swt/transform_proxy.rb +3 -3
- data/lib/glimmer/swt/tray_proxy.rb +4 -4
- data/lib/glimmer/swt/widget_proxy.rb +5 -7
- data/lib/glimmer/ui/custom_shape.rb +34 -10
- data/lib/glimmer/ui/custom_widget.rb +3 -8
- data/lib/glimmer-dsl-swt.rb +6 -2
- data/samples/elaborate/klondike_solitaire/model/column_pile.rb +0 -1
- data/samples/elaborate/klondike_solitaire/view/column_pile.rb +3 -16
- data/samples/elaborate/klondike_solitaire/view/dealing_pile.rb +1 -1
- data/samples/elaborate/klondike_solitaire/view/dealt_pile.rb +12 -5
- data/samples/elaborate/klondike_solitaire/view/empty_playing_card.rb +2 -1
- data/samples/elaborate/klondike_solitaire/view/foundation_pile.rb +2 -2
- data/samples/elaborate/klondike_solitaire/view/hidden_playing_card.rb +2 -2
- data/samples/elaborate/klondike_solitaire/view/klondike_solitaire_menu_bar.rb +60 -0
- data/samples/elaborate/klondike_solitaire/view/playing_card.rb +3 -2
- data/samples/elaborate/klondike_solitaire.rb +13 -55
- data/samples/elaborate/mandelbrot_fractal.rb +3 -1
- data/samples/elaborate/quarto/model/game.rb +124 -0
- data/samples/elaborate/quarto/model/piece/cube.rb +31 -0
- data/samples/elaborate/quarto/model/piece/cylinder.rb +31 -0
- data/samples/elaborate/quarto/model/piece.rb +70 -0
- data/samples/elaborate/quarto/view/available_pieces_area.rb +72 -0
- data/samples/elaborate/quarto/view/board.rb +65 -0
- data/samples/elaborate/quarto/view/cell.rb +85 -0
- data/samples/elaborate/quarto/view/cube.rb +73 -0
- data/samples/elaborate/quarto/view/cylinder.rb +72 -0
- data/samples/elaborate/quarto/view/message_box_panel.rb +114 -0
- data/samples/elaborate/quarto/view/piece.rb +56 -0
- data/samples/elaborate/quarto/view/selected_piece_area.rb +69 -0
- data/samples/elaborate/quarto.rb +190 -0
- data/samples/hello/hello_custom_widget.rb +23 -5
- metadata +17 -23
- data/bin/glimmer_runner.rb +0 -4
@@ -0,0 +1,31 @@
|
|
1
|
+
# Copyright (c) 2007-2021 Andy Maleh
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
# a copy of this software and associated documentation files (the
|
5
|
+
# "Software"), to deal in the Software without restriction, including
|
6
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
# the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be
|
12
|
+
# included in all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
|
22
|
+
require_relative '../piece'
|
23
|
+
|
24
|
+
class Quarto
|
25
|
+
module Model
|
26
|
+
class Piece
|
27
|
+
class Cylinder < Piece
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# Copyright (c) 2007-2021 Andy Maleh
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
# a copy of this software and associated documentation files (the
|
5
|
+
# "Software"), to deal in the Software without restriction, including
|
6
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
# the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be
|
12
|
+
# included in all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
|
22
|
+
class Quarto
|
23
|
+
module Model
|
24
|
+
class Piece
|
25
|
+
class << self
|
26
|
+
def all_pieces
|
27
|
+
[
|
28
|
+
Cube.new(pitted: false, height: :tall, color: :light),
|
29
|
+
Cylinder.new(pitted: false, height: :tall, color: :light),
|
30
|
+
Cube.new(pitted: true, height: :short, color: :light),
|
31
|
+
Cube.new(pitted: false, height: :short, color: :light),
|
32
|
+
Cube.new(pitted: false, height: :tall, color: :dark),
|
33
|
+
Cylinder.new(pitted: true, height: :short, color: :dark),
|
34
|
+
Cylinder.new(pitted: false, height: :short, color: :dark),
|
35
|
+
Cylinder.new(pitted: true, height: :tall, color: :dark),
|
36
|
+
Cylinder.new(pitted: false, height: :tall, color: :dark),
|
37
|
+
Cube.new(pitted: true, height: :short, color: :dark),
|
38
|
+
Cube.new(pitted: false, height: :short, color: :dark),
|
39
|
+
Cube.new(pitted: true, height: :tall, color: :dark),
|
40
|
+
].freeze
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
attr_reader :pitted, :height, :color
|
45
|
+
alias pitted? pitted
|
46
|
+
|
47
|
+
def initialize(pitted: , height: , color: )
|
48
|
+
@pitted = pitted
|
49
|
+
@height = height
|
50
|
+
@color = color
|
51
|
+
end
|
52
|
+
|
53
|
+
def light?
|
54
|
+
@color == :light
|
55
|
+
end
|
56
|
+
|
57
|
+
def dark?
|
58
|
+
@color == :dark
|
59
|
+
end
|
60
|
+
|
61
|
+
def tall?
|
62
|
+
@height == :tall
|
63
|
+
end
|
64
|
+
|
65
|
+
def short?
|
66
|
+
@height == :short
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# Copyright (c) 2007-2021 Andy Maleh
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
# a copy of this software and associated documentation files (the
|
5
|
+
# "Software"), to deal in the Software without restriction, including
|
6
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
# the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be
|
12
|
+
# included in all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
|
22
|
+
require_relative 'piece'
|
23
|
+
|
24
|
+
class Quarto
|
25
|
+
module View
|
26
|
+
class AvailablePiecesArea
|
27
|
+
include Glimmer::UI::CustomShape
|
28
|
+
|
29
|
+
options :game
|
30
|
+
option :location_x, default: 0
|
31
|
+
option :location_y, default: 0
|
32
|
+
|
33
|
+
attr_reader :pieces
|
34
|
+
|
35
|
+
after_body do
|
36
|
+
reset_pieces
|
37
|
+
end
|
38
|
+
|
39
|
+
body {
|
40
|
+
rectangle(location_x, location_y, PIECES_AREA_WIDTH, AVAILABLE_PIECES_AREA_HEIGHT) {
|
41
|
+
background COLOR_WOOD
|
42
|
+
|
43
|
+
rectangle(0, 0, :max, :max, round: true) { # border
|
44
|
+
foreground :black
|
45
|
+
line_width 2
|
46
|
+
}
|
47
|
+
|
48
|
+
text('Available Pieces', 15, 10) {
|
49
|
+
font height: 18, style: :bold
|
50
|
+
}
|
51
|
+
}
|
52
|
+
}
|
53
|
+
|
54
|
+
def reset_pieces
|
55
|
+
@pieces&.dup&.each { |piece| piece.dispose(redraw: false) }
|
56
|
+
body_root.content {
|
57
|
+
x_offset = 15
|
58
|
+
y_offset = 10 + 18 + 10
|
59
|
+
x_spacing = 10
|
60
|
+
y_spacing = 35
|
61
|
+
row_count = 3
|
62
|
+
column_count = 4
|
63
|
+
@pieces = row_count.times.map do |row|
|
64
|
+
column_count.times.map do |column|
|
65
|
+
piece(game: game, model: game.available_pieces[row*column_count + column], location_x: x_offset + column*(View::Piece::BASIC_SHAPE_WIDTH + x_spacing), location_y: y_offset + row*(View::Piece::SIZE_TALL + y_spacing))
|
66
|
+
end
|
67
|
+
end.flatten
|
68
|
+
}
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# Copyright (c) 2007-2021 Andy Maleh
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
# a copy of this software and associated documentation files (the
|
5
|
+
# "Software"), to deal in the Software without restriction, including
|
6
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
# the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be
|
12
|
+
# included in all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
|
22
|
+
require_relative 'cell'
|
23
|
+
|
24
|
+
class Quarto
|
25
|
+
module View
|
26
|
+
class Board
|
27
|
+
include Glimmer::UI::CustomShape
|
28
|
+
|
29
|
+
option :game
|
30
|
+
option :location_x, default: 0
|
31
|
+
option :location_y, default: 0
|
32
|
+
|
33
|
+
after_body do
|
34
|
+
reset_cells
|
35
|
+
end
|
36
|
+
|
37
|
+
body {
|
38
|
+
rectangle(location_x, location_y, BOARD_DIAMETER, BOARD_DIAMETER, round: true) {
|
39
|
+
background :black
|
40
|
+
|
41
|
+
text("Glimmer\nQuarto", BOARD_DIAMETER - 69, BOARD_DIAMETER - 43) {
|
42
|
+
foreground COLOR_WOOD
|
43
|
+
}
|
44
|
+
|
45
|
+
@cell_container = oval(0, 0, :max, :max) {
|
46
|
+
foreground COLOR_WOOD
|
47
|
+
line_width CELL_LINE_WIDTH
|
48
|
+
|
49
|
+
}
|
50
|
+
}
|
51
|
+
}
|
52
|
+
|
53
|
+
def reset_cells
|
54
|
+
@cell_container.shapes.dup.each(&:dispose)
|
55
|
+
@cell_container.content {
|
56
|
+
@cells = ROW_COUNT.times.map do |row|
|
57
|
+
COLUMN_COUNT.times.map do |column|
|
58
|
+
cell(game: game, row: row, column: column)
|
59
|
+
end
|
60
|
+
end.flatten
|
61
|
+
}
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
# Copyright (c) 2007-2021 Andy Maleh
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
# a copy of this software and associated documentation files (the
|
5
|
+
# "Software"), to deal in the Software without restriction, including
|
6
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
# the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be
|
12
|
+
# included in all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
|
22
|
+
class Quarto
|
23
|
+
module View
|
24
|
+
class Cell
|
25
|
+
include Glimmer::UI::CustomShape
|
26
|
+
|
27
|
+
options :game, :row, :column
|
28
|
+
|
29
|
+
attr_reader :placed_piece
|
30
|
+
|
31
|
+
before_body do
|
32
|
+
@board_x_offset = (BOARD_DIAMETER - COLUMN_COUNT * (CELL_DIAMETER + CELL_LINE_WIDTH + CELL_MARGIN) + CELL_LINE_WIDTH + CELL_MARGIN) / 2.0
|
33
|
+
@board_y_offset = (BOARD_DIAMETER - ROW_COUNT * (CELL_DIAMETER + CELL_LINE_WIDTH + CELL_MARGIN) + CELL_LINE_WIDTH + CELL_MARGIN) / 2.0
|
34
|
+
end
|
35
|
+
|
36
|
+
body {
|
37
|
+
oval(@board_x_offset + column * (CELL_DIAMETER + CELL_LINE_WIDTH + CELL_MARGIN),
|
38
|
+
@board_y_offset + row * (CELL_DIAMETER + CELL_LINE_WIDTH + CELL_MARGIN),
|
39
|
+
CELL_DIAMETER,
|
40
|
+
CELL_DIAMETER) {
|
41
|
+
background :black
|
42
|
+
line_width CELL_LINE_WIDTH
|
43
|
+
transform board_rotation_transform
|
44
|
+
|
45
|
+
oval { # this draws an outline around max dimensions by default (when no x,y,w,h specified)
|
46
|
+
foreground COLOR_WOOD
|
47
|
+
line_width CELL_LINE_WIDTH
|
48
|
+
transform board_rotation_transform
|
49
|
+
}
|
50
|
+
|
51
|
+
on_drop do |drop_event|
|
52
|
+
dragged_piece = drop_event.dragged_shape
|
53
|
+
if dragged_piece.parent.get_data('custom_shape').is_a?(SelectedPieceArea)
|
54
|
+
model = dragged_piece.get_data('custom_shape').model
|
55
|
+
dragged_piece.dispose
|
56
|
+
new_x, new_y = body_root.transform_point(body_root.absolute_x, body_root.absolute_y)
|
57
|
+
parent_proxy.content {
|
58
|
+
piece(game: game, model: model, location_x: new_x, location_y: new_y) {
|
59
|
+
transform {
|
60
|
+
translate -38, -14
|
61
|
+
}
|
62
|
+
}
|
63
|
+
}
|
64
|
+
game.place_piece(model, row: row, column: column)
|
65
|
+
else
|
66
|
+
drop_event.doit = false
|
67
|
+
end
|
68
|
+
end
|
69
|
+
}
|
70
|
+
}
|
71
|
+
|
72
|
+
def board_rotation_transform
|
73
|
+
@board_rotation_transform ||= transform {
|
74
|
+
# main rotation is done by moving shape to be centered in origin, rotating, and then moving shape back
|
75
|
+
translate (SHELL_MARGIN + BOARD_DIAMETER)/2.0, (SHELL_MARGIN + BOARD_DIAMETER)/2.0
|
76
|
+
rotate 45
|
77
|
+
translate -(SHELL_MARGIN + BOARD_DIAMETER)/2.0, -(SHELL_MARGIN + BOARD_DIAMETER)/2.0
|
78
|
+
|
79
|
+
# extra translation to improve location of rotated cells
|
80
|
+
translate 7, -4
|
81
|
+
}
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# Copyright (c) 2007-2021 Andy Maleh
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
# a copy of this software and associated documentation files (the
|
5
|
+
# "Software"), to deal in the Software without restriction, including
|
6
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
# the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be
|
12
|
+
# included in all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
|
22
|
+
class Quarto
|
23
|
+
module View
|
24
|
+
class Cube
|
25
|
+
include Glimmer::UI::CustomShape
|
26
|
+
|
27
|
+
DEFAULT_SIZE = 28
|
28
|
+
|
29
|
+
options :location_x, :location_y, :rectangle_width, :rectangle_height, :cube_height, :pitted, :background_color, :line_thickness
|
30
|
+
alias pitted? pitted
|
31
|
+
|
32
|
+
before_body do
|
33
|
+
self.location_x ||= 0
|
34
|
+
self.location_y ||= 0
|
35
|
+
self.rectangle_width ||= rectangle_height || cube_height || DEFAULT_SIZE
|
36
|
+
self.rectangle_height ||= rectangle_width || cube_height || DEFAULT_SIZE
|
37
|
+
self.cube_height ||= rectangle_width || rectangle_height || DEFAULT_SIZE
|
38
|
+
self.line_thickness ||= 1
|
39
|
+
end
|
40
|
+
|
41
|
+
body {
|
42
|
+
shape(location_x, location_y) {
|
43
|
+
polygon(0, cube_height + rectangle_height / 2.0, rectangle_width / 2.0, cube_height, rectangle_width, cube_height + rectangle_height / 2.0, rectangle_width / 2.0, cube_height + rectangle_height) {
|
44
|
+
background background_color
|
45
|
+
}
|
46
|
+
polygon(0, cube_height + rectangle_height / 2.0, rectangle_width / 2.0, cube_height, rectangle_width, cube_height + rectangle_height / 2.0, rectangle_width / 2.0, cube_height + rectangle_height) {
|
47
|
+
line_width line_thickness
|
48
|
+
}
|
49
|
+
rectangle(0, rectangle_height / 2.0, rectangle_width, cube_height) {
|
50
|
+
background background_color
|
51
|
+
}
|
52
|
+
polyline(0, rectangle_height / 2.0 + cube_height, 0, rectangle_height / 2.0, rectangle_width, rectangle_height / 2.0, rectangle_width, rectangle_height / 2.0 + cube_height) {
|
53
|
+
line_width line_thickness
|
54
|
+
}
|
55
|
+
polygon(0, rectangle_height / 2.0, rectangle_width / 2.0, 0, rectangle_width, rectangle_height / 2.0, rectangle_width / 2.0, rectangle_height) {
|
56
|
+
background background_color
|
57
|
+
}
|
58
|
+
polygon(0, rectangle_height / 2.0, rectangle_width / 2.0, 0, rectangle_width, rectangle_height / 2.0, rectangle_width / 2.0, rectangle_height) {
|
59
|
+
line_width line_thickness
|
60
|
+
}
|
61
|
+
line(rectangle_width / 2.0, cube_height + rectangle_height, rectangle_width / 2.0, rectangle_height) {
|
62
|
+
line_width line_thickness
|
63
|
+
}
|
64
|
+
if pitted?
|
65
|
+
oval(rectangle_width / 4.0, rectangle_height / 4.0, rectangle_width / 2.0, rectangle_height / 2.0) {
|
66
|
+
background :black
|
67
|
+
}
|
68
|
+
end
|
69
|
+
}
|
70
|
+
}
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# Copyright (c) 2007-2021 Andy Maleh
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
# a copy of this software and associated documentation files (the
|
5
|
+
# "Software"), to deal in the Software without restriction, including
|
6
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
# the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be
|
12
|
+
# included in all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
|
22
|
+
class Quarto
|
23
|
+
module View
|
24
|
+
class Cylinder
|
25
|
+
include Glimmer::UI::CustomShape
|
26
|
+
|
27
|
+
DEFAULT_SIZE = 28
|
28
|
+
|
29
|
+
options :location_x, :location_y, :oval_width, :oval_height, :cylinder_height, :pitted, :background_color, :line_thickness
|
30
|
+
alias pitted? pitted
|
31
|
+
|
32
|
+
before_body do
|
33
|
+
self.location_x ||= 0
|
34
|
+
self.location_y ||= 0
|
35
|
+
self.oval_width ||= oval_height || cylinder_height || DEFAULT_SIZE
|
36
|
+
self.oval_height ||= oval_width || cylinder_height || DEFAULT_SIZE
|
37
|
+
self.cylinder_height ||= oval_width || oval_height || DEFAULT_SIZE
|
38
|
+
self.line_thickness ||= 1
|
39
|
+
end
|
40
|
+
|
41
|
+
body {
|
42
|
+
shape(location_x, location_y) {
|
43
|
+
oval(0, cylinder_height, oval_width, oval_height) {
|
44
|
+
background background_color
|
45
|
+
|
46
|
+
oval { # draws with foreground :black and has max size within parent by default
|
47
|
+
line_width line_thickness
|
48
|
+
}
|
49
|
+
}
|
50
|
+
rectangle(0, oval_height / 2.0, oval_width, cylinder_height) {
|
51
|
+
background background_color
|
52
|
+
}
|
53
|
+
polyline(0, oval_height / 2.0 + cylinder_height, 0, oval_height / 2.0, oval_width, oval_height / 2.0, oval_width, oval_height / 2.0 + cylinder_height) {
|
54
|
+
line_width line_thickness
|
55
|
+
}
|
56
|
+
oval(0, 0, oval_width, oval_height) {
|
57
|
+
background background_color
|
58
|
+
|
59
|
+
oval { # draws with foreground :black and has max size within parent by default
|
60
|
+
line_width line_thickness
|
61
|
+
}
|
62
|
+
}
|
63
|
+
if pitted?
|
64
|
+
oval(oval_width / 4.0, oval_height / 4.0, oval_width / 2.0, oval_height / 2.0) {
|
65
|
+
background :black
|
66
|
+
}
|
67
|
+
end
|
68
|
+
}
|
69
|
+
}
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
# Copyright (c) 2007-2021 Andy Maleh
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
# a copy of this software and associated documentation files (the
|
5
|
+
# "Software"), to deal in the Software without restriction, including
|
6
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
# the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be
|
12
|
+
# included in all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
|
22
|
+
class Quarto
|
23
|
+
module View
|
24
|
+
class MessageBoxPanel
|
25
|
+
include Glimmer::UI::CustomShape
|
26
|
+
|
27
|
+
FONT_HEIGHT_DEFAULT = 12
|
28
|
+
BUTTON_TEXT_DEFAULT = 'OK'
|
29
|
+
|
30
|
+
option :message
|
31
|
+
option :location_x, default: :default
|
32
|
+
option :location_y, default: :default
|
33
|
+
option :size_width
|
34
|
+
option :size_height
|
35
|
+
option :background_color, default: :white
|
36
|
+
option :foreground_color, default: :black
|
37
|
+
option :border_line_width, default: 1
|
38
|
+
option :text_font, default: {height: FONT_HEIGHT_DEFAULT}
|
39
|
+
option :text_color, default: :black
|
40
|
+
|
41
|
+
attr_reader :closed
|
42
|
+
alias closed? closed
|
43
|
+
|
44
|
+
def can_handle_observation_request?(observation_request)
|
45
|
+
observation_request == 'on_closed' || super
|
46
|
+
end
|
47
|
+
|
48
|
+
def handle_observation_request(observation_request, &block)
|
49
|
+
if observation_request == 'on_closed'
|
50
|
+
@on_closed_handlers ||= []
|
51
|
+
@on_closed_handlers << block
|
52
|
+
else
|
53
|
+
super
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
before_body do
|
58
|
+
@font_height = text_font[:height] || FONT_HEIGHT_DEFAULT
|
59
|
+
self.size_width ||= [:default, @font_height*4.0]
|
60
|
+
self.size_height ||= [:default, @font_height*4.0]
|
61
|
+
@text_offset = -1.2*@font_height
|
62
|
+
|
63
|
+
display {
|
64
|
+
on_swt_keyup do |key_event|
|
65
|
+
close if key_event.keyCode == swt(:cr)
|
66
|
+
end
|
67
|
+
}
|
68
|
+
end
|
69
|
+
|
70
|
+
body {
|
71
|
+
rectangle(location_x, location_y, size_width, size_height, round: true) {
|
72
|
+
background background_color
|
73
|
+
|
74
|
+
text(message, :default, [:default, @text_offset]) {
|
75
|
+
foreground :black
|
76
|
+
font text_font
|
77
|
+
}
|
78
|
+
|
79
|
+
rectangle(0, 0, :max, :max, round: true) { # border drawn around max dimensions of parent
|
80
|
+
foreground foreground_color
|
81
|
+
line_width border_line_width
|
82
|
+
}
|
83
|
+
|
84
|
+
rectangle(:default, [:default, @font_height + (@font_height/2.0)], @font_height*5.5, @font_height*2.0, @font_height, @font_height, round: true) {
|
85
|
+
background background_color
|
86
|
+
|
87
|
+
text(BUTTON_TEXT_DEFAULT) {
|
88
|
+
foreground text_color
|
89
|
+
font text_font
|
90
|
+
}
|
91
|
+
|
92
|
+
on_mouse_up do
|
93
|
+
close
|
94
|
+
end
|
95
|
+
}
|
96
|
+
|
97
|
+
rectangle(:default, [:default, @font_height + (@font_height/2.0)], @font_height*5.5, @font_height*2.0, @font_height, @font_height, round: true) { # border
|
98
|
+
foreground foreground_color
|
99
|
+
line_width border_line_width
|
100
|
+
}
|
101
|
+
}
|
102
|
+
}
|
103
|
+
|
104
|
+
def close
|
105
|
+
unless @closed
|
106
|
+
@closed = true
|
107
|
+
@on_closed_handlers&.each {|handler| handler.call}
|
108
|
+
@on_closed_handlers&.clear
|
109
|
+
body_root.dispose
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# Copyright (c) 2007-2021 Andy Maleh
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
# a copy of this software and associated documentation files (the
|
5
|
+
# "Software"), to deal in the Software without restriction, including
|
6
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
# the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be
|
12
|
+
# included in all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
|
22
|
+
require_relative 'cylinder'
|
23
|
+
require_relative 'cube'
|
24
|
+
|
25
|
+
class Quarto
|
26
|
+
module View
|
27
|
+
class Piece
|
28
|
+
include Glimmer::UI::CustomShape
|
29
|
+
|
30
|
+
SIZE_SHORT = 28
|
31
|
+
SIZE_TALL = 48
|
32
|
+
BASIC_SHAPE_WIDTH = 48
|
33
|
+
BASIC_SHAPE_HEIGHT = 28
|
34
|
+
LINE_THICKNESS = 2
|
35
|
+
|
36
|
+
options :game, :model, :location_x, :location_y
|
37
|
+
|
38
|
+
before_body do
|
39
|
+
@background_color = model.light? ? COLOR_LIGHT_WOOD : COLOR_DARK_WOOD
|
40
|
+
@size = model.short? ? SIZE_SHORT : SIZE_TALL
|
41
|
+
@shape_location_x = 0
|
42
|
+
@shape_location_y = model.short? ? 20 : 0
|
43
|
+
end
|
44
|
+
|
45
|
+
body {
|
46
|
+
shape(location_x, location_y) {
|
47
|
+
if model.is_a?(Model::Piece::Cylinder)
|
48
|
+
cylinder(location_x: @shape_location_x, location_y: @shape_location_y, cylinder_height: @size, oval_width: BASIC_SHAPE_WIDTH, oval_height: BASIC_SHAPE_HEIGHT, pitted: model.pitted?, background_color: @background_color, line_thickness: LINE_THICKNESS)
|
49
|
+
else
|
50
|
+
cube(location_x: @shape_location_x, location_y: @shape_location_y, cube_height: @size, rectangle_width: BASIC_SHAPE_WIDTH, rectangle_height: BASIC_SHAPE_HEIGHT, pitted: model.pitted?, background_color: @background_color, line_thickness: LINE_THICKNESS)
|
51
|
+
end
|
52
|
+
}
|
53
|
+
}
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|