CWDG论坛-专业魔兽插件's Archiver

simonw 发表于 2007-7-27 16:09

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了.

biggates 发表于 2007-7-30 00:22

[language=lua]button:SetAttribute("type", "func")
button.func = myfunc[/language]即可

simonw 发表于 2007-7-30 00:59

的确是这样. 我得改改文档

guileen 发表于 2007-9-17 11:47

为什么不把函数绑定的功能加入到 ShortKey里面呢?

我急需这个功能

simonw 发表于 2007-9-17 12:21

ShortKey本身使用了EVA, 直接按照EVA的方式调用就可以了, 异常简单.

guileen 发表于 2007-9-17 13:02

shortkey 的type中,并没有function这样的设置,
可以给一段ShortkeyConfig配置key绑定到function的例子吗?
最好ShortkeyConfig配置里面还可以加入,事件绑定到function的配置

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.