Chili%3AExample_3 - beyond-all-reason/springrts_engine_wiki_mirror GitHub Wiki

Chili build/order menu

This is a very basic menu that displays a button for each command currently available.

function widget:GetInfo()
    return {
        name    = "Command Menu",
        desc    = "Shows a button for each order that can currently be given",
        author  = "Turnips",
        date    = "2016",
        license = "GNU GPL v2 or later",
        layer   = math.pi,
        enabled = true,
        handler = true,
    }
end

local Chili, window, orderGrid, buildGrid
local updateRequired

-----------------------
-- buttons

local ignoreCMDs = {
    timewait=true,
    deathwait=true,
    squadwait=true,
    gatherwait=true,
    loadonto=true,
}

function ActionCommand(self, x, y, button, mods)
    local index = Spring.GetCmdDescIndex(self.cmdID)
    if index then
        local left, right = (button == 1), (button == 3)
        local alt, ctrl, meta, shift = mods.alt, mods.ctrl, mods.meta, mods.shift
        Spring.SetActiveCommand(index, button, left, right, alt, ctrl, meta, shift)
    end
end

function OrderButton(cmd)
    local button = Chili.Button:New{
        name = "orderButton_" .. cmd.action,
        cmdID = cmd.id,
        caption = cmd.name,
        padding = {0,0,0,0},
        margin = {0,0,0,0},
        OnMouseUp = {ActionCommand},
    }
    orderGrid:AddChild(button)
end

function StateButton(cmd)
    local button = Chili.Button:New{
        name = "stateButton_" .. cmd.action,
        cmdID = cmd.id,
        caption = cmd.params[cmd.params[1] + 2],
        padding = {0,0,0,0},
        margin = {0,0,0,0},
        OnMouseUp = {ActionCommand},
    }
    stateGrid:AddChild(button)
end

function UnitButton(cmd)
    local uDID = -cmd.id
    local unitDef = UnitDefs[uDID]
    local name = unitDef.name

    local image = Chili.Image:New{
        name   = "unitImage_" .. name,
        height = '100%',
        width = '100%',
        file   = '#'..unitDef.id,
        -- flip = false,
    }
    local button = Chili.Button:New{
        name = "unitButton_" .. name,
        cmdID = cmd.id,
        caption = "",
        children = {image},
        padding = {0,0,0,0},
        margin = {0,0,0,0},
        OnMouseUp = {ActionCommand},
    }
    buildGrid:AddChild(button)
end

function ParseCmd(cmd)
    if UnitDefNames[cmd.name] then
        -- unit
        UnitButton(cmd)
    elseif #cmd.params > 1 then
        -- state
        StateButton(cmd)
    else
        -- order
        OrderButton(cmd)
    end
end

function ParseCmds()
    -- clean out the grids & repopulate
    buildGrid:ClearChildren()
    orderGrid:ClearChildren()
    stateGrid:ClearChildren()

    local cmds = Spring.GetActiveCmdDescs()
    local haveCmd = false
    for _,cmd in ipairs(cmds) do
        if cmd.name ~= '' and not (ignoreCMDs[cmd.name] or ignoreCMDs[cmd.action]) then
            haveCmd = true
            ParseCmd(cmd)
        end
    end

    if haveCmd and window.hidden then window:Show() elseif not haveCmd and window.visible then window:Hide() end
end

-----------------------
-- callins

function LayoutHandler(xIcons, yIcons, cmdCount, commands)
    -- its really better not to think about this bit
    -- you may need to change widgetHandler to plain handler, dependent on your games lua internals
    widgetHandler.commands   = commands
    widgetHandler.commands.n = cmdCount
    widgetHandler:CommandsChanged()
    local reParamsCmds = {}
    local customCmds = {}

    return "", xIcons, yIcons, {}, customCmds, {}, {}, {}, {}, reParamsCmds, {[1337]=9001}
end

function widget:Initialize()
    widgetHandler:ConfigLayoutHandler(LayoutHandler)
    Spring.ForceLayoutUpdate()

    if not WG.Chili then
        widgetHandler:RemoveWidget()
        return
    end

    Chili = WG.Chili

    stateGrid = Chili.Grid:New{
        name = "stateGrid",
        x = '0%',
        y = '0%',
        width = '100%',
        height = '15%',
        rows = 3,
        columns = 3,
        padding = {0,0,0,0},
    }

    orderGrid = Chili.Grid:New{
        name = "orderGrid",
        x = '0%',
        y = '15%',
        width = '100%',
        height = '25%',
        rows = 5,
        columns = 3,
        padding = {0,0,0,0},
    }

    buildGrid = Chili.Grid:New{
        name = "buildGrid",
        x = '0%',
        y = '40%',
        width = '100%',
        height = '60%',
        rows = 6,
        columns = 5,
        padding = {0,0,0,0},
    }

    window = Chili.Window:New{
        name = "window",
        parent = Chili.Screen0,
        x = '0%',
        y = '25%',
        height = '65%',
        width = '30%',
        children = {stateGrid, orderGrid, buildGrid},
    }

    window:Hide()
end

function widget:CommandsChanged()
    updateRequired = true -- the active cmd descs haven't changed yet; wait until the next widget:Update
end

function widget:Update()
    if updateRequired then
        ParseCmds()
        updateRequired = false
    end
end

function widget:Shutdown()
    widgetHandler:ConfigLayoutHandler(nil)
    Spring.ForceLayoutUpdate()
end

Category:Libraries Category:Tutorial