diff --git a/gamemodes/terrortown/entities/entities/ttt_c4/cl_init.lua b/gamemodes/terrortown/entities/entities/ttt_c4/cl_init.lua index ed161b0fd0..d8c8caf932 100644 --- a/gamemodes/terrortown/entities/entities/ttt_c4/cl_init.lua +++ b/gamemodes/terrortown/entities/entities/ttt_c4/cl_init.lua @@ -7,6 +7,186 @@ local starttime = C4_MINIMUM_TIME local T = LANG.GetTranslation local PT = LANG.GetParamTranslation +--- +-- Calculates and caches the dimensions of the bodysearch UI. +-- @realm client +function ENT:CalculateMenuSizes() + self.sizes = {} + + self.sizes.width = 600 + self.sizes.height = 500 + self.sizes.padding = 10 + + self.sizes.heightButton = 45 + self.sizes.widthButton = 160 + self.sizes.widthButtonClose = 100 + self.sizes.heightBottomButtonPanel = self.sizes.heightButton + self.sizes.padding + 1 + + self.sizes.widthMainArea = self.sizes.width - 2 * self.sizes.padding + self.sizes.heightMainArea = self.sizes.height + - self.sizes.heightBottomButtonPanel + - 3 * self.sizes.padding + - vskin.GetHeaderHeight() + - vskin.GetBorderSize() + + self.sizes.widthTopButton = (self.sizes.widthMainArea - 4 * self.sizes.padding) / 5 + self.sizes.heightTopButton = 50 +end + +function ENT:ShowMenu() + self:CalculateMenuSizes() + + local frame = self.menuFrame + + -- IF MENU ELEMENT DOES NOT ALREADY EXIST, CREATE IT + if IsValid(frame) then + frame:ClearFrame(nil, nil, "c4_arm") + else + frame = vguihandler.GenerateFrame(self.sizes.width, self.sizes.height, "c4_arm") + end + + frame:SetPadding(self.sizes.padding, self.sizes.padding, self.sizes.padding, self.sizes.padding) + + -- CONTENT AREA + local mainBox = vgui.Create("DPanelTTT2", frame) + mainBox:SetSize(self.sizes.widthMainArea, self.sizes.heightMainArea) + mainBox:DockMargin(0, 0, 0, 0) + mainBox:Dock(TOP) + + local contentLayout = vgui.Create("DIconLayout", mainBox) + contentLayout:Dock(FILL) + + local box = contentLayout:Add("DInfoItemTTT2") + box:SetSize(self.sizes.widthContentBox, 100) + box:DockMargin(0, 0, 0, self.sizes.padding) + box:Dock(TOP) + box:SetData({ + text = { + title = { + body = "search_title_spectator", + params = nil, + }, + text = { + { + body = "search_spec", + params = nil, + }, + }, + }, + }) + + local selectionPanel = contentLayout:Add("DPanelTTT2") + selectionPanel:SetSize(self.sizes.widthContentBox, 250) + selectionPanel:DockMargin(0, 0, 0, 0) + selectionPanel:Dock(TOP) + selectionPanel.Paint = function(slf, w, h) + derma.SkinHook("Paint", "SelectionPanelTTT2", slf, w, h) + + return true + end + + local decisionLayout = vgui.Create("DIconLayout", selectionPanel) + decisionLayout:Dock(FILL) + + local buttonPanel = decisionLayout:Add("DPanelTTT2") + buttonPanel:SetSize( + self.sizes.widthMainArea - 2 * self.sizes.padding, + self.sizes.heightTopButton + ) + buttonPanel:DockMargin(0, 0, 0, 0) + buttonPanel:Dock(TOP) + + local buttonLayout = vgui.Create("DIconLayout", buttonPanel) + buttonLayout:Dock(FILL) + + local buttonTime1 = buttonLayout:Add("DButtonTTT2") + buttonTime1:SetSize(self.sizes.widthTopButton, self.sizes.heightTopButton) + buttonTime1:DockMargin(0, 0, 0, 0) + buttonTime1:Dock(LEFT) + buttonTime1:SetText("0:25") + buttonTime1.Paint = function(slf, w, h) + derma.SkinHook("Paint", "ButtonRoundEndLeftTTT2", slf, w, h) + + return true + end + + local buttonTime2 = buttonLayout:Add("DButtonTTT2") + buttonTime2:SetSize(self.sizes.widthTopButton, self.sizes.heightTopButton) + buttonTime2:DockMargin(self.sizes.padding, 0, 0, 0) + buttonTime2:Dock(LEFT) + buttonTime2:SetText("0:45") + buttonTime2.Paint = function(slf, w, h) + derma.SkinHook("Paint", "ButtonRoundEndLeftTTT2", slf, w, h) + + return true + end + + local buttonTime3 = buttonLayout:Add("DButtonTTT2") + buttonTime3:SetSize(self.sizes.widthTopButton, self.sizes.heightTopButton) + buttonTime3:DockMargin(self.sizes.padding, 0, 0, 0) + buttonTime3:Dock(LEFT) + buttonTime3:SetText("1:15") + buttonTime3.Paint = function(slf, w, h) + derma.SkinHook("Paint", "ButtonRoundEndLeftTTT2", slf, w, h) + + return true + end + + local buttonTime4 = buttonLayout:Add("DButtonTTT2") + buttonTime4:SetSize(self.sizes.widthTopButton, self.sizes.heightTopButton) + buttonTime4:DockMargin(self.sizes.padding, 0, 0, 0) + buttonTime4:Dock(LEFT) + buttonTime4:SetText("2:00") + buttonTime4.Paint = function(slf, w, h) + derma.SkinHook("Paint", "ButtonRoundEndLeftTTT2", slf, w, h) + + return true + end + + local buttonTime5 = buttonLayout:Add("DButtonTTT2") + buttonTime5:SetSize(self.sizes.widthTopButton, self.sizes.heightTopButton) + buttonTime5:DockMargin(self.sizes.padding, 0, 0, 0) + buttonTime5:Dock(LEFT) + buttonTime5:SetText("3:00") + buttonTime5.Paint = function(slf, w, h) + derma.SkinHook("Paint", "ButtonRoundEndLeftTTT2", slf, w, h) + + return true + end + + ----------------- + + -- BUTTONS + local buttonArea = vgui.Create("DButtonPanelTTT2", frame) + buttonArea:SetSize(self.sizes.width, self.sizes.heightBottomButtonPanel) + buttonArea:Dock(BOTTOM) + + local buttonPickUp = vgui.Create("DButtonTTT2", buttonArea) + buttonPickUp:SetText("c4_remove_pickup") + buttonPickUp:SetSize(self.sizes.widthButton, self.sizes.heightButton) + buttonPickUp:SetPos(0, self.sizes.padding + 1) + buttonPickUp.DoClick = function(btn) + print("bla") + end + + local buttonDestroy = vgui.Create("DButtonTTT2", buttonArea) + buttonDestroy:SetText("c4_remove_destroy1") + buttonDestroy:SetSize(self.sizes.widthButton, self.sizes.heightButton) + buttonDestroy:SetPos(self.sizes.widthButton + self.sizes.padding, self.sizes.padding + 1) + buttonDestroy:SetHoldTime(2) + buttonDestroy.DoClick = function(btn) + print("blubb") + end + + local buttonArm = vgui.Create("DButtonTTT2", buttonArea) + buttonArm:SetText("c4_arm") + buttonArm:SetSize(self.sizes.widthButton, self.sizes.heightButton) + buttonArm:SetPos(self.sizes.widthMainArea - self.sizes.widthButton, self.sizes.padding + 1) + buttonArm.DoClick = function(btn) + print("blubbidubb") + end +end + ---- ARMING --- diff --git a/gamemodes/terrortown/entities/entities/ttt_c4/shared.lua b/gamemodes/terrortown/entities/entities/ttt_c4/shared.lua index 6996086e1c..5b8b1283ae 100644 --- a/gamemodes/terrortown/entities/entities/ttt_c4/shared.lua +++ b/gamemodes/terrortown/entities/entities/ttt_c4/shared.lua @@ -731,8 +731,10 @@ else -- CLIENT if IsValid(self) then if not self:GetArmed() then ShowC4Config(self) + self:ShowMenu() else ShowC4Disarm(self) + self:ShowMenu() end end diff --git a/gamemodes/terrortown/gamemode/client/cl_vskin/default_skin.lua b/gamemodes/terrortown/gamemode/client/cl_vskin/default_skin.lua index 281963e635..bebddcc68b 100644 --- a/gamemodes/terrortown/gamemode/client/cl_vskin/default_skin.lua +++ b/gamemodes/terrortown/gamemode/client/cl_vskin/default_skin.lua @@ -664,6 +664,13 @@ function SKIN:PaintButtonTTT2(panel, w, h) drawBox(0, 0, w, h, colorBox) drawBox(0, h - sizes.border, w, sizes.border, colorLine) + local holdProgress = panel:GetHoldProgress() + + if panel:HasHoldTime() and holdProgress > 0 then + drawBox(0, 0, w * holdProgress, h, colors.accentActive) + drawBox(0, h - sizes.border, w * holdProgress, sizes.border, colors.accentDarkActive) + end + local translatedText = "" if panel:HasTextParams() then translatedText = string.upper(ParT(panel:GetText(), panel:GetTextParams())) @@ -2381,5 +2388,9 @@ function SKIN:PaintPlayerGraphTTT2(panel, w, h) end end +function SKIN:PaintSelectionPanelTTT2(panel, w, h) + drawRoundedBox(sizes.cornerRadius, 0, 0, w, h, colors.handle) +end + -- REGISTER DERMA SKIN derma.DefineSkin(SKIN.Name, "TTT2 default skin for all vgui elements", SKIN) diff --git a/gamemodes/terrortown/gamemode/client/cl_vskin/vgui/dbutton_ttt2.lua b/gamemodes/terrortown/gamemode/client/cl_vskin/vgui/dbutton_ttt2.lua index 8b5472bb1e..3712e27d5f 100644 --- a/gamemodes/terrortown/gamemode/client/cl_vskin/vgui/dbutton_ttt2.lua +++ b/gamemodes/terrortown/gamemode/client/cl_vskin/vgui/dbutton_ttt2.lua @@ -56,6 +56,30 @@ function PANEL:Init() oldRightClick(slf) end end) + + local oldMousePressed = self.OnMousePressed + local oldMouseReleased = self.OnMouseReleased + + self.OnMousePressed = function(slf, keyCode) + if not self:HasHoldTime() or keyCode ~= MOUSE_LEFT then + return oldMousePressed(slf, keyCode) + end + + self.data.holdStart = CurTime() + end + + self.OnMouseReleased = function(slf, keyCode) + if not self:HasHoldTime() or keyCode ~= MOUSE_LEFT then + return oldMouseReleased(slf, keyCode) + end + + if self:GetHoldProgress() >= 1 then + self:DoClickInternal() + self:DoClick() + end + + self.data.holdStart = nil + end end --- @@ -368,4 +392,22 @@ function PANEL:SizeToContents() self:SetSize(w + 8, h + 4) end +function PANEL:SetHoldTime(time) + self.data.holdtime = time +end + +function PANEL:HasHoldTime() + return self.data.holdtime ~= nil +end + +function PANEL:GetHoldProgress() + if not self:HasHoldTime() then + return 0 + end + + local time = CurTime() + + return math.min((time - (self.data.holdStart or time)) / self.data.holdtime, 1) +end + derma.DefineControl("DButtonTTT2", "A standard Button", PANEL, "DLabelTTT2") diff --git a/gamemodes/terrortown/gamemode/client/cl_vskin/vgui/dinfoitem_ttt2.lua b/gamemodes/terrortown/gamemode/client/cl_vskin/vgui/dinfoitem_ttt2.lua index fdb6cc5b76..40c3967ef8 100644 --- a/gamemodes/terrortown/gamemode/client/cl_vskin/vgui/dinfoitem_ttt2.lua +++ b/gamemodes/terrortown/gamemode/client/cl_vskin/vgui/dinfoitem_ttt2.lua @@ -27,6 +27,10 @@ end -- @return string|nil -- @realm client function PANEL:GetText() + if not self.data.text then + return + end + return self.data.text.text end @@ -34,6 +38,10 @@ end -- @return string -- @realm client function PANEL:GetTitle() + if not self.data.text then + return + end + return self.data.text.title end