On Fri, 3 Jan 2025 10:36:23 GMT, John Hendrikx <jhendr...@openjdk.org> wrote:

>> Implementation of [focus 
>> delegation](https://gist.github.com/mstr2/44d94f0bd5b5c030e26a47103063aa29).
>
> This looks really good.  I'm wondering if this could be simplified further.  
> Specifically, I think the `hoistFocus` flag and manual management of the 
> focus delegate may not be needed.
> 
> It seems to me that a Control could share some similarities with a Scene, in 
> that Control has properties that track a focus owner (similar to focus 
> delegate). In effect, a Control is a focus root similar to scene.  When a 
> Scene receives focus, it determines the best Node to "delegate" focus to; 
> similarly, when a Control receives focus, it determines which skin control 
> should be focused.  The normal focus rules should do the right thing here and 
> for example select the TextField of a Spinner as the delegate automatically 
> (some children may need to be marked as not focusable to guide the auto 
> selection, but this is an already existing standard mechanism).
> 
> When determining where to send events, if the target is a focus root, it 
> queries its focus owner (or focus delegate) and extends the event to that 
> target.  If that target is also a focus root, the process repeats.
> 
> The request focus function should operate differently as well.  It should 
> look for the closest focus root (a Control or Scene) and call the appropriate 
> request focus function on the root it finds.  If that root is Scene, 
> everything works as usual.  If it is another focus root like a Control, 
> Control can determine the best way to focus one of its child nodes (likely 
> you can just apply a normal search for an eligible focusable control for 
> this).
> 
> Perhaps the focus root functionality can be captured in an interface that 
> both Scene and Control implement.  I think it would need to specify a 
> `requestFocus` method and `focusOwnerProperty`.  This interface would then 
> replace the `focusScope` flag.

@hjohn I think what's missing in your model is the option to have an 
independently focusable node inside of a control. For example, think of a 
Button placed within a Button (via its `graphic` property). Clicking the nested 
button should not transfer the focus to its parent button. Whether a focus 
request should be hoisted is a choice that depends on the specifics of the 
control, and we probably need an API for that.

-------------

PR Comment: https://git.openjdk.org/jfx/pull/1632#issuecomment-2637581233

Reply via email to