Glimmer DSL for SWT 4.20.13.13 added a new Parking elaborate sample that acts as a building's parking booking system at its entrance.
It leverages the Canvas Shape DSL and Canvas Transform DSL. Also, it does not rely on data-binding for everything despite that being the flagship feature of Glimmer DSL for SWT. Glimmer aims to be pragmatic, not forcing data-binding when there are other practical approaches. The sample takes a hybrid approach, using data-binding where practical (changing parking spot color when booked) and relying on plain old observers to destroy/rebuild canvas shapes on floor changes.
# From: https://github.com/AndyObtiva/glimmer-dsl-swt/blob/master/docs/reference/GLIMMER_SAMPLES.md#parking
require 'glimmer-dsl-swt'
require_relative 'parking/model/parking_presenter'
class Parking
include Glimmer::UI::CustomShell
FLOOR_COUNT = 4
before_body do
@parking_spots = Model::ParkingSpot::LETTERS.clone
@parking_presenter = Model::ParkingPresenter.new(FLOOR_COUNT)
end
body {
shell(:no_resize) {
row_layout(:vertical) {
center true
}
text 'Parking'
label {
text 'Select an available spot to park'
font height: 30
}
label {
text 'Floor:'
font height: 20
}
spinner {
minimum 1
maximum FLOOR_COUNT
font height: 20
selection <=> [@parking_presenter, :selected_floor]
on_widget_selected do
@parking_spots = Model::ParkingSpot::LETTERS.clone
@canvas.dispose_shapes
@canvas.content {
parking_floor
}
end
}
@canvas = canvas {
layout_data {
width 600
height 600
}
background :dark_gray
parking_floor
}
}
}
def parking_floor
parking_quad(67.5, 0, 125)
parking_quad(67.5, 0, 125) { |shp|
shp.rotate(90)
}
parking_quad(67.5, 0, 125) { |shp|
shp.rotate(180)
}
parking_quad(67.5, 0, 125) { |shp|
shp.rotate(270)
}
end
def parking_quad(location_x, location_y, length, &block)
distance = (1.0/3)*length
parking_spot(location_x, location_y, length, &block)
parking_spot(location_x + distance, location_y, length, &block)
parking_spot(location_x + 2*distance, location_y, length, &block)
parking_spot(location_x + 3*distance, location_y, length, &block)
end
def parking_spot(location_x, location_y, length, &block)
parking_spot_letter = @parking_spots.shift
height = length
width = (2.0/3)*length
shape(location_x, location_y) { |the_shape|
line_width (1.0/15)*length
foreground :white
block&.call(the_shape)
rectangle(location_x, location_y, width, height) {
background <= [
@parking_presenter.floors[@parking_presenter.selected_floor - 1].parking_spots[parking_spot_letter],
:booked,
on_read: ->(b) {b ? :red : :dark_gray}
]
text {
x :default
y :default
string parking_spot_letter
font height: 20
}
on_mouse_up do
begin
@parking_presenter.floors[@parking_presenter.selected_floor - 1].book!(parking_spot_letter)
message_box {
text 'Parking Booked!'
message "Floor #{@parking_presenter.selected_floor} Parking Spot #{parking_spot_letter} Is Booked!"
}.open
rescue => e
# No Op if already booked
end
end
}
line(location_x, location_y, location_x, location_y + height)
line(location_x, location_y, location_x + width, location_y)
line(location_x + width, location_y, location_x + width, location_y + height)
}
end
end
Parking.launch
Parking Floor 1
Parking Floor 4
Clicking available parking spot M triggers a booking!
Happy Glimmering!
Top comments (0)