• 🏆 Texturing Contest #33 is OPEN! Contestants must re-texture a SD unit model found in-game (Warcraft 3 Classic), recreating the unit into a peaceful NPC version. 🔗Click here to enter!
  • It's time for the first HD Modeling Contest of 2024. Join the theme discussion for Hive's HD Modeling Contest #6! Click here to post your idea!

[Lua] ToggleIconButtonGroup

ToggleIconButtonGroup is an addon for ToggleIconButton. It combines multiple ones into a shared entity. The values for Buttons used in a ToggleIconButtonGroup should be unique power2 values.
Lua:
--[[
    ToggleIconButtonGroup 1.3 by Tasyen
uses ToggleIconButton by Tasyen

ToggleIconButtonGroup is a addon for ToggleIconButton. It combines multiple ones into a shared entity, the values for Buttons used in ToggleIconButtonGroup should be unique power2.

function CreateToggleIconButtonGroup(multiSelection, action, ...)
    create a Group with action happening when any button is toggled considering the sharedRules set by the individual buttons.
    multiSelection(false) unselect others before setting x, can also be changed later with groupObject.MultiSelection[player] = true/false.
    A ToggleIconButton inside a ToggleIconButtonGroup can not have a custom Action, because it is used by the ToggleIconButtonGroup, but the Group also supports an Action.
    afer action you can give any amount of ToggleIconButtonTables
    The actionfunction provides this args function(groupObject, buttonObject, player, groupValue)

function ToggleIconButtonGroupGetValue(groupObject, player)
function ToggleIconButtonGroupAddButton(groupObject, buttonObject)
function ToggleIconButtonGroupSetModeButton(groupObject[, buttonObject])
    define a ToggleIconButton as multiSelection mode toggle, this uses the Buttons ToggleIconButton Action.
function ToggleIconButtonGroupModeButton(groupObject, parent)
    Creates a default ModeButton for groupObject
    Returns the buttonObject of the new ModeButton
    The new Button still has to be placed
function ToggleIconButtonGroupClearButton(groupObject[, parent, iconPath])
    When the group does not have a Clear Button, then this creates a BUTTON that clears selection when clicked.
    Returns the clear Button-Frame of the group.
    The Button has to be placed after it is created.
function ToggleIconButtonGroupClear(groupObject, player)

--]]

ToggleIconButtonGroup = {}
ToggleIconButtonGroup.Action = function(object, player, enabled)
    local groupObject = object.Group
    if not groupObject.MultiSelection[player] then
        local oldValue = ToggleIconButtonGroupGetValue(groupObject, player)
        ToggleIconButtonGroupClear(groupObject, player)
        if enabled or oldValue ~= 0 then
            ToggleIconButtonSetValue(object, player, true)
        end
    end
    groupObject.Action(groupObject, object, player, ToggleIconButtonGroupGetValue(groupObject, player))
end


ToggleIconButtonGroup.ActionMode = function(object, player, enabled)
    object.Group.MultiSelection[player] = enabled
end

function ToggleIconButtonGroupClear(groupObject, player)
    for index, value in ipairs(groupObject) do
        ToggleIconButtonSetValue(value, player, false)
    end
end

function ToggleIconButtonGroupGetValue(groupObject, player)
    local returnValue = 0
    for index, value in ipairs(groupObject) do
        returnValue = returnValue + ToggleIconButtonGetValue(value, player)
    end
    return returnValue
end

function ToggleIconButtonGroupAddButton(groupObject, buttonObject)
    table.insert(groupObject, buttonObject)
    buttonObject.Action = ToggleIconButtonGroup.Action
    buttonObject.Group = groupObject
end

function ToggleIconButtonGroupSetModeButton(groupObject, buttonObject)
    groupObject.ModeButton = buttonObject
    buttonObject.Action = ToggleIconButtonGroup.ActionMode
    buttonObject.Group = groupObject
    return buttonObject   
end

function ToggleIconButtonGroupModeButton(groupObject, parent)
    if groupObject.ModeButton then return groupObject.ModeButton end
    if not parent then parent = BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0) end
    local buttonObject = ToggleIconButtonGroupSetModeButton(groupObject, CreateToggleIconButton(parent, 1, "MultiSelection", "ui\\widgets\\battlenet\\bnet-mainmenu-customteam-up", nil, "UI\\Widgets\\Glues\\GlueScreen-ROC-EditionButton-up", "SingleSelection"))
    -- start with multiselection mode enabled?
    for index = 0, bj_MAX_PLAYERS - 1 do ToggleIconButtonSetValue(groupObject.ModeButton, Player(index), groupObject.MultiSelection[Player(index)]) end
    return buttonObject
end


function ToggleIconButtonGroupClearButton(groupObject, parent, iconPath)
    -- only one clearButton
    if not groupObject.ClearButton then
        -- default optional values
        if not parent then parent = BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0) end
        if not iconPath then iconPath = "ReplaceableTextures\\CommandButtons\\BTNCancel" end

        local button = BlzCreateFrameByType("BUTTON", "ToggleIconButtonGroupClearButton", parent, "", 0)
        local buttonIcon = BlzCreateFrameByType("BACKDROP", "ToggleIconButtonGroupClearButtonIcon", button, "", 0)
        BlzFrameSetSize(button, ToggleIconButton.DefaultSizeX, ToggleIconButton.DefaultSizeY)
        BlzFrameSetAllPoints(buttonIcon, button)
        BlzFrameSetTexture(buttonIcon, "ReplaceableTextures\\CommandButtons\\BTNCancel", 0, false)
        ToggleIconButton.CreateTooltip(button, "Clear")       
        ToggleIconButtonGroup[button] = groupObject
        groupObject.ClearButton = button
        groupObject.ClearButtonIcon = buttonIcon
        if not ToggleIconButtonGroup.ClearTrigger then
            ToggleIconButtonGroup.ClearTrigger = CreateTrigger()
            ToggleIconButtonGroup.ClearTriggerAction = TriggerAddAction(ToggleIconButtonGroup.ClearTrigger, function()
                local button = BlzGetTriggerFrame()
                local groupObject = ToggleIconButtonGroup[button]
                local player = GetTriggerPlayer()
                StartSoundForPlayerBJ(player, ToggleIconButton.Sound)
                ToggleIconButtonGroupClear(groupObject, player)
                -- remove focus
                BlzFrameSetEnable(button, false)
                BlzFrameSetEnable(button, true)
                groupObject.Action(groupObject, nil, player, ToggleIconButtonGroupGetValue(groupObject, player))
            end)
        end
        BlzTriggerRegisterFrameEvent(ToggleIconButtonGroup.ClearTrigger, button, FRAMEEVENT_CONTROL_CLICK)
        return button
    else
        return groupObject.ClearButton
    end
end

function CreateToggleIconButtonGroup(multiSelection, action, ...)
    local object = {MultiSelection = __jarray(multiSelection), Action = action}
    for index, value in ipairs({...})  do ToggleIconButtonGroupAddButton(object, value) end
    return object
end
Changelog:
V1.3
Moved the Trigger Creation out of the Lua Root, into the creator functions.
The Clear Button will execute the GroupAction without an object.​
V1.2
One could not deselect the selected category in singleselection mode
Added default Creators for Clear & ModeButton
MultiSelection Mode is now synced knowlage (array)​
V1.1 adjusted ToggleIconButtonGroupGetValue to fit ToggleIconButton1.1
 
Last edited:
Updated to V1.2)
Added functions to create default Clear & Mode Buttons for you. This buttons don't have positions on default.
Fixed bugs in single selection mode.
The Selection mode is now known to all players, it is now handled by an array instead of an boolean (takes a more memory but saves one from some problems in partly shared Groups).
 
Top