Создание этой функции бесконечной вложенности на основе таблицы

Я наконец решил свою проблему, чтобы сделать выпадающее меню в World of Warcraft за столом.

Теперь мне нужно, чтобы он мог вкладываться так далеко, как это делает пользователь. Как бы я это сделал?

Вот функция, которую я сейчас использую:

    local info = UIDropDownMenu_CreateInfo()

    if level == 1 then
        for a,b in pairs(menuList) do
            info.text = b[1]
            info.hasArrow = b[2]

            UIDropDownMenu_AddButton(info, level)
        end
    elseif level == 2 then

        for a,b in pairs(menuList[UIDROPDOWNMENU_MENU_VALUE][3]) do
            info.text = b
            info.func = OnClick

            UIDropDownMenu_AddButton(info, level)
        end
    end

Вот пример таблицы:

testMenuList = {Greetings = {"Greetings", true, {"hi", "hello", "good day"}}, Farewells = {"Farewells", true, {"bye", "goodbye", "later"}}}

В настоящее время он может установить до 2 уровней вниз. Первое и подменю.

Может кто-нибудь мне помочь?

1 ответ

Решение

Вот решение:

function IOLib_CreateDropDown(parent, name, title, width, anchor, posX, posY, menuList, OnClick)
    local dropDown = CreateFrame("Button", name, parent, "UIDropDownMenuTemplate")
    --_G[name].list = menuList
    dropDown.list = menuList
    -- dropDown.Func = OnClick
    dropDown:ClearAllPoints()
    dropDown:SetPoint(anchor, posY, posX)

    local function initialize(self, level)
        local info = UIDropDownMenu_CreateInfo()

        if level ~= nil then
            info = UIDropDownMenu_CreateInfo()
            info.text = title
            info.isTitle = true
            UIDropDownMenu_AddButton(info, level)

            if level == 1 then

                for a,b in pairs(menuList) do
                    info = UIDropDownMenu_CreateInfo()
                    info.text = b[1]
                    info.hasArrow = b[2]
                    info.func = OnClick
                    if info.hasArrow then _menuLists[b[1]] = b[3] end
                    UIDropDownMenu_AddButton(info, level)
                end

            elseif level > 1 then
                --print(#_menuLists[UIDROPDOWNMENU_MENU_VALUE][2])
                --for x=1, #_menuLists[UIDROPDOWNMENU_MENU_VALUE] do
                for a,b in pairs(_menuLists[UIDROPDOWNMENU_MENU_VALUE]) do
                    info = UIDropDownMenu_CreateInfo()
                    info.text = b[1]
                    info.hasArrow = b[2]
                    if info.hasArrow then _menuLists[b[1]] = b[3] end
                    info.func = OnClick
                    UIDropDownMenu_AddButton(info, level)
                end
            end


        end
    end

    UIDropDownMenu_Initialize(dropDown, initialize)
    UIDropDownMenu_SetWidth(dropDown, width) -- Use in place of dropDown:SetWidth
    UIDropDownMenu_SetButtonWidth(dropDown, width + 24)
    UIDropDownMenu_SetSelectedID(dropDown, 1)
    UIDropDownMenu_JustifyText(dropDown, "LEFT")

    return dropDown
end

Вот пример таблицы, используемой с этой функцией:

testMenuList = {{"Greetings", true, {{"Hi", true, {{"H", true, {{"Amazing", false, nil}}},{"i", false, nil}}},
                                     {"Hello", false, nil}}},
                {"Farewells", true, {{"Bye", false, nil},
                                     {"Goodbye", false, nil}}},
                {"Test", false, nil}}
Другие вопросы по тегам