【问题标题】:How to detect right-click on DCollapsibleCategory? [GLua]如何检测右键单击 DCollapsibleCategory? [GLUA]
【发布时间】:2020-08-13 23:56:10
【问题描述】:

我相信 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。

【问题讨论】:

    标签: lua garrys-mod


    【解决方案1】:

    DCollapsibleCategory 由标题行和内容组成。

    标头does not implement OnMousePressed

    内容由您添加到其中的任何 UI 元素组成。
    如果您希望内容响应鼠标事件,您应该为这些单独的元素覆盖 OnMousePressed


    如果您确实需要标题行中的此类功能,您可以向 Garry 的 Mod 存储库提交拉取请求。

    或者:

    1. 复制the code for the 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
    

    Full code snippet

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多