Commit 5a7d5a43 authored by Avery Musbach's avatar Avery Musbach Committed by Commit Bot

overview: Show a drop target in the display being dragged in

For multi-display dragging from overview, there shall be a drop target
in the display being dragged in.

Test: manual
Bug: 961170
Change-Id: If8439a301310f82896a776589c3d6be751b9504e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1972297Reviewed-by: default avatarSammie Quon <sammiequon@chromium.org>
Commit-Queue: Avery Musbach <amusbach@chromium.org>
Cr-Commit-Position: refs/heads/master@{#726184}
parent 68f5b78e
...@@ -187,6 +187,7 @@ class ShutdownAnimationFpsCounterObserver : public OverviewObserver { ...@@ -187,6 +187,7 @@ class ShutdownAnimationFpsCounterObserver : public OverviewObserver {
// Creates |drop_target_widget_|. It's created when a window or overview item is // Creates |drop_target_widget_|. It's created when a window or overview item is
// dragged around, and destroyed when the drag ends. // dragged around, and destroyed when the drag ends.
std::unique_ptr<views::Widget> CreateDropTargetWidget( std::unique_ptr<views::Widget> CreateDropTargetWidget(
aura::Window* root_window,
aura::Window* dragged_window) { aura::Window* dragged_window) {
views::Widget::InitParams params; views::Widget::InitParams params;
params.type = views::Widget::InitParams::TYPE_WINDOW_FRAMELESS; params.type = views::Widget::InitParams::TYPE_WINDOW_FRAMELESS;
...@@ -194,7 +195,7 @@ std::unique_ptr<views::Widget> CreateDropTargetWidget( ...@@ -194,7 +195,7 @@ std::unique_ptr<views::Widget> CreateDropTargetWidget(
params.activatable = views::Widget::InitParams::Activatable::ACTIVATABLE_NO; params.activatable = views::Widget::InitParams::Activatable::ACTIVATABLE_NO;
params.opacity = views::Widget::InitParams::WindowOpacity::kTranslucent; params.opacity = views::Widget::InitParams::WindowOpacity::kTranslucent;
params.accept_events = false; params.accept_events = false;
params.parent = dragged_window->parent(); params.parent = desks_util::GetActiveDeskContainerForRoot(root_window);
params.init_properties_container.SetProperty(kHideInDeskMiniViewKey, true); params.init_properties_container.SetProperty(kHideInDeskMiniViewKey, true);
auto widget = std::make_unique<views::Widget>(); auto widget = std::make_unique<views::Widget>();
widget->set_focus_on_creation(false); widget->set_focus_on_creation(false);
...@@ -655,17 +656,32 @@ void OverviewGrid::RemoveItem(OverviewItem* overview_item, ...@@ -655,17 +656,32 @@ void OverviewGrid::RemoveItem(OverviewItem* overview_item,
} }
} }
void OverviewGrid::AddDropTargetForDraggingFromOverview( void OverviewGrid::AddDropTargetForDraggingFromThisGrid(
OverviewItem* dragged_item) { OverviewItem* dragged_item) {
DCHECK_EQ(dragged_item->GetWindow()->GetRootWindow(), root_window_);
DCHECK(!drop_target_widget_); DCHECK(!drop_target_widget_);
drop_target_widget_ = CreateDropTargetWidget(dragged_item->GetWindow()); drop_target_widget_ =
CreateDropTargetWidget(root_window_, dragged_item->GetWindow());
const size_t position = GetOverviewItemIndex(dragged_item) + 1u; const size_t position = GetOverviewItemIndex(dragged_item) + 1u;
overview_session_->AddItem(drop_target_widget_->GetNativeWindow(), overview_session_->AddItem(drop_target_widget_->GetNativeWindow(),
/*reposition=*/true, /*animate=*/false, /*reposition=*/true, /*animate=*/false,
/*ignored_items=*/{dragged_item}, position); /*ignored_items=*/{dragged_item}, position);
} }
void OverviewGrid::AddDropTargetNotForDraggingFromThisGrid(
aura::Window* dragged_window,
bool animate) {
DCHECK(!drop_target_widget_);
drop_target_widget_ = CreateDropTargetWidget(root_window_, dragged_window);
aura::Window* drop_target_window = drop_target_widget_->GetNativeWindow();
if (animate) {
drop_target_widget_->SetOpacity(0.f);
ScopedOverviewAnimationSettings settings(
OVERVIEW_ANIMATION_DROP_TARGET_FADE, drop_target_window);
drop_target_widget_->SetOpacity(1.f);
}
overview_session_->AddItem(drop_target_window, /*reposition=*/true, animate);
}
void OverviewGrid::RemoveDropTarget() { void OverviewGrid::RemoveDropTarget() {
DCHECK(drop_target_widget_); DCHECK(drop_target_widget_);
OverviewItem* drop_target = GetDropTarget(); OverviewItem* drop_target = GetDropTarget();
...@@ -683,6 +699,7 @@ void OverviewGrid::SetBoundsAndUpdatePositions( ...@@ -683,6 +699,7 @@ void OverviewGrid::SetBoundsAndUpdatePositions(
} }
void OverviewGrid::RearrangeDuringDrag( void OverviewGrid::RearrangeDuringDrag(
aura::Window* root_window_being_dragged_in,
aura::Window* dragged_window, aura::Window* dragged_window,
SplitViewDragIndicators::WindowDraggingState window_dragging_state) { SplitViewDragIndicators::WindowDraggingState window_dragging_state) {
OverviewItem* drop_target = GetDropTarget(); OverviewItem* drop_target = GetDropTarget();
...@@ -692,11 +709,12 @@ void OverviewGrid::RearrangeDuringDrag( ...@@ -692,11 +709,12 @@ void OverviewGrid::RearrangeDuringDrag(
ScopedOverviewAnimationSettings settings( ScopedOverviewAnimationSettings settings(
OVERVIEW_ANIMATION_DROP_TARGET_FADE, OVERVIEW_ANIMATION_DROP_TARGET_FADE,
drop_target_widget_->GetNativeWindow()); drop_target_widget_->GetNativeWindow());
drop_target->SetOpacity( drop_target->SetOpacity(root_window_being_dragged_in == root_window_ &&
SplitViewDragIndicators::GetSnapPosition(window_dragging_state) == SplitViewDragIndicators::GetSnapPosition(
SplitViewController::NONE window_dragging_state) ==
? 1.f SplitViewController::NONE
: 0.f); ? 1.f
: 0.f);
} }
// Update the grid's bounds. // Update the grid's bounds.
...@@ -763,22 +781,10 @@ void OverviewGrid::OnSelectorItemDragEnded(bool snap) { ...@@ -763,22 +781,10 @@ void OverviewGrid::OnSelectorItemDragEnded(bool snap) {
void OverviewGrid::OnWindowDragStarted(aura::Window* dragged_window, void OverviewGrid::OnWindowDragStarted(aura::Window* dragged_window,
bool animate) { bool animate) {
DCHECK_EQ(dragged_window->GetRootWindow(), root_window_);
DCHECK(!drop_target_widget_);
dragged_window_ = dragged_window; dragged_window_ = dragged_window;
drop_target_widget_ = CreateDropTargetWidget(dragged_window); AddDropTargetNotForDraggingFromThisGrid(dragged_window, animate);
aura::Window* drop_target_window = drop_target_widget_->GetNativeWindow();
if (animate) {
drop_target_widget_->SetOpacity(0.f);
ScopedOverviewAnimationSettings settings(
OVERVIEW_ANIMATION_DROP_TARGET_FADE, drop_target_window);
drop_target_widget_->SetOpacity(1.f);
}
overview_session_->AddItem(drop_target_window, /*reposition=*/true, animate);
// Stack the |dragged_window| at top during drag. // Stack the |dragged_window| at top during drag.
dragged_window->parent()->StackChildAtTop(dragged_window); dragged_window->parent()->StackChildAtTop(dragged_window);
// Called to set caption and title visibility during dragging. // Called to set caption and title visibility during dragging.
OnSelectorItemDragStarted(/*item=*/nullptr); OnSelectorItemDragStarted(/*item=*/nullptr);
} }
...@@ -790,7 +796,7 @@ void OverviewGrid::OnWindowDragContinued( ...@@ -790,7 +796,7 @@ void OverviewGrid::OnWindowDragContinued(
DCHECK_EQ(dragged_window_, dragged_window); DCHECK_EQ(dragged_window_, dragged_window);
DCHECK_EQ(dragged_window->GetRootWindow(), root_window_); DCHECK_EQ(dragged_window->GetRootWindow(), root_window_);
RearrangeDuringDrag(dragged_window, window_dragging_state); RearrangeDuringDrag(root_window_, dragged_window, window_dragging_state);
UpdateDropTargetBackgroundVisibility(nullptr, location_in_screen); UpdateDropTargetBackgroundVisibility(nullptr, location_in_screen);
aura::Window* target_window = aura::Window* target_window =
......
...@@ -128,7 +128,12 @@ class ASH_EXPORT OverviewGrid : public SplitViewObserver, ...@@ -128,7 +128,12 @@ class ASH_EXPORT OverviewGrid : public SplitViewObserver,
// drop target takes the place of |dragged_item|. Does not animate the // drop target takes the place of |dragged_item|. Does not animate the
// repositioning or fade in the drop target. The visual effect is that the // repositioning or fade in the drop target. The visual effect is that the
// drop target was already present but was covered by |dragged_item|. // drop target was already present but was covered by |dragged_item|.
void AddDropTargetForDraggingFromOverview(OverviewItem* dragged_item); void AddDropTargetForDraggingFromThisGrid(OverviewItem* dragged_item);
// Adds a drop target for |dragged_window|. Used for dragging from another
// grid, from the top in tablet mode, or from the shelf in tablet mode.
void AddDropTargetNotForDraggingFromThisGrid(aura::Window* dragged_window,
bool animate);
// Removes the drop target from the grid. // Removes the drop target from the grid.
void RemoveDropTarget(); void RemoveDropTarget();
...@@ -141,8 +146,9 @@ class ASH_EXPORT OverviewGrid : public SplitViewObserver, ...@@ -141,8 +146,9 @@ class ASH_EXPORT OverviewGrid : public SplitViewObserver,
bool animate); bool animate);
// Updates overview bounds and hides the drop target when a preview area is // Updates overview bounds and hides the drop target when a preview area is
// shown. // shown or |root_window_being_dragged_in| does not equal |root_window_|.
void RearrangeDuringDrag( void RearrangeDuringDrag(
aura::Window* root_window_being_dragged_in,
aura::Window* dragged_window, aura::Window* dragged_window,
SplitViewDragIndicators::WindowDraggingState window_dragging_state); SplitViewDragIndicators::WindowDraggingState window_dragging_state);
......
...@@ -357,15 +357,28 @@ void OverviewSession::UpdateSplitViewDragIndicatorsWindowDraggingStates( ...@@ -357,15 +357,28 @@ void OverviewSession::UpdateSplitViewDragIndicatorsWindowDraggingStates(
} }
} }
void OverviewSession::RearrangeDuringDrag(aura::Window* dragged_window) { void OverviewSession::RearrangeDuringDrag(
aura::Window* root_window_being_dragged_in,
aura::Window* dragged_window) {
for (std::unique_ptr<OverviewGrid>& grid : grid_list_) { for (std::unique_ptr<OverviewGrid>& grid : grid_list_) {
DCHECK(grid->split_view_drag_indicators()); DCHECK(grid->split_view_drag_indicators());
grid->RearrangeDuringDrag( grid->RearrangeDuringDrag(
dragged_window, root_window_being_dragged_in, dragged_window,
grid->split_view_drag_indicators()->current_window_dragging_state()); grid->split_view_drag_indicators()->current_window_dragging_state());
} }
} }
void OverviewSession::UpdateDropTargetsBackgroundVisibilities(
OverviewItem* dragged_item,
const gfx::PointF& location_in_screen) {
for (std::unique_ptr<OverviewGrid>& grid : grid_list_) {
if (grid->GetDropTarget()) {
grid->UpdateDropTargetBackgroundVisibility(dragged_item,
location_in_screen);
}
}
}
OverviewGrid* OverviewSession::GetGridWithRootWindow( OverviewGrid* OverviewSession::GetGridWithRootWindow(
aura::Window* root_window) { aura::Window* root_window) {
for (std::unique_ptr<OverviewGrid>& grid : grid_list_) { for (std::unique_ptr<OverviewGrid>& grid : grid_list_) {
...@@ -431,6 +444,13 @@ void OverviewSession::RemoveItem(OverviewItem* overview_item) { ...@@ -431,6 +444,13 @@ void OverviewSession::RemoveItem(OverviewItem* overview_item) {
UpdateNoWindowsWidget(); UpdateNoWindowsWidget();
} }
void OverviewSession::RemoveDropTargets() {
for (std::unique_ptr<OverviewGrid>& grid : grid_list_) {
if (grid->GetDropTarget())
grid->RemoveDropTarget();
}
}
void OverviewSession::InitiateDrag(OverviewItem* item, void OverviewSession::InitiateDrag(OverviewItem* item,
const gfx::PointF& location_in_screen, const gfx::PointF& location_in_screen,
bool is_touch_dragging) { bool is_touch_dragging) {
......
...@@ -145,7 +145,14 @@ class ASH_EXPORT OverviewSession : public display::DisplayObserver, ...@@ -145,7 +145,14 @@ class ASH_EXPORT OverviewSession : public display::DisplayObserver,
SplitViewController::SnapPosition snap_position); SplitViewController::SnapPosition snap_position);
// See |OverviewGrid::RearrangeDuringDrag|. // See |OverviewGrid::RearrangeDuringDrag|.
void RearrangeDuringDrag(aura::Window* dragged_window); void RearrangeDuringDrag(aura::Window* root_window_being_dragged_in,
aura::Window* dragged_window);
// Updates the appearance of each drop target to visually indicate when the
// dragged window is being dragged over it.
void UpdateDropTargetsBackgroundVisibilities(
OverviewItem* dragged_item,
const gfx::PointF& location_in_screen);
// Retrieves the window grid whose root window matches |root_window|. Returns // Retrieves the window grid whose root window matches |root_window|. Returns
// nullptr if the window grid is not found. // nullptr if the window grid is not found.
...@@ -172,6 +179,8 @@ class ASH_EXPORT OverviewSession : public display::DisplayObserver, ...@@ -172,6 +179,8 @@ class ASH_EXPORT OverviewSession : public display::DisplayObserver,
// repositioned. // repositioned.
void RemoveItem(OverviewItem* overview_item); void RemoveItem(OverviewItem* overview_item);
void RemoveDropTargets();
void InitiateDrag(OverviewItem* item, void InitiateDrag(OverviewItem* item,
const gfx::PointF& location_in_screen, const gfx::PointF& location_in_screen,
bool is_touch_dragging); bool is_touch_dragging);
......
...@@ -237,7 +237,7 @@ void OverviewWindowDragController::StartNormalDragMode( ...@@ -237,7 +237,7 @@ void OverviewWindowDragController::StartNormalDragMode(
OVERVIEW_ANIMATION_LAYOUT_OVERVIEW_ITEMS_IN_OVERVIEW); OVERVIEW_ANIMATION_LAYOUT_OVERVIEW_ITEMS_IN_OVERVIEW);
original_scaled_size_ = item_->target_bounds().size(); original_scaled_size_ = item_->target_bounds().size();
auto* overview_grid = item_->overview_grid(); auto* overview_grid = item_->overview_grid();
overview_grid->AddDropTargetForDraggingFromOverview(item_); overview_grid->AddDropTargetForDraggingFromThisGrid(item_);
if (should_allow_split_view_) { if (should_allow_split_view_) {
overview_session_->SetSplitViewDragIndicatorsDraggedWindow( overview_session_->SetSplitViewDragIndicatorsDraggedWindow(
...@@ -336,7 +336,7 @@ void OverviewWindowDragController::ResetGesture() { ...@@ -336,7 +336,7 @@ void OverviewWindowDragController::ResetGesture() {
Shell::Get()->mouse_cursor_filter()->HideSharedEdgeIndicator(); Shell::Get()->mouse_cursor_filter()->HideSharedEdgeIndicator();
item_->DestroyPhantomsForDragging(); item_->DestroyPhantomsForDragging();
} }
item_->overview_grid()->RemoveDropTarget(); overview_session_->RemoveDropTargets();
if (should_allow_split_view_) { if (should_allow_split_view_) {
SplitViewController::Get(Shell::GetPrimaryRootWindow()) SplitViewController::Get(Shell::GetPrimaryRootWindow())
->OnWindowDragCanceled(); ->OnWindowDragCanceled();
...@@ -493,8 +493,21 @@ void OverviewWindowDragController::ContinueNormalDrag( ...@@ -493,8 +493,21 @@ void OverviewWindowDragController::ContinueNormalDrag(
// portrait mode. // portrait mode.
overview_grid->MaybeUpdateDesksWidgetBounds(); overview_grid->MaybeUpdateDesksWidgetBounds();
} }
overview_grid->UpdateDropTargetBackgroundVisibility(item_, if (AreMultiDisplayOverviewAndSplitViewEnabled()) {
location_in_screen); OverviewGrid* grid_being_dragged_in =
overview_session_->GetGridWithRootWindow(GetRootWindowBeingDraggedIn());
if (!grid_being_dragged_in->GetDropTarget() &&
(!should_allow_split_view_ ||
SplitViewDragIndicators::GetSnapPosition(
grid_being_dragged_in->split_view_drag_indicators()
->current_window_dragging_state()) ==
SplitViewController::NONE)) {
grid_being_dragged_in->AddDropTargetNotForDraggingFromThisGrid(
item_->GetWindow(), /*animate=*/true);
}
}
overview_session_->UpdateDropTargetsBackgroundVisibilities(
item_, location_in_screen);
bounds.set_x(centerpoint.x() - bounds.width() / 2.f); bounds.set_x(centerpoint.x() - bounds.width() / 2.f);
bounds.set_y(centerpoint.y() - bounds.height() / 2.f); bounds.set_y(centerpoint.y() - bounds.height() / 2.f);
...@@ -513,7 +526,7 @@ OverviewWindowDragController::CompleteNormalDrag( ...@@ -513,7 +526,7 @@ OverviewWindowDragController::CompleteNormalDrag(
Shell::Get()->mouse_cursor_filter()->HideSharedEdgeIndicator(); Shell::Get()->mouse_cursor_filter()->HideSharedEdgeIndicator();
item_->DestroyPhantomsForDragging(); item_->DestroyPhantomsForDragging();
} }
overview_grid->RemoveDropTarget(); overview_session_->RemoveDropTargets();
const gfx::Point rounded_screen_point = const gfx::Point rounded_screen_point =
gfx::ToRoundedPoint(location_in_screen); gfx::ToRoundedPoint(location_in_screen);
...@@ -576,6 +589,7 @@ OverviewWindowDragController::CompleteNormalDrag( ...@@ -576,6 +589,7 @@ OverviewWindowDragController::CompleteNormalDrag(
} }
SnapWindow(snap_position_); SnapWindow(snap_position_);
overview_session_->PositionWindows(/*animate=*/true);
return DragResult::kSuccessfulDragToSnap; return DragResult::kSuccessfulDragToSnap;
} }
...@@ -591,11 +605,12 @@ void OverviewWindowDragController::UpdateDragIndicatorsAndOverviewGrid( ...@@ -591,11 +605,12 @@ void OverviewWindowDragController::UpdateDragIndicatorsAndOverviewGrid(
return; return;
snap_position_ = GetSnapPosition(location_in_screen); snap_position_ = GetSnapPosition(location_in_screen);
aura::Window* root_window = GetRootWindowBeingDraggedIn();
overview_session_->UpdateSplitViewDragIndicatorsWindowDraggingStates( overview_session_->UpdateSplitViewDragIndicatorsWindowDraggingStates(
GetRootWindowBeingDraggedIn(), /*is_dragging=*/true, root_window, /*is_dragging=*/true,
SplitViewDragIndicators::WindowDraggingState::kFromOverview, SplitViewDragIndicators::WindowDraggingState::kFromOverview,
snap_position_); snap_position_);
overview_session_->RearrangeDuringDrag(item_->GetWindow()); overview_session_->RearrangeDuringDrag(root_window, item_->GetWindow());
} }
aura::Window* OverviewWindowDragController::GetRootWindowBeingDraggedIn() aura::Window* OverviewWindowDragController::GetRootWindowBeingDraggedIn()
......
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