mirror of
https://github.com/mehah/otclient
synced 2026-08-15 16:29:06 -04:00
198 lines
6.4 KiB
Lua
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
|