dobrograd-13-06-2022/garrysmod/addons/util-dlib/lua/dlib/vgui/skin/hooks.lua
Jonny_Bro (Nikita) e4d5311906 first commit
2023-11-16 15:01:19 +05:00

697 lines
18 KiB
Lua

-- Copyright (C) 2016-2018 DBot
-- Permission is hereby granted, free of charge, to any person obtaining a copy
-- of this software and associated documentation files (the "Software"), to deal
-- in the Software without restriction, including without limitation the rights
-- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-- of the Software, and to permit persons to whom the Software is furnished to do so,
-- subject to the following conditions:
-- The above copyright notice and this permission notice shall be included in all copies
-- or substantial portions of the Software.
-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-- INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-- PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
-- FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-- DEALINGS IN THE SOFTWARE.
local DLib = DLib
local surface = surface
local draw = draw
local Color = Color
local GWEN = GWEN
local surface_SetTexture = surface.SetTexture
local surface_DrawRect = surface.DrawRect
local surface_GetTextSize = surface.GetTextSize
local surface_SetTextColor = surface.SetTextColor
local surface_SetTextPos = surface.SetTextPos
local surface_DrawText = surface.DrawText
local surface_SetFont = surface.SetFont
local surface_SetDrawColor = surface.SetDrawColor
local surface_DrawLine = surface.DrawLine
local Simple_DrawBox = DLib.skin.Simple_DrawBox
local Simple_DrawText = DLib.skin.Simple_DrawText
--[[---------------------------------------------------------
ExpandButton
-----------------------------------------------------------]]
function DLib.skin:PaintExpandButton(panel, w, h)
if not panel:GetExpanded() then
self.tex.TreePlus(0, 0, w, h)
else
self.tex.TreeMinus(0, 0, w, h)
end
end
local DefaultSkin
local function access(key)
if DefaultSkin ~= nil then
return DefaultSkin[key]
end
DefaultSkin = derma.GetSkinTable().Default
return DefaultSkin[key]
end
--[[---------------------------------------------------------
TextEntry
-----------------------------------------------------------]]
function DLib.skin:PaintTextEntry(panel, w, h)
-- https://github.com/Facepunch/garrysmod/blob/master/garrysmod/lua/skins/default.lua#L442
-- this is stupid
local super = access('PaintTextEntry')
if super then
return super(self, panel, w, h)
else
if panel.m_bBackground then
if panel:GetDisabled() then
self.tex.TextBox_Disabled(0, 0, w, h)
elseif panel:HasFocus() then
self.tex.TextBox_Focus(0, 0, w, h)
else
self.tex.TextBox(0, 0, w, h)
end
end
panel:DrawTextEntryText(panel:GetTextColor(), panel:GetHighlightColor(), panel:GetCursorColor())
end
end
function DLib.skin:SchemeTextEntry(panel) ---------------------- TODO
if access('PaintTextEntry') then return end
panel:SetTextColor(self.colTextEntryText)
panel:SetHighlightColor(self.colTextEntryTextHighlight)
panel:SetCursorColor(self.colTextEntryTextCursor)
end
--[[---------------------------------------------------------
Menu
-----------------------------------------------------------]]
function DLib.skin:PaintMenuSpacer(panel, w, h)
self.tex.MenuBG(0, 0, w, h)
end
--[[---------------------------------------------------------
MenuOption
-----------------------------------------------------------]]
function DLib.skin:PaintMenuOption(panel, w, h)
if panel.m_bBackground and (panel.Hovered or panel.Highlight) then
self.tex.MenuBG_Hover(0, 0, w, h)
end
if panel:GetChecked() then
self.tex.Menu_Check(5, h/2-7, 15, 15)
end
end
--[[---------------------------------------------------------
MenuRightArrow
-----------------------------------------------------------]]
function DLib.skin:PaintMenuRightArrow(panel, w, h)
self.tex.Menu.RightArrow(0, 0, w, h)
end
--[[---------------------------------------------------------
PropertySheet
-----------------------------------------------------------]]
function DLib.skin:PaintPropertySheet(panel, w, h)
-- TODO: Tabs at bottom, left, right
local ActiveTab = panel:GetActiveTab()
local Offset = 0
if ActiveTab then Offset = ActiveTab:GetTall()-8 end
if self.ENABLE_BLUR:GetBool() then
DLib.blur.RefreshNow(true)
DLib.blur.DrawOffset(0, Offset, w, h, panel:LocalToScreen(0, Offset))
end
self.tex.Tab_Control(0, Offset, w, h-Offset)
end
--[[---------------------------------------------------------
Tab
-----------------------------------------------------------]]
function DLib.skin:PaintTab(panel, w, h)
if panel:GetPropertySheet():GetActiveTab() == panel then
return self:PaintActiveTab(panel, w, h)
end
--DLib.blur.DrawPanel(w, h, panel:LocalToScreen(0, 0))
self.tex.TabT_Inactive(0, 0, w, h)
end
function DLib.skin:PaintActiveTab(panel, w, h)
--DLib.blur.DrawPanel(w, h, panel:LocalToScreen(0, 0))
self.tex.TabT_Active(0, 0, w, h)
end
--[[---------------------------------------------------------
Button
-----------------------------------------------------------]]
function DLib.skin:PaintWindowCloseButton(panel, w, h)
if not panel.m_bBackground then return end
if panel:GetDisabled() then
return self.tex.Window.Close(0, 0, w, h, Color(255, 255, 255, 50))
end
if panel.Depressed or panel:IsSelected() then
return self.tex.Window.Close_Down(0, 0, w, h)
end
if panel.Hovered then
return self.tex.Window.Close_Hover(0, 0, w, h)
end
self.tex.Window.Close(0, 0, w, h)
end
function DLib.skin:PaintWindowMinimizeButton(panel, w, h)
if not panel.m_bBackground then return end
if panel:GetDisabled() then
return self.tex.Window.Mini(0, 0, w, h, Color(255, 255, 255, 50))
end
if panel.Depressed or panel:IsSelected() then
return self.tex.Window.Mini_Down(0, 0, w, h)
end
if panel.Hovered then
return self.tex.Window.Mini_Hover(0, 0, w, h)
end
self.tex.Window.Mini(0, 0, w, h)
end
function DLib.skin:PaintWindowMaximizeButton(panel, w, h)
if not panel.m_bBackground then return end
if panel:GetDisabled() then
return self.tex.Window.Maxi(0, 0, w, h, Color(255, 255, 255, 50))
end
if panel.Depressed or panel:IsSelected() then
return self.tex.Window.Maxi_Down(0, 0, w, h)
end
if panel.Hovered then
return self.tex.Window.Maxi_Hover(0, 0, w, h)
end
self.tex.Window.Maxi(0, 0, w, h)
end
--[[---------------------------------------------------------
VScrollBar
-----------------------------------------------------------]]
function DLib.skin:PaintVScrollBar(panel, w, h)
self.tex.Scroller.TrackV(0, 0, w, h)
end
--[[---------------------------------------------------------
ScrollBarGrip
-----------------------------------------------------------]]
function DLib.skin:PaintScrollBarGrip(panel, w, h)
if panel:GetDisabled() then
return self.tex.Scroller.ButtonV_Disabled(0, 0, w, h)
end
if panel.Depressed then
return self.tex.Scroller.ButtonV_Down(0, 0, w, h)
end
if panel.Hovered then
return self.tex.Scroller.ButtonV_Hover(0, 0, w, h)
end
return self.tex.Scroller.ButtonV_Normal(0, 0, w, h)
end
--[[---------------------------------------------------------
ButtonDown
-----------------------------------------------------------]]
function DLib.skin:PaintButtonDown(panel, w, h)
if not panel.m_bBackground then return end
if panel.Depressed or panel:IsSelected() then
return self.tex.Scroller.DownButton_Down(0, 0, w, h)
end
if panel:GetDisabled() then
return self.tex.Scroller.DownButton_Dead(0, 0, w, h)
end
if panel.Hovered then
return self.tex.Scroller.DownButton_Hover(0, 0, w, h)
end
self.tex.Scroller.DownButton_Normal(0, 0, w, h)
end
--[[---------------------------------------------------------
ButtonUp
-----------------------------------------------------------]]
function DLib.skin:PaintButtonUp(panel, w, h)
if not panel.m_bBackground then return end
if panel.Depressed or panel:IsSelected() then
return self.tex.Scroller.UpButton_Down(0, 0, w, h)
end
if panel:GetDisabled() then
return self.tex.Scroller.UpButton_Dead(0, 0, w, h)
end
if panel.Hovered then
return self.tex.Scroller.UpButton_Hover(0, 0, w, h)
end
self.tex.Scroller.UpButton_Normal(0, 0, w, h)
end
--[[---------------------------------------------------------
ButtonLeft
-----------------------------------------------------------]]
function DLib.skin:PaintButtonLeft(panel, w, h)
if not panel.m_bBackground then return end
if panel.Depressed or panel:IsSelected() then
return self.tex.Scroller.LeftButton_Down(0, 0, w, h)
end
if panel:GetDisabled() then
return self.tex.Scroller.LeftButton_Dead(0, 0, w, h)
end
if panel.Hovered then
return self.tex.Scroller.LeftButton_Hover(0, 0, w, h)
end
self.tex.Scroller.LeftButton_Normal(0, 0, w, h)
end
--[[---------------------------------------------------------
ButtonRight
-----------------------------------------------------------]]
function DLib.skin:PaintButtonRight(panel, w, h)
if not panel.m_bBackground then return end
if panel.Depressed or panel:IsSelected() then
return self.tex.Scroller.RightButton_Down(0, 0, w, h)
end
if panel:GetDisabled() then
return self.tex.Scroller.RightButton_Dead(0, 0, w, h)
end
if panel.Hovered then
return self.tex.Scroller.RightButton_Hover(0, 0, w, h)
end
self.tex.Scroller.RightButton_Normal(0, 0, w, h)
end
--[[---------------------------------------------------------
ComboDownArrow
-----------------------------------------------------------]]
function DLib.skin:PaintComboDownArrow(panel, w, h)
if panel.ComboBox:GetDisabled() then
return self.tex.Input.ComboBox.Button.Disabled(0, 0, w, h)
end
if panel.ComboBox.Depressed or panel.ComboBox:IsMenuOpen() then
return self.tex.Input.ComboBox.Button.Down(0, 0, w, h)
end
if panel.ComboBox.Hovered then
return self.tex.Input.ComboBox.Button.Hover(0, 0, w, h)
end
self.tex.Input.ComboBox.Button.Normal(0, 0, w, h)
end
--[[---------------------------------------------------------
ComboBox
-----------------------------------------------------------]]
function DLib.skin:PaintComboBox(panel, w, h)
if panel:GetDisabled() then
return self.tex.Input.ComboBox.Disabled(0, 0, w, h)
end
if panel.Depressed or panel:IsMenuOpen() then
return self.tex.Input.ComboBox.Down(0, 0, w, h)
end
if panel.Hovered then
return self.tex.Input.ComboBox.Hover(0, 0, w, h)
end
self.tex.Input.ComboBox.Normal(0, 0, w, h)
end
--[[---------------------------------------------------------
ComboBox
-----------------------------------------------------------]]
function DLib.skin:PaintListBox(panel, w, h)
self.tex.Input.ListBox.Background(0, 0, w, h)
end
--[[---------------------------------------------------------
NumberUp
-----------------------------------------------------------]]
function DLib.skin:PaintNumberUp(panel, w, h)
if panel:GetDisabled() then
return self.Input.UpDown.Up.Disabled(0, 0, w, h)
end
if panel.Depressed then
return self.tex.Input.UpDown.Up.Down(0, 0, w, h)
end
if panel.Hovered then
return self.tex.Input.UpDown.Up.Hover(0, 0, w, h)
end
self.tex.Input.UpDown.Up.Normal(0, 0, w, h)
end
--[[---------------------------------------------------------
NumberDown
-----------------------------------------------------------]]
function DLib.skin:PaintNumberDown(panel, w, h)
if panel:GetDisabled() then
return self.tex.Input.UpDown.Down.Disabled(0, 0, w, h)
end
if panel.Depressed then
return self.tex.Input.UpDown.Down.Down(0, 0, w, h)
end
if panel.Hovered then
return self.tex.Input.UpDown.Down.Hover(0, 0, w, h)
end
self.tex.Input.UpDown.Down.Normal(0, 0, w, h)
end
function DLib.skin:PaintTreeNode(panel, w, h)
if not panel.m_bDrawLines then return end
surface_SetDrawColor(self.Colours.Tree.Lines)
if panel.m_bLastChild then
surface_DrawRect(9, 0, 1, 7)
surface_DrawRect(9, 7, 9, 1)
else
surface_DrawRect(9, 0, 1, h)
surface_DrawRect(9, 7, 9, 1)
end
end
function DLib.skin:PaintTreeNodeButton(panel, w, h)
if not panel.m_bSelected then return end
-- Don't worry this isn't working out the size every render
-- it just gets the cached value from inside the Label
local w, _ = panel:GetTextSize()
self.tex.Selection(38, 0, w + 6, h)
end
function DLib.skin:PaintSelection(panel, w, h)
self.tex.Selection(0, 0, w, h)
end
function DLib.skin:PaintSliderKnob(panel, w, h)
if panel:GetDisabled() then return self.tex.Input.Slider.H.Disabled(0, 0, w, h) end
if panel.Depressed then
return self.tex.Input.Slider.H.Down(0, 0, w, h)
end
if panel.Hovered then
return self.tex.Input.Slider.H.Hover(0, 0, w, h)
end
self.tex.Input.Slider.H.Normal(0, 0, w, h)
end
local function PaintNotches(x, y, w, h, num)
if not num then return end
local space = w / num
for i=0, num do
surface_DrawRect(x + i * space, y + 4, 1, 5)
end
end
function DLib.skin:PaintNumSlider(panel, w, h)
surface_SetDrawColor(Color(0, 0, 0, 100))
surface_DrawRect(8, h / 2 - 1, w - 15, 1)
PaintNotches(8, h / 2 - 1, w - 16, 1, panel.m_iNotches)
end
function DLib.skin:PaintProgress(panel, w, h)
self.tex.ProgressBar.Back(0, 0, w, h)
self.tex.ProgressBar.Front(0, 0, w * panel:GetFraction(), h)
end
function DLib.skin:PaintCollapsibleCategory(panel, w, h)
if not panel:GetExpanded() and h < 40 then
return self.tex.CategoryList.Header(0, 0, w, h)
end
self.tex.CategoryList.Inner(0, 0, w, h)
end
function DLib.skin:PaintCategoryList(panel, w, h)
self.tex.CategoryList.Outer(0, 0, w, h)
end
function DLib.skin:PaintCategoryButton(panel, w, h)
if panel.AltLine then
if panel.Depressed or panel.m_bSelected then
surface_SetDrawColor(self.Colours.Category.LineAlt.Button_Selected)
elseif panel.Hovered then
surface_SetDrawColor(self.Colours.Category.LineAlt.Button_Hover)
else
surface_SetDrawColor(self.Colours.Category.LineAlt.Button)
end
else
if panel.Depressed or panel.m_bSelected then
surface_SetDrawColor(self.Colours.Category.Line.Button_Selected)
elseif panel.Hovered then
surface_SetDrawColor(self.Colours.Category.Line.Button_Hover)
else
surface_SetDrawColor(self.Colours.Category.Line.Button)
end
end
surface_DrawRect(0, 0, w, h)
end
function DLib.skin:PaintListViewLine(panel, w, h)
if panel:IsSelected() then
self.tex.Input.ListBox.EvenLineSelected(0, 0, w, h)
elseif panel.Hovered then
self.tex.Input.ListBox.Hovered(0, 0, w, h)
elseif panel.m_bAlt then
self.tex.Input.ListBox.EvenLine(0, 0, w, h)
end
end
function DLib.skin:PaintListView(panel, w, h)
self.tex.Input.ListBox.Background(0, 0, w, h)
end
function DLib.skin:PaintTooltip(panel, w, h)
self.tex.Tooltip(0, 0, w, h)
end
function DLib.skin:PaintMenuBar(panel, w, h)
local Childs = panel:GetChildren()
for k, v in pairs(Childs) do
if panel.SetTextColor and not panel.FixFuckingTextColor then
panel.FixFuckingTextColor = true
panel:SetTextColor(DLib.skin.Colours.Button.Menu)
end
end
self.tex.Menu_Strip(0, 0, w, h)
end
-- END DEFAULT
function DLib.skin:PaintMenuOption(panel, w, h)
if panel.m_bBackground and (panel.Hovered or panel.Highlight) then
self.tex.MenuBG_Hover(0, 0, w, h)
end
if panel:GetChecked() then
self.tex.Menu_Check(5, h/2-7, 15, 15)
end
end
function DLib.skin:PaintMenu(panel, w, h)
if self.ENABLE_BLUR:GetBool() then
DLib.blur.RefreshNow(true)
DLib.blur.DrawPanel(w, h, panel:LocalToScreen(0, 0))
end
if panel:GetDrawColumn() then
self.tex.MenuBG_Column(0, 0, w, h)
else
self.tex.MenuBG(0, 0, w, h)
end
local Canvas = panel:GetCanvas()
if IsValid(Canvas) then
for k, v in pairs(Canvas:GetChildren()) do
if v.SetTextColor and not v.FIX_FUCKING_COLOR then
v:SetTextColor(DLib.skin.text_normal)
v.FIX_FUCKING_COLOR = true
end
end
end
end
function DLib.skin:PaintTree(panel, w, h)
if not panel.m_bBackground then return end
self.tex.Tree(0, 0, w, h, panel.m_bgColor, panel)
end
function DLib.skin:PaintCheckBox(panel, w, h)
if panel:GetChecked() then
if panel:GetDisabled() then
self.tex.CheckboxD_Checked(0, 0, w, h)
else
self.tex.Checkbox_Checked(0, 0, w, h)
end
else
if panel:GetDisabled() then
self.tex.CheckboxD(0, 0, w, h)
else
self.tex.Checkbox(0, 0, w, h)
end
end
end
function DLib.skin:PaintButton(panel, w, h)
if panel:GetIsMenu() then
if not panel.FixFuckingTextColor then
panel.FixFuckingTextColor = true
panel:SetTextColor(DLib.skin.Colours.Button.Menu)
end
end
if not panel.m_bBackground then return end
if panel.Depressed or panel:IsSelected() or panel:GetToggle() then
return self.tex.Button_Down(0, 0, w, h, panel)
end
if panel:GetDisabled() then
return self.tex.Button_Dead(0, 0, w, h, panel)
end
if panel.Hovered then
return self.tex.Button_Hovered(0, 0, w, h, panel)
end
self.tex.Button(0, 0, w, h, panel)
end
function DLib.skin:PaintWindowCloseButton(panel, w, h)
if not panel.m_bBackground then return end
if panel:GetDisabled() then
return self.tex.Window.Close(0, 0, w, h, panel)
end
if panel.Depressed or panel:IsSelected() then
return self.tex.Window.Close_Down(0, 0, w, h, panel)
end
if panel.Hovered then
return self.tex.Window.Close_Hover(0, 0, w, h, panel)
end
self.tex.Window.Close(0, 0, w, h, panel)
end
function DLib.skin:PaintWindowMinimizeButton(panel, w, h)
if not panel.m_bBackground then return end
if panel:GetDisabled() then
return self.tex.Window.Mini(0, 0, w, h, panel)
end
if panel.Depressed or panel:IsSelected() then
return self.tex.Window.Mini_Down(0, 0, w, h, panel)
end
if panel.Hovered then
return self.tex.Window.Mini_Hover(0, 0, w, h, panel)
end
self.tex.Window.Mini(0, 0, w, h, panel)
end
function DLib.skin:PaintWindowMaximizeButton(panel, w, h)
if not panel.m_bBackground then return end
if panel:GetDisabled() then
return self.tex.Window.Maxi(0, 0, w, h, panel)
end
if panel.Depressed or panel:IsSelected() then
return self.tex.Window.Maxi_Down(0, 0, w, h, panel)
end
if panel.Hovered then
return self.tex.Window.Maxi_Hover(0, 0, w, h, panel)
end
self.tex.Window.Maxi(0, 0, w, h, panel)
end
--[[---------------------------------------------------------
Frame
-----------------------------------------------------------]]
function DLib.skin:PaintFrame(panel, w, h)
if panel.m_bPaintShadow then
DisableClipping(true)
SKIN.tex.Shadow(-4, -4, w + 10, h + 10)
DisableClipping(false)
end
if self.ENABLE_BLUR:GetBool() then
DLib.blur.RefreshNow(true)
DLib.blur.DrawPanel(w, h, panel:LocalToScreen(0, 0))
end
if panel:HasHierarchicalFocus() then
self.tex.Window.Normal(0, 0, w, h)
else
self.tex.Window.Inactive(0, 0, w, h)
end
end