控件.lua 3.8 KB
Newer Older
baidwwy's avatar
lua  
baidwwy 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178
-- @Author       : GGELUA
-- @Date         : 2021-12-11 01:01:03
-- @Last Modified by: baidwwy
-- @Last Modified time: 2021-12-13 22:54:47

local im = require 'gimgui'
local IM控件 = class('IM控件')

function IM控件:初始化(name, w, h, x, y)
    self.名称 = name and tostring(name) or nil
    self.x = math.floor(tonumber(x) or 0)
    self.y = math.floor(tonumber(y) or 0)
    self.宽度 = w
    self.高度 = h

    self._子控件 = {}
end

function IM控件:__index(k)
    if k == '是否可见' then
        return self[1]
    end
end

function IM控件:更新(...)
    for _, v in ipairs(self._子控件) do
        if v[1] then
            v:更新(...)
        end
    end
end

function IM控件:_更新()
    if self._iswin then
    else
    end
    -- if self._nw then
    --     im.SetNextItemWidth(self._nw)
    --     self._nw = nil
    -- end
    -- if self._open then
    --     self._open = nil
    --     im.SetNextItemOpen(true)
    -- end
end

function IM控件:更新_()
    if self._tip and im.IsItemHovered() then
        im.SetTooltip(self._tip)
    end
end

function IM控件:置可见(val, sub)
    if val and self.是否实例 and self.是否禁止 then
        return self
    end
    if self._lock then
        self[1] = val == true
        return
    end
    self._lock = true
    if self:发送消息('可见事件', val) == false then
        return self
    end
    self[1] = val == true

    if not self.是否实例 and val then
        if rawget(self, '初始化') then
            ggexpcall(self.初始化, self)
        end
        self.是否实例 = true
    end
    if sub then
        for _, v in ipairs(self._子控件) do
            if v.置可见 then
                v:置可见(val, sub)
            end
        end
    end
    self._lock = nil
    return self
end

function IM控件:置禁止(v)
    self.是否禁止 = v == true
    return self
end

function IM控件:发送消息(name, ...)
    local fun = rawget(self, name)
    if type(fun) == 'function' then
        return coroutine.xpcall(fun, self, ...)
    end
end

local 同行 = {
    [1] = true,
    更新 = function()
        im.SameLine()
    end
}
function IM控件:同行()
    table.insert(self._子控件, 同行)
    return self
end

local 对齐 = {
    [1] = true,
    更新 = function()
        im.AlignTextToFramePadding()
    end
}
function IM控件:对齐()
    table.insert(self._子控件, 对齐)
    return self
end

local 分隔线 = {
    [1] = true,
    更新 = function()
        im.Separator()
    end
}
function IM控件:分隔线()
    table.insert(self._子控件, 分隔线)
    return self
end

function IM控件:置提示(v)
    self._tip = v
end

function IM控件:创建控件(name, ...)
    assert(not self[name], name .. ':此控件已存在,不能重复创建.')
    self[name] = IM控件(name, ...)
    table.insert(self._子控件, self[name])
    return self[name]
end

local IM选项 = class('IM选项',IM控件)
function IM选项:初始化()
    self._flag = 2|4
    self.是否选中 = false
    self[1] = true
end

function IM选项:更新()
    if im.Selectable(self.名称,self.是否选中,self._flag) then
        self:发送消息('选中事件',self.是否选中)
        if im.IsMouseDoubleClicked() then --ImGuiMouseButton_Left flag = 4
            self:发送消息('双击事件')
        end
    end
    IM控件.更新(self)
end

function IM选项:置选中(b)
    self.是否选中 = b==true
end

function IM控件:创建选项(name, ...)
    self[name] = IM选项(name, ...)
    table.insert(self._子控件, self[name])
    return self[name]
end

-- function IMBase:是否按下(b)
--     return im.IsMouseDown(b)
-- end

-- function IMBase:是否弹起(b)
--     return im.IsMouseReleased(b)
-- end

-- function IMBase:是否单击(b,r)
--     return im.IsMouseClicked(b,r)
-- end
return IM控件