Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(8)

Side by Side Diff: chrome/browser/ui/panels/panel_drag_controller.cc

Issue 14175016: Change to update panel positions after panels moved to the new collection when the unstacking happe… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/panels/panel_drag_controller.h" 5 #include "chrome/browser/ui/panels/panel_drag_controller.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "chrome/browser/ui/panels/detached_panel_collection.h" 8 #include "chrome/browser/ui/panels/detached_panel_collection.h"
9 #include "chrome/browser/ui/panels/detached_panel_drag_handler.h" 9 #include "chrome/browser/ui/panels/detached_panel_drag_handler.h"
10 #include "chrome/browser/ui/panels/docked_panel_collection.h" 10 #include "chrome/browser/ui/panels/docked_panel_collection.h"
(...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after
439 gfx::Rect target_bounds = last_panel_to_unstack->GetBounds(); 439 gfx::Rect target_bounds = last_panel_to_unstack->GetBounds();
440 target_bounds.Offset(delta); 440 target_bounds.Offset(delta);
441 gfx::Rect below_panel_bounds = panel_below_last_panel_to_unstack->GetBounds(); 441 gfx::Rect below_panel_bounds = panel_below_last_panel_to_unstack->GetBounds();
442 if (GetVerticalDistance(target_bounds, below_panel_bounds) < 442 if (GetVerticalDistance(target_bounds, below_panel_bounds) <
443 kGluePanelsDistanceThreshold && 443 kGluePanelsDistanceThreshold &&
444 GetHorizontalOverlap(target_bounds, below_panel_bounds) > 444 GetHorizontalOverlap(target_bounds, below_panel_bounds) >
445 kGluePanelsOverlapThreshold) { 445 kGluePanelsOverlapThreshold) {
446 return false; 446 return false;
447 } 447 }
448 448
449 // Move the panel (and all the panels below if in a stack) to the new
450 // position.
451 for (StackedPanelCollection::Panels::const_iterator iter =
452 dragging_stack->panels().begin();
453 iter != dragging_stack->panels().end(); ++iter) {
454 if (!(*iter)->in_preview_mode())
455 break;
456 (*iter)->MoveByInstantly(delta);
457 }
458
459 int num_panels_in_stack = dragging_stack->num_panels(); 449 int num_panels_in_stack = dragging_stack->num_panels();
460 DCHECK_GE(num_panels_in_stack, 2); 450 DCHECK_GE(num_panels_in_stack, 2);
461 451
462 // When a panel is removed from its stack, we always make it detached. If it 452 // When a panel is removed from its stack, we always make it detached. If it
463 // indeed should go to the docked collection, the subsequent TryDock will then 453 // indeed should go to the docked collection, the subsequent TryDock will then
464 // move it from the detached collection to the docked collection. 454 // move it from the detached collection to the docked collection.
465 DetachedPanelCollection* detached_collection = 455 DetachedPanelCollection* detached_collection =
466 panel_manager_->detached_collection(); 456 panel_manager_->detached_collection();
467 457
468 // If there're only 2 panels in the stack, both panels should move out of the 458 // If there're only 2 panels in the stack, both panels should move out of the
469 // stack and the stack should be removed. 459 // stack and the stack should be removed.
470 if (num_panels_in_stack == 2) { 460 if (num_panels_in_stack == 2) {
471 DCHECK_EQ(1, num_panels_to_unstack); 461 DCHECK_EQ(1, num_panels_to_unstack);
472 MovePanelAndBelowToCollection(dragging_panel_, 462 MovePanelAndBelowToCollection(dragging_panel_,
473 detached_collection, 463 detached_collection,
474 PanelCollection::KNOWN_POSITION); 464 PanelCollection::KNOWN_POSITION);
465 dragging_panel_->MoveByInstantly(delta);
475 return true; 466 return true;
476 } 467 }
477 468
478 DCHECK_GE(num_panels_in_stack, 3); 469 DCHECK_GE(num_panels_in_stack, 3);
479 470
480 // If only one panel (top panel) needs to unstack, move it out of the stack. 471 // If only one panel (top panel) needs to unstack, move it out of the stack.
481 if (num_panels_to_unstack == 1) { 472 if (num_panels_to_unstack == 1) {
482 panel_manager_->MovePanelToCollection(dragging_panel_, 473 panel_manager_->MovePanelToCollection(dragging_panel_,
483 panel_manager_->detached_collection(), 474 detached_collection,
484 PanelCollection::KNOWN_POSITION); 475 PanelCollection::KNOWN_POSITION);
476 dragging_panel_->MoveByInstantly(delta);
485 return true; 477 return true;
486 } 478 }
487 479
488 // If all the panels except the bottom panel need to unstack, simply move 480 // If all the panels except the bottom panel need to unstack, simply move
489 // bottom panel out of the stack. 481 // bottom panel out of the stack.
490 if (num_panels_in_stack - num_panels_to_unstack == 1) { 482 if (num_panels_in_stack - num_panels_to_unstack == 1) {
491 panel_manager_->MovePanelToCollection(dragging_stack->bottom_panel(), 483 panel_manager_->MovePanelToCollection(dragging_stack->bottom_panel(),
492 panel_manager_->detached_collection(), 484 detached_collection,
493 PanelCollection::KNOWN_POSITION); 485 PanelCollection::KNOWN_POSITION);
486 dragging_panel_->stack()->MoveAllDraggingPanelsInstantly(delta);
494 return true; 487 return true;
495 } 488 }
496 489
497 // Otherwise, move all unstacked panels to a new stack. 490 // Otherwise, move all unstacked panels to a new stack.
498 // Note that all the panels to move should be copied to a local list first 491 // Note that all the panels to move should be copied to a local list first
499 // because the stack collection will be modified during the move. 492 // because the stack collection will be modified during the move.
500 std::list<Panel*> panels_to_move; 493 std::list<Panel*> panels_to_move;
501 for (StackedPanelCollection::Panels::const_iterator iter = 494 for (StackedPanelCollection::Panels::const_iterator iter =
502 dragging_stack->panels().begin(); 495 dragging_stack->panels().begin();
503 iter != dragging_stack->panels().end(); ++iter) { 496 iter != dragging_stack->panels().end(); ++iter) {
504 Panel* panel = *iter; 497 Panel* panel = *iter;
505 if (!panel->in_preview_mode()) 498 if (!panel->in_preview_mode())
506 break; 499 break;
507 panels_to_move.push_back(panel); 500 panels_to_move.push_back(panel);
508 } 501 }
509 StackedPanelCollection* new_stack = panel_manager_->CreateStack(); 502 StackedPanelCollection* new_stack = panel_manager_->CreateStack();
510 for (std::list<Panel*>::const_iterator iter = panels_to_move.begin(); 503 for (std::list<Panel*>::const_iterator iter = panels_to_move.begin();
511 iter != panels_to_move.end(); ++iter) { 504 iter != panels_to_move.end(); ++iter) {
512 panel_manager_->MovePanelToCollection(*iter, 505 panel_manager_->MovePanelToCollection(*iter,
513 new_stack, 506 new_stack,
514 PanelCollection::KNOWN_POSITION); 507 PanelCollection::KNOWN_POSITION);
515 } 508 }
509 dragging_panel_->stack()->MoveAllDraggingPanelsInstantly(delta);
516 510
517 return true; 511 return true;
518 } 512 }
519 513
520 // Check if a panel or a set of stacked panels (being dragged together from a 514 // Check if a panel or a set of stacked panels (being dragged together from a
521 // stack) can be dragged away from the panel above such that the former panel(s) 515 // stack) can be dragged away from the panel above such that the former panel(s)
522 // are not in the same stack as the latter panel. 516 // are not in the same stack as the latter panel.
523 bool PanelDragController::TryUnstackFromBottom( 517 bool PanelDragController::TryUnstackFromBottom(
524 const gfx::Point& target_position) { 518 const gfx::Point& target_position) {
525 // It has to be stacked. 519 // It has to be stacked.
(...skipping 13 matching lines...) Expand all
539 Panel* above_panel = dragging_stack->GetPanelAbove(dragging_panel_); 533 Panel* above_panel = dragging_stack->GetPanelAbove(dragging_panel_);
540 DCHECK(above_panel); 534 DCHECK(above_panel);
541 gfx::Rect above_panel_bounds = above_panel->GetBounds(); 535 gfx::Rect above_panel_bounds = above_panel->GetBounds();
542 if (GetVerticalDistance(above_panel_bounds, target_bounds) < 536 if (GetVerticalDistance(above_panel_bounds, target_bounds) <
543 kGluePanelsDistanceThreshold && 537 kGluePanelsDistanceThreshold &&
544 GetHorizontalOverlap(above_panel_bounds, target_bounds) > 538 GetHorizontalOverlap(above_panel_bounds, target_bounds) >
545 kGluePanelsOverlapThreshold) { 539 kGluePanelsOverlapThreshold) {
546 return false; 540 return false;
547 } 541 }
548 542
549 // Move the panel (and all the panels below if in a stack) to the new
550 // position.
551 gfx::Vector2d delta = target_position - dragging_panel_->GetBounds().origin(); 543 gfx::Vector2d delta = target_position - dragging_panel_->GetBounds().origin();
552 if (dragging_stack)
553 dragging_stack->MoveAllDraggingPanelsInstantly(delta);
554 else
555 dragging_panel_->MoveByInstantly(delta);
556 544
557 // If there're only 2 panels in the stack, both panels should move out the 545 // If there're only 2 panels in the stack, both panels should move out the
558 // stack and the stack should be removed. 546 // stack and the stack should be removed.
559 DetachedPanelCollection* detached_collection = 547 DetachedPanelCollection* detached_collection =
560 panel_manager_->detached_collection(); 548 panel_manager_->detached_collection();
561 if (dragging_stack->num_panels() == 2) { 549 if (dragging_stack->num_panels() == 2) {
562 MovePanelAndBelowToCollection(dragging_stack->top_panel(), 550 MovePanelAndBelowToCollection(dragging_stack->top_panel(),
563 detached_collection, 551 detached_collection,
564 PanelCollection::KNOWN_POSITION); 552 PanelCollection::KNOWN_POSITION);
553 dragging_panel_->MoveByInstantly(delta);
565 return true; 554 return true;
566 } 555 }
567 556
568 // There're at least 3 panels. 557 // There're at least 3 panels.
569 DCHECK_GE(dragging_stack->num_panels(), 3); 558 DCHECK_GE(dragging_stack->num_panels(), 3);
570 559
571 // If the dragging panel is bottom panel, move it out of the stack. 560 // If the dragging panel is bottom panel, move it out of the stack.
572 if (dragging_panel_ == dragging_stack->bottom_panel()) { 561 if (dragging_panel_ == dragging_stack->bottom_panel()) {
573 panel_manager_->MovePanelToCollection(dragging_panel_, 562 panel_manager_->MovePanelToCollection(dragging_panel_,
574 detached_collection, 563 detached_collection,
575 PanelCollection::KNOWN_POSITION); 564 PanelCollection::KNOWN_POSITION);
565 dragging_panel_->MoveByInstantly(delta);
576 return true; 566 return true;
577 } 567 }
578 568
579 // If the dragging panel is the one below the top panel, move top panel 569 // If the dragging panel is the one below the top panel, move top panel
580 // out of the stack. 570 // out of the stack.
581 if (dragging_stack->GetPanelAbove(dragging_panel_) == 571 if (dragging_stack->GetPanelAbove(dragging_panel_) ==
582 dragging_stack->top_panel()) { 572 dragging_stack->top_panel()) {
583 panel_manager_->MovePanelToCollection(dragging_stack->top_panel(), 573 panel_manager_->MovePanelToCollection(dragging_stack->top_panel(),
584 detached_collection, 574 detached_collection,
585 PanelCollection::KNOWN_POSITION); 575 PanelCollection::KNOWN_POSITION);
576 dragging_panel_->stack()->MoveAllDraggingPanelsInstantly(delta);
586 return true; 577 return true;
587 } 578 }
588 579
589 // There're at least 4 panels. 580 // There're at least 4 panels.
590 DCHECK_GE(dragging_stack->num_panels(), 4); 581 DCHECK_GE(dragging_stack->num_panels(), 4);
591 582
592 // We can split them into 2 stacks by moving the dragging panel and all panels 583 // We can split them into 2 stacks by moving the dragging panel and all panels
593 // below to a new stack while keeping all panels above in the same stack. 584 // below to a new stack while keeping all panels above in the same stack.
594 StackedPanelCollection* new_stack = panel_manager_->CreateStack(); 585 StackedPanelCollection* new_stack = panel_manager_->CreateStack();
595 MovePanelAndBelowToCollection(dragging_panel_, 586 MovePanelAndBelowToCollection(dragging_panel_,
596 new_stack, 587 new_stack,
597 PanelCollection::KNOWN_POSITION); 588 PanelCollection::KNOWN_POSITION);
589 dragging_panel_->stack()->MoveAllDraggingPanelsInstantly(delta);
598 590
599 return true; 591 return true;
600 } 592 }
601 593
602 void PanelDragController::TrySnap(gfx::Point* target_position) { 594 void PanelDragController::TrySnap(gfx::Point* target_position) {
603 // Snapping does not apply to docked panels. 595 // Snapping does not apply to docked panels.
604 if (dragging_panel_->collection()->type() == PanelCollection::DOCKED) 596 if (dragging_panel_->collection()->type() == PanelCollection::DOCKED)
605 return; 597 return;
606 598
607 // Check if the panel can snap to other panel. 599 // Check if the panel can snap to other panel.
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after
813 panel_manager_->detached_collection(), 805 panel_manager_->detached_collection(),
814 PanelCollection::KNOWN_POSITION); 806 PanelCollection::KNOWN_POSITION);
815 } 807 }
816 // Note that if the stack is the original collection, do not remove it now. 808 // Note that if the stack is the original collection, do not remove it now.
817 // This is because the original collection contains the information to 809 // This is because the original collection contains the information to
818 // restore the dragging panel to the right place when the drag is cancelled. 810 // restore the dragging panel to the right place when the drag is cancelled.
819 if (stack != dragging_panel_original_collection_) 811 if (stack != dragging_panel_original_collection_)
820 panel_manager_->RemoveStack(stack); 812 panel_manager_->RemoveStack(stack);
821 } 813 }
822 } 814 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698