Ir para conteúdo

Modal window (tfs 1.2)


Peedbew

Posts Recomendados

Olá. Esse conteúdo foi desenvolvido pelo membro Non Sequitur, da Otland. Decidi trazer a vocês, então vamos lá.

 

 

MODAL WINDOW

A forma atual que podemos implementar Modal Windows é bastante complicada, de acordo com Non Sequitur. Ter de criá-la em algum lugar, registrar um evento, adicionar botões de alguma forma estranha para fazer funcionar, sem falar que tem que ter em conta ids de janelas, botões, ids de escolha em algum arquivo diferente, etc...

 

  • O que você pode fazer com isto?
-- The helper lib is used by passing a table value to the ModalWindow functionlocal window = ModalWindow {    title = 'Title',    message = 'Please, choose the lowest number and press [Ok]'}local lowestChoicefor i = 1, 5 do    local value = math.random(1, 100)    -- modalWindow:addChoice() returns the choice object that will be passed to the callbacks    local choice = window:addChoice(value)    -- This way we can pass extra information to the callback    choice.value = value    if not lowestChoice or lowestChoice.value > value then        lowestChoice = choice    endendlowestChoice.correct = true-- Add a button with a specific callbackwindow:addButton('Ok',    function(button, choice)        if choice.correct then            print('Player selected the correct option.')        else            print('Player selected the incorrect option.')        end    end)-- Set this button as the default enter buttonwindow:setDefaultEnterButton('Ok')-- Add a button without a specific callbackwindow:addButton('Close')window:setDefaultEscapeButton('Close')-- If a button without a specific callback is pressed, this fucntion will be calledwindow:setDefaultCallback(    function(button, choice)        print('Default callback, button pressed: ' .. button.text .. ' player choice: ' .. choice.text)    end)window:sendToPlayer(player)

 

Você pode usar este exemplo em uma talkaction e testar por si mesmo. Diferente do que é mostrado no código acima, você também pode usar modalWindow: addbuttons (...) e modalWindow: addChoices (...) para adicionar vários botões / opções ao mesmo tempo.

 

 

INSTALANDO

Em data/lib/lib.lua

dofile('data/lib/modalwindow.lua')

 

Crie o arquivo data/lib/modalwindow.lua

if not modalWindows then        modalWindows = {                modalWindowConstructor = ModalWindow,                nextFreeId = 500,                 windows = {}        }end local MT = {}MT.__index = MT function ModalWindow(...)        local args = {...}        if type(args[1]) == 'table' then                local self = setmetatable(args[1], MT)                local id = modalWindows.nextFreeId                             self.id = id                self.buttons = {}                self.choices = {}                self.players = {}                self.created = false                 modalWindows.nextFreeId = id + 1                table.insert(modalWindows.windows, self)                return self        end         return modalWindows.modalWindowConstructor(...)end function MT:setDefaultCallback(callback)        self.defaultCallback = callbackend function MT:addButton(text, callback)        local button = {text = tostring(text), callback = callback}        table.insert(self.buttons, button)        return buttonend function MT:addButtons(...)        for _, text in ipairs({...}) do                table.insert(self.buttons, {text = tostring(text)})        endend function MT:addChoice(text)        local choice = {text = tostring(text)}        table.insert(self.choices, choice)        return choiceend function MT:addChoices(...)        for _, text in ipairs({...}) do                table.insert(self.choices, {text = tostring(text)})        endend function MT:setDefaultEnterButton(text)        self.defaultEnterButton = textend function MT:setDefaultEscapeButton(text)        self.defaultEscapeButton = textend function MT:setTitle(title)        self.title = tostring(title)end function MT:setMessage(message)        self.message = tostring(message)end local buttonOrder = {        [4] = {3, 4, 2, 1},        [3] = {2, 3, 1},        [2] = {1, 2},        [1] = {1}}function MT:create()        local modalWindow = modalWindows.modalWindowConstructor(self.id, self.title, self.message)        local order = buttonOrder[math.min(#self.buttons, 4)]         if order then                for _, i in ipairs(order) do                        local button = self.buttons[i]                        modalWindow:addButton(i, button.text)                        button.id = i                         if button.text == self.defaultEnterButton then                                modalWindow:setDefaultEnterButton(i)                        elseif button.text == self.defaultEscapeButton then                                modalWindow:setDefaultEscapeButton(i)                        end                end        end         for _, choice in ipairs(self.choices) do                modalWindow:addChoice(_, choice.text)                choice.id = _        end         self.modalWindow = modalWindowend function MT:sendToPlayer(player)        if not self.modalWindow then                self:create()        end         player:registerEvent('ModalWindowHelper')        self.players[player:getId()] = true        return self.modalWindow:sendToPlayer(player)end

 

Em data/creaturescripts/creaturescripts.xml

<event type="modalwindow" name="ModalWindowHelper" script="modalwindowhelper.lua" />

 

Crie o arquivo data/creaturescripts/scripts/modalwindowhelper.lua

function onModalWindow(player, modalWindowId, buttonId, choiceId)        local modalWindow        for _, window in ipairs(modalWindows.windows) do                if window.id == modalWindowId then                        modalWindow = window                        break                end        end         if not modalWindow then                return true        end         local playerId = player:getId()        if not modalWindow.players[playerId] then                return true        end        modalWindow.players[playerId] = nil         local choice = modalWindow.choices[choiceId]         for _, button in ipairs(modalWindow.buttons) do                if button.id == buttonId then                        local callback = button.callback or modalWindow.defaultCallback                        if callback then                                callback(button, choice)                                break                        end                end        end         return trueend

 

 

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...