From 509e70548e38d0d294374b519a6c989f143d9c70 Mon Sep 17 00:00:00 2001 From: Ray Greenwell Date: Fri, 16 Mar 2007 21:26:53 +0000 Subject: [PATCH] It's just so handy, build-in the ability to specify a callback directly instead of a command to CommandEvent. Weirdly, a CommandEvent will never be generated with the callback way of doing things, but now CommandMenu and CommandButton will both support the callback syntax. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4629 542714f4-19e9-0310-aa3c-eee0fc999fb1 --- src/as/com/threerings/util/CommandEvent.as | 36 +++++++++++++++++----- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/src/as/com/threerings/util/CommandEvent.as b/src/as/com/threerings/util/CommandEvent.as index 445fd5a6a..38ff54eb0 100644 --- a/src/as/com/threerings/util/CommandEvent.as +++ b/src/as/com/threerings/util/CommandEvent.as @@ -35,16 +35,36 @@ public class CommandEvent extends Event * Use this method to dispatch CommandEvents. */ public static function dispatch ( - disp :IEventDispatcher, cmd :String, arg :Object = null) :void + disp :IEventDispatcher, cmdOrFn :Object, arg :Object = null) :void { - // Create the event - var event :CommandEvent = create(cmd, arg); + if (cmdOrFn is Function) { + var fn :Function = (cmdOrFn as Function); + var args :Array = (arg as Array); + if (args == null && arg != null) { + args = [ arg ]; + } + try { + fn.apply(null, args); + } catch (err :Error) { + var log :Log = Log.getLog(CommandEvent); + log.warning("Unable to call command callback, stack trace follows."); + log.logStackTrace(err); + } - // Dispatch it. A return value of true means that the event was - // never cancelled, so we complain. - if (disp == null || disp.dispatchEvent(event)) { - Log.getLog(CommandEvent).warning("Unhandled controller command " + - "[cmd=" + cmd + ", arg=" + arg + "]."); + } else if (cmdOrFn is String) { + var cmd :String = String(cmdOrFn); + // Create the event to dispatch + var event :CommandEvent = create(cmd, arg); + + // Dispatch it. A return value of true means that the event was + // never cancelled, so we complain. + if (disp == null || disp.dispatchEvent(event)) { + Log.getLog(CommandEvent).warning("Unhandled controller command " + + "[cmd=" + cmd + ", arg=" + arg + "]."); + } + + } else { + throw new ArgumentError("Argument 'cmdOrFn' must be a command (String) or a Function"); } }