mirror of
				https://github.com/OTCv8/otclientv8.git
				synced 2025-10-31 10:56:24 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			167 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			167 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| local activeWindow
 | |
| 
 | |
| function init()
 | |
|   g_ui.importStyle('textedit')
 | |
| 
 | |
|   connect(g_game, { onGameEnd = destroyWindow })
 | |
| end
 | |
| 
 | |
| function terminate()
 | |
|   disconnect(g_game, { onGameEnd = destroyWindow })
 | |
| 
 | |
|   destroyWindow()
 | |
| end
 | |
| 
 | |
| function destroyWindow()
 | |
|   if activeWindow then
 | |
|     activeWindow:destroy()
 | |
|     activeWindow = nil
 | |
|   end
 | |
| end
 | |
| 
 | |
| -- also works as show(text, callback)
 | |
| function show(text, options, callback) -- callback = function(newText)
 | |
|   --[[
 | |
|     Available options:
 | |
|       title = text
 | |
|       description = text
 | |
|       multiline = true / false
 | |
|       width = number
 | |
|       validation = text (regex)
 | |
|       range = {number, number}
 | |
|       examples = {{name, text}, {name, text}}
 | |
|   ]]--
 | |
|   if type(text) == 'userdata' then
 | |
|     local widget = text
 | |
|     callback = function(newText)
 | |
|       widget:setText(newText)
 | |
|     end
 | |
|     text = widget:getText()
 | |
|   elseif type(text) == 'number' then
 | |
|     text = tostring(text)
 | |
|   elseif type(text) == 'nil' then
 | |
|     text = ''
 | |
|   elseif type(text) ~= 'string' then
 | |
|     return error("Invalid text type for client_textedit: " .. type(text))
 | |
|   end
 | |
|   if type(options) == 'function' then
 | |
|     local tmp = callback
 | |
|     callback = options
 | |
|     options = callback
 | |
|   end
 | |
|   options = options or {}
 | |
| 
 | |
|   if activeWindow then
 | |
|     destroyWindow()
 | |
|   end
 | |
| 
 | |
|   local window
 | |
|   if options.multiline then
 | |
|     window = g_ui.createWidget('MultilineTextEditWindow', rootWidget)
 | |
|     window.text = window.textPanel.text
 | |
|   else
 | |
|     window = g_ui.createWidget('SinglelineTextEditWindow', rootWidget)
 | |
|   end
 | |
|   -- functions
 | |
|   local validate = function(text)
 | |
|     if type(options.range) == 'table' then
 | |
|       local value = tonumber(text)
 | |
|       return value >= options.range[1] and value <= options.range[2]
 | |
|     elseif type(options.validation) == 'string' and options.validation:len() > 0 then
 | |
|       return #regexMatch(text, options.validation) == 1
 | |
|     end
 | |
|     return true
 | |
|   end
 | |
|   local destroy = function()
 | |
|     window:destroy()
 | |
|   end
 | |
|   local doneFunc = function()
 | |
|     local text = window.text:getText()
 | |
|     if not validate(text) then return end
 | |
|     destroy()
 | |
|     if callback then
 | |
|       callback(text)
 | |
|     end
 | |
|   end
 | |
|   
 | |
|   window.buttons.ok.onClick = doneFunc
 | |
|   window.buttons.cancel.onClick = destroy
 | |
|   if not options.multiline then
 | |
|     window.onEnter = doneFunc
 | |
|   end
 | |
|   window.onEscape = destroy
 | |
|   window.onDestroy = function()
 | |
|     if window == activeWindow then
 | |
|       activeWindow = nil
 | |
|     end
 | |
|   end
 | |
|   
 | |
|   if options.title then
 | |
|     window:setText(options.title)
 | |
|   end
 | |
|   if options.description then
 | |
|     window.description:show()
 | |
|     window.description:setText(options.description)
 | |
|   end
 | |
|   if type(options.examples) == 'table' and #options.examples > 0 then
 | |
|     window.examples:show()
 | |
|     for i, title_text in ipairs(options.examples) do
 | |
|       window.examples:addOption(title_text[1], title_text[2])
 | |
|     end
 | |
|     window.examples.onOptionChange = function(widget, option, data)
 | |
|       window.text:setText(data)
 | |
|       window.text:setCursorPos(-1)
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   window.text:setText(text)
 | |
|   window.text:setCursorPos(-1)
 | |
| 
 | |
|   window.text.onTextChange = function(widget, text)
 | |
|     if validate(text) then
 | |
|       window.buttons.ok:enable()
 | |
|       if g_app.isMobile() then
 | |
|         doneFunc()
 | |
|       end
 | |
|     else
 | |
|       window.buttons.ok:disable()
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   if type(options.width) == 'number' then
 | |
|     window:setWidth(options.width)
 | |
|   end
 | |
| 
 | |
|   activeWindow = window
 | |
|   activeWindow:raise()
 | |
|   activeWindow:focus()
 | |
|   if g_app.isMobile() then
 | |
|     window.text:focus()
 | |
|     local flags = 0
 | |
|     if options.multiline then
 | |
|       flags = 1
 | |
|     end
 | |
|     g_window.showTextEditor(window:getText(), window.description:getText(), window.text:getText(), flags)
 | |
|   end
 | |
|   return activeWindow
 | |
| end
 | |
| 
 | |
| function hide()
 | |
|   destroyWindow()
 | |
| end
 | |
| 
 | |
| function edit(...)
 | |
|   return show(...)
 | |
| end
 | |
| 
 | |
| -- legacy
 | |
| function singlelineEditor(text, callback)
 | |
|   return show(text, {}, callback)
 | |
| end
 | |
| 
 | |
| -- legacy
 | |
| function multilineEditor(description, text, callback)
 | |
|   return show(text, {description=description, multiline=true}, callback)
 | |
| end
 | |
| 
 | 
