Commit dd2fe769 authored by Melissa Zhang's avatar Melissa Zhang Committed by Chromium LUCI CQ

[Sharesheet] Update bubble position with anchor movement

This CL adds a SharesheetParentWidgetObserver which
observes changes in the parent widget and updates the
position of the bubble to remain anchored to it.

Bug: 1159674
Change-Id: I9bc7d180b249fda54bc387b83501063be72ab37f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2596899Reviewed-by: default avatarDominick Ng <dominickn@chromium.org>
Reviewed-by: default avatarAvi Drissman <avi@chromium.org>
Commit-Queue: Melissa Zhang <melzhang@chromium.org>
Cr-Commit-Position: refs/heads/master@{#840469}
parent 3e8e19f5
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include "ash/public/cpp/ash_typography.h" #include "ash/public/cpp/ash_typography.h"
#include "ash/public/cpp/tablet_mode.h" #include "ash/public/cpp/tablet_mode.h"
#include "base/i18n/rtl.h" #include "base/i18n/rtl.h"
#include "base/scoped_observation.h"
#include "base/strings/string16.h" #include "base/strings/string16.h"
#include "base/time/time.h" #include "base/time/time.h"
#include "chrome/app/vector_icons/vector_icons.h" #include "chrome/app/vector_icons/vector_icons.h"
...@@ -49,6 +50,7 @@ ...@@ -49,6 +50,7 @@
#include "ui/views/metadata/metadata_impl_macros.h" #include "ui/views/metadata/metadata_impl_macros.h"
#include "ui/views/view_class_properties.h" #include "ui/views/view_class_properties.h"
#include "ui/views/widget/widget.h" #include "ui/views/widget/widget.h"
#include "ui/views/widget/widget_observer.h"
namespace { namespace {
...@@ -106,11 +108,33 @@ bool IsKeyboardCodeArrow(ui::KeyboardCode key_code) { ...@@ -106,11 +108,33 @@ bool IsKeyboardCodeArrow(ui::KeyboardCode key_code) {
} // namespace } // namespace
class SharesheetBubbleView::SharesheetParentWidgetObserver
: public views::WidgetObserver {
public:
SharesheetParentWidgetObserver(SharesheetBubbleView* owner,
views::Widget* widget)
: owner_(owner) {
observer_.Observe(widget);
}
~SharesheetParentWidgetObserver() override = default;
void OnWidgetBoundsChanged(views::Widget* widget,
const gfx::Rect& bounds) override {
owner_->OnWidgetBoundsChanged(widget, bounds);
}
private:
SharesheetBubbleView* owner_;
base::ScopedObservation<views::Widget, views::WidgetObserver> observer_{this};
};
SharesheetBubbleView::SharesheetBubbleView( SharesheetBubbleView::SharesheetBubbleView(
gfx::NativeWindow native_window, gfx::NativeWindow native_window,
sharesheet::SharesheetServiceDelegate* delegate) sharesheet::SharesheetServiceDelegate* delegate)
: delegate_(delegate) { : delegate_(delegate) {
set_parent_window(native_window); set_parent_window(native_window);
parent_widget_observer_ = std::make_unique<SharesheetParentWidgetObserver>(
this, views::Widget::GetWidgetForNativeWindow(native_window));
parent_view_ = parent_view_ =
views::Widget::GetWidgetForNativeWindow(native_window)->GetRootView(); views::Widget::GetWidgetForNativeWindow(native_window)->GetRootView();
UpdateAnchorPosition(); UpdateAnchorPosition();
...@@ -464,6 +488,11 @@ void SharesheetBubbleView::OnWidgetActivationChanged(views::Widget* widget, ...@@ -464,6 +488,11 @@ void SharesheetBubbleView::OnWidgetActivationChanged(views::Widget* widget,
} }
} }
void SharesheetBubbleView::OnWidgetBoundsChanged(views::Widget* widget,
const gfx::Rect& new_bounds) {
UpdateAnchorPosition();
}
void SharesheetBubbleView::CreateBubble() { void SharesheetBubbleView::CreateBubble() {
set_close_on_deactivate(false); set_close_on_deactivate(false);
SetButtons(ui::DIALOG_BUTTON_NONE); SetButtons(ui::DIALOG_BUTTON_NONE);
......
...@@ -44,7 +44,13 @@ class SharesheetBubbleView : public views::BubbleDialogDelegateView { ...@@ -44,7 +44,13 @@ class SharesheetBubbleView : public views::BubbleDialogDelegateView {
void ResizeBubble(const int& width, const int& height); void ResizeBubble(const int& width, const int& height);
void CloseBubble(); void CloseBubble();
// views::BubbleDialogDelegateView:
void OnWidgetBoundsChanged(views::Widget* widget,
const gfx::Rect& new_bounds) override;
private: private:
class SharesheetParentWidgetObserver;
// ui::EventHandler: // ui::EventHandler:
void OnKeyEvent(ui::KeyEvent* event) override; void OnKeyEvent(ui::KeyEvent* event) override;
...@@ -98,6 +104,8 @@ class SharesheetBubbleView : public views::BubbleDialogDelegateView { ...@@ -98,6 +104,8 @@ class SharesheetBubbleView : public views::BubbleDialogDelegateView {
views::Separator* expanded_view_separator_ = nullptr; views::Separator* expanded_view_separator_ = nullptr;
views::View* parent_view_ = nullptr; views::View* parent_view_ = nullptr;
SharesheetExpandButton* expand_button_ = nullptr; SharesheetExpandButton* expand_button_ = nullptr;
std::unique_ptr<SharesheetParentWidgetObserver> parent_widget_observer_;
}; };
#endif // CHROME_BROWSER_UI_ASH_SHARESHEET_SHARESHEET_BUBBLE_VIEW_H_ #endif // CHROME_BROWSER_UI_ASH_SHARESHEET_SHARESHEET_BUBBLE_VIEW_H_
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