1. 13 Jan, 2020 1 commit
    • Greg Spencer's avatar
      Allow requestFocus on an unattached FocusNode to create a deferred focus request (#48589) · 6495d377
      Greg Spencer authored
      This changes the behavior of requestFocus when it is called on a FocusNode that does not yet have a parent, so that it defers requesting focus until it receives a parent. Before this change, calling requestFocus before it had a parent was a no-op.
      
      This allows scenarios where a widget is newly added and wishes to immediately request the focus. Previously, it was very hard to make that work because requesting focus before the widget's focus node had a parent was ignored, so the developer had to wait until two frames later to request focus (one for the widget's node to be added to the focus tree, and one to request the focus).
      
      Now, in order to have a widget be focused when initially added, you just need to call requestFocus on its node when you create it, and as soon as it is added, it will automatically request focus.
      
      This is different from the autofocus attribute on the Focus widget, because it unconditionally requests focus when added (autofocus will only request focus if nothing else in the scope has focus).
      6495d377
  2. 08 Jan, 2020 1 commit
  3. 07 Jan, 2020 1 commit
  4. 05 Dec, 2019 2 commits
    • Greg Spencer's avatar
      Fixes Focus and FocusScope's assignment of canRequestFocus. (#46168) · e3005e69
      Greg Spencer authored
      This fixes an issue where lines like this:
      
          focusNode.canRequestFocus = widget.canRequestFocus ?? focusNode.canRequestFocus;
      
      Were causing the canRequestFocus bit to copy the status of the enclosing scope, since canRequestFocus also looks to the enclosing scope to decide if it can focus.
      e3005e69
    • Greg Spencer's avatar
      Normalizes all of the "See also" blocks in comments. (#46121) · c6fe7bb9
      Greg Spencer authored
      This normalizes all of the "See also" blocks in comments so that they conform in style.
      
      They all look like this now:
      
        /// See also:
        ///
        ///  * [MyFavoriteWidget], because it's cool.
        class Foo {}
      
      I removed some useless "See also" blocks, and added commentary to ones that were just "bare" references.
      
      This is my penance for adding so many bullets that are "-" instead of "*". :-)
      c6fe7bb9
  5. 04 Dec, 2019 1 commit
  6. 03 Dec, 2019 1 commit
    • Greg Spencer's avatar
      Clean up some things I noticed while doing another change (#45658) · 37f86c31
      Greg Spencer authored
      This fixes some minor things I noticed while doing another change.
      
      - Uncomments an old test that wants to be run, but can't be, and marked it as "skipped", so that the code won't rot anymore.
      - Added the focus state to the short string version of a FocusNode
      - Added a missing piece of information to findAncestorWidgetOfExactType
      37f86c31
  7. 27 Nov, 2019 1 commit
    • Ian Hickson's avatar
      License update (#45373) · 449f4a66
      Ian Hickson authored
      * Update project.pbxproj files to say Flutter rather than Chromium
      
      Also, the templates now have an empty organization so that we don't cause people to give their apps a Flutter copyright.
      
      * Update the copyright notice checker to require a standard notice on all files
      
      * Update copyrights on Dart files. (This was a mechanical commit.)
      
      * Fix weird license headers on Dart files that deviate from our conventions; relicense Shrine.
      
      Some were already marked "The Flutter Authors", not clear why. Their
      dates have been normalized. Some were missing the blank line after the
      license. Some were randomly different in trivial ways for no apparent
      reason (e.g. missing the trailing period).
      
      * Clean up the copyrights in non-Dart files. (Manual edits.)
      
      Also, make sure templates don't have copyrights.
      
      * Fix some more ORGANIZATIONNAMEs
      449f4a66
  8. 22 Nov, 2019 1 commit
  9. 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
  10. 30 Oct, 2019 1 commit
  11. 28 Oct, 2019 2 commits
  12. 23 Oct, 2019 2 commits
  13. 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
  14. 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
  15. 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
  16. 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
  17. 04 Sep, 2019 1 commit
  18. 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
  19. 21 Aug, 2019 1 commit
  20. 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
  21. 14 Aug, 2019 1 commit
  22. 12 Aug, 2019 1 commit
  23. 10 Jul, 2019 1 commit
  24. 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
  25. 21 May, 2019 1 commit
  26. 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
  27. 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
  28. 10 May, 2019 1 commit
  29. 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
  30. 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
  31. 23 Apr, 2019 1 commit
  32. 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
  33. 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
  34. 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