// Copyright 2016 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef UI_VIEWS_CONTROLS_FOCUS_RING_H_ #define UI_VIEWS_CONTROLS_FOCUS_RING_H_ #include <memory> #include "base/functional/callback.h" #include "base/scoped_observation.h" #include "ui/base/class_property.h" #include "ui/base/metadata/metadata_types.h" #include "ui/color/color_id.h" #include "ui/native_theme/native_theme.h" #include "ui/views/controls/focusable_border.h" #include "ui/views/view.h" #include "ui/views/view_observer.h" #include "ui/views/views_export.h" namespace views { class HighlightPathGenerator; // FocusRing is a View that is designed to act as an indicator of focus for its // parent. It is a view that paints to a layer which extends beyond the bounds // of its parent view. // If MyView should show a rounded rectangular focus ring when it has focus and // hide the ring when it loses focus, no other configuration is necessary. In // other cases, it might be necessary to use the Set*() functions on FocusRing; // these take care of repainting it when the state changes. // TODO(tluk): FocusRing should not be a view but instead a new concept which // only participates in view painting ( https://crbug.com/840796 ). class VIEWS_EXPORT FocusRing : public View, public ViewObserver { … }; VIEWS_EXPORT SkPath GetHighlightPath(const View* view, float halo_thickness = FocusRing::kDefaultHaloThickness); // Set this on the FocusRing host to have the FocusRing paint an outline around // itself. This ensures that the FocusRing has sufficient contrast with its // surroundings (this is used for prominent MdTextButtons because they are blue, // while the background is light/dark, and the FocusRing doesn't contrast well // with both the interior and exterior of the button). This may need some polish // (such as blur?) in order to be expandable to all controls. For now it solves // color contrast on prominent buttons which is an a11y issue. See // https://crbug.com/1197631. // TODO(pbos): Consider polishing this well enough that this can be // unconditional. This may require rolling out `kCascadingBackgroundColor` to // more surfaces to have an accurate background color. VIEWS_EXPORT extern const ui::ClassProperty<bool>* const kDrawFocusRingBackgroundOutline; } // namespace views #endif // UI_VIEWS_CONTROLS_FOCUS_RING_H_