summaryrefslogtreecommitdiffhomepage
path: root/not/Group.lua
blob: d9c0b9c94c59ec7c0b6cdc216e79ab399d3ea9e5 (plain)
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
--- Element used for grouping elements and passing input to selected child based on controller set.
Group = require "not.Element":extends()

function Group:new (parent)
	Group.__super.new(self, parent)
	self.children = {}
end

--- Calls function with parameters for each child.
-- @param func key of function to call
-- @param ... parameters passed to function
-- @return table with calls' results
function Group:callEach (func, ...)
	local results = {}
	for _,child in ipairs(self.children) do
		if type(child[func]) == "function" then
			table.insert(results, child[func](child, ...))
		end
	end
	return results
end

--- Calls function with parameters for each but one child.
-- @param avoid child to avoid calling
-- @param func key of function to call
-- @param ... parameters passed to function
-- @return table with calls' results
function Group:callEachBut (avoid, func, ...)
	local results = {}
	for _,child in ipairs(self.children) do
		if child ~= avoid then
			if type(child[func]) == "function" then
				table.insert(results, child[func](child, ...))
			end
		end
	end
	return results
end

--- Calls function with parameters for one child based on controller set.
-- @param set controller set
-- @param func key of function to call
-- @param ... parameters passed to function
-- @return results of called function
function Group:callWithSet (set, func, ...)
	for i,test in ipairs(Controller.getSets()) do
		if test == set then
			local child = self.children[i]
			if child then
				return child[func](child, ...)
			end
		end
	end
end

function Group:focus ()
	self:callEach("focus")
	self.focused = true
	return true
end 

function Group:blur ()
	self:callEach("blur")
	self.focused = false
end 

function Group:draw (scale)
	self:callEach("draw", scale)
end

function Group:update (dt)
	self:callEach("update", dt)
end

function Group:controlpressed (set, action, key)
	if self.focused then
		self:callWithSet(set, "controlpressed", set, action, key)
	end
end

function Group:controlreleased (set, action, key)
	if self.focused then
		self:callWithSet(set, "controlreleased", set, action, key)
	end
end

return Group