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
|