如何在 DCollapsibleCategory 上检测鼠标右键单击?[GLua]

我相信 Garry's Mod 的 DCollapsibleCategory 派生自 Panel,因此我尝试创建一个自定义的 vgui 元素,以便我可以添加一个 function PANEL:OnMousePressed(keyCode),但这完全改变了它在我的记分板上的绘制方式。

下面是自定义 vgui 元素的代码,也许我错过了什么:

local PANEL = {}

AccessorFunc(PANEL, "hiddenPanel", "HiddenPanel")

function PANEL:Init()
    self.dataPanel = vgui.Create("DCollapsibleCategory", self)
    self.dataPanel:SetExpanded(0)
    self.dataPanel:SetLabel('')
    self.dataPanel:GetChildren()[1]:SetTall(45)
    self.dataPanel.Paint = function(pnl, w, h)
        draw.RoundedBox(0, 0, 0, w, h, Advocate_Scoreboard.Colors.BASE_HEADER)
    end

    self.hiddenList = vgui.Create("DPanelList", self.dataPanel)
    self.hiddenList:SetSpacing(1)
    self.dataPanel:SetContents(self.hiddenList)

    self.hiddenPanel = vgui.Create("DPanel", self.hiddenList)
    self.hiddenList:AddItem(self.hiddenPanel)
    self.hiddenPanel.Paint = function(pnl, w, h)
        draw.RoundedBox(0, 0, 0, w, h, Color(50, 50, 50))
    end
end

function PANEL:PerformLayout()
    self.dataPanel:SetSize(self:GetWide(), self:GetTall())
    self.dataPanel:GetChildren()[1]:SetTall(45)

    self.hiddenList:SetSize(self.dataPanel:GetWide(), self.dataPanel:GetTall())
    self.hiddenPanel:SetSize(self.hiddenList:GetWide(), 39)
end

function PANEL:OnMousePressed(keyCode)
    print(keyCode)
end

vgui.Register("Advocate_Scoreboard.Row", PANEL)

DCollapsibleCategory 不响应任何 . DoClick 函数 - 我不相信它具有从 Panel 派生的任何这些方法。

点赞
用户13497411
用户13497411

DCollapsibleCategory 由头部行和内容组成。

头部行不实现 OnMousePressed

内容由您添加的任何 UI 元素组成。

如果您想让内容响应鼠标事件,您应该重写这些单独元素的 OnMousePressed

如果您确实需要在头部行中使用此类功能,您可以向 Garry's Mod 存储库提交拉取请求。

或者:

  1. 复制 DCollapsibleCategory 的代码
  2. DCategoryHeader 重命名为 DCategoryHeader2
  3. DCollapsibleCategory 重命名为 DCollapsibleCategory2
  4. 向这个标头 PANEL 表添加以下函数
local PANEL = {
    ...

    OnMousePressed = function(self, mcode)
        self.DoClick(self)
        self:GetParent():OnMousePressed(mcode)
    end,

    ...
}

derma.DefineControl( "DCategoryHeader2", "Category Header", PANEL, "DButton" )

然后,您就可以在头部上检测鼠标单击

local DCollapsible = vgui.Create( "DCollapsibleCategory2", frame )
DCollapsible:SetLabel( "Collapsible Category" )
DCollapsible:SetPos( 25, 50 )
DCollapsible:SetSize( 250, 100 )
DCollapsible:SetExpanded( false )
function DCollapsible:OnMousePressed(keyCode)
    chat.AddText("DCollapsible Key pressed- " .. tostring(keyCode))
end

完整代码段

2020-05-08 14:44:16