ООП в LUA

why ega

РП игрок
Автор темы
Модератор
2,541
2,233
Версия MoonLoader
.026-beta
Крч, недавно делал скрипт, в котором таблицы выступали "недо-классами". Сегодня наткнулся на интересную статью, как можно реализовать классы в LUA, но т.к. я немного ебланчик, я хз как лучше это перенести. Накидайте советов, как это "правильно" реализовать в формате классов. Ниже оставлю часть кода из скрипта.
Lua:
local config = {
    window = {
        main = new.bool()
    },

    input = {
        send = new.char[1000000](),
        search = new.char[256](),
    },

    message = {
        system = new.bool(mainIni.message.system),
        script = new.bool(mainIni.message.script)
    },

    settings = {
        clean = new.bool(mainIni.settings.clean),
        multiline = new.bool(mainIni.settings.multiline),   
        notification = new.bool(mainIni.settings.notification)
    },

    style = {
        twist = new.int(mainIni.style.twist),
        theme = new.int(mainIni.style.theme),
    },         

    style_combo = imgui.new["const char*"][#style_list](style_list),
    twist_combo = imgui.new["const char*"][#twist_list](twist_list)
}

local imguiElementSettings = {   
    toggle = {
        clean = {
            name = "Очистка поля после отправки",
            actived = new.bool(mainIni.settings.clean)           
        },
        
        notification = {
            name = "Уведомления",
            actived = new.bool(mainIni.settings.notification)           
        },

        multiline = {
            name = "Режим мега тру щит программера",
            actived = new.bool(mainIni.settings.multiline)           
        }
    },

    checkbox = {
        system = {
            name = "Системные сообщения",
            actived = new.bool(mainIni.message.system)           
        },
        
        script = {
            name = "Сообщения от скриптов",
            actived = new.bool(mainIni.message.script)           
        }
    }
}

local imguiElementRender = {
    header = {
        logs = {
            name = u8"LOGS", -- что-то типа свойств
            actived = new.bool(true),
            render = function() -- что-то типа метода             
                imgui.Text(u8"Поиск:")
                imgui.SameLine()
                imgui.PushItemWidth(config.settings.multiline[0] and 715 or 515)
                imgui.InputText("##Search", config.input.search, sizeof(config.input.search))
                imgui.PopItemWidth()   

                imgui.BeginChild("log", imgui.ImVec2(-1, 330), true)         
                    if #str(config.input.search) > 0 then
                        for _, msg in ipairs(message) do
                            if msg:lower():find(str(config.input.search):lower()) then                       
                                imgui.Text(u8(msg)) 
                            end
                        end
                    else
                        for _, msg in ipairs(message) do
                            imgui.Text(u8(msg))
                        end
                    end
                imgui.EndChild()

                imgui.PushItemWidth(500)
                imgui[("InputText%s"):format(config.settings.multiline[0] and "Multiline" or "")]("##", config.input.send, sizeof(config.input.send))         

                imgui.SameLine()
                imgui.BeginGroup()
                    if imgui.Button("Send", config.settings.multiline[0] and imgui.ImVec2(250, 24) or imgui.ImVec2(55, 24)) then
                        if #u8:decode(str(config.input.send)) > 0 then
                            playCode(u8:decode(str(config.input.send)))
                            if config.settings.clean[0] then
                                imgui.StrCopy(config.input.send, "")
                            end                             
                            Notification("Play code", 5, colorNotification())                             
                        end
                    end
                    
                    if config.settings.multiline[0] then
                        if imgui.Button("Clean", imgui.ImVec2(250, 24)) then
                            imgui.StrCopy(config.input.send, "")                   
                        end
                    end
                imgui.EndGroup()
            end
        },

        settings = {   
            name = "SETTINGS",
            actived = new.bool(),
            render = function()   
                --[[
                    for _, data in pairs(imguiElementRender.combo) do
                        if imgui.Combo(u8(data.name), data.twist, data.combo, #data.list) then
                            Style()
                        end
                    end 
                ]]

                if imgui.Combo(u8"Выбор темы", config.style.theme, config.style_combo, #style_list) then
                    mainIni.style.theme = style.theme[0]
                    inicfg.save(mainIni, "moonlog.ini")
                    Style()
                end
                if imgui.Combo(u8"Стиль элементов", config.style.twist, config.twist_combo, #twist_list) then
                    mainIni.style.twist = style.twist[0]
                    inicfg.save(mainIni, "moonlog.ini")
                    Style()
                end

                for key, data in pairs(imguiElementSettings.toggle) do
                    if imgui.ToggleButton(u8(data.name), data.actived) then
                        mainIni.settings[key] = data.actived[0]
                        inicfg.save(mainIni, "moonlog.ini")
                        Notification(u8(("%s - %s"):format(data.name, (data.actived[0] and "ON" or "OFF"))), 5, colorNotification())                             
                    end
                end
                
                for key, data in pairs(imguiElementSettings.checkbox) do
                    if imgui.Checkbox(u8(data.name), data.actived) then
                        mainIni.message[key] = data.actived[0]
                        inicfg.save(mainIni, "moonlog.ini")
                        Notification(u8(("%s - %s"):format(data.name, (data.actived[0] and "ON" or "OFF"))), 5, colorNotification())                             
                    end
                end                               
            end
        }       
    }   
}

local mainFrame = imgui.OnFrame(
    function() return config.window.main[0] end,
    function(self)       
        local sizeX, sizeY = getScreenResolution()
        local header = imguiElementRender.header
        imgui.SetNextWindowPos(imgui.ImVec2(sizeX - 400, sizeY - 400), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(config.settings.multiline[0] and imgui.ImVec2(800, 550) or imgui.ImVec2(600, 450), imgui.Cond.FirstUseEver)
        imgui.Begin(u8"##main", nil, imgui.WindowFlags.NoResize + imgui.WindowFlags.NoCollapse + imgui.WindowFlags.AlwaysUseWindowPadding + imgui.WindowFlags.NoScrollbar + imgui.WindowFlags.NoTitleBar)

        imgui.SetCursorPosX((imgui.GetWindowWidth() - imgui.CalcTextSize(u8"LOGS").x - imgui.CalcTextSize(u8"SETTGINS").x) / 2)
        imgui.BeginGroup()           
            for index, data in ipairs(header) do
                if imgui.HeaderButton(data.actived[0], data.name) then
                    for i, header in ipairs(header) do
                        header.actived[0] = i == index                       
                    end                         
                end

                if index ~= #header then
                    imgui.SameLine()
                end
            end
        imgui.EndGroup()

        imgui.SetCursorPosY(40)
        imgui.BeginGroup()       
        for _, data in ipairs(header) do
            if data.actived[0] then
                data.render()
            end
        end
        imgui.EndGroup()

        imgui.End()
    end
)
 

why ega

РП игрок
Автор темы
Модератор
2,541
2,233
Вроде что-то сделал, но чет мне кажется это сделано из говна и палок, поэтому все равно хотелось бы получить хорошего пинка под зад, с советом.

вот крч код этот, как его можно привести в более культурный вид (бля, я заебался уже монолог вести)
Lua:
local Combo = {}
local Toggle = {}
local Checkbox = {}
local Header = {}

function Combo:new(name, val, list, char, key)
    local obj = {}
    obj.cName = u8(name)
    obj.cVal = new.int(val) 
    obj.cList = list 
    obj.cChar = imgui.new["const char*"][#list](list) 
  
    function obj:save()
        mainIni.style[key] = self.cVal[0]
        inicfg.save(mainIni, "moonlog.ini")     
        Style() 
    end

    setmetatable(obj, self)
    self.__index = self; return obj
end

function Toggle:new(name, actived, key)
    local obj = {}
    obj.cName = u8(name)
    obj.cActived = new.bool(actived)       

    function obj:save()
        mainIni.settings[key] = self.cActived[0]
        inicfg.save(mainIni, "moonlog.ini")
        Notification(("%s - %s"):format(self.cName, u8((self.cActived[0] and "ON" or "OFF"))), 5)                             
    end

    setmetatable(obj, self)
    self.__index = self; return obj
end

function Checkbox:new(name, actived, key)   
    local obj = {}
    obj.cName = u8(name)
    obj.cActived = new.bool(actived)       

    function obj:save()
        mainIni.message[key] = self.cActived[0]
        inicfg.save(mainIni, "moonlog.ini")
        Notification(("%s - %s"):format(self.cName, u8((self.cActived[0] and "ON" or "OFF"))), 5)                             
    end

    setmetatable(obj, self)
    self.__index = self; return obj
end

function Header:new(name, actived, content)   
    local obj = {}
    obj.cName = u8(name)
    obj.cActived = new.bool(actived)   

    function obj:render()
        content()
    end

    setmetatable(obj, self)
    self.__index = self; return obj
end

local classList = {
    combo = {
        twist = Combo:new("Стиль элементов", mainIni.style.twist, {u8"Мягккий", u8"Резкий"}, "twist"),
        theme = Combo:new("Выбор темы", mainIni.style.theme, {u8"Темная", u8"Берюзовая"}, "theme")
    },

    toggle = {
        clean = Toggle:new("Очистка поля после отправки", mainIni.settings.clean, "clean"),
        notification = Toggle:new("Уведомления", mainIni.settings.notification, "notification"),
        multiline = Toggle:new("Режим мега тру щит программера", mainIni.settings.multiline, "multiline")
    },

    checkbox = {
        system = Checkbox:new("Системные сообщения", mainIni.message.system, "system"),
        script = Checkbox:new("Сообщения от скриптов", mainIni.message.script, "script")
    }
}

local hList = {
    Header:new("LOGS", true, function()
        imgui.Text(u8"Поиск:")
        imgui.SameLine()
        imgui.PushItemWidth(config.settings.multiline[0] and 715 or 515)
        imgui.InputText("##Search", config.input.search, sizeof(config.input.search))
        imgui.PopItemWidth()   
    
        imgui.BeginChild("log", imgui.ImVec2(-1, 330), true)         
            if #str(config.input.search) > 0 then
                for _, msg in ipairs(message) do
                    if msg:lower():find(str(config.input.search):lower()) then                       
                        imgui.Text(u8(msg)) 
                    end
                end
            else
                for _, msg in ipairs(message) do
                    imgui.Text(u8(msg))
                end
            end
        imgui.EndChild()
    
        imgui.BeginGroup()
            imgui.PushItemWidth(500)
            imgui[("InputText%s"):format(config.settings.multiline[0] and "Multiline" or "")]("##", config.input.send, sizeof(config.input.send))         
        imgui.EndGroup()

        imgui.SameLine()
        imgui.BeginGroup()
            if imgui.Button("Send", config.settings.multiline[0] and imgui.ImVec2(250, 24) or imgui.ImVec2(55, 24)) then
                if #u8:decode(str(config.input.send)) > 0 then
                    playCode(u8:decode(str(config.input.send)))
                    if config.settings.clean[0] then
                        imgui.StrCopy(config.input.send, "")
                    end                             
                    Notification("Play code", 5)                             
                end
            end
            
            if config.settings.multiline[0] then
                if imgui.Button("Clean", imgui.ImVec2(250, 24)) then
                    imgui.StrCopy(config.input.send, "")                   
                end
            end
        imgui.EndGroup()
    end),

    Header:new("SETTINGS", false, function()
        for k, class in pairs(classList.combo) do
            if imgui.Combo(class.cName, class.cVal, class.cChar, #class.cList) then
                class:save()               
            end                       
        end
        
        for k, class in pairs(classList.toggle) do
            if imgui.ToggleButton(class.cName, class.cActived) then
                class:save()
            end
        end

        for k, class in pairs(classList.checkbox) do
            if imgui.Checkbox(class.cName, class.cActived) then
                class:save()
            end
        end
    end)
}

--========================================================FUNCTION========================================

--========================================================IMGUI========================================================

local mainFrame = imgui.OnFrame(
    function() return config.window.main[0] end,
    function(self)       
        local sizeX, sizeY = getScreenResolution()
        imgui.SetNextWindowPos(imgui.ImVec2(sizeX - 400, sizeY - 400), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(config.settings.multiline[0] and imgui.ImVec2(800, 550) or imgui.ImVec2(600, 450), imgui.Cond.FirstUseEver)
        imgui.Begin(u8"##main", nil, imgui.WindowFlags.NoResize + imgui.WindowFlags.NoCollapse + imgui.WindowFlags.AlwaysUseWindowPadding + imgui.WindowFlags.NoScrollbar + imgui.WindowFlags.NoTitleBar)

        imgui.SetCursorPosX((imgui.GetWindowWidth() - imgui.CalcTextSize(u8"LOGS").x - imgui.CalcTextSize(u8"SETTGINS").x) / 2)
        imgui.BeginGroup()   
            for i, class in ipairs(hList) do
                if imgui.HeaderButton(class.cActived[0], class.cName) then
                    for j, class in ipairs(hList) do
                        class.cActived[0] = (i == j)                       
                    end                                             
                end

                if i ~= #hList then
                    imgui.SameLine()
                end
            end
        imgui.EndGroup()

        imgui.SetCursorPosY(40)
        imgui.BeginGroup()       
            for _, class in ipairs(hList) do
                if class.cActived[0] then
                    class:render()
                end
            end
        imgui.EndGroup()

        imgui.End()
    end
)
 
Последнее редактирование:
  • Нравится
Реакции: Lance_Sterling

riverya4life

Известный
393
170
А шо с ним было?
Та вот из за новичков признаюсь честно ловил десятикратный инсульт, пятнадцать раз делал сальтуху в гробу, и всё из за того что они не соблюдали банальный PEP8. Надеюсь в луа такого не будет
 
  • Нравится
  • Вау
Реакции: why ega и qdIbp