mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 05:43:46 +03:00
345 lines
11 KiB
Lua
345 lines
11 KiB
Lua
--[[
|
|
| This file was obtained through the combined efforts
|
|
| of Madbluntz & Plymouth Antiquarian Society.
|
|
|
|
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
|
| Maloy, DrPepper10 @ RIP, Atle!
|
|
|
|
|
| Visit for more: https://plymouth.thetwilightzone.ru/
|
|
--]]
|
|
|
|
|
|
local PANEL = {}
|
|
|
|
local materialMainframe = ix.util.GetMaterial("willardnetworks/datafile/mainframe.png")
|
|
local materialGadgetlight = ix.util.GetMaterial("willardnetworks/datafile/gadgetlight.png")
|
|
local materialDataBackground = ix.util.GetMaterial("willardnetworks/datafile/buttonnoarrow.png")
|
|
|
|
local color_blueDark = Color(40, 88, 115, 75)
|
|
local color_blueLight = Color(41, 243, 229, 255)
|
|
local color_gray = Color(154, 169, 175, 255)
|
|
|
|
local font = "MenuFontNoClamp"
|
|
|
|
local dateFormat = "%d/%m/%Y"
|
|
|
|
local animationSpeed = {
|
|
[true] = 1,
|
|
[false] = 0.5
|
|
}
|
|
|
|
function PANEL:Init()
|
|
self:SetSize(ScrW(), ScrH())
|
|
self:MakePopup()
|
|
Schema:AllowMessage(self)
|
|
self.outputHeight = 0
|
|
self.dividerWide = 0
|
|
|
|
local mainFrame = self:Add("EditablePanel")
|
|
mainFrame:SetSize(SScaleMin(645 / 3), SScaleMin(850 / 3))
|
|
mainFrame:Center()
|
|
mainFrame.Paint = function(this, with, height)
|
|
surface.SetDrawColor(color_white:Unpack())
|
|
surface.SetMaterial(materialMainframe)
|
|
surface.DrawTexturedRect(0, 0, with, height)
|
|
end
|
|
|
|
local close = self:Add("DButton")
|
|
close:SetSize(SScaleMin(107 / 3), SScaleMin(105 / 3))
|
|
close:SetPos(self:GetWide() * 0.5 + mainFrame:GetWide() * 0.5 - close:GetWide() * 0.6, self:GetTall() * 0.5 - mainFrame:GetTall() * 0.5 - close:GetTall() * 0.4)
|
|
close:SetText("")
|
|
close.Paint = function(this, with, height)
|
|
if this:IsHovered() then
|
|
surface.SetDrawColor(ColorAlpha(color_white, 50))
|
|
surface.SetMaterial(materialGadgetlight)
|
|
surface.DrawTexturedRect(0, 0, with, height)
|
|
end
|
|
end
|
|
|
|
close.DoClick = function()
|
|
surface.PlaySound("willardnetworks/datapad/close.wav")
|
|
self:Remove()
|
|
end
|
|
|
|
local subFrame = self:Add("EditablePanel")
|
|
subFrame:SetSize(mainFrame:GetWide() * 0.8, mainFrame:GetTall() * 0.5)
|
|
subFrame:Center()
|
|
subFrame:SetPos(subFrame.x, subFrame.y - SScaleMin(105 / 3))
|
|
|
|
self.dataSearch = subFrame:Add("ixDatapadSearchProfiles")
|
|
self.dataSearch.sendData = function(this, text)
|
|
self:UpdateStatus(L"pdaDatafile_search", "Warning")
|
|
|
|
net.Start("ixDataFilePDA_CWU_RequestData")
|
|
net.WriteString(text)
|
|
net.SendToServer()
|
|
end
|
|
|
|
self.dataSearch:GetChildren()[1]:GetChildren()[3]:Clear()
|
|
self.dataSearch:GetChildren()[3]:GetChildren()[2].OnEnter = function(this)
|
|
if (ix.config.Get("datafileNoConnection")) then
|
|
LocalPlayer():NotifyLocalized("Error: no connection!")
|
|
surface.PlaySound("hl1/fvox/buzz.wav")
|
|
self.dataSearch.noConnection2:SetVisible(true)
|
|
return
|
|
end
|
|
if self.outputFrame.inProgress then return end
|
|
|
|
surface.PlaySound("willardnetworks/datapad/navigate.wav")
|
|
|
|
if self.outputFrame.isOpen then
|
|
self:UpdateStatus(L"pdaDatafile_search", "Warning")
|
|
|
|
return self:SetOutputDataHeight(0, false, function(isOpen)
|
|
self.dataSearch:sendData(this:GetValue())
|
|
end)
|
|
end
|
|
|
|
self.dataSearch:sendData(this:GetValue())
|
|
end
|
|
|
|
self.dividerLine = self.dataSearch:Add("DShape")
|
|
self.dividerLine:SetType( "Rect" )
|
|
self.dividerLine:SetSize(self.dividerWide, SScaleMin(1 / 3))
|
|
self.dividerLine:SetPos(0, self.dataSearch:GetTall() - self.dividerLine:GetTall())
|
|
self.dividerLine:SetColor(color_blueLight)
|
|
|
|
self.status = self.dataSearch:GetChildren()[1]:GetChildren()[3]:Add("DLabel")
|
|
self:UpdateStatus(L"pdaDatafile_waiting", "Info")
|
|
|
|
self:InvalidateLayout(true)
|
|
|
|
self.outputFrame = self:Add("EditablePanel")
|
|
self.outputFrame:SetSize(subFrame:GetWide(), self.outputHeight)
|
|
self.outputFrame:SetPos(subFrame.x, self.dataSearch:GetTall() + subFrame.y)
|
|
self.outputFrame.isOpen = false
|
|
self.outputFrame.inProgress = false
|
|
self.outputFrame.Paint = function(this, width, height)
|
|
surface.SetDrawColor(color_blueDark)
|
|
surface.DrawRect(0, 0, width, height)
|
|
end
|
|
|
|
self.outputScroll = self.outputFrame:Add("DScrollPanel")
|
|
self.outputScroll:Dock(FILL)
|
|
self.outputScroll:DockMargin(SScaleMin(2 / 3), SScaleMin(2 / 3), SScaleMin(2 / 3), SScaleMin(2 / 3))
|
|
self.outputScroll.alphaOffset = 0.125
|
|
|
|
net.Receive("ixDataFilePDA_CWU_CheckData", function(_, client)
|
|
local length = net.ReadUInt(32)
|
|
local data = net.ReadData(length)
|
|
local uncompressed = util.Decompress(data)
|
|
|
|
if (!uncompressed) then
|
|
return self:UpdateStatus("Unable to decompress data", "Error")
|
|
end
|
|
|
|
local output = util.JSONToTable(uncompressed)
|
|
|
|
self:UpdateStatus(output.status[1], output.status[2])
|
|
|
|
if output.id then
|
|
output.status = nil
|
|
|
|
self:SetOutputDataHeight(SScaleMin(48 / 3) * 8 + SScaleMin(20 / 3), true)
|
|
|
|
self.outputScroll:Clear()
|
|
self:OnGetData(output)
|
|
end
|
|
end)
|
|
end
|
|
|
|
local function AddAdditionalInfo(basePanel, title, subtitle)
|
|
local top = basePanel:Add("DLabel")
|
|
top:SetTextColor(color_gray)
|
|
top:SetFont(font)
|
|
top:SetText(title:utf8upper()..":")
|
|
top:SizeToContents()
|
|
top:SetPos(basePanel:GetWide() - top:GetWide() - SScaleMin(32 / 3), basePanel:GetTall() * 0.2 - top:GetTall() * 0.2)
|
|
|
|
local bottom = basePanel:Add("DLabel")
|
|
bottom:SetTextColor(color_blueLight)
|
|
bottom:SetFont(font)
|
|
bottom:SetText(subtitle:utf8upper())
|
|
bottom:SizeToContents()
|
|
bottom:SetPos(basePanel:GetWide() - bottom:GetWide() - SScaleMin(32 / 3), basePanel:GetTall() - bottom:GetTall() - SScaleMin(4 / 3))
|
|
end
|
|
|
|
local function addInfo(basePanel, title, subtitle, additionalTitle, additionalSubtitle)
|
|
subtitle, additionalSubtitle = tostring(subtitle), tostring(additionalSubtitle)
|
|
|
|
local plugin = ix.plugin.Get("combineutilities")
|
|
|
|
local panel = basePanel:Add("EditablePanel")
|
|
panel:SetSize(basePanel:GetWide(), SScaleMin(48 / 3))
|
|
panel:Dock(TOP)
|
|
panel:DockMargin(0, 1, 0, 1)
|
|
panel:SetAlpha(0)
|
|
panel:AlphaTo(255, 1, basePanel.alphaOffset)
|
|
|
|
plugin:CreateRow(panel, title, subtitle)
|
|
|
|
panel.Paint = function(this, width, height)
|
|
surface.SetDrawColor(ColorAlpha(color_white, 50))
|
|
surface.SetMaterial(materialDataBackground)
|
|
surface.DrawTexturedRect(0, 0, width, height)
|
|
end
|
|
|
|
if additionalTitle then
|
|
AddAdditionalInfo(panel, additionalTitle, additionalSubtitle)
|
|
end
|
|
|
|
basePanel.alphaOffset = basePanel.alphaOffset + 0.125
|
|
|
|
return panel
|
|
end
|
|
|
|
function PANEL:OnGetData(data)
|
|
self.outputScroll.alphaOffset = 0.125
|
|
|
|
local anticitizen = addInfo(self.outputScroll, L("pdaDatafile_data_anticitizen"), data.anticitizen, L("pdaDatafile_data_bol"), data.bol)
|
|
|
|
if data.anticitizen or data.bol then
|
|
local color = data.anticitizen and derma.GetColor("Error", anticitizen) or derma.GetColor("Warning", anticitizen)
|
|
|
|
local oldPaint = anticitizen.Paint
|
|
anticitizen.Paint = function(this, width, height)
|
|
surface.SetDrawColor(ColorAlpha(color, 69))
|
|
surface.DrawRect(0, 0, width, height)
|
|
|
|
oldPaint(this, width, height)
|
|
end
|
|
end
|
|
|
|
local permits = addInfo(self.outputScroll, L("pdaDatafile_data_permits"), "")
|
|
permits.oldHeight = permits:GetTall()
|
|
permits.newHeight = 0
|
|
|
|
local permitsButton = permits:Add("DButton")
|
|
permitsButton:SetTextColor(color_blueLight)
|
|
permitsButton:SetFont(font)
|
|
permitsButton:SetText(L("pdaDatafile_data_permits_buttonShow"):utf8upper())
|
|
permitsButton:SizeToContentsY()
|
|
permitsButton:SetWide(permits:GetWide() - SScaleMin(24 / 3))
|
|
permitsButton:SetPos(SScaleMin(4 / 3), permits:GetTall() - permitsButton:GetTall() - SScaleMin(4 / 3))
|
|
permitsButton.isOpen = false
|
|
permitsButton.inProgress = false
|
|
permitsButton._SetHeight = function(this, height)
|
|
this.inProgress = true
|
|
|
|
permits:CreateAnimation(animationSpeed[this.isOpen], {
|
|
index = 0,
|
|
target = { newHeight = height },
|
|
easing = "outQuint",
|
|
Think = function(animation, panel)
|
|
panel:SetTall(panel.newHeight)
|
|
end,
|
|
OnComplete = function(animation, panel)
|
|
permitsButton.inProgress = false
|
|
end
|
|
})
|
|
end
|
|
|
|
local permitsPanel = permits:Add("EditablePanel")
|
|
permitsPanel:SetWide(permits:GetWide())
|
|
permitsPanel:SetTall(0)
|
|
permitsPanel:SetPos(0, permitsButton.y + permitsButton:GetTall())
|
|
|
|
local y = SScaleMin(8 / 3)
|
|
|
|
for k, _ in pairs(ix.permits.list) do
|
|
if data.permits[k] then
|
|
local left = permitsPanel:Add("DLabel")
|
|
left:SetTextColor(color_gray)
|
|
left:SetFont(font)
|
|
left:SetText(k:utf8upper())
|
|
left:SizeToContents()
|
|
left:SetPos(SScaleMin(20 / 3), y)
|
|
|
|
local right = permitsPanel:Add("DLabel")
|
|
right:SetTextColor(color_blueLight)
|
|
right:SetFont(font)
|
|
right:SetText(isbool(data.permits[k]) and L("pdaDatafile_data_permitsUnlimited"):utf8upper() or os.date(dateFormat, data.permits[k]))
|
|
right:SizeToContents()
|
|
right:SetPos(permitsPanel:GetWide() - right:GetWide() - SScaleMin(32 / 3), y)
|
|
|
|
y = y + left:GetTall() + SScaleMin(8 / 3)
|
|
end
|
|
end
|
|
|
|
permitsPanel:SetTall(y)
|
|
|
|
permitsButton.permitsTall = permits.oldHeight + y
|
|
permitsButton.DoClick = function(this, width, height)
|
|
if this.inProgress then return end
|
|
|
|
surface.PlaySound("willardnetworks/datapad/navigate2.wav")
|
|
|
|
this.isOpen = !this.isOpen
|
|
|
|
local translate = this.isOpen and "pdaDatafile_data_permits_buttonHide" or "pdaDatafile_data_permits_buttonShow"
|
|
|
|
this:SetText(L(translate):utf8upper())
|
|
this:_SetHeight(this.isOpen and this.permitsTall or permits.oldHeight)
|
|
end
|
|
|
|
permitsButton.Paint = function(this, width, height)
|
|
local alpha = this:IsHovered() and 125 or 69
|
|
|
|
surface.SetDrawColor(ColorAlpha(color_white, alpha))
|
|
surface.SetMaterial(materialDataBackground)
|
|
surface.DrawTexturedRect(0, 0, width, height)
|
|
end
|
|
end
|
|
|
|
function PANEL:UpdateStatus(text, color)
|
|
if color == "Error" then
|
|
surface.PlaySound("willardnetworks/datapad/deny.wav")
|
|
end
|
|
|
|
self.status:SetFont(font)
|
|
self.status:SetTextColor(derma.GetColor(color, self.status))
|
|
self.status:SetText(text:utf8upper())
|
|
self.status:SizeToContents()
|
|
self.status:Dock(RIGHT)
|
|
self.status:DockMargin(0, 0, SScaleMin(4 / 4), SScaleMin(6 / 3))
|
|
end
|
|
|
|
function PANEL:SetOutputDataHeight(height, boolean, callback)
|
|
local dataSearchWide = self.dataSearch:GetWide()
|
|
|
|
self.outputFrame.inProgress = true
|
|
|
|
self:CreateAnimation(animationSpeed[boolean], {
|
|
index = -1,
|
|
target = { outputHeight = height, dividerWide = boolean and dataSearchWide or 0 },
|
|
easing = "outQuint",
|
|
Think = function(animation, panel)
|
|
panel.outputFrame:SetTall(panel.outputHeight)
|
|
panel.dividerLine:SetWide(panel.dividerWide)
|
|
end,
|
|
OnComplete = function(animation, panel)
|
|
panel.outputFrame.isOpen = boolean
|
|
panel.outputFrame.inProgress = false
|
|
|
|
if callback then
|
|
callback(boolean)
|
|
end
|
|
end
|
|
})
|
|
end
|
|
|
|
vgui.Register("ixDatafilePDA_CWU", PANEL, "EditablePanel")
|
|
|
|
net.Receive("ixDataFilePDA_CWU_Open", function(length, client)
|
|
local character = LocalPlayer():GetCharacter()
|
|
|
|
if LocalPlayer():Team() == FACTION_WORKERS or character:IsVortigaunt() and character:GetBioticPDA() == "CWU" then
|
|
if IsValid(ix.gui.menu) then
|
|
ix.gui.menu:Remove()
|
|
end
|
|
|
|
surface.PlaySound("willardnetworks/datapad/open.wav")
|
|
vgui.Create("ixDatafilePDA_CWU")
|
|
end
|
|
end)
|