> On Feb 6, 2025, at 11:52 PM, Michael Strauß <michaelstr...@gmail.com> wrote:
> 
>> This PR uses an event dispatcher to provide a cleaner way of channeling 
>> keyboard events to another node. I haven’t prototyped the code but I suspect 
>> a Control could do this using the existing API without any changes to the 
>> Node class.
>> This PR also provides an API to query a node’s delegate, finally making the 
>> delegation public. This could also be an aspect of a Control rather than a 
>> Node.
> 
> I'm not sure you could do that. The redirecting event dispatcher
> ensures that on each level of abstraction, you'll see events exactly
> how you would expect to see them in isolation.

I should have been clearer. In your PR the retargeting event dispatcher is 
added in Node.buildEventDispatchChain. I was thinking that it could be added in 
Control.buildEventDispatchChain. So I was playing devil’s advocate and 
suggesting that all of this get moved to Control. After all it seems like a lot 
of machinery to add to Node to clean up the implementation of a small number of 
controls.

But on re-reading the PR I see that it’s the child of the delegating node 
that’s adding the dispatcher. Could you elaborate on why that is? It looks like 
you’re trying to ensure that the re-targeting of the event happens after the 
Control is done processing it even if a Control subclass overrides 
buildEventDispatchChain.

I’m fine with adding focus delegation to Node instead of Control. In fact I 
would recommend it since it provides a clean way of getting InputMethod events 
working.

> That's another aspect of the "consistency story" that this proposal
> tries to tell: you should be able to reason about the sub-graph of a
> Control in the same way as you reason about a top-level graph. If your
> control receives input, then it should also be focused.

I should have asked a different question. Is the focused flag being set to 
ensure the focus ring shows up? Or is it being set for some other reason and 
the focus ring is an unwelcome side-effect?

I’m trying to get a handle on what parts of the system rely on this flag 
because the documentation is incorrect and the implementation is murky. For 
example, the ListView and TreeView manipulate the focused flag in surprising 
ways and it’s not entirely clear if this is just bookkeeping or if they’re also 
trying to invoke some specific behavior in another part of the system (like 
CSS).

> I think that a node that is disabled, not editable, or not focus
> traversable should probably not be eligible to be a focus delegate.
> That would be inconsistent with top-level graphs.

I don’t think a ComboBox’s editor should be focus traversable since the user 
should never be able to traverse to it.

I’m not sure how you would enforce these restrictions. The enabled state is a 
property of Node but the editable state is not.

This raises another question. Can the focus delegate of the focusOwner change 
dynamically? For example, what if the editor inside a ComboBox changes to an 
enabled state while the ComboBox is the focusOwner? I ask because the code that 
enables and disables InputMethod events queries state and needs to be aware of 
changes to that state. If we extend that state to include delegates (and I 
think we should) we need to know when a delegate might change.

Reply via email to