-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathstevescalc.rb
112 lines (93 loc) · 2.13 KB
/
stevescalc.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
101
102
103
104
105
106
107
108
109
110
111
112
require '../lib/shoes'
class Calc
def initialize
@number = 0
@previous = nil
@op = nil
end
def to_s
@number.to_s
end
(0..9).each do |n|
define_method "press_#{n}" do
@number = @number.to_i * 10 + n
end
end
def press_clear
@number = 0
end
{'add' => '+', 'sub' => '-', 'times' => '*', 'div' => '/'}.each do |meth, op|
define_method "press_#{meth}" do
if @op
press_equals
end
@op = op
@previous, @number = @number, nil
end
end
def press_equals
@number = @previous.send(@op, @number.to_i)
@op = nil
end
end
number_field = nil
number = Calc.new
Shoes.app do
stack do
stack do
number_field = edit_line(:text=>number.to_s)
end
stack do
flow do
%w(7 8 9 /).each do |btn|
button :text=>btn do
method = case btn
when /[0-9]/; 'press_'+btn
when '/'; 'press_div'
end
number.send(method)
number_field.replace(number.to_s)
end
end
end
flow do
%w(4 5 6 *).each do |btn|
button :text=>btn do
puts btn
method = case btn
when /[0-9]/; 'press_'+btn
when '*'; 'press_times'
end
number.send(method)
number_field.replace(number.to_s)
end
end
end
flow do
%w(1 2 3 -).each do |btn|
button :text=>btn do
method = case btn
when /[0-9]/; 'press_'+btn
when '-'; 'press_sub'
end
number.send(method)
number_field.replace(number.to_s)
end
end
end
flow do
%w(Clr = +).each do |btn|
button :text=>btn do
method = case btn
when 'Clr'; 'press_clear'
when '='; 'press_equals'
when '+'; 'press_add'
end
number.send(method)
number_field.replace(number.to_s)
end
end
end
end
end
end