SecureActionButton支持自定义方法探索
在使用SecureActionButtonTemplate做自己的动作按钮时, 通常只能执行安全模版中预定义的行为, 如actionbar, action, pet, spell, item...等等, 例如[language=lua]
local testbutton = CreateFrame("CheckButton", "Testbutton2", UIParent, "SecureActionButtonTemplate")
testbutton:SetAttribute("type", "spell")
testbutton:SetAttribute("spell", "恢复")
[/language]
如果想执行自定义行为, 文档上并没有给出相关说明, 只好翻源码了. 在SecureTemplates.lua这个文件中SecureActionButton_OnClick方法是来处理用户请求的. 对于type属性的的处理代码是这样的.
[language=lua]
...
elseif ( type == "focus" ) then
...
elseif ( type == "assist" ) then
...
elseif ( type == "maintank" or type == "mainassist" ) then
...
elseif ( type == "click" ) then
...
elseif ( type == "attribute" ) then
...
elseif ( type ) then
-- Custom action support
local func = rawget(self, type);
if ( func ) then
func(self, unit, button);
end
end
...
[/language]
最后一个elseif这里是值得关注的, 看起来blz给我们提供了一种执行自定义方法的入口. 于是下面我这么写
[language=lua]
local myfunc = function ()
Test.Print("Test Case2 aaaaaaaaaaaaaaaaaaaa")
end
local testbutton = CreateFrame("CheckButton", "Testbutton2", UIParent, "SecureActionButtonTemplate")
testbutton:SetAttribute("type", "func")
testbutton:SetAttribute("func", myfunc)
[/language]
以期望myfunc能够执行, 但结果是令人失望的. local func = rawget(self, type) 这句话便成了焦点, self就是Testbutton2, type变量这里是func字符串. 也就是说要从Testbutton2这个表中直接获取"func"这个key所对应的value. 当我用pairs遍历Testbutton2是发现他依然只是个普通的frame, 通过frame.:SetAttribute这样的语法并没有将属性加入到frame这个table中(实际应该是加到了table里的userdata对象中, 但这个对象无法控制). 因此无论怎么写, rawget(self, type) 的结果总是一个nil. 那么这部分代码就形同虚设了. 不知是blz没有设计完全还是只是给自己内部使用.
那应该如何才能支持自定义方法呢, 目前我想到的只是通过
[language=lua]
hooksecurefunc("SecureActionButton_OnClick", func)
[/language]
这样的方式来实现.
之后[url=http://www.cwowaddon.com/79][u][b][color=#666666]biggates[/color][/b][/u][/url]的指出了这里的用法
[language=lua]
button:SetAttribute("type", "func")
button.func = myfunc
[/language]
这是正确的, 看来我冤枉blz了. [language=lua]button:SetAttribute("type", "func")
button.func = myfunc[/language]即可 的确是这样. 我得改改文档 为什么不把函数绑定的功能加入到 ShortKey里面呢?
我急需这个功能 ShortKey本身使用了EVA, 直接按照EVA的方式调用就可以了, 异常简单. shortkey 的type中,并没有function这样的设置,
可以给一段ShortkeyConfig配置key绑定到function的例子吗?
最好ShortkeyConfig配置里面还可以加入,事件绑定到function的配置
页:
[1]