File size: 4,319 Bytes
b6a38d7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
const.HoldButtonFillTime = 1000

DefineClass.XHoldButton = {
	__parents = { "PropertyObject" },
	properties = {
		{ category = "Interaction" ,id = "CursorsFolder", editor = "text", default = "UI/Cursors/", },
		{ category = "Interaction", id = "CursorsCount", editor = "number", default = 6, },
		{ category = "Interaction", id = "OnHoldDown", editor = "func", params = "self, pt, button"},
	},
	pt_pressed = false,
	pressed_button =  false, 
	delay_wait_time = false,
	start_time = false,
	prev_mouse_cursor = false,
	registered_buttons = false,
}

function XHoldButton:InitButtons()
	local list = self.HoldGamepadButtons or ""
	self.registered_buttons = { list:starts_with(",") and "" or nil }
	for btn in list:gmatch("([%w%-_]+)") do
		self.registered_buttons[btn] = true
	end	
end

--print("pressed, onhold", pt, button)
function XHoldButton:OnHoldDown(pt, button)
	
end

function XHoldButton:OnHoldButtonTick(i, shortcut)	
	if not i then -- restore after up
		if self.prev_mouse_cursor then
			self:SetMouseCursor(self.prev_mouse_cursor)		
			Msg("MouseCursor",self.prev_mouse_cursor)
		end	
		return
	end
	local img = self.CursorsFolder.."hold"..i..".tga"
	self:SetMouseCursor(img)
	Msg("MouseCursor",img)
end

function XHoldButton:OnHoldButtonRepeat(button, controller_id)	
	--print("repeat A", button, self.delay_wait_time and now() - self.delay_wait_time)
	if self.pressed_button and self.pressed_button==button and not self:IsThreadRunning("hold button") and (now() - self.delay_wait_time)>=300 and not self.start_time then				
		self.start_time = now()
		self.prev_mouse_cursor = self.prev_mouse_cursor or self:GetMouseCursor() or const.DefaultMouseCursor
		-- start button 		
		local count = self.CursorsCount
		local sleep_time = const.HoldButtonFillTime/count
		local last = const.HoldButtonFillTime - sleep_time*count
		self:OnHoldButtonTick(0, button)	
		self:CreateThread("hold button", function()
			for i=1, (count-1) do
				--print("change cursor", i)
				if i == (count - 1) then
					sleep_time = sleep_time + last
				end	
				Sleep(sleep_time)
				self:OnHoldButtonTick(i, button)	
			end		
		end)
	end	
end

function XHoldButton:OnHoldButtonDown(button, controller_id)
	if not self.pressed_button then
		self.pt_pressed = GamepadMouseGetPos()
		self.pressed_button = button
		self.delay_wait_time= now()
		--print("pressed A",self.delay_wait_time)
	end	
end

function XHoldButton:OnHoldButtonUp(button, controller_id)
--call on hold if time is passed or cancel if less
	local success
	if self.pressed_button and button==self.pressed_button then
		self:DeleteThread("hold button")
		--print("release A",self.start_time)
		if self.start_time and (now() - self.start_time) >= const.HoldButtonFillTime then
			self:OnHoldDown(self.pt_pressed,self.pressed_button)
			success = true
		end
		
		self.pt_pressed = false
		self.pressed_button = false
		self.delay_wait_time = false
		self.start_time = false
		
		self:OnHoldButtonTick(false, button)
		self.prev_mouse_cursor = false
	end
	return success
end
---------------------------
DefineClass.XHoldButtonControl = {
	__parents = {"XHoldButton", "XContextControl" },
	properties = {
		{ category = "Interaction", id = "HoldGamepadButtons", editor = "text"},
	},
	MouseCursor = "CommonAssets/UI/HandCursor.tga",
	pt_pressed = false,
	pressed_button =  false, 
	delay_wait_time = false,
	start_time = false,
	prev_mouse_cursor = false,
	registered_buttons = false,
}

function XHoldButtonControl:Open()
	XHoldButton.InitButtons(self)
	XContextControl.Open(self)
end

--print("pressed, onhold", pt, button)
function XHoldButtonControl:OnHoldDown(pt, button)
	
end

-- XWindow functions
function XHoldButtonControl:OnXButtonRepeat(button, controller_id)	
	if not self.registered_buttons or not self.registered_buttons[button]then return end
	return XHoldButton.OnHoldButtonRepeat(self, button, controller_id)	
end

function XHoldButtonControl:OnXButtonDown(button, controller_id)
	if not self.registered_buttons or not self.registered_buttons[button]then return end
	return XHoldButton.OnHoldButtonDown(self,button, controller_id)
end

function XHoldButtonControl:OnXButtonUp(button, controller_id)
	if not self.registered_buttons or not self.registered_buttons[button]then return end
	return XHoldButton.OnHoldButtonUp(self, button, controller_id)
end