otclient-redemption/modules/modulelib/ext/parseevent.lua
2025-05-06 16:01:47 -03:00

198 lines
6.4 KiB
Lua

local EVENTS_TRANSLATED = {
onstyleapply = 'onStyleApply',
ondestroy = 'onDestroy',
onidchange = 'onIdChange',
onwidthchange = 'onWidthChange',
onheightchange = 'onHeightChange',
onresize = 'onResize',
onenabled = 'onEnabled',
onpropertychange = 'onPropertyChange',
ongeometrychange = 'onGeometryChange',
onlayoutupdate = 'onLayoutUpdate',
onfocus = 'onFocusChange',
onchildfocus = 'onChildFocusChange',
onhover = 'onHoverChange',
onvisibility = 'onVisibilityChange',
ondragenter = 'onDragEnter',
ondragleave = 'onDragLeave',
ondragmove = 'onDragMove',
ondrop = 'onDrop',
onkeytext = 'onKeyText',
onkeydown = 'onKeyDown',
onkeypress = 'onKeyPress',
onkeyup = 'onKeyUp',
onmousepress = 'onMousePress',
onmouserelease = 'onMouseRelease',
onmousemove = 'onMouseMove',
onmousewheel = 'onMouseWheel',
onclick = 'onClick',
ondoubleclick = 'onDoubleClick',
oncreate = 'onCreate',
onsetup = 'onSetup',
ontextareaupdate = 'onTextAreaUpdate',
onfontchange = 'onFontChange',
ontextchange = 'onTextChange',
onescape = 'onEscape',
}
local parseEvents = function(el, widget, eventName, callStr, controller)
local eventCall = loadstring('return function(self, event) ' .. callStr .. ' end')()
local event = { target = widget }
local function execEventCall()
eventCall(controller, event)
end
if eventName == 'onchange' then
if widget.__class == 'UIComboBox' then
controller:registerEvents(widget, {
onOptionChange = function(widget, text, data)
event.name = 'onOptionChange'
event.text = text
event.data = data
execEventCall()
end
})
elseif widget.__class == 'UIRadioGroup' then
controller:registerEvents(widget, {
onSelectionChange = function(widget, selectedWidget, previousSelectedWidget)
event.name = 'onSelectionChange'
event.selectedWidget = selectedWidget
event.previousSelectedWidget = previousSelectedWidget
execEventCall()
end
})
elseif widget.__class == 'UICheckBox' then
controller:registerEvents(widget, {
onCheckChange = function(widget, checked)
event.name = 'onCheckChange'
event.checked = checked
execEventCall()
end
})
elseif widget.__class == 'UIScrollBar' then
controller:registerEvents(widget, {
onValueChange = function(widget, value, delta)
event.name = 'onValueChange'
event.value = value
event.delta = delta
execEventCall()
end
})
elseif widget.setValue then
controller:registerEvents(widget, {
onValueChange = function(widget, value)
event.name = 'onValueChange'
event.value = value
execEventCall()
end
})
else
controller:registerEvents(widget, {
onTextChange = function(widget, value)
event.name = 'onTextChange'
event.value = value
execEventCall()
end
})
end
return
end
local trEventName = EVENTS_TRANSLATED[eventName]
if not trEventName then
pwarning('[' .. HTML_PATH .. ']:' .. el.name .. ' Event ' .. eventName .. ' does not exist.')
return
end
local data = {}
data[trEventName] = function(widget, value)
event.name = trEventName
event.value = value
execEventCall()
end
controller:registerEvents(widget, data)
end
local onCreateWidget = function(el, widget, controller)
local getFncSet = function(exp)
local f = loadstring('return function(self, value) ' .. exp .. '=value end')
return f and f() or nil
end
if el.attributes['*checked'] then
local set = getFncSet(el.attributes['*checked'])
if set then
controller:registerEvents(widget, {
onCheckChange = function(widget, value)
set(controller, value)
end
})
end
end
if el.attributes['*value'] then
local set = getFncSet(el.attributes['*value'])
if set then
if widget.getCurrentOption then
controller:registerEvents(widget, {
onOptionChange = function(widget, text, data)
set(controller, data)
end
})
else
controller:registerEvents(widget, {
onTextChange = function(widget, value)
set(controller, value)
end
})
end
end
end
end
local function setText(el, text)
if text then
local whiteSpace = el.style and el.style['white-space'] or 'nowrap'
el.widget:setTextWrap(true)
if whiteSpace == 'normal' then
text = text:trim()
elseif whiteSpace == 'nowrap' then
text = text:gsub(" ", ""):gsub("[\n\r\t]", " ")
el.widget:setTextWrap(false)
elseif whiteSpace == 'pre' then
el.widget:setTextWrap(false)
end
el.widget:setText(text)
end
end
local createRadioGroup = function(el, groups, controller)
local name = el.attributes.name
if not name then
return
end
if not groups[name] then
groups[name] = UIRadioGroup.create()
end
groups[name]:addWidget(el.widget)
end
local function afterLoadElement(el)
if el.name == 'hr' then
if el.widget:hasAnchoredLayout() then
el.widget:addAnchor(AnchorLeft, 'parent', AnchorLeft)
el.widget:addAnchor(AnchorRight, 'parent', AnchorRight)
end
end
if #el.nodes == 0 then
setText(el, el:getcontent())
end
end
return parseEvents, onCreateWidget, setText, createRadioGroup, afterLoadElement