Commit 6847b882 authored by Caroline Rising's avatar Caroline Rising Committed by Commit Bot

Use animating layout for extensions toolbar container.

This animates the new extensions container when extensions are added/removed from the toolbar.

There will be a follow up that moved the animating layout to toolbar icon container view so that animating layout will also be used for the avatar button.

Bug: 985792
Change-Id: Ia0717e982825ddaa794ad495b20a3ef32bf87060
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1756983
Commit-Queue: Caroline Rising <corising@chromium.org>
Commit-Queue: Dana Fried <dfried@chromium.org>
Reviewed-by: default avatarDana Fried <dfried@chromium.org>
Cr-Commit-Position: refs/heads/master@{#697439}
parent d81e8289
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include "chrome/browser/ui/views/extensions/extensions_toolbar_container.h" #include "chrome/browser/ui/views/extensions/extensions_toolbar_container.h"
#include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/browser/ui/views/frame/browser_view.h"
#include "chrome/browser/ui/views/hover_button_controller.h" #include "chrome/browser/ui/views/hover_button_controller.h"
#include "chrome/browser/ui/views/layout/animating_layout_manager.h"
#include "chrome/browser/ui/views/toolbar/toolbar_actions_bar_bubble_views.h" #include "chrome/browser/ui/views/toolbar/toolbar_actions_bar_bubble_views.h"
#include "chrome/browser/ui/views/toolbar/toolbar_view.h" #include "chrome/browser/ui/views/toolbar/toolbar_view.h"
#include "chrome/common/chrome_paths.h" #include "chrome/common/chrome_paths.h"
...@@ -29,6 +30,33 @@ ...@@ -29,6 +30,33 @@
#include "ui/views/test/widget_test.h" #include "ui/views/test/widget_test.h"
#include "ui/views/window/dialog_client_view.h" #include "ui/views/window/dialog_client_view.h"
// Helper to wait until the hover card widget is visible.
class AnimatingLayoutWaiter : public AnimatingLayoutManager::Observer {
public:
explicit AnimatingLayoutWaiter(AnimatingLayoutManager* animating_layout)
: animating_layout_(animating_layout) {
animating_layout_->AddObserver(this);
}
~AnimatingLayoutWaiter() override { animating_layout_->RemoveObserver(this); }
void Wait() {
if (!animating_layout_->is_animating())
return;
run_loop_.Run();
}
// AnimatingLayoutManager overrides:
void OnLayoutIsAnimatingChanged(AnimatingLayoutManager* source,
bool is_animating) override {
if (!is_animating)
run_loop_.Quit();
}
private:
AnimatingLayoutManager* const animating_layout_;
base::RunLoop run_loop_;
};
class ExtensionsMenuViewBrowserTest : public DialogBrowserTest { class ExtensionsMenuViewBrowserTest : public DialogBrowserTest {
protected: protected:
void LoadTestExtension(const std::string& extension) { void LoadTestExtension(const std::string& extension) {
...@@ -91,6 +119,12 @@ class ExtensionsMenuViewBrowserTest : public DialogBrowserTest { ...@@ -91,6 +119,12 @@ class ExtensionsMenuViewBrowserTest : public DialogBrowserTest {
->primary_action_button_for_testing() ->primary_action_button_for_testing()
->button_controller() ->button_controller()
->OnMouseReleased(click_event); ->OnMouseReleased(click_event);
AnimatingLayoutWaiter waiter(
BrowserView::GetBrowserViewForBrowser(browser())
->toolbar()
->extensions_container()
->animating_layout_for_testing());
waiter.Wait();
} }
base::test::ScopedFeatureList scoped_feature_list_; base::test::ScopedFeatureList scoped_feature_list_;
......
...@@ -11,7 +11,10 @@ ...@@ -11,7 +11,10 @@
#include "chrome/browser/ui/views/extensions/browser_action_drag_data.h" #include "chrome/browser/ui/views/extensions/browser_action_drag_data.h"
#include "chrome/browser/ui/views/extensions/extensions_menu_view.h" #include "chrome/browser/ui/views/extensions/extensions_menu_view.h"
#include "chrome/browser/ui/views/extensions/extensions_toolbar_button.h" #include "chrome/browser/ui/views/extensions/extensions_toolbar_button.h"
#include "chrome/browser/ui/views/layout/animating_layout_manager.h"
#include "chrome/browser/ui/views/toolbar/toolbar_actions_bar_bubble_views.h" #include "chrome/browser/ui/views/toolbar/toolbar_actions_bar_bubble_views.h"
#include "ui/views/layout/flex_layout.h"
#include "ui/views/view_class_properties.h"
#include "ui/views/widget/widget_observer.h" #include "ui/views/widget/widget_observer.h"
struct ExtensionsToolbarContainer::DropInfo { struct ExtensionsToolbarContainer::DropInfo {
...@@ -35,6 +38,15 @@ ExtensionsToolbarContainer::ExtensionsToolbarContainer(Browser* browser) ...@@ -35,6 +38,15 @@ ExtensionsToolbarContainer::ExtensionsToolbarContainer(Browser* browser)
model_(ToolbarActionsModel::Get(browser_->profile())), model_(ToolbarActionsModel::Get(browser_->profile())),
model_observer_(this), model_observer_(this),
extensions_button_(new ExtensionsToolbarButton(browser_, this)) { extensions_button_(new ExtensionsToolbarButton(browser_, this)) {
animating_layout_ =
SetLayoutManager(std::make_unique<AnimatingLayoutManager>());
animating_layout_->SetShouldAnimateBounds(true);
auto* flex_layout = animating_layout_->SetTargetLayoutManager(
std::make_unique<views::FlexLayout>());
flex_layout->SetCollapseMargins(true)
.SetIgnoreDefaultMainAxisMargins(true)
.SetDefault(views::kMarginsKey,
gfx::Insets(0, GetLayoutConstant(TOOLBAR_ELEMENT_PADDING)));
model_observer_.Add(model_); model_observer_.Add(model_);
AddMainButton(extensions_button_); AddMainButton(extensions_button_);
CreateActions(); CreateActions();
...@@ -121,19 +133,16 @@ void ExtensionsToolbarContainer::PopOutAction( ...@@ -121,19 +133,16 @@ void ExtensionsToolbarContainer::PopOutAction(
ToolbarActionViewController* action, ToolbarActionViewController* action,
bool is_sticky, bool is_sticky,
const base::Closure& closure) { const base::Closure& closure) {
// TODO(pbos): Animate popout.
// TODO(pbos): Highlight popout differently. // TODO(pbos): Highlight popout differently.
DCHECK(!popped_out_action_); DCHECK(!popped_out_action_);
popped_out_action_ = action; popped_out_action_ = action;
icons_[popped_out_action_->GetId()]->SetVisible(true); icons_[popped_out_action_->GetId()]->SetVisible(true);
ReorderViews(); ReorderViews();
closure.Run(); animating_layout_->RunOrQueueAction(closure);
} }
void ExtensionsToolbarContainer::ShowToolbarActionBubble( void ExtensionsToolbarContainer::ShowToolbarActionBubble(
std::unique_ptr<ToolbarActionsBarBubbleDelegate> controller) { std::unique_ptr<ToolbarActionsBarBubbleDelegate> controller) {
// TODO(pbos): Make sure we finish animations before showing the bubble.
auto iter = icons_.find(controller->GetAnchorActionId()); auto iter = icons_.find(controller->GetAnchorActionId());
views::View* const anchor_view = iter != icons_.end() views::View* const anchor_view = iter != icons_.end()
...@@ -142,11 +151,10 @@ void ExtensionsToolbarContainer::ShowToolbarActionBubble( ...@@ -142,11 +151,10 @@ void ExtensionsToolbarContainer::ShowToolbarActionBubble(
anchor_view->SetVisible(true); anchor_view->SetVisible(true);
active_bubble_ = new ToolbarActionsBarBubbleViews( animating_layout_->RunOrQueueAction(
anchor_view, anchor_view != extensions_button_, std::move(controller)); base::BindOnce(&ExtensionsToolbarContainer::ShowActiveBubble,
views::BubbleDialogDelegateView::CreateBubble(active_bubble_) weak_ptr_factory_.GetWeakPtr(), anchor_view,
->AddObserver(this); base::Passed(std::move(controller))));
active_bubble_->Show();
} }
void ExtensionsToolbarContainer::ShowToolbarActionBubbleAsync( void ExtensionsToolbarContainer::ShowToolbarActionBubbleAsync(
...@@ -413,3 +421,13 @@ size_t ExtensionsToolbarContainer::WidthToIconCount(int x_offset) { ...@@ -413,3 +421,13 @@ size_t ExtensionsToolbarContainer::WidthToIconCount(int x_offset) {
0); 0);
return std::min(unclamped_count, actions_.size()); return std::min(unclamped_count, actions_.size());
} }
void ExtensionsToolbarContainer::ShowActiveBubble(
views::View* anchor_view,
std::unique_ptr<ToolbarActionsBarBubbleDelegate> controller) {
active_bubble_ = new ToolbarActionsBarBubbleViews(
anchor_view, anchor_view != extensions_button_, std::move(controller));
views::BubbleDialogDelegateView::CreateBubble(active_bubble_)
->AddObserver(this);
active_bubble_->Show();
}
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "chrome/browser/ui/views/toolbar/toolbar_action_view.h" #include "chrome/browser/ui/views/toolbar/toolbar_action_view.h"
#include "chrome/browser/ui/views/toolbar/toolbar_icon_container_view.h" #include "chrome/browser/ui/views/toolbar/toolbar_icon_container_view.h"
class AnimatingLayoutManager;
class Browser; class Browser;
class ExtensionsToolbarButton; class ExtensionsToolbarButton;
class ToolbarActionViewController; class ToolbarActionViewController;
...@@ -45,11 +46,19 @@ class ExtensionsToolbarContainer : public ToolbarIconContainerView, ...@@ -45,11 +46,19 @@ class ExtensionsToolbarContainer : public ToolbarIconContainerView,
return active_bubble_; return active_bubble_;
} }
AnimatingLayoutManager* animating_layout_for_testing() {
return animating_layout_;
}
// ToolbarIconContainerView: // ToolbarIconContainerView:
void UpdateAllIcons() override; void UpdateAllIcons() override;
ToolbarActionView* GetViewForId(const std::string& id); ToolbarActionView* GetViewForId(const std::string& id);
void ShowActiveBubble(
views::View* anchor_view,
std::unique_ptr<ToolbarActionsBarBubbleDelegate> controller);
private: private:
// A struct representing the position and action being dragged. // A struct representing the position and action being dragged.
struct DropInfo; struct DropInfo;
...@@ -158,6 +167,8 @@ class ExtensionsToolbarContainer : public ToolbarIconContainerView, ...@@ -158,6 +167,8 @@ class ExtensionsToolbarContainer : public ToolbarIconContainerView,
// there is none. // there is none.
std::unique_ptr<DropInfo> drop_info_; std::unique_ptr<DropInfo> drop_info_;
AnimatingLayoutManager* animating_layout_ = nullptr;
base::WeakPtrFactory<ExtensionsToolbarContainer> weak_ptr_factory_{this}; base::WeakPtrFactory<ExtensionsToolbarContainer> weak_ptr_factory_{this};
DISALLOW_COPY_AND_ASSIGN(ExtensionsToolbarContainer); DISALLOW_COPY_AND_ASSIGN(ExtensionsToolbarContainer);
......
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