Commit 2232c4fb authored by Peter Boström's avatar Peter Boström Committed by Commit Bot

Highlight ToolbarIconContainerView when hovered

Changes the detection mechanism for the ToolbarIconContainerView
highlight border so that it is active when either:

* The container is mouse hovered but the main view is not.
* Any child view has focus.
* Any child view is in the pressed state.

Bug: chromium:932818, chromium:943702
Change-Id: I388a4b78a43ddd05b3dd2623321f92938110ba0f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1674629Reviewed-by: default avatarSiyu An <siyua@chromium.org>
Commit-Queue: Peter Boström <pbos@chromium.org>
Cr-Commit-Position: refs/heads/master@{#671899}
parent 9f2651be
......@@ -40,26 +40,29 @@ void ToolbarIconContainerView::OnHighlightChanged(
bool highlighted) {
// TODO(crbug.com/932818): Pass observed button type to container.
highlighted_view_ = highlighted ? observed_button : nullptr;
UpdateHighlight(highlighted);
UpdateHighlight();
}
void ToolbarIconContainerView::OnStateChanged(
views::Button* observed_button,
views::Button::ButtonState old_state) {
if (highlighted_view_)
return;
UpdateHighlight(
observed_button->state() == views::Button::ButtonState::STATE_PRESSED ||
observed_button->state() == views::Button::ButtonState::STATE_HOVERED);
UpdateHighlight();
}
void ToolbarIconContainerView::OnViewFocused(views::View* observed_view) {
UpdateHighlight(true);
UpdateHighlight();
}
void ToolbarIconContainerView::OnViewBlurred(views::View* observed_view) {
UpdateHighlight(false);
UpdateHighlight();
}
void ToolbarIconContainerView::OnMouseEntered(const ui::MouseEvent& event) {
UpdateHighlight();
}
void ToolbarIconContainerView::OnMouseExited(const ui::MouseEvent& event) {
UpdateHighlight();
}
void ToolbarIconContainerView::ChildPreferredSizeChanged(views::View* child) {
......@@ -77,10 +80,38 @@ gfx::Insets ToolbarIconContainerView::GetInsets() const {
return gfx::Insets();
}
void ToolbarIconContainerView::UpdateHighlight(bool highlighted) {
void ToolbarIconContainerView::UpdateHighlight() {
if (!uses_highlight_)
return;
bool highlighted = false;
// If this container is mouse hovered and the main view is not mouse hovered
// the container should be highlighted.
if (!main_view_ || !main_view_->IsMouseHovered())
highlighted = IsMouseHovered();
// The container should also be highlighted if a dialog is anchored to.
if (highlighted_view_)
highlighted = true;
// The container should also highlight if any of the child buttons are
// either pressed or hovered.
for (views::View* child : children()) {
// The main view should not be considered for focus / button state.
if (child == main_view_)
continue;
if (child->HasFocus())
highlighted = true;
views::Button* button = views::Button::AsButton(child);
if (!button)
continue;
if (button->state() == views::Button::ButtonState::STATE_PRESSED ||
button->state() == views::Button::ButtonState::STATE_HOVERED) {
highlighted = true;
}
}
SetBorder(highlighted
? views::CreateRoundedRectBorder(
1,
......
......@@ -40,11 +40,13 @@ class ToolbarIconContainerView : public views::View,
friend class ToolbarPageActionIconContainerViewBrowserTest;
// views::View:
void OnMouseEntered(const ui::MouseEvent& event) override;
void OnMouseExited(const ui::MouseEvent& event) override;
void ChildPreferredSizeChanged(views::View* child) override;
void ChildVisibilityChanged(views::View* child) override;
gfx::Insets GetInsets() const override;
void UpdateHighlight(bool highlighted);
void UpdateHighlight();
// The main view is nominally always present and is last child in the view
// hierarchy.
......
......@@ -6,6 +6,7 @@
#include "base/test/scoped_feature_list.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/ui/views/autofill/payments/save_card_icon_view.h"
#include "chrome/browser/ui/views/frame/browser_view.h"
#include "chrome/browser/ui/views/toolbar/toolbar_page_action_icon_container_view.h"
#include "chrome/browser/ui/views/toolbar/toolbar_view.h"
......@@ -50,17 +51,17 @@ class ToolbarPageActionIconContainerViewBrowserTest
InProcessBrowserTest::SetUp();
}
void TestUsesHighlight(ToolbarPageActionIconContainerView* view,
void TestUsesHighlight(ToolbarPageActionIconContainerView* container,
bool expect_highlight) {
DCHECK(view);
EXPECT_EQ(view->uses_highlight(), expect_highlight);
EXPECT_EQ(view->border(), nullptr);
DCHECK(container);
EXPECT_EQ(container->uses_highlight(), expect_highlight);
EXPECT_EQ(container->border(), nullptr);
view->UpdateHighlight(true);
EXPECT_EQ(view->border() != nullptr, expect_highlight);
container->save_card_icon_view()->SetHighlighted(true);
EXPECT_EQ(container->border() != nullptr, expect_highlight);
view->UpdateHighlight(false);
EXPECT_EQ(view->border(), nullptr);
container->save_card_icon_view()->SetHighlighted(false);
EXPECT_EQ(container->border(), nullptr);
}
private:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment