-
Notifications
You must be signed in to change notification settings - Fork 193
/
Copy pathsimple_displace.rb
100 lines (85 loc) · 2.33 KB
/
simple_displace.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# frozen_string_literal: true
class Layout
def initialize(app, art, elements)
@app = app
@art = art
@elements = elements
@position = {}
@width = 50
@margin = 10
@top = 4
end
attr_reader :art, :elements, :width, :margin, :top
def oval
@app.oval(*position(:oval), width)
end
def rect
@app.rect(*position(:rect), width)
end
def image
@app.image File.expand_path(File.join(__FILE__, "../avatar.png")), left: left(:image), top: top
end
def edit_box
@app.edit_box "Edit me", left: left(:edit_box), top: top, height: 50, width: width
end
def offset(element)
art.index(element.to_sym) || elements.index(element.to_sym)
end
def left(element)
(width + margin) * offset(element)
end
def position(element)
[left(element), top]
end
def remember(name, element)
@app.info "Remembering #{name} at [#{element.left}, #{element.top}]"
@position[name] = [element.left, element.top]
end
def recall(name)
position = @position.fetch(name, "...oops, can't find it...[0, 0]")
@app.info "Recalling #{name} was at #{position}"
@position.fetch(name, [0, 0])
end
end
Shoes.app do
@art = [:oval, :rect]
@elements = [:image, :edit_box]
@objects = {}
@layout = Layout.new self, @art, @elements
@create_object = lambda do |name|
info "#{name} starts at #{@layout.position(name)}"
@objects[name] = @layout.send(name)
@layout.remember name, @objects[name]
end
stack do
title "Art"
flow height: 100 do
@art.each(&@create_object)
end
title "Elements"
flow height: 100 do
@elements.each(&@create_object)
end
flow do
x = 400
colors = [seagreen, salmon, papayawhip, goldenrod]
@art.concat(@elements).each_with_index do |name, i|
stack width: 100, margin: 4 do
background colors[i]
tagline name.to_s
button "displace" do
@layout.remember(name, @objects[name])
position = [x - @layout.left(name), @layout.top]
info "#{name} displaces to #{position}"
@objects[name].displace(*position)
end
button "replace" do
position = @layout.recall(name)
info "#{name} replaces to #{position}"
@objects[name].displace(*position)
end
end
end
end
end
end