Nikita Kruglickiy f1eaecd79e Update
2021-03-17 18:21:42 +06:00

184 lines
4.4 KiB
Plaintext

--@include element.txt
--@include label.txt
--@include button.txt
--@include /koptilnya/libs/utils.txt
require("element.txt")
require("label.txt")
require("button.txt")
require("/koptilnya/libs/utils.txt")
EPanel = class("EPanel", Element)
accessorFunc(EPanel, "_parentLock", "ParentLock", false)
function EPanel:initialize()
Element.initialize(self)
self._minimized = false
self._lastHeight = 0
self.title = ELabel:new()
self.title:setPos(12, 8)
self:addChild(self.title)
local colorScheme = {
bg = {
Color(0, 0, 0),
hover = Color(25, 25, 25),
disabled = Color(0, 0, 0)
}
}
self.minimizeButton = EButton:new()
self.minimizeButton:setFont(GUI.fonts["icons"])
self.minimizeButton:setText(string.utf8char(0xE73F))
self.minimizeButton:setSize(32, 32)
self.minimizeButton:setRadius(0)
self.minimizeButton:setColorScheme(colorScheme)
self.minimizeButton.onClick = function()
self:minimizeMaximize()
end
self:addChild(self.minimizeButton)
self.closeButton = EButton:new()
self.closeButton:setFont(GUI.fonts["icons"])
self.closeButton:setText(string.utf8char(0xE006))
self.closeButton:setSize(32, 32)
self.closeButton:setRadius(0)
self.closeButton:setColorScheme(colorScheme)
self.closeButton.onClick = function()
self:close()
end
self:addChild(self.closeButton)
self:setTitle("Panel")
self:setColorScheme({
border = {
Color(255, 255, 255, 10)
},
header = {
Color(0, 0, 0)
},
bg = {
Color(23, 23, 23)
}
})
end
function EPanel:setTitle(title)
self.title:setText(title)
end
function EPanel:getTitle()
return self.title:getText()
end
function EPanel:setMinimized(state)
self._minimized = state
end
function EPanel:isMinimized()
return self._minimized
end
function EPanel:close()
self:setVisible(false)
self:setEnabled(false)
end
function EPanel:open()
self:setVisible(true)
self:setEnabled(true)
end
function EPanel:minimize()
self._lastHeight = self:getHeight()
self.minimizeButton:setText(string.utf8char(10063))
self:setMinimized(true)
self:setHeight(34)
local child = self._firstChild
while child do
if child ~= self.title and child ~= self.minimizeButton and child ~= self.closeButton then
child:setVisible(false)
end
child = child._nextSibling
end
end
function EPanel:maximize()
self.minimizeButton:setText("_")
self:setMinimized(false)
self:setHeight(self._lastHeight)
local child = self._firstChild
while child do
if child ~= self.title and child ~= self.minimizeButton and child ~= self.closeButton then
child:setVisible(true)
end
child = child._nextSibling
end
end
function EPanel:minimizeMaximize()
if self:isMinimized() then
self:maximize()
else
self:minimize()
end
end
function EPanel:onMousePressed(x, y, key, keyName)
if keyName == "MOUSE1" then
local aX, aY = self:getAbsolutePos()
if self:isDraggable() and y < aY + 33 then
self._dragStartPos = {x - self:getX(), y - self:getY()}
end
end
end
function EPanel:onMouseReleased(x, y, key, keyName)
if keyName == "MOUSE1" then
if self:isDraggable() then
self._dragStartPos = nil
end
end
end
function EPanel:onMouseMoved(x, y)
if self._dragStartPos then
local targetX, targetY = x - self._dragStartPos[1], y - self._dragStartPos[2]
if self:hasParent() and self:getParentLock() then
targetX = math.clamp(targetX, 0, 1920 - self:getWidth())
targetY = math.clamp(targetY, 0, 1080 - self:getHeight())
end
self:setPos(targetX, targetY)
end
end
function EPanel:onMouseLeave()
self._dragStartPos = nil
end
function EPanel:performLayout(w, h)
self.minimizeButton:setPos(w - 65, 1)
self.closeButton:setPos(w - 33, 1)
end
function EPanel:paint(x, y, w, h)
render.setColor(self:getColorFromScheme("border"))
render.drawRectFast(x, y, w, h)
render.setColor(self:getColorFromScheme("header"))
render.drawRectFast(x + 1, y + 1, w - 2, 32)
render.setColor(self:getColorFromScheme("bg"))
render.drawRectFast(x + 1, y + 33, w - 2, h - 34)
end