-- Массив всех объектов
ALL = {}
-- Доступ к массиву объектов instead-style
function _(key)
    return ALL[key]
end

-- Пассивная надпись на экране
Label = {}
function Label:new(nam, x, y, text)
    local o = {}
    o.x = x
    o.y = y
    o.text = text
    o.draw = function (s)
             gfx.print(s.text, s.x, s.y)
             end;
    o.act = function(s)
            end;
    o.update = function(s)
                end;
    setmetatable(o, self)
    self.__index = self
    if nam then ALL[nam] = o end
    return o
end --func

-- Пассивная картинка на экране
Image = {}
function Image:new(nam, x, y, picarray)
    local o = {}
    o.x = x
    o.y = y
    if type(picarray)=='table' then o.pic = picarray else o.pic = {picarray} end
    o.clock = 1
    o.draw = function (s)
             s.pic[1+math.floor(s.clock/50*#(s.pic))]:blend(screen, s.x, s.y)
             end;
    o.act = function(s)
            end;
    o.update = function(s)
                s.clock = s.clock + 1
                if s.clock>=50 then s.clock = 1 end
                end;
    setmetatable(o, self)
    self.__index = self
    if nam then ALL[nam] = o end
    return o
end --func


-- Простой агрегатор, транслирующий вызовы в лежащие в нем obj
Conteiner = {}
function Conteiner:new(nam)
    local o = {}
    o.nam = nam
    o.active = true
    o._active = function(s)
                if type(s.active)=='function' then return s.active() else return s.active end
                end --func
    o.visible = true
    o._visible = function(s)
                if type(s.visible)=='function' then return s.visible() else return s.visible end
                end --func
    o.draw = function (s)
                if not s:_visible() then return end
                for i,v in pairs(s.obj) do v:draw() end
             end;
    o.act = function(s)
                if not s:_active() then return end
                for i,v in pairs(s.obj) do v:act() end
            end;
    o.update = function(s)
                if not s:_active() then return end
                for i,v in pairs(s.obj) do v:update() end
                end;
    o.obj = {};

    setmetatable(o, self)
    self.__index = self
    -- Нужна проверка на занятость тега
    if nam then ALL[nam] = o end
    return o
end --func

posinrect = function(x,y, x1, y1, x2, y2)
        if x1<x and x<x2 and y1<y and y<y2 then return true else return false end
end --func

AbstractButton = {}
setmetatable(AbstractButton ,{__index = Conteiner})
function AbstractButton:new(nam, x, y, width, heigth, key)
    local o = Conteiner:new(nam)
    o.key = key
    o.x = x
    o.y = y
    o.width = width
    o.heigth = heigth
    o.act = function(s)
            if not s:_active() then return end
            local x, y, mb = input.mouse()
            if (mb.left and s.x<x and x<s.x+s.width and s.y<y and y<s.y+s.heigth) or input.keypress(s.key) then
                FREEZE = 10
                s:sound()
                if type(s.onclick)=='function' then s:onclick()
                elseif type(s.onclick)=='string' then showmessage(s.onclick)
                else error('Ошибка. onclick может быть только функцией либо строкой.') end
                ADD(s.nam..'_была_нажата')
                --s:onclick()
                end --if
            end;
    o.sound = function(s)
                buttonsound()
                --mixer.play 'kick'
                end;
    o.onclick = function(s)
                --error("Ошибка. Не прописано нажатие на кнопку. Добавьте метод onclick.")
                end;
    setmetatable(o, self)
    self.__index = self
    return o
end


PicButton = {}
setmetatable(PicButton ,{__index = AbstractButton})
function PicButton:new(nam, x, y, pic, key)
    local o = AbstractButton:new(nam, x,y,0,0, key)
    o.pic = pic
    o.width, o.heigth = pic:size()
    o.draw = function (s)
            if not s:_visible() then return end
            s.pic:blend(screen, s.x, s.y)
            end;
    setmetatable(o, self)
    return o
end --func


TextButton = {}
setmetatable(TextButton ,{__index = AbstractButton})
function TextButton:new(nam, x, y, width, heigth, text, key)
    local o = AbstractButton:new(nam, x, y, width, heigth, key)
    o.text = text
    o.draw = function (s)
            if not s:_visible() then return end
            local COLORACTIVE = 1
            local COLORNOTACTIVE = 4
            local color
            if s:_active() then color = COLORACTIVE else color = COLORNOTACTIVE end
            screen:rect(s.x, s.y, s.x+s.width, s.y+s.heigth, color)
            local w, h = font:size(s.text)
            gfx.print(s.text, s.x + (s.width - w)/2, s.y + (s.heigth - h)/2, color)
            end;
    setmetatable(o, self)
    return o
end --func

