| // Copyright 2013 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef ASH_ACCESSIBILITY_FOCUS_RING_CONTROLLER_H_ |
| #define ASH_ACCESSIBILITY_FOCUS_RING_CONTROLLER_H_ |
| |
| #include <memory> |
| |
| #include "ash/accessibility/focus_ring_layer.h" |
| #include "ash/ash_export.h" |
| #include "base/macros.h" |
| #include "ui/views/focus/focus_manager.h" |
| #include "ui/views/focus/widget_focus_manager.h" |
| #include "ui/views/widget/widget_observer.h" |
| |
| namespace views { |
| class View; |
| class Widget; |
| } // namespace views |
| |
| namespace ash { |
| |
| // FocusRingController manages the focus ring around the focused view. It |
| // follows widget focus change and update the focus ring layer when the focused |
| // view of the widget changes. |
| class ASH_EXPORT FocusRingController : public AccessibilityLayerDelegate, |
| public views::WidgetObserver, |
| public views::WidgetFocusChangeListener, |
| public views::FocusChangeListener { |
| public: |
| FocusRingController(); |
| ~FocusRingController() override; |
| |
| // Turns on/off the focus ring. |
| void SetVisible(bool visible); |
| |
| private: |
| // AccessibilityLayerDelegate. |
| void OnDeviceScaleFactorChanged() override; |
| void OnAnimationStep(base::TimeTicks timestamp) override; |
| |
| // Sets the focused |widget|. |
| void SetWidget(views::Widget* widget); |
| |
| // Updates the focus ring to the focused view of |widget_|. If |widget_| is |
| // NULL or has no focused view, removes the focus ring. Otherwise, draws it. |
| void UpdateFocusRing(); |
| |
| // views::WidgetObserver overrides: |
| void OnWidgetDestroying(views::Widget* widget) override; |
| void OnWidgetBoundsChanged(views::Widget* widget, |
| const gfx::Rect& new_bounds) override; |
| |
| // views::WidgetFocusChangeListener overrides: |
| void OnNativeFocusChanged(gfx::NativeView focused_now) override; |
| |
| // views::FocusChangeListener overrides: |
| void OnWillChangeFocus(views::View* focused_before, |
| views::View* focused_now) override; |
| void OnDidChangeFocus(views::View* focused_before, |
| views::View* focused_now) override; |
| |
| bool visible_; |
| |
| views::Widget* widget_; |
| std::unique_ptr<FocusRingLayer> focus_ring_layer_; |
| |
| DISALLOW_COPY_AND_ASSIGN(FocusRingController); |
| }; |
| |
| } // namespace ash |
| |
| #endif // ASH_ACCESSIBILITY_FOCUS_RING_CONTROLLER_H_ |