--@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: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