Programmatically modifying the UI while respecting Edit Mode

The following code (when loaded via an addon, or perhaps via WeakAuras) does the following:

  1. Creates a layout object similar to what would be saved when creating an Edit Mode profile.
  2. Creates a dummy frame with the ADDON_LOADED event registered.
  3. Sets an OnEvent script to check and confirm that Blizzard_PlayerChoice (Blizzard addon, part of WoW already) is loaded. This Blizzard addon must be loaded before you can interact with Edit Mode profiles and layouts.
  4. Retrieves existing layouts and checks to see whether or not the new one exists already before attempting to add it.
  5. Checks to see if the new layout is activated or not. If not, it activates it.

Of note:

  • This code only runs once, when first logging into a character.
  • There’s a GetRatioWidth helper function, but it’s not necessary.
  • All of the settings still have to adhere to Edit Mode limitations, though you can somewhat skirt around some size and/or dimensional settings by leveraging the anchorInfo2 optional bit (see what’s been done in the example below for ObjectiveTracker).
  • This code doesn’t rely on any addon libraries or anything else, just pure WoW APIs.
  • If you want to further fine-tune UI elements (like whether they show or not), you’ll likely need to manually modify child frames and elements within the Edit Mode elements (since the game is REALLY picky about modifying the frames controlled by Edit Mode).
---------------------------------------------------------------------
-- Initialization
---------------------------------------------------------------------
local MyAddon, addon = ...
addon.UI = addon.UI or CreateFrame("Frame", "MyAddon.UI", UIParent)

addon.UI.GetRatioWidth = addon.UI.GetRatioWidth or function()
    local _, screenHeight = GetPhysicalScreenSize()
    local aspectRatioWidth, aspectRatioHeight = 16, 9
    local desiredHeight = screenHeight
    local desiredWidth = desiredHeight * (aspectRatioWidth / aspectRatioHeight)

    return desiredWidth
end

addon.UI.Layout = {
    layoutName = MyAddon,
    layoutType = 1,
    systems = {
        [1] = { -- Action Bar 1
            settings = {
                [1] = { -- Orientation: 0 = horizontal, 1 = vertical
                    value = 0,
                    setting = 0,
                },
                [2] = { -- # of Rows, 1 through 4
                    value = 2,
                    setting = 1,
                },
                [3] = { -- # of Icons, 6 through 12
                    value = 12,
                    setting = 2,
                },
                [4] = { -- Icon Size, 0 = 50%, 15 = 200%, so "50% + (num x 10%)"
                    value = 5,
                    setting = 3,
                },
                [5] = { -- Icon Padding, 2 through 10
                    value = 10,
                    setting = 4,
                },
                [6] = { -- Hide Bar Art, 0 = false, 1 = true
                    value = 1,
                    setting = 6,
                },
                [7] = { -- Hide Bar Scrolling, 0 = false, 1 = true
                    value = 1,
                    setting = 8,
                },
                [8] = { -- Always Show Buttons, 0 = false, 1 = true
                    value = 1,
                    setting = 9,
                },
            },
            anchorInfo = {
                point = "RIGHT",
                relativeTo = "Minimap",
                relativePoint = "LEFT",
                offsetX = -20,
                offsetY = 0,
            },
            isInDefaultPosition = false,
            systemIndex = 1, -- Represents Action Bar "1", because there are multiple Action Bars
            system = 0, -- Represents an "ActionBar" type of element within Edit Mode
        },
        [2] = { -- Action Bar 2
            settings = {
                [1] = { -- Orientation: 0 = horizontal, 1 = vertical
                    value = 0,
                    setting = 0,
                },
                [2] = { -- # of Rows, 1 through 4
                    value = 2,
                    setting = 1,
                },
                [3] = { -- # of Icons, 6 through 12
                    value = 12,
                    setting = 2,
                },
                [4] = { -- Icon Size, 0 = 50%, 15 = 200%, so "50% + (num x 10%)"
                    value = 5,
                    setting = 3,
                },
                [5] = { -- Icon Padding, 2 through 10
                    value = 10,
                    setting = 4,
                },
                [6] = { -- Bar Visible, 0 = Always Visible, 1 = In Combat, 2 = Out of Combat, 3 = Hidden
                    value = 0,
                    setting = 5,
                },
                [7] = { -- Always Show Buttons, 0 = false, 1 = true
                    value = 1,
                    setting = 9,
                },
            },
            anchorInfo = {
                point = "LEFT",
                relativeTo = "Minimap",
                relativePoint = "Right",
                offsetX = 20,
                offsetY = 0,
            },
            isInDefaultPosition = false,
            systemIndex = 2, -- Represents Action Bar "2", because there are multiple Action Bars
            system = 0, -- Represents an "ActionBar" type of element within Edit Mode
        },
        [3] = { -- Action Bar 3
            settings = {
                [1] = { -- Orientation: 0 = horizontal, 1 = vertical
                    value = 0,
                    setting = 0,
                },
                [2] = { -- # of Rows, 1 through 4
                    value = 1,
                    setting = 1,
                },
                [3] = { -- # of Icons, 6 through 12
                    value = 12,
                    setting = 2,
                },
                [4] = { -- Icon Size, 0 = 50%, 15 = 200%, so "50% + (num x 10%)"
                    value = 5,
                    setting = 3,
                },
                [5] = { -- Icon Padding, 2 through 10
                    value = 2,
                    setting = 4,
                },
                [6] = { -- Bar Visible, 0 = Always Visible, 1 = In Combat, 2 = Out of Combat, 3 = Hidden
                    value = 0,
                    setting = 5,
                },
                [7] = { -- Always Show Buttons, 0 = false, 1 = true
                    value = 1,
                    setting = 9,
                },
            },
            anchorInfo = {
                point = "TOP",
                relativeTo = "UIParent",
                relativePoint = "TOP",
                offsetX = 0,
                offsetY = 0,
            },
            isInDefaultPosition = false,
            systemIndex = 3, -- Represents Action Bar "3", because there are multiple Action Bars
            system = 0, -- Represents an "ActionBar" type of element within Edit Mode
        },
        [4] = { -- Action Bar 4
            settings = {
                [1] = { -- Orientation: 0 = horizontal, 1 = vertical
                    value = 0,
                    setting = 0,
                },
                [2] = { -- # of Rows, 1 through 4
                    value = 1,
                    setting = 1,
                },
                [3] = { -- # of Icons, 6 through 12
                    value = 12,
                    setting = 2,
                },
                [4] = { -- Icon Size, 0 = 50%, 15 = 200%, so "50% + (num x 10%)"
                    value = 5,
                    setting = 3,
                },
                [5] = { -- Icon Padding, 2 through 10
                    value = 2,
                    setting = 4,
                },
                [6] = { -- Bar Visible, 0 = Always Visible, 1 = In Combat, 2 = Out of Combat, 3 = Hidden
                    value = 0,
                    setting = 5,
                },
                [7] = { -- Always Show Buttons, 0 = false, 1 = true
                    value = 1,
                    setting = 9,
                },
            },
            anchorInfo = {
                point = "TOP",
                relativeTo = "UIParent",
                relativePoint = "TOP",
                offsetX = 0,
                offsetY = 0,
            },
            isInDefaultPosition = false,
            systemIndex = 4, -- Represents Action Bar "4", because there are multiple Action Bars
            system = 0, -- Represents an "ActionBar" type of element within Edit Mode
        },
        [5] = { -- Action Bar 5
            settings = {
                [1] = { -- Orientation: 0 = horizontal, 1 = vertical
                    value = 0,
                    setting = 0,
                },
                [2] = { -- # of Rows, 1 through 4
                    value = 1,
                    setting = 1,
                },
                [3] = { -- # of Icons, 6 through 12
                    value = 12,
                    setting = 2,
                },
                [4] = { -- Icon Size, 0 = 50%, 15 = 200%, so "50% + (num x 10%)"
                    value = 5,
                    setting = 3,
                },
                [5] = { -- Icon Padding, 2 through 10
                    value = 2,
                    setting = 4,
                },
                [6] = { -- Bar Visible, 0 = Always Visible, 1 = In Combat, 2 = Out of Combat, 3 = Hidden
                    value = 0,
                    setting = 5,
                },
                [7] = { -- Always Show Buttons, 0 = false, 1 = true
                    value = 1,
                    setting = 9,
                },
            },
            anchorInfo = {
                point = "TOP",
                relativeTo = "UIParent",
                relativePoint = "TOP",
                offsetX = 0,
                offsetY = 0,
            },
            isInDefaultPosition = false,
            systemIndex = 5, -- Represents Action Bar "5", because there are multiple Action Bars
            system = 0, -- Represents an "ActionBar" type of element within Edit Mode
        },
        [6] = { -- Action Bar 6
            settings = {
                [1] = { -- Orientation: 0 = horizontal, 1 = vertical
                    value = 0,
                    setting = 0,
                },
                [2] = { -- # of Rows, 1 through 4
                    value = 1,
                    setting = 1,
                },
                [3] = { -- # of Icons, 6 through 12
                    value = 12,
                    setting = 2,
                },
                [4] = { -- Icon Size, 0 = 50%, 15 = 200%, so "50% + (num x 10%)"
                    value = 5,
                    setting = 3,
                },
                [5] = { -- Icon Padding, 2 through 10
                    value = 2,
                    setting = 4,
                },
                [6] = { -- Bar Visible, 0 = Always Visible, 1 = In Combat, 2 = Out of Combat, 3 = Hidden
                    value = 0,
                    setting = 5,
                },
                [7] = { -- Always Show Buttons, 0 = false, 1 = true
                    value = 1,
                    setting = 9,
                },
            },
            anchorInfo = {
                point = "TOP",
                relativeTo = "UIParent",
                relativePoint = "TOP",
                offsetX = 0,
                offsetY = 0,
            },
            isInDefaultPosition = false,
            systemIndex = 6, -- Represents Action Bar "6", because there are multiple Action Bars
            system = 0, -- Represents an "ActionBar" type of element within Edit Mode
        },
        [7] = { -- Action Bar 7
            settings = {
                [1] = { -- Orientation: 0 = horizontal, 1 = vertical
                    value = 0,
                    setting = 0,
                },
                [2] = { -- # of Rows, 1 through 4
                    value = 1,
                    setting = 1,
                },
                [3] = { -- # of Icons, 6 through 12
                    value = 12,
                    setting = 2,
                },
                [4] = { -- Icon Size, 0 = 50%, 15 = 200%, so "50% + (num x 10%)"
                    value = 5,
                    setting = 3,
                },
                [5] = { -- Icon Padding, 2 through 10
                    value = 2,
                    setting = 4,
                },
                [6] = { -- Bar Visible, 0 = Always Visible, 1 = In Combat, 2 = Out of Combat, 3 = Hidden
                    value = 0,
                    setting = 5,
                },
                [7] = { -- Always Show Buttons, 0 = false, 1 = true
                    value = 1,
                    setting = 9,
                },
            },
            anchorInfo = {
                point = "TOP",
                relativeTo = "UIParent",
                relativePoint = "TOP",
                offsetX = 0,
                offsetY = 0,
            },
            isInDefaultPosition = false,
            systemIndex = 7, -- Represents Action Bar "7", because there are multiple Action Bars
            system = 0, -- Represents an "ActionBar" type of element within Edit Mode
        },
        [8] = { -- Action Bar 8
            settings = {
                [1] = { -- Orientation: 0 = horizontal, 1 = vertical
                    value = 0,
                    setting = 0,
                },
                [2] = { -- # of Rows, 1 through 4
                    value = 1,
                    setting = 1,
                },
                [3] = { -- # of Icons, 6 through 12
                    value = 12,
                    setting = 2,
                },
                [4] = { -- Icon Size, 0 = 50%, 15 = 200%, so "50% + (num x 10%)"
                    value = 5,
                    setting = 3,
                },
                [5] = { -- Icon Padding, 2 through 10
                    value = 2,
                    setting = 4,
                },
                [6] = { -- Bar Visible, 0 = Always Visible, 1 = In Combat, 2 = Out of Combat, 3 = Hidden
                    value = 0,
                    setting = 5,
                },
                [7] = { -- Always Show Buttons, 0 = false, 1 = true
                    value = 1,
                    setting = 9,
                },
            },
            anchorInfo = {
                point = "TOP",
                relativeTo = "UIParent",
                relativePoint = "TOP",
                offsetX = 0,
                offsetY = 0,
            },
            isInDefaultPosition = false,
            systemIndex = 8, -- Represents Action Bar "8", because there are multiple Action Bars
            system = 0, -- Represents an "ActionBar" type of element within Edit Mode
        },
        [9] = { -- Stance Bar
            settings = {
                [1] = { -- Orientation: 0 = horizontal, 1 = vertical
                    value = 1,
                    setting = 0,
                },
                [2] = { -- # of Rows, 1 through 4
                    value = 1,
                    setting = 1,
                },
                [3] = { -- Icon Size, 0 = 50%, 15 = 200%, so "50% + (num x 10%)"
                    value = 5,
                    setting = 3,
                },
                [4] = { -- Icon Padding, 2 through 10
                    value = 10,
                    setting = 4,
                },
            },
            anchorInfo = {
                point = "TOPRIGHT",
                relativeTo = "MainMenuBar",
                relativePoint = "TOPLEFT",
                offsetX = -10,
                offsetY = 0,
            },
            isInDefaultPosition = false,
            systemIndex = 11, -- Represents Action Bar "11" (Stance Bar), because there are multiple Action Bars
            system = 0, -- Represents an "ActionBar" type of element within Edit Mode
        },
        [10] = { -- Pet Bar
            settings = {
                [1] = { -- Orientation: 0 = horizontal, 1 = vertical
                    value = 0,
                    setting = 0,
                },
                [2] = { -- # of Rows, 1 through 4
                    value = 1,
                    setting = 1,
                },
                [3] = { -- Icon Size, 0 = 50%, 15 = 200%, so "50% + (num x 10%)"
                    value = 5,
                    setting = 3,
                },
                [4] = { -- Icon Padding, 2 through 10
                    value = 2,
                    setting = 4,
                },
                [5] = { -- Always Show Buttons, 0 = false, 1 = true
                    value = 0,
                    setting = 9,
                },
            },
            anchorInfo = {
                point = "TOPLEFT",
                relativeTo = "MainMenuBar",
                relativePoint = "BOTTOMLEFT",
                offsetX = 0,
                offsetY = -10,
            },
            isInDefaultPosition = false,
            systemIndex = 12, -- Represents Action Bar "12" (Pet Bar), because there are multiple Action Bars
            system = 0, -- Represents an "ActionBar" type of element within Edit Mode
        },
        [11] = { -- Possess Bar
            settings = {
                [1] = { -- Orientation: 0 = horizontal, 1 = vertical
                    value = 1,
                    setting = 0,
                },
                [2] = { -- # of Rows, 1 through 4
                    value = 1,
                    setting = 1,
                },
                [3] = { -- Icon Size, 0 = 50%, 15 = 200%, so "50% + (num x 10%)"
                    value = 5,
                    setting = 3,
                },
                [4] = { -- Icon Padding, 2 through 10
                    value = 10,
                    setting = 4,
                },
            },
            anchorInfo = {
                point = "TOPRIGHT",
                relativeTo = "MainMenuBar",
                relativePoint = "TOPLEFT",
                offsetX = -10,
                offsetY = 0,
            },
            isInDefaultPosition = false,
            systemIndex = 13, -- Represents Action Bar "13" (Possess Bar), because there are multiple Action Bars
            system = 0, -- Represents an "ActionBar" type of element within Edit Mode
        },
        [12] = { -- Castbar
            settings = {
                [1] = { -- Bar Size, 0 through 5, 0 = 100%, 5 = 150%, so "100% + (num x 10%)"
                    value = 0,
                    setting = 0,
                },
                [2] = { -- Lock To Player Frame, 0 = false, 1 = true
                    value = 0,
                    setting = 1,
                },
                [3] = { -- Show Cast Time, 0 = false, 1 = true
                    value = 0,
                    setting = 2,
                },
            },
            anchorInfo = {
                point = "BOTTOM",
                relativeTo = "VehicleSeatIndicator",
                relativePoint = "TOP",
                offsetX = 0,
                offsetY = 0,
            },
            isInDefaultPosition = false,
            system = 1, -- Represents a "CastBar" type of element within Edit Mode
        },
        [13] = { -- Minimap
            settings = {
                [1] = { -- Header Underneath, 0 = false, 1 = true
                    value = 1,
                    setting = 0,
                },
                [2] = { -- Rotate Minimap, 0 = false, 1 = true
                    value = 1,
                    setting = 1,
                },
                [3] = { -- Size, "50% + (num x 10%)"
                    value = 6,
                    setting = 2,
                },
            },
            anchorInfo = {
                point = "BOTTOM",
                relativeTo = "UIParent",
                relativePoint = "BOTTOM",
                offsetX = -8,
                offsetY = 0,
            },
            isInDefaultPosition = false,
            system = 2, -- Represents a "Minimap" type of element within Edit Mode
        },
        [14] = { -- Player Frame
            settings = {
                [1] = { -- Cast Bar Underneath, 0 = false, 1 = true
                    value = 0,
                    setting = 1,
                },
                [2] = { -- Frame Size, 0 through 20, "100% + (num * 5%)"
                    value = 0,
                    setting = 16,
                },
            },
            anchorInfo = {
                point = "BOTTOMLEFT",
                relativeTo = "MainMenuBar",
                relativePoint = "TOPLEFT",
                offsetX = -20,
                offsetY = 30,
            },
            isInDefaultPosition = false,
            systemIndex = 1,
            system = 3, -- Represents a "UnitFrame" type of element within Edit Mode
        },
        [15] = { -- Target Frame
            settings = {
                [1] = { -- Buffs On Top, 0 = false, 1 = true
                    value = 1,
                    setting = 2,
                },
                [2] = { -- Frame Size, 0 through 20, "100% + (num * 5%)"
                    value = 0,
                    setting = 16,
                },
            },
            anchorInfo = {
                point = "BOTTOMRIGHT",
                relativeTo = "MultiBarBottomLeft",
                relativePoint = "TOPRIGHT",
                offsetX = 20,
                offsetY = 30,
            },
            isInDefaultPosition = false,
            systemIndex = 2,
            system = 3, -- Represents a "UnitFrame" type of element within Edit Mode
        },
        [16] = { -- Focus Frame
            settings = {
                [1] = { -- Use Larger Frame, 0 = false, 1 = true
                    value = 0,
                    setting = 2,
                },
                [2] = { -- [Larger Frame] Buffs On Top, 0 = false, 1 = true
                    value = 1,
                    setting = 3,
                },
                [3] = { -- [Larger Frame] Frame Size, 0 through 20, "100% + (num * 5%)"
                    value = 0,
                    setting = 16,
                },
            },
            anchorInfo = {
                point = "TOPLEFT",
                relativeTo = "TargetFrame",
                relativePoint = "TOPRIGHT",
                offsetX = 10,
                offsetY = 0,
            },
            isInDefaultPosition = false,
            systemIndex = 3,
            system = 3, -- Represents a "UnitFrame" type of element within Edit Mode
        },
        [17] = { -- Party Frames
            settings = { -- Settings displayed change based on Raid-Style or not
                [1] = { -- Use Raid-Style Party Frames, 0 = false, 1 = true
                    value = 1,
                    setting = 4,
                },
                [2] = { -- [Party Style] Show Background, 0 = false, 1 = true
                    value = 0,
                    setting = 5,
                },
                [3] = { -- [Raid-Style] Use Horizontal Layout, 0 = false, 1 = true
                    value = 1,
                    setting = 6,
                },
                [4] = { -- [Raid-Style] Frame Width, 0 through 72 (Narrow to Wide)
                    value = 0,
                    setting = 10,
                },
                [5] = { -- [Raid-Style] Frame Height, 0 through 36 (Short to Tall)
                    value = 0,
                    setting = 11,
                },
                [6] = { -- [Raid-Style] Display Border, 0 = false, 1 = true
                    value = 0,
                    setting = 12,
                },
                [7] = { -- [Raid-Style] Sort By, 0 = Role, 1 = Group, 2 = Alphabetical
                    value = 0,
                    setting = 14,
                },
                [8] = { -- [Party Style] Frame Size, 0 through 20, "100% + (num * 5%)"
                    value = 0,
                    setting = 16,
                },
            },
            anchorInfo = {
                point = "BOTTOM",
                relativeTo = "EncounterBar",
                relativePoint = "TOP",
                offsetX = 0,
                offsetY = 0,
            },
            isInDefaultPosition = false,
            systemIndex = 4,
            system = 3, -- Represents a "UnitFrame" type of element within Edit Mode
        },
        [18] = { -- Raid Frames
            settings = { -- Some settings only appear under certain conditions
                [1] = { -- Raid Size, 0 = 10, 1 = 25, 2 = 40
                    value = 0,
                    setting = 9,
                },
                [2] = { -- Frame Width, 0 through 72 (Narrow to Wide)
                    value = 0,
                    setting = 10,
                },
                [3] = { -- Frame Height, 0 through 36 (Short to Tall)
                    value = 0,
                    setting = 11,
                },
                [4] = { -- Display Border, 0 = false, 1 = true
                    value = 0,
                    setting = 12,
                },
                [5] = { -- Groups, 0 = Separate Groups (Vertical), 1 = Separate Groups (Horizontal), 2 = Combine Groups (Vertical), 3 = Combine Groups (Horizontal)
                    value = 3,
                    setting = 13,
                },
                [6] = { -- [13: Combine Groups] Sort By, 0 = Role, 1 = Group, 2 = Alphabetical
                    value = 0,
                    setting = 14,
                },
                [7] = { -- [13: Combine Groups] Column/Row Size, 5 through 10
                    value = 10,
                    setting = 15,
                },
            },
            anchorInfo = {
                point = "BOTTOM",
                relativeTo = "EncounterBar",
                relativePoint = "TOP",
                offsetX = 0,
                offsetY = 0,
            },
            isInDefaultPosition = false,
            systemIndex = 5,
            system = 3, -- Represents a "UnitFrame" type of element within Edit Mode
        },
        [19] = { -- Boss Frames
            settings = {
                [1] = { -- Use Larger Frame, 0 = false, 1 = true
                    value = 0,
                    setting = 3,
                },
                [2] = { -- Cast Bar on Side, 0 = false, 1 = true
                    value = 1,
                    setting = 7,
                },
                [3] = { -- [Larger Frame] Frame Size, 0 through 20, "100% + (num * 5%)"
                    value = 0,
                    setting = 16,
                },
            },
            anchorInfo = {
                point = "TOPLEFT",
                relativeTo = "UIParent",
                relativePoint = "TOPLEFT",
                offsetX = 0,
                offsetY = 0,
            },
            isInDefaultPosition = false,
            systemIndex = 6,
            system = 3, -- Represents a "UnitFrame" type of element within Edit Mode
        },
        [20] = { -- Arena Frames
            settings = {
                [1] = { -- Frame Width, 0 through 72 (Narrow to Wide)
                    value = 0,
                    setting = 10,
                },
                [2] = { -- Frame Height, 0 through 36 (Short to Tall)
                    value = 0,
                    setting = 11,
                },
                [3] = { -- Display Border, 0 = false, 1 = true
                    value = 0,
                    setting = 12,
                },
                [4] = { -- Arena Size, 0 = 2v2, 1 = 3v3
                    value = 0,
                    setting = 17,
                },
            },
            anchorInfo = {
                point = "TOPLEFT",
                relativeTo = "UIParent",
                relativePoint = "TOPLEFT",
                offsetX = 0,
                offsetY = 0,
            },
            isInDefaultPosition = false,
            systemIndex = 7,
            system = 3, -- Represents a "UnitFrame" type of element within Edit Mode
        },
        [21] = { -- Pet Frame
            settings = {
                [1] = { -- Frame Size, 0 through 20, "100% + (num * 5%)"
                    value = 0,
                    setting = 16,
                },
            },
            anchorInfo = {
                point = "TOPRIGHT",
                relativeTo = "PlayerFrame",
                relativePoint = "TOPLEFT",
                offsetX = 0,
                offsetY = 0,
            },
            isInDefaultPosition = false,
            systemIndex = 8,
            system = 3, -- Represents a "UnitFrame" type of element within Edit Mode
        },
        [22] = { -- Encounter Bar
            settings = {},
            anchorInfo = {
                point = "BOTTOM",
                relativeTo = "PlayerCastingBarFrame",
                relativePoint = "TOP",
                offsetX = 0,
                offsetY = 0,
            },
            isInDefaultPosition = false,
            system = 4, -- Represents a "EncounterBar" type of element within Edit Mode
        },
        [23] = { -- Extra Abilities
            settings = {},
            anchorInfo = {
                point = "BOTTOM",
                relativeTo = "PlayerCastingBarFrame",
                relativePoint = "TOP",
                offsetX = 0,
                offsetY = 0,
            },
            isInDefaultPosition = false,
            system = 5, -- Represents a "ExtraAbilities" type of element within Edit Mode
        },
        [24] = { -- Buff Frames
            settings = {
                [1] = { -- Orientation, 0 = Horizontal, 1 = Vertical
                    value = 0,
                    setting = 0,
                },
                [2] = { -- Icon Wrap, 0 = Down / Left, 1 = Up / Right
                    value = 0,
                    setting = 1,
                },
                [3] = { -- Icon Direction 0 = Left / Down, 1 = Right / Up
                    value = 0,
                    setting = 2,
                },
                [4] = { -- Icon Limit, 2 through 32
                    value = 32,
                    setting = 3,
                },
                [5] = { -- Icon Size, 0 through 15, "50% + (num x 10%)"
                    value = 5,
                    setting = 5,
                },
                [6] = { -- Icon Padding, 5 through 15
                    value = 5,
                    setting = 6,
                },
            },
            anchorInfo = {
                point = "TOP",
                relativeTo = "UIParent",
                relativePoint = "TOP",
                offsetX = 0,
                offsetY = 0,
            },
            isInDefaultPosition = false,
            systemIndex = 1,
            system = 6, -- Represents a "AuraFrame" type of element within Edit Mode
        },
        [25] = { -- Debuff Frame
            settings = {
                [1] = { -- Orientation, 0 = Horizontal, 1 = Vertical
                    value = 0,
                    setting = 0,
                },
                [2] = { -- Icon Wrap, 0 = Down / Left, 1 = Up / Right
                    value = 1,
                    setting = 1,
                },
                [3] = { -- Icon Direction 0 = Left / Down, 1 = Right / Up
                    value = 1,
                    setting = 2,
                },
                [4] = { -- Icon Limit, 2 through 16
                    value = 16,
                    setting = 4,
                },
                [5] = { -- Icon Size, 0 through 15, "50% + (num x 10%)"
                    value = 5,
                    setting = 5,
                },
                [6] = { -- Icon Padding, 5 through 15
                    value = 5,
                    setting = 6,
                },
            },
            anchorInfo = {
                point = "BOTTOMLEFT",
                relativeTo = "MultiBarBottomLeft",
                relativePoint = "TOPLEFT",
                offsetX = 0,
                offsetY = 10,
            },
            isInDefaultPosition = false,
            systemIndex = 2,
            system = 6, -- Represents a "AuraFrame" type of element within Edit Mode
        },
        [26] = { -- Talking Head Frame
            settings = {},
            anchorInfo = {
                point = "TOP",
                relativeTo = "BuffFrame",
                relativePoint = "BOTTOM",
                offsetX = 0,
                offsetY = -10,
            },
            isInDefaultPosition = false,
            system = 7, -- Represents a "TalkingHeadFrame" type of element within Edit Mode
        },
        [27] = { -- Chat Frame
            settings = { -- Width: 250 - 800, Height: 120 - 800
                [1] = { -- Width (hundreds place), 2 through 8
                    value = 7,
                    setting = 0,
                },
                [2] = { -- Width (tens and ones places), 0 through 99
                    value = 0,
                    setting = 1,
                },
                [3] = { -- Height (hundreds place), 1 through 8
                    value = 1,
                    setting = 2,
                },
                [4] = { -- Height (tens and ones places), 0 through 99
                    value = 65,
                    setting = 3,
                },
            },
            anchorInfo = {
                point = "BOTTOMLEFT",
                relativeTo = "UIParent",
                relativePoint = "BOTTOM",
                offsetX = -addon.UI.GetRatioWidth() / 2,
                offsetY = 0,
            },
            isInDefaultPosition = false,
            system = 8, -- Represents a "ChatFrame" type of element within Edit Mode
        },
        [28] = { -- Vehicle Exit Button
            settings = {},
            anchorInfo = {
                point = "TOPRIGHT",
                relativeTo = "MainMenuBar",
                relativePoint = "TOPLEFT",
                offsetX = -10,
                offsetY = 0,
            },
            isInDefaultPosition = false,
            system = 9, -- Represents a "VehicleLeaveButton" type of element within Edit Mode
        },
        [29] = { -- Loot Frame
            settings = {},
            anchorInfo = {
                point = "TOPLEFT",
                relativeTo = "UIParent",
                relativePoint = "TOPLEFT",
                offsetX = -116,
                offsetY = 16,
            },
            isInDefaultPosition = false,
            system = 10, -- Represents a "LootFrame" type of element within Edit Mode
        },
        [30] = { -- HUD Tooltip
            settings = {},
            anchorInfo = {
                point = "BOTTOMRIGHT",
                relativeTo = "PlayerFrame",
                relativePoint = "TOPRIGHT",
                offsetX = 0,
                offsetY = 0,
            },
            isInDefaultPosition = false,
            system = 11, -- Represents a "HudTooltip" type of element within Edit Mode
        },
        [31] = { -- ObjectiveTracker
            settings = {
                [1] = { -- [When not in default position] Height, 0 through 60, "400 + (num x 10)"
                    value = 60,
                    setting = 0,
                },
                [2] = { -- Opacity, 0 through 100 (background opacity of ObjectiveTracker)
                    value = 0,
                    setting = 1,
                },
                [3] = { -- Text Size, 0 through 8, "12 + num"
                    value = 0,
                    setting = 2,
                },
            },
            anchorInfo = {
                point = "TOPRIGHT",
                relativeTo = "UIParent",
                relativePoint = "TOP",
                offsetX = addon.UI.GetRatioWidth() / 2,
                offsetY = 0,
            },
            anchorInfo2 = {
                point = "BOTTOMRIGHT",
                relativeTo = "UIParent",
                relativePoint = "BOTTOM",
                offsetX = addon.UI.GetRatioWidth() / 2,
                offsetY = 0,
            },
            isInDefaultPosition = false,
            system = 12, -- Represents a "ObjectiveTracker" type of element within Edit Mode
        },
        [32] = { -- Micro Menu
            settings = {
                [1] = { -- Orientation, 0 = Horizontal, 1 = Vertical
                    value = 0,
                    setting = 0,
                },
                [2] = { -- Order, 0 = Default, 1 = Reverse
                    value = 0,
                    setting = 1,
                },
                [3] = { -- Menu Size, 0 through 26, "70% + (num x 5%)"
                    value = 0,
                    setting = 2,
                },
                [4] = { -- Eye Size, 0 through 20, "50% + (num x 5%)"
                    value = 0,
                    setting = 3,
                },
            },
            anchorInfo = {
                point = "TOPLEFT",
                relativeTo = "UIParent",
                relativePoint = "TOP",
                offsetX = -addon.UI.GetRatioWidth() / 2,
                offsetY = 0,
            },
            isInDefaultPosition = false,
            system = 13, -- Represents a "MicroMenu" type of element within Edit Mode
        },
        [33] = { -- Bags
            settings = {
                [1] = { -- Orientation, 0 = Horizontal, 1 = Vertical
                    value = 0,
                    setting = 0,
                },
                [2] = { -- Direction, 0 = Left / Up, 1 = Right / Down
                    value = 0,
                    setting = 0,
                },
                [3] = { -- Size, 0 through 25, "75% + (num x 5%)"
                    value = 5,
                    setting = 2,
                },
            },
            anchorInfo = {
                point = "BOTTOMRIGHT",
                relativeTo = "UIParent",
                relativePoint = "BOTTOM",
                offsetX = addon.UI.GetRatioWidth() / 2,
                offsetY = 0,
            },
            isInDefaultPosition = false,
            system = 14, -- Represents a "Bags" type of element within Edit Mode
        },
        [34] = { -- Status Bar 1
            settings = {},
            anchorInfo = {
                point = "BOTTOMLEFT",
                relativeTo = "UIParent",
                relativePoint = "BOTTOM",
                offsetX = -addon.UI.GetRatioWidth() / 2,
                offsetY = 0,
            },
            isInDefaultPosition = false,
            systemIndex = 1,
            system = 15, -- Represents a "StatusTrackingBar" type of element within Edit Mode
        },
        [35] = { -- Status Bar 2
            settings = {},
            anchorInfo = {
                point = "BOTTOMLEFT",
                relativeTo = "UIParent",
                relativePoint = "BOTTOM",
                offsetX = -addon.UI.GetRatioWidth() / 2,
                offsetY = 0,
            },
            isInDefaultPosition = false,
            systemIndex = 2,
            system = 15, -- Represents a "StatusTrackingBar" type of element within Edit Mode
        },
        [36] = { -- Durability Frame
            settings = {
                [1] = { -- Size, 0 through 25, "75% + (num x 5%)"
                    value = 0,
                    setting = 0,
                },
            },
            anchorInfo = {
                point = "BOTTOM",
                relativeTo = "Minimap",
                relativePoint = "TOP",
                offsetX = 0,
                offsetY = 0,
            },
            isInDefaultPosition = false,
            system = 16, -- Represents a "DurabilityFrame" type of element within Edit Mode
        },
        [37] = { -- Duration Bars
            settings = {
                [1] = { -- Size, 0 through 5, "100% + (num x 10%)"
                    value = 0,
                    setting = 0,
                },
            },
            anchorInfo = {
                point = "TOP",
                relativeTo = "BuffFrame",
                relativePoint = "BOTTOM",
                offsetX = 0,
                offsetY = -10,
            },
            isInDefaultPosition = false,
            system = 17, -- Represents a "TimerBars" type of element within Edit Mode
        },
        [38] = { -- Vehicle Seat Indicator
            settings = {
                [1] = { -- Size, 0 through 10, "50% + (num x 5%)"
                    value = 0,
                    setting = 0,
                },
            },
            anchorInfo = {
                point = "BOTTOM",
                relativeTo = "Minimap",
                relativePoint = "TOP",
                offsetX = 0,
                offsetY = 0,
            },
            isInDefaultPosition = false,
            system = 18, -- Represents a "VehicleSeatIndicator" type of element within Edit Mode
        },
        [39] = { -- Archaeology Bar
            settings = {
                [1] = { -- Size, 0 through 20, "100% + (num x 5%)"
                    value = 0,
                    setting = 0,
                },
            },
            anchorInfo = {
                point = "BOTTOM",
                relativeTo = "UIParent",
                relativePoint = "BOTTOM",
                offsetX = 0,
                offsetY = 0,
            },
            isInDefaultPosition = false,
            system = 19, -- Represents a "ArchaeologyBar" type of element within Edit Mode
        },
    }
}

---------------------------------------------------------------------
-- Events
---------------------------------------------------------------------
addon.UI:RegisterEvent("ADDON_LOADED")
addon.UI:SetScript("OnEvent", function(self, event)
    if C_AddOns.IsAddOnLoaded("Blizzard_PlayerChoice") then
        local numOfDefaultLayouts = 2
        local data = C_EditMode.GetLayouts()
        local indexMyAddon = 0
        local hasMyAddon = false

        for index, layout in ipairs(data.layouts) do
            if layout.layoutName == MyAddon then
                hasMyAddon = true
                indexMyAddon = numOfDefaultLayouts + index
            end
        end

        if not hasMyAddon then
            table.insert(data.layouts, addon.UI.Layout)
            indexMyAddon = numOfDefaultLayouts + #data.layouts
            C_EditMode.SaveLayouts(data)
        end

        if data.activeLayout ~= indexMyAddon then
            self:UnregisterEvent(event)
            C_EditMode.SetActiveLayout(indexMyAddon)
        end
    end
end)

Blizzard has a utility function for this in Interface/AddOns/Blizzard_SharedXML/EventUtil.lua, namely EventUtil.ContinueOnAddOnLoaded(addOnName, callback)

1 Like