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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
|
--- `Selector`
-- Element for selecting variable from list.
Selector = require "not.Element":extends()
Selector.DEFAULT_DELAY = 2
Selector.SHAPE_PORTRAIT = 1
Selector.SHAPE_PANORAMA = 2
function Selector:new (list, group, parent)
Selector.__super.new(self, parent)
self.atlas, self.quads = parent:getSheet()
self.group = group
self.list = list
self.delay = Selector.DEFAULT_DELAY
self.shape = Selector.SHAPE_PORTRAIT
self.focused = false
self.lock = false
self.index = 1
end
-- TODO: See `not/Element@getSize`.
function Selector:getSize ()
if self.shape == Selector.SHAPE_PORTRAIT then
return 32, 32
end
if self.shape == Selector.SHAPE_PANORAMA then
return 80, 42
end
end
--- Makes sure that n is in <1, total> range.
local
function limit (n, total)
if n > total then
return limit(n - total, total)
end
if n < 1 then
return limit(n + total, total)
end
return n
end
--- Chooses item with an index.
-- @param index selected item's index
-- @return old index
function Selector:setIndex (index)
local old = self.index
self.index = limit(index, #self.list)
return old
end
--- Returns selected item's value.
-- @return item selected from the list
function Selector:getSelected ()
return self.list[self.index]
end
--- Checks if selection is locked and returns item's value.
-- @return item selected from the list if Selector is locked, nil otherwise
function Selector:getLocked ()
if self.lock then
return self:getSelected()
end
end
--- Checks if Selected value is unique in group's scope.
-- @return boolean answering question
function Selector:isUnique ()
if self.group then
-- In this case next is used to determine if table returned by call is empty.
if next(group:callEachBut(self, "getLocked")) then
return false
end
end
return true
end
function Selector:getText ()
return tostring(self:getSelected())
end
function Selector:focus ()
self.focused = true
return true
end
function Selector:blur ()
self.focused = false
end
-- TODO: Temporary function to determine quad to use. Will be obsolete when BoxElement will be done. See also `not/Element@getSize`.
function Selector:getShapeString ()
if self.shape == Selector.SHAPE_PORTRAIT then
return "portrait"
end
if self.shape == Selector.SHAPE_PANORAMA then
return "panorama"
end
end
-- TODO: Selector draw is missing box content drawing.
function Selector:draw (scale)
local x, y = self:getPosition()
local w, h = self:getSize()
local boxType = "normal"
if self:getLocked() then
boxType = "active"
end
love.graphics.setColor(255, 255, 255, 255)
love.graphics.draw(self.atlas, self.quads[self:getShapeString()][boxType], x*scale, y*scale, 0, scale, scale)
if self.focused then
local dy = (h-6)/2
local al, ar = self.quads.arrow_r, self.quads.arrow_l
if self.lock then
al, ar = ar, al
end
love.graphics.draw(self.atlas, ar, (x+0-2-math.floor(self.delay))*scale, (y+dy)*scale, 0, scale, scale)
love.graphics.draw(self.atlas, al, (x+w-4+math.floor(self.delay))*scale, (y+dy)*scale, 0, scale, scale)
end
love.graphics.setFont(Font)
love.graphics.printf(self:getText(), (x-w)*scale, (y+h+1)*scale, w*3, "center", 0, scale, scale)
end
function Selector:update (dt)
self.delay = self.delay + dt
if self.delay > Selector.DEFAULT_DELAY then
self.delay = self.delay - Selector.DEFAULT_DELAY
end
end
function Selector:controlpressed (set, action, key)
if set and self.focused then
if not self.lock then
if action == "left" then
self:setIndex(self.index - 1)
end
if action == "right" then
self:setIndex(self.index + 1)
end
-- TODO: Extend functionality on attack action in Selector.
if action == "attack" then
self.lock = true
end
end
if action == "jump" then
self.lock = false
end
end
end
return Selector
|