1. 01 Nov, 2019 1 commit
    • Greg Spencer's avatar
      Add convenience accessor for primaryFocus (#43859) · 3a30722f
      Greg Spencer authored
      This adds accessors for WidgetsBinding.instance.focusManager and WidgetsBinding.instance.focusManager.primaryFocus so that they can be more easily found in IDEs and accessed.
      
      This adds a top level getter for WidgetsBinding.instance.focusManager.primaryFocus called primaryFocus, and a static accessor FocusManager.instance that returns WidgetsBinding.instance.focusManager.
      3a30722f
  2. 30 Oct, 2019 1 commit
  3. 28 Oct, 2019 2 commits
  4. 23 Oct, 2019 2 commits
  5. 18 Oct, 2019 1 commit
    • Greg Spencer's avatar
      Wire up canRequestFocus and skipTraversal in FocusScopeNode (#43013) · 560873af
      Greg Spencer authored
      This adds a canRequestFocus and skipTraversal argument to FocusScope and FocusScopeNode, so that a scope can prevent being traversed.
      
      This allows a fix for a problem in the gallery where the focus while traversing the list of items would sometimes appear to disappear, since it would be focusing things that were in the backdrop that were part of the tree, but were not visible.
      
      Related Issues
      Fixes #42955
      560873af
  6. 15 Oct, 2019 1 commit
    • Greg Spencer's avatar
      Optimize focus operations by caching descendants and ancestors. (#42683) · 134ac429
      Greg Spencer authored
      This optimizes certain paths in the FocusManager, FocusNode, and FocusScopeNode classes in order to fix a regression in stock_animation_open_first_frame_average when I added more focus nodes to the tree to do focus traversal.
      
      Mainly I removed some remaining sync* iterators, and also started caching the computation of descendants and ancestors, since those are iterated over fairly often.
      
      This improves stock_animation_open_first_frame_average by about 2.8% overall (so about half of a 4.9% regression, both averaged over 10 runs).
      
      Addresses #42564
      134ac429
  7. 14 Oct, 2019 1 commit
    • Greg Spencer's avatar
      Fix route focusing and autofocus when reparenting focus nodes. (#42554) · e2c5fd6c
      Greg Spencer authored
      This fixes a problem with reparenting of focus nodes where it would remove the node from the scope's focused children when reparented, even if it was being reparented to another place under the same scope. This only occurred if the scope in question didn't have focus.
      
      This caused nodes to not get autofocused when they were a child of another node within the scope, and were reparented, and then the scope was given focus (as when a route is pushed).
      
      This keeps the node in the scope's child list where it was if the node is reparented under a parent within the same scope.
      
      - Added a test that tries to autofocus a TextField when the route is pushed and there is another 
        FocusNode above the text field. This was how this was first noticed: the autofocus got ignored in 
        this configuration.
      
      - Added a test to focus_manager_test that tests for the specific case of reparenting a node when 
        it's in the focused children of the scope.
      e2c5fd6c
  8. 26 Sep, 2019 2 commits
    • Greg Spencer's avatar
      Change the way ActionDispatcher is found. (#41245) · a0856358
      Greg Spencer authored
      This changes the way ActionDispatchers are found by the Actions widget, so that by default it will look for dispatchers of the parent Actions widgets instead of just creating a default ActionDispatcher. This allows overriding of the ActionDispatcher at the top level: before, the custom action dispatcher would only be invoked if explicitly set on all the Actions widgets.
      
      This is not a breaking change because there was a default value to the dispatcher parameter before that performed this function, and not specifying the dispatcher anywhere will still result in a default dispatcher being created.
      a0856358
    • Greg Spencer's avatar
      Added proper focus handling when pushing and popping routes (#40166) · 1a7bb1f5
      Greg Spencer authored
      The proposed change will change focus handling when pushing and popping routes so that the FocusScopeNode for the route receives focus when pushed, and that the FocusScopeNode in the navigator receives focus when the route is popped.
      
      This means that the last setFirstFocus call on the scope is used to determine which control actually receives focus. When the focus scope receives focus, it traverses its children, trying to find a non-scope node that is the "first focus" of itself or a child node.
      
      This is a breaking change, because the focus behavior has changed. If you push a route after this change, and had a 'first focus' set on a widget via FocusScopeNode.setFirstFocus, it won't currently receive focus immediately, but after this change it will. Similarly, if you pop a route after this change, the focus will go back to where it was before the route was pushed, which is correct, but different from what happens now.
      1a7bb1f5
  9. 04 Sep, 2019 1 commit
  10. 03 Sep, 2019 1 commit
    • Greg Spencer's avatar
      Make disabled buttons/chips/text fields not be focusable. (#38726) · 8daa165d
      Greg Spencer authored
      This changes the behavior of text fields, Material buttons, and Chips so that if they are disabled they lose focus. Before this change, it was possible to disable a control and then use focus traversal to reach it anyhow, and in the case of text fields, enter text into a disabled field.
      
      Fixes #33985
      8daa165d
  11. 21 Aug, 2019 1 commit
  12. 16 Aug, 2019 3 commits
    • Greg Spencer's avatar
      Adds canRequestFocus toggle to FocusNode (#38704) · d6938c56
      Greg Spencer authored
      * Add an 'unfocusable' focus node to allow developers to indicate when they don't want a Focus widget to be active
      
      * more unfocusable changes. not working.
      
      * Switch to focusable attribute
      
      * Rename to canRequestFocus
      
      * Turn off debug output
      
      * Update docs
      
      * Removed unused import
      d6938c56
    • brandondiamond's avatar
      c161ac89
    • Greg Spencer's avatar
      Automatic focus highlight mode for FocusManager (#37825) · a11d7314
      Greg Spencer authored
      This adds a FocusHighlightMode to the FocusManager that switches based on the type of input that has recently been received. The initial value is based on the platform, but is updated as soon as user input is received. There is also a FocusHighlightStrategy enum so that the developer can change the strategy to a fixed value if needed.
      
      The default is to automatically detect the mode based on the last type of user input. If they use a mouse or keyboard, it shows the focus highlights. If they use a touch interface, then the highlights disappear. This is consistent with the way that Android and Chrome work. The controls still receive focus, only the display of the highlight changes.
      
      Text fields show the focus highlight regardless of the focus highlight mode.
      a11d7314
  13. 14 Aug, 2019 1 commit
  14. 12 Aug, 2019 1 commit
  15. 10 Jul, 2019 1 commit
  16. 04 Jun, 2019 1 commit
    • Greg Spencer's avatar
      Add actions and keyboard shortcut map support (#33298) · 387e2b06
      Greg Spencer authored
      This implements the keyboard shortcut handling and action invocation in order to provide a place in the infrastructure for keyboard events to trigger actions. This will allow binding of key events to actions like "move the focus to the next widget" and "activate button".
      387e2b06
  17. 21 May, 2019 1 commit
  18. 16 May, 2019 1 commit
    • Greg Spencer's avatar
      Fix Focus.of to not find FocusScope nodes. (#32826) · 3c16cf6a
      Greg Spencer authored
      Until this change, Focus.of would return a FocusScopeNode if it found a FocusScope widget. This isn't really all that useful, and can easily lead to bad situations where many widgets think that the scope they are in (or the root scope!) is their indication of being focused.
      
      This changes Focus.of to throw an exception if it doesn't find a Focus widget before reaching the nearest FocusScope widget, or the root of the widget hierarchy.
      
      It also adds a nullOk optional bool to Focus.of so that if a caller expects to not find a Focus widget, it can deal with that as it sees fit. I modified InkWell to use this new behavior.
      
      This fixes an unreported issue that widgets using an InkWell will be drawn as focused the first time they are visited.
      3c16cf6a
  19. 15 May, 2019 1 commit
    • Greg Spencer's avatar
      Implements focus handling and hover for Material buttons. (#31438) · bb3c6605
      Greg Spencer authored
      This implements focus and hover handling for Material buttons. It inserts Focus widgets into the tree in order to allow buttons to be focusable via keyboard traversal (a.k.a. TAB traversal), and Listener widgets into the InkWell to allow the detection of hover states for widgets.
      
      Addresses #11344, #1608, and #13264.
      bb3c6605
  20. 10 May, 2019 1 commit
  21. 01 May, 2019 1 commit
    • Greg Spencer's avatar
      Change unfocus to unfocus the entire chain, Fix setFirstFocus (#31909) · be75fb36
      Greg Spencer authored
      In #31614, I added an unfocus() to FocusNodes to allow giving up of focus, but it only worked on the primary focus. This changes that so that it will unfocus the entire chain, not just the primary focus. Now, if you call unfocus() on a FocusNode or FocusScopeNode, and their hasFocus returns true, then after calling unfocus(), it will return false. Before this change, it would only do that if hasPrimaryFocus was also true.
      
      This also fixes a bug in the way setFirstFocus was implemented, making it conform more to the behavior of the previous implementation. It has simplified logic in reparent, and in when it requests focus for scope nodes that have had setFirstFocus called on them.
      be75fb36
  22. 25 Apr, 2019 1 commit
    • Greg Spencer's avatar
      [Re-Land] Implement focus traversal for desktop platforms. (#31614) · 7775c237
      Greg Spencer authored
      This re-lands the Focus changes in #30040. Correctness changes in routes.dart, and removes the automatic requesting of focus on reparent when there is no current focus, which caused undesirable selections.
      
      Addresses #11344, #1608, #13264, and #1678
      Fixes #30084
      Fixes #26704
      7775c237
  23. 23 Apr, 2019 1 commit
  24. 22 Apr, 2019 1 commit
    • Greg Spencer's avatar
      Implement focus traversal for desktop platforms, shoehorn edition. (#30040) · 4218c0bc
      Greg Spencer authored
      Implements focus traversal for desktop platforms, including re-implementing the existing focus manager and focus tree.
      
      This implements a Focus widget that can be put into a widget tree to allow input focus to be given to a particular part of a widget tree.
      
      It incorporates with the existing FocusScope and FocusNode infrastructure, and has minimal breakage to the API, although FocusScope.reparentIfNeeded is removed, replaced by a call to FocusAttachment.reparent(), so this is a breaking change:
      
      FocusScopeNodes must now be attached to the focus tree using FocusScopeNode.attach, which takes a context and an optional onKey callback, and returns a FocusAttachment that should be kept by the widget that hosts the FocusScopeNode. This is necessary because of the need to make sure that the focus tree reflects the widget hierarchy.
      
      Callers that used to call FocusScope(context).reparentIfNeeded in their build method will call reparent  on a FocusAttachment instead, which they will obtain by calling FocusScopeNode.attach in their initState method. Widgets that own FocusNodes will need to call dispose on the focus node in their dispose method.
      
      Addresses #11344, #1608, #13264, and #1678
      Fixes #30084
      Fixes #26704
      4218c0bc
  25. 20 Mar, 2019 1 commit
    • Alexandre Ardhuin's avatar
      some spaces formatting (#29452) · a6af4228
      Alexandre Ardhuin authored
      * some space formattings
      
      * always use blocks in if-else if a block is used
      
      * format spaces in for and while
      
      * allow multiline if conditions
      
      * fix missing space
      a6af4228
  26. 08 Mar, 2019 1 commit
    • Greg Spencer's avatar
      Add/rewrite tests for FocusScope. (#28169) · 89512e46
      Greg Spencer authored
      In anticipation of changing a lot of the focus code, I'm adding some tests for the FocusScope.
      
      As a result, I was able to find and fix a bug where there was an incorrect assert.
      
      I also added some more documentation.
      
      Several of the tests enforce what I think is incorrect behavior related to passing focus off when the widget tree gets rebuilt without focus nodes that were previously there, but I'm not going to change that behavior in this PR.
      
      I also renamed focus_test.dart to focus_scope_test.dart to be more in line with our naming conventions.
      89512e46
  27. 05 Feb, 2019 1 commit
  28. 14 Dec, 2018 2 commits
  29. 12 Sep, 2018 1 commit
  30. 20 Mar, 2018 1 commit
  31. 01 Feb, 2018 1 commit
  32. 22 Oct, 2017 1 commit
  33. 21 Sep, 2017 1 commit
  34. 11 Sep, 2017 1 commit