Re: EventHandler problem
- To: mathgroup at smc.vnet.net
- Subject: [mg88966] Re: EventHandler problem
- From: m.r at inbox.ru
- Date: Thu, 22 May 2008 02:38:50 -0400 (EDT)
- References: <g03v5a$bp4$1@smc.vnet.net>
On May 10, 5:58 am, "J. McKenzie Alexander" <ja... at lse.ac.uk> wrote:
> I'm trying to design a custom InputField that indicates whether or not =
> the user has pressed Return to submit the changes. It's a simple
> design: a red or green disk is drawn to the right of the InputField to =
> indicate the state.
>
> Here's the definition of the disks:
>
> red = Graphics[{Green, AbsolutePointSize[12], Point[{0, =
0}]},
> ImageSize -> {20, Automatic}]
>
> green = Graphics[{Green, AbsolutePointSize[12], Point[{0=
, 0}]},
> ImageSize -> {20, Automatic}]
>
> Here's my first attempt at creating the InputField:
>
> DynamicModule[{k = 1, changed = False},
> Row[{
> EventHandler[
> InputField[Dynamic[k], Number, FieldSize -> Tiny,
> ContinuousAction -> True],
> {"KeyDown" :> (changed = True),
> "ReturnKeyDown" :> (changed = False)
> },
> PassEventsDown -> True
> ],
> Dynamic[If[changed, red, green]]
> }]
> ]
>
> Everything works except setting the value of changed back to False
> when the Return key is pressed. Mathematica fires the action for
> *both* "KeyDown" and "ReturnKeyDown", and the "KeyDown" action is
> invoked after the "ReturnKeyDown" action. (This happens regardless of
> whether one uses {"KeyDown" :> (...), "ReturnKeyDown" :> (...) } or
> {"ReturnKeyDown" :> (...) "KeyDown" :> (...)} in the argument to
> EventHandler.)
>
> I've tried detecting the value of the key by using CurrentValue["EventK=
ey"] but this doesn't seem to do anything...
>
> Any thoughts on how to solve this problem would be greatly appreciated!
>
> Cheers,
>
> Jason
>
> --
> Dr J. McKenzie Alexander
> Department of Philosophy, Logic and Scientific Method
> London School of Economics and Political Science
> Houghton Street, London WC2A 2AE
>
The CurrentValue["EventKey"] behaviour is a bug. Here's a workaround:
DynamicModule[{col = Green, x = Null, ret = ""},
EventHandler[
{InputField[Dynamic[x]],
Style["\[FilledCircle]", FontColor -> Dynamic[col]]},
{"KeyDown" :> (If[! ret, col = Red]; ret = False),
"ReturnKeyDown" :> (col = Green; ret = True)},
PassEventsDown -> True]
]
Maxim Rytin
m.r at inbox.ru