2021-06-06 18:34:44 +06:00

222 lines
5.2 KiB
Lua

--@include element.txt
--@include label.txt
--@include button.txt
--@include /koptilnya/libs/utils.txt
--@include /koptilnya/gui/segoe_mdl2_assets_icons.txt
require("element.txt")
require("label.txt")
require("button.txt")
require("/koptilnya/libs/utils.txt")
local segoeIcons = require("/koptilnya/gui/segoe_mdl2_assets_icons.txt")
EPanel = class("EPanel", Element)
accessorFunc(EPanel, "_parentLock", "ParentLock", false)
function EPanel:initialize()
Element.initialize(self)
self._minimizable = true
self._closeable = true
self._minimized = false
self._lastHeight = 0
self.title = ELabel:new()
self.title:setFont(GUI.fonts.mainBold)
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(segoeIcons.ChromeMinimize)
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(0xE8BB))
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:setMinimizable(state)
self._minimizable = state
self.minimizeButton:setEnabled(state)
self.minimizeButton:setVisible(state)
end
function EPanel:isMinimizable()
return self._minimizable
end
function EPanel:setCloseable(state)
self._closeable = state
self.closeButton:setEnabled(state)
self.closeButton:setVisible(state)
end
function EPanel:isMinimized()
return self._minimized
end
function EPanel:setMinimized(state)
self._minimized = state
end
function EPanel:isCloseable()
return self._minimizable
end
function EPanel:close()
self:setVisible(false)
self:setEnabled(false)
self:onClose()
end
function EPanel:open()
self:setVisible(true)
self:setEnabled(true)
self:onOpen()
end
function EPanel:minimize()
self._lastHeight = self:getHeight()
self.minimizeButton:setText(segoeIcons.ChromeMaximize)
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(segoeIcons.ChromeMinimize)
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
-- STUB
function EPanel:onClose()
end
function EPanel:onOpen()
end