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 {
// Creates |drop_target_widget_|. It's created when a window or overview item is
// dragged around, and destroyed when the drag ends.
std::unique_ptr<views::Widget> CreateDropTargetWidget(
aura::Window* root_window,
aura::Window* dragged_window) {
views::Widget::InitParams params;
params.type = views::Widget::InitParams::TYPE_WINDOW_FRAMELESS;
......@@ -194,7 +195,7 @@ std::unique_ptr<views::Widget> CreateDropTargetWidget(
params.activatable = views::Widget::InitParams::Activatable::ACTIVATABLE_NO;
params.opacity = views::Widget::InitParams::WindowOpacity::kTranslucent;
params.accept_events = false;
params.parent = dragged_window->parent();
params.parent = desks_util::GetActiveDeskContainerForRoot(root_window);
params.init_properties_container.SetProperty(kHideInDeskMiniViewKey, true);
auto widget = std::make_unique<views::Widget>();
widget->set_focus_on_creation(false);
......@@ -655,17 +656,32 @@ void OverviewGrid::RemoveItem(OverviewItem* overview_item,
}
}
void OverviewGrid::AddDropTargetForDraggingFromOverview(
void OverviewGrid::AddDropTargetForDraggingFromThisGrid(
OverviewItem* dragged_item) {
DCHECK_EQ(dragged_item->GetWindow()->GetRootWindow(), root_window_);
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;
overview_session_->AddItem(drop_target_widget_->GetNativeWindow(),
/*reposition=*/true, /*animate=*/false,
/*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() {
DCHECK(drop_target_widget_);
OverviewItem* drop_target = GetDropTarget();
......@@ -683,6 +699,7 @@ void OverviewGrid::SetBoundsAndUpdatePositions(
}
void OverviewGrid::RearrangeDuringDrag(
aura::Window* root_window_being_dragged_in,
aura::Window* dragged_window,
SplitViewDragIndicators::WindowDraggingState window_dragging_state) {
OverviewItem* drop_target = GetDropTarget();
......@@ -692,11 +709,12 @@ void OverviewGrid::RearrangeDuringDrag(
ScopedOverviewAnimationSettings settings(
OVERVIEW_ANIMATION_DROP_TARGET_FADE,
drop_target_widget_->GetNativeWindow());
drop_target->SetOpacity(
SplitViewDragIndicators::GetSnapPosition(window_dragging_state) ==
SplitViewController::NONE
? 1.f
: 0.f);
drop_target->SetOpacity(root_window_being_dragged_in == root_window_ &&
SplitViewDragIndicators::GetSnapPosition(
window_dragging_state) ==
SplitViewController::NONE
? 1.f
: 0.f);
}
// Update the grid's bounds.
......@@ -763,22 +781,10 @@ void OverviewGrid::OnSelectorItemDragEnded(bool snap) {
void OverviewGrid::OnWindowDragStarted(aura::Window* dragged_window,
bool animate) {
DCHECK_EQ(dragged_window->GetRootWindow(), root_window_);
DCHECK(!drop_target_widget_);
dragged_window_ = dragged_window;
drop_target_widget_ = CreateDropTargetWidget(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);
AddDropTargetNotForDraggingFromThisGrid(dragged_window, animate);
// Stack the |dragged_window| at top during drag.
dragged_window->parent()->StackChildAtTop(dragged_window);
// Called to set caption and title visibility during dragging.
OnSelectorItemDragStarted(/*item=*/nullptr);
}
......@@ -790,7 +796,7 @@ void OverviewGrid::OnWindowDragContinued(
DCHECK_EQ(dragged_window_, dragged_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);
aura::Window* target_window =
......
......@@ -128,7 +128,12 @@ class ASH_EXPORT OverviewGrid : public SplitViewObserver,
// 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
// 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.
void RemoveDropTarget();
......@@ -141,8 +146,9 @@ class ASH_EXPORT OverviewGrid : public SplitViewObserver,
bool animate);
// 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(
aura::Window* root_window_being_dragged_in,
aura::Window* dragged_window,
SplitViewDragIndicators::WindowDraggingState window_dragging_state);
......
......@@ -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_) {
DCHECK(grid->split_view_drag_indicators());
grid->RearrangeDuringDrag(
dragged_window,
root_window_being_dragged_in, dragged_window,
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(
aura::Window* root_window) {
for (std::unique_ptr<OverviewGrid>& grid : grid_list_) {
......@@ -431,6 +444,13 @@ void OverviewSession::RemoveItem(OverviewItem* overview_item) {
UpdateNoWindowsWidget();
}
void OverviewSession::RemoveDropTargets() {
for (std::unique_ptr<OverviewGrid>& grid : grid_list_) {
if (grid->GetDropTarget())
grid->RemoveDropTarget();
}
}
void OverviewSession::InitiateDrag(OverviewItem* item,
const gfx::PointF& location_in_screen,
bool is_touch_dragging) {
......
......@@ -145,7 +145,14 @@ class ASH_EXPORT OverviewSession : public display::DisplayObserver,
SplitViewController::SnapPosition snap_position);
// 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
// nullptr if the window grid is not found.
......@@ -172,6 +179,8 @@ class ASH_EXPORT OverviewSession : public display::DisplayObserver,
// repositioned.
void RemoveItem(OverviewItem* overview_item);
void RemoveDropTargets();
void InitiateDrag(OverviewItem* item,
const gfx::PointF& location_in_screen,
bool is_touch_dragging);
......
......@@ -237,7 +237,7 @@ void OverviewWindowDragController::StartNormalDragMode(
OVERVIEW_ANIMATION_LAYOUT_OVERVIEW_ITEMS_IN_OVERVIEW);
original_scaled_size_ = item_->target_bounds().size();
auto* overview_grid = item_->overview_grid();
overview_grid->AddDropTargetForDraggingFromOverview(item_);
overview_grid->AddDropTargetForDraggingFromThisGrid(item_);
if (should_allow_split_view_) {
overview_session_->SetSplitViewDragIndicatorsDraggedWindow(
......@@ -336,7 +336,7 @@ void OverviewWindowDragController::ResetGesture() {
Shell::Get()->mouse_cursor_filter()->HideSharedEdgeIndicator();
item_->DestroyPhantomsForDragging();
}
item_->overview_grid()->RemoveDropTarget();
overview_session_->RemoveDropTargets();
if (should_allow_split_view_) {
SplitViewController::Get(Shell::GetPrimaryRootWindow())
->OnWindowDragCanceled();
......@@ -493,8 +493,21 @@ void OverviewWindowDragController::ContinueNormalDrag(
// portrait mode.
overview_grid->MaybeUpdateDesksWidgetBounds();
}
overview_grid->UpdateDropTargetBackgroundVisibility(item_,
location_in_screen);
if (AreMultiDisplayOverviewAndSplitViewEnabled()) {
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_y(centerpoint.y() - bounds.height() / 2.f);
......@@ -513,7 +526,7 @@ OverviewWindowDragController::CompleteNormalDrag(
Shell::Get()->mouse_cursor_filter()->HideSharedEdgeIndicator();
item_->DestroyPhantomsForDragging();
}
overview_grid->RemoveDropTarget();
overview_session_->RemoveDropTargets();
const gfx::Point rounded_screen_point =
gfx::ToRoundedPoint(location_in_screen);
......@@ -576,6 +589,7 @@ OverviewWindowDragController::CompleteNormalDrag(
}
SnapWindow(snap_position_);
overview_session_->PositionWindows(/*animate=*/true);
return DragResult::kSuccessfulDragToSnap;
}
......@@ -591,11 +605,12 @@ void OverviewWindowDragController::UpdateDragIndicatorsAndOverviewGrid(
return;
snap_position_ = GetSnapPosition(location_in_screen);
aura::Window* root_window = GetRootWindowBeingDraggedIn();
overview_session_->UpdateSplitViewDragIndicatorsWindowDraggingStates(
GetRootWindowBeingDraggedIn(), /*is_dragging=*/true,
root_window, /*is_dragging=*/true,
SplitViewDragIndicators::WindowDraggingState::kFromOverview,
snap_position_);
overview_session_->RearrangeDuringDrag(item_->GetWindow());
overview_session_->RearrangeDuringDrag(root_window, item_->GetWindow());
}
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