otclient-redemption/modules/corelib/ui/uimessagebox.lua
2025-02-14 21:25:02 -03:00

211 lines
6.5 KiB
Lua

if not UIMiniWindow then
dofile 'uiminiwindow'
end
-- @docclass
UIMessageBox = extends(UIMiniWindow, 'UIMessageBox')
-- messagebox cannot be created from otui files
function UIMessageBox.create(title, okCallback, cancelCallback)
local calendar = UIMessageBox.internalCreate()
return calendar
end
function UIMessageBox.display(title, message, buttons, onEnterCallback, onEscapeCallback)
local staticSizes = {
width = {
max = 916,
min = 116
},
height = {
min = 56,
max = 616
}
}
local currentSizes = {
width = 0,
height = 0
}
local messageBox = g_ui.createWidget('MessageBoxWindow', rootWidget)
messageBox.title = messageBox:getChildById('title')
messageBox.title:setText(title)
messageBox.content = messageBox:getChildById('content')
messageBox.content:setText(message)
messageBox.content:resizeToText()
messageBox.content:resize(messageBox.content:getWidth(), messageBox.content:getHeight())
currentSizes.width = currentSizes.width + messageBox.content:getWidth() + 32
currentSizes.height = currentSizes.height + messageBox.content:getHeight() + 20
messageBox.holder = messageBox:getChildById('holder')
currentSizes.height = currentSizes.height + 22
for i = 1, #buttons do
local button = messageBox:addButton(buttons[i].text, buttons[i].callback)
button:addAnchor(AnchorTop, 'parent', AnchorTop)
if i == 1 then
button:addAnchor(AnchorRight, 'parent', AnchorRight)
currentSizes.height = currentSizes.height + button:getHeight() + 22
else
button:addAnchor(AnchorRight, 'prev', AnchorLeft)
button:setMarginRight(10)
end
end
messageBox:setWidth(math.min(staticSizes.width.max, math.max(staticSizes.width.min, currentSizes.width)))
messageBox:setHeight(math.min(staticSizes.height.max, math.max(staticSizes.height.min, currentSizes.height)))
if onEnterCallback then
connect(messageBox, {
onEnter = onEnterCallback
})
end
if onEscapeCallback then
connect(messageBox, {
onEscape = onEscapeCallback
})
end
return messageBox
end
function displayInfoBox(title, message)
local messageBox
local defaultCallback = function()
messageBox:ok()
end
messageBox = UIMessageBox.display(title, message, {{
text = 'Ok',
callback = defaultCallback
}}, defaultCallback, defaultCallback)
return messageBox
end
function displayErrorBox(title, message)
local messageBox
local defaultCallback = function()
messageBox:ok()
end
messageBox = UIMessageBox.display(title, message, {{
text = 'Ok',
callback = defaultCallback
}}, defaultCallback, defaultCallback)
return messageBox
end
function displayCancelBox(title, message)
local messageBox
local defaultCallback = function()
messageBox:cancel()
end
messageBox = UIMessageBox.display(title, message, {{
text = 'Cancel',
callback = defaultCallback
}}, defaultCallback, defaultCallback)
return messageBox
end
function displayGeneralBox(title, message, buttons, onEnterCallback, onEscapeCallback)
return UIMessageBox.display(title, message, buttons, onEnterCallback, onEscapeCallback)
end
function displayGeneralSHOPBox(title, message,description, buttons, onEnterCallback, onEscapeCallback)
return UIMessageBox.displaySHOP(title, message,description, buttons, onEnterCallback, onEscapeCallback)
end
function UIMessageBox:addButton(text, callback)
local holder = self:getChildById('holder')
local button = g_ui.createWidget('QtButton', holder)
button:setWidth(math.max(48, 10 + (string.len(text) * 8)))
button:setHeight(20)
button:setText(text)
connect(button, {
onClick = callback
})
return button
end
function UIMessageBox:ok()
signalcall(self.onOk, self)
self.onOk = nil
self:destroy()
end
function UIMessageBox:cancel()
signalcall(self.onCancel, self)
self.onCancel = nil
self:destroy()
end
function UIMessageBox.displaySHOP(title, message, description, buttons, onEnterCallback, onEscapeCallback)
local staticSizes = {
width = {
max = 390,
min = 390
},
height = {
min = 200,
max = 200
}
}
local currentSizes = {
width = 0,
height = 0
}
local messageBox = g_ui.createWidget('MessageBoxShopWindow', rootWidget)
messageBox.title = messageBox:getChildById('title')
messageBox.title:setText(title)
messageBox.title:setTextAutoResize(true)
messageBox.content = messageBox:getChildById('content')
messageBox.content:setText(message)
messageBox.content:setTextAutoResize(true)
messageBox.content:setTextWrap(true)
messageBox.content:setTextAlign(AlignCenter)
messageBox.additionalLabel:setText(description)
messageBox.additionalLabel:setTextWrap(true)
messageBox.additionalLabel:setTextAlign(AlignCenter)
local contentWidth = messageBox.content:getTextSize().width + messageBox.content:getPaddingLeft() + messageBox.content:getPaddingRight()
local contentHeight = messageBox.content:getHeight() + messageBox.content:getPaddingTop() + messageBox.content:getPaddingBottom()
currentSizes.width = contentWidth + 32
currentSizes.height = contentHeight + 20
messageBox.holder = messageBox:getChildById('holder')
currentSizes.height = currentSizes.height + 22
for i = 1, #buttons do
local button = messageBox:addButton(buttons[i].text, buttons[i].callback)
button:addAnchor(AnchorTop, 'parent', AnchorTop)
if i == 1 then
button:addAnchor(AnchorRight, 'parent', AnchorRight)
currentSizes.height = currentSizes.height + button:getHeight() + 22
button:setImageSource('/images/options/blue_large')
button:setImageClip("0 0 108 20")
else
button:addAnchor(AnchorRight, 'prev', AnchorLeft)
button:setMarginRight(10)
end
end
messageBox:setWidth(currentSizes.width)
messageBox:setHeight(math.min(staticSizes.height.max, math.max(staticSizes.height.min, currentSizes.height)))
if onEnterCallback then
connect(messageBox, {
onEnter = onEnterCallback
})
end
if onEscapeCallback then
connect(messageBox, {
onEscape = onEscapeCallback
})
end
return messageBox
end