myspace / CommonLua /X /XHoldButtonControl.lua
sirnii's picture
Upload 1816 files
b6a38d7 verified
raw
history blame
4.32 kB
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