Thread Tools Display Modes
Prev Previous Post   Next Post Next
06/29/24, 04:06 AM   #1
tealke
Join Date: Mar 2023
Posts: 19
I have a problem with displaying the menu in TLC

Hello people
I wrote two codes here one contains TLC named TMA_Menu
and with the second one, I'm trying to get the content into it (the second file is called TMA_Settings), both codes are attached below. The problem is that the TMA_Menu menu is displayed correctly, but the content from the TMA_Setting is no longer filled in, and I really don't know what to do with it, could someone give me some advice? Thank you very much to everyone who can give me advice

TMA_Menu:
Code:
local TMA_Menu = {}
local wm = WINDOW_MANAGER

-- Utility Functions
local function CreateControl(parent, controlType, controlName)
    if not wm then
        d("Error: WINDOW_MANAGER is not available.")
        return nil
    end
    parent = parent or GuiRoot
    return wm:CreateControl(controlName or nil, parent, controlType)
end

local function InitializeTooltip(control, text)
    control:SetHandler("OnMouseEnter", function(self)
        InitializeTooltip(InformationTooltip, self, BOTTOM, 0, 0)
        SetTooltipText(InformationTooltip, text)
    end)
    control:SetHandler("OnMouseExit", function(self)
        ClearTooltip(InformationTooltip)
    end)
end

-- Panel Functions
function TMA_Menu.CreateSettingWindows()
    local wm = WINDOW_MANAGER
    if not wm then
        d("Error: WINDOW_MANAGER is nil")
        return
    end
    
    local windowName = "TMA_Menu"
    local dark = wm:CreateTopLevelWindow(windowName)
    dark:SetDimensions(1010, 914)
    dark:SetHidden(true)

    ZO_ReanchorControlForLeftSidePanel(dark)

    local bgLeft = wm:CreateControl("$(parent)BackgroundLeft", dark, CT_TEXTURE)
    bgLeft:SetTexture("EsoUI/Art/Miscellaneous/centerscreen_left.dds")
    bgLeft:SetDimensions(1024, 1024)
    bgLeft:SetAnchor(TOPLEFT, nil, TOPLEFT)
    bgLeft:SetDrawLayer(DL_BACKGROUND)
    bgLeft:SetExcludeFromResizeToFitExtents(true)

    local bgRight = wm:CreateControl("$(parent)BackgroundRight", dark, CT_TEXTURE)
    bgRight:SetTexture("EsoUI/Art/Miscellaneous/centerscreen_right.dds")
    bgRight:SetDimensions(64, 1024)
    bgRight:SetAnchor(TOPLEFT, bgLeft, TOPRIGHT)
    bgRight:SetDrawLayer(DL_BACKGROUND)
    bgRight:SetExcludeFromResizeToFitExtents(true)

    local underlayLeft = wm:CreateControl("$(parent)UnderlayLeft", dark, CT_TEXTURE)
    underlayLeft:SetTexture("EsoUI/Art/Miscellaneous/centerscreen_indexArea_left.dds")
    underlayLeft:SetDimensions(256, 1024)
    underlayLeft:SetAnchor(TOPLEFT, bgLeft, TOPLEFT)
    underlayLeft:SetDrawLayer(DL_BACKGROUND)
    underlayLeft:SetExcludeFromResizeToFitExtents(true)

    local underlayRight = wm:CreateControl("$(parent)UnderlayRight", dark, CT_TEXTURE)
    underlayRight:SetTexture("EsoUI/Art/Miscellaneous/centerscreen_indexArea_right.dds")
    underlayRight:SetDimensions(128, 1024)
    underlayRight:SetAnchor(TOPLEFT, underlayLeft, TOPRIGHT)
    underlayRight:SetDrawLayer(DL_BACKGROUND)
    underlayRight:SetExcludeFromResizeToFitExtents(true)

    local title = wm:CreateControl("$(parent)Title", dark, CT_LABEL)
    title:SetAnchor(TOPLEFT, nil, TOPLEFT, 65, 70)
    title:SetText(TMA.NameS)
    title:SetFont("ZoFontWinH1")
    title:SetModifyTextType(TEXT_MODIFY_TYPE_UPPERCASE)

    local author = wm:CreateControl("$(parent)Author", dark, CT_LABEL)
    author:SetAnchor(TOPRIGHT, title, TOPLEFT, 770, 15)
    author:SetText(" Author: " .. TMA.Autor .. " Version: " .. TMA.Version .. " ")
    author:SetFont("ZoFontWinT2")

    local divider = wm:CreateControlFromVirtual("$(parent)Divider", dark, "ZO_Options_Divider")
    divider:SetAnchor(TOPLEFT, nil, TOPLEFT, 65, 108)

    local addonList = wm:CreateControlFromVirtual("$(parent)AddonList", dark, "ZO_ScrollList")
    addonList:SetAnchor(TOPLEFT, nil, TOPLEFT, 65, 160)
    addonList:SetDimensions(285, 665)

    local panelContainer = wm:CreateControl("$(parent)PanelContainer", dark, CT_CONTROL)
    panelContainer:SetAnchor(TOPLEFT, nil, TOPLEFT, 365, 120)
    panelContainer:SetDimensions(645, 675)

    local scene = ZO_FadeSceneFragment:New(dark)
    local leftFragment = ZO_FadeSceneFragment:New(bgLeft)
    local rightFragment = ZO_FadeSceneFragment:New(bgRight)

    scene:RegisterCallback("StateChange", function(oldState, newState)
        if newState == SCENE_FRAGMENT_SHOWING then
            PushActionLayerByName("OptionsWindow")
        elseif newState == SCENE_FRAGMENT_HIDDEN then
            RemoveActionLayerByName("OptionsWindow")
        end
    end)

    leftFragment:RegisterCallback("StateChange", function(oldState, newState)
        if newState == SCENE_FRAGMENT_SHOWING then
            PushActionLayerByName("OptionsWindow")
        elseif newState == SCENE_FRAGMENT_HIDDEN then
            RemoveActionLayerByName("OptionsWindow")
        end
    end)

    rightFragment:RegisterCallback("StateChange", function(oldState, newState)
        if newState == SCENE_FRAGMENT_SHOWING then
            PushActionLayerByName("OptionsWindow")
        elseif newState == SCENE_FRAGMENT_HIDDEN then
            RemoveActionLayerByName("OptionsWindow")
        end
    end)
         
     return dark, scene, leftFragment, rightFragment
end

function TMA_Menu:CreateSettingsWindow(panelName)
    local panelData = self.panelData[panelName]
    if not panelData then
        d("Error: No panel data found for " .. panelName)
        return
    end

    local control = CreateControl(panelName .. "_SettingsWindow", GuiRoot, CT_CONTROL)
    if not control then
        d("Error: Unable to create control for " .. panelName)
        return
    end

    control:SetDimensions(600, 400)
    control:SetAnchor(CENTER, GuiRoot, CENTER, 0, 0)
    control:SetHidden(true)

    local bg = CreateControlFromVirtual("$parentBG", control, "ZO_Options_Background")
    bg:SetAnchorFill(control)

    local header = CreateControl(control:GetName() .. "_Header", control, CT_LABEL)
    header:SetFont("ZoFontHeader")
    header:SetText(panelData.displayName)
    header:SetAnchor(TOP, control, TOP, 0, 10)

    local version = CreateControl(control:GetName() .. "_Version", control, CT_LABEL)
    version:SetFont("ZoFontWinH3")
    version:SetText("Version: " .. panelData.version)
    version:SetAnchor(TOP, header, BOTTOM, 0, 5)

    local author = CreateControl(control:GetName() .. "_Author", control, CT_LABEL)
    author:SetFont("ZoFontWinH3")
    author:SetText("Author: " .. panelData.author)
    author:SetAnchor(TOP, version, BOTTOM, 0, 0)

    self.panelControl = control
    return control
end


function TMA_Menu:RegisterAddonPanel(panelName, panelData)
    if not self.panelData then
        self.panelData = {}
    end
    self.panelData[panelName] = panelData
end

function TMA_Menu:RegisterOptionControls(panelName, optionsTable)
    local panel = self.panelData[panelName]
    if not panel then
        d("Error: No panel data found for " .. panelName)
        return
    end

    local parent = self.panelControl
    if not parent then
        d("Error: Panel control not found for " .. panelName)
        return
    end

    for index, optionData in ipairs(optionsTable) do
        local optionControl = self["Create" .. optionData.type](self, parent, optionData)
        if optionControl then
            optionControl:SetAnchor(TOPLEFT, parent, TOPLEFT, 20, 50 + 40 * index)
        else
            d("Error: Unable to create option control for " .. optionData.type)
        end
    end

    local control = self.panelControl
    for _, option in ipairs(optionsTable) do
        local optionControl = CreateControlFromVirtual("$parent" .. option.type, control, option.type)
        optionControl:SetAnchor(TOP, control, TOP, 0, 100 * _)
        optionControl:SetText(option.name)
    end
end

function TMA_Menu:HideSettingsWindow()
    if self.panelControl and not self.panelControl:IsHidden() then
        self.panelControl:SetHidden(false)
    end
end

-- Control Creation Functions (continued)
function TMA_Menu:CreateDescription(parent, data)
    local control = CreateControl(parent, CT_LABEL)
    control:SetFont("ZoFontWinH3")
    control:SetText(data.text)
    control:SetAnchor(TOPLEFT, parent, TOPLEFT, 10, 10)
    control:SetDimensions(parent:GetWidth() - 20, 30)
    InitializeTooltip(control, data.tooltip)
    return control
end

function TMA_Menu:CreateDropdown(parent, data)
    local control = CreateControlFromVirtual("$parentDropdown", parent, "ZO_ComboBox")
    local dropdown = ZO_ComboBox_ObjectFromContainer(control)
    dropdown:SetSortsItems(false)
    dropdown:ClearItems()

    for _, choice in ipairs(data.choices) do
        local entry = dropdown:CreateItemEntry(choice, function() data.setFunc(choice) end)
        dropdown:AddItem(entry)
    end

    dropdown:SelectItemByIndex(1)
    control:SetAnchor(TOPLEFT, parent, TOPLEFT, 10, 10)
    InitializeTooltip(control, data.tooltip)
    return control
end

function TMA_Menu:CreateSlider(parent, data)
    local control = CreateControlFromVirtual("$parentSlider", parent, "ZO_DefaultSlider")
    control:SetMinMax(data.min, data.max)
    control:SetValueStep(data.step)
    control:SetValue(data.getFunc())

    control:SetHandler("OnValueChanged", function(_, value, eventReason)
        if eventReason == EVENT_REASON_SOFTWARE then return end
        data.setFunc(value)
    end)

    control:SetAnchor(TOPLEFT, parent, TOPLEFT, 10, 10)
    InitializeTooltip(control, data.tooltip)
    return control
end

function TMA_Menu:CreateButton(parent, data)
    local control = CreateControlFromVirtual("$parentButton", parent, "ZO_DefaultButton")
    control:SetText(data.name)
    control:SetHandler("OnClicked", data.func)
    control:SetAnchor(TOPLEFT, parent, TOPLEFT, 10, 10)
    InitializeTooltip(control, data.tooltip)
    return control
end

function TMA_Menu:CreateCheckbox(parent, data)
    local control = CreateControl(parent, CT_CHECKBOX)
    control:SetText(data.name)
    control:SetAnchor(TOPLEFT, parent, TOPLEFT, 10, 10)
    control:SetDimensions(200, 30)
    control:SetHandler("OnClicked", function()
        data.setFunc(not data.getFunc())
    end)
    InitializeTooltip(control, data.tooltip)
    return control
end

function TMA_Menu:CreateColorPicker(parent, data)
    local control = CreateControl(parent, CT_COLORSELECT)
    control:SetColor(data.getFunc())
    control:SetAnchor(TOPLEFT, parent, TOPLEFT, 10, 10)
    control:SetDimensions(50, 50)
    control:SetHandler("OnColorSelected", function(_, r, g, b, a)
        data.setFunc(r, g, b, a)
    end)
    InitializeTooltip(control, data.tooltip)
    return control
end

function TMA_Menu:CreateEditBox(parent, data)
    local control = CreateControl(parent, CT_EDITBOX)
    control:SetText(data.getFunc())
    control:SetAnchor(TOPLEFT, parent, TOPLEFT, 10, 10)
    control:SetDimensions(parent:GetWidth() - 20, 30)
    control:SetHandler("OnTextChanged", function(_, text)
        data.setFunc(text)
    end)
    InitializeTooltip(control, data.tooltip)
    return control
end

function TMA_Menu:CreateSubmenu(parent, data)
    local control = CreateControl(parent, CT_CONTROL)
    control:SetAnchor(TOPLEFT, parent, TOPLEFT, 10, 10)
    control:SetDimensions(parent:GetWidth() - 20, 200)

    local label = CreateControl(control, CT_LABEL)
    label:SetFont("ZoFontWinH2")
    label:SetText(data.name)
    label:SetAnchor(TOPLEFT, control, TOPLEFT, 10, 10)
    
    local submenuControl = CreateControl(control, CT_CONTROL)
    submenuControl:SetAnchor(TOPLEFT, label, BOTTOMLEFT, 0, 10)
    submenuControl:SetDimensions(parent:GetWidth() - 40, 180)

    for _, subData in ipairs(data.controls) do
        local subControl = self["Create" .. subData.type](self, submenuControl, subData)
        if subControl then
            subControl:SetAnchor(TOPLEFT, submenuControl, TOPLEFT, 0, 40 * _)
        else
            d("Error: Unable to create submenu control for " .. subData.type)
        end
    end

    return control
end

-- Register Settings
function TMA_Menu.RegisterSettings()
    EVENT_MANAGER:RegisterForEvent("TMA_Menu", EVENT_PLAYER_ACTIVATED, function()
        local dark, scene, leftFragment, rightFragment = TMA_Menu.CreateSettingWindows()
        settingsWindow = dark
        local data = {
            id = "TMAMenu",
            name = TMA.DisplayName,
            longname = TMA.NameS,
            callback = function()
                SCENE_MANAGER:AddFragment(scene)
                SCENE_MANAGER:AddFragment(leftFragment)
                SCENE_MANAGER:AddFragment(rightFragment)
            end,
            unselectedCallback = function()
                SCENE_MANAGER:RemoveFragment(scene)
                SCENE_MANAGER:RemoveFragment(leftFragment)
                SCENE_MANAGER:RemoveFragment(rightFragment)
            end,
        }

        TMA_Menu:RegisterAddonPanel("TMAMenu", data)
        ZO_GameMenu_AddSettingPanel(data)
    end)
end

-- Register settings when the addon is loaded
EVENT_MANAGER:RegisterForEvent("TMA_Menu_Load", EVENT_ADD_ON_LOADED, function(event, addonName)
    if addonName == "TealkeMultiAddons" then
        TMA_Menu.RegisterSettings()
        TMA_Menu:HideSettingsWindow()
    end
end)

-- Register TMA_Menu with the global environment or addon framework
-- Return TMA_Menu table to be assigned to global _G
_G["TMA_Menu"] = TMA_Menu
return TMA_Menu
TMA_Settings:
Code:
local TMA_Menu = _G["TMA_Menu"]
if not TMA_Menu then return end

-- Sample panel data and option controls
local function AddMenuContents()
    -- Sample panel data
    local panelData = {
        panelName = "TealkeMultiAddonsPanel",
        displayName = "Tealke Multi Addons",
        version = "1.0",
        author = "Tealke",
    }

    -- Register the panel
    TMA_Menu:RegisterAddonPanel("TealkeMultiAddonsPanel", panelData)

    -- Sample option controls
    local optionsTable = {
        {
            type = "Description",
            text = "This is a description for the Tealke Multi Addons panel.",
            tooltip = "This is a tooltip for the description."
        },
        {
            type = "Dropdown",
            name = "Select an Option",
            choices = {"Option 1", "Option 2", "Option 3"},
            tooltip = "Select an option from the dropdown.",
            setFunc = function(value) d("Dropdown selected: " .. value) end,
        },
        {
            type = "Slider",
            name = "Adjust the Slider",
            min = 0,
            max = 100,
            step = 1,
            getFunc = function() return 50 end,
            setFunc = function(value) d("Slider value: " .. value) end,
            tooltip = "Adjust the slider between 0 and 100.",
        },
        {
            type = "Button",
            name = "Click Me",
            func = function() d("Button clicked") end,
            tooltip = "Click this button.",
        },
        {
            type = "Checkbox",
            name = "Enable Feature",
            getFunc = function() return true end,
            setFunc = function(value) d("Checkbox state: " .. tostring(value)) end,
            tooltip = "Check or uncheck this box.",
        },
        {
            type = "ColorPicker",
            name = "Pick a Color",
            getFunc = function() return 1, 0, 0, 1 end,
            setFunc = function(r, g, b, a) d("Color selected: ", r, g, b, a) end,
            tooltip = "Pick a color.",
        },
        {
            type = "EditBox",
            name = "Enter Text",
            getFunc = function() return "Sample text" end,
            setFunc = function(text) d("EditBox text: " .. text) end,
            tooltip = "Enter some text.",
        },
        {
            type = "Submenu",
            name = "Submenu",
            controls = {
                {
                    type = "Checkbox",
                    name = "Submenu Checkbox",
                    getFunc = function() return false end,
                    setFunc = function(value) d("Submenu checkbox state: " .. tostring(value)) end,
                    tooltip = "This is a checkbox in a submenu.",
                },
            },
        },
    }

    -- Create the settings window and register option controls
    TMA_Menu:CreateSettingsWindow("TealkeMultiAddonsPanel_SettingsWindow")
    TMA_Menu:RegisterOptionControls("TealkeMultiAddonsPanel", optionsTable)
end

-- Register the settings and add menu contents on addon load
EVENT_MANAGER:RegisterForEvent("TMA_Menu_Load", EVENT_ADD_ON_LOADED, function(event, addonName)
    if addonName == "TealkeMultiAddons" then
        TMA_Menu.RegisterSettings()
        TMA_Menu:HideSettingsWindow()
        AddMenuContents()
    end
end)

-- Return TMA_Menu with the global environment or addon framework
return TMA_Menu
  Reply With Quote
 

ESOUI » Developer Discussions » Lua/XML Help » I have a problem with displaying the menu in TLC


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off