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

Side by Side Diff: ui/app_list/views/app_list_view.cc

Issue 2939693004: Added HALF, FULLSCREEN_ALL_APPS, and FULLSCREEN_SEARCH. (Closed)
Patch Set: Addressed comments. Created 3 years, 6 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
« no previous file with comments | « ui/app_list/views/app_list_view.h ('k') | ui/app_list/views/search_box_view.cc » ('j') | 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 "ui/app_list/views/app_list_view.h" 5 #include "ui/app_list/views/app_list_view.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/macros.h" 10 #include "base/macros.h"
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
54 54
55 // The margin from the edge to the speech UI. 55 // The margin from the edge to the speech UI.
56 constexpr int kSpeechUIMargin = 12; 56 constexpr int kSpeechUIMargin = 12;
57 57
58 // The height/width of the shelf. 58 // The height/width of the shelf.
59 constexpr int kShelfSize = 48; 59 constexpr int kShelfSize = 48;
60 60
61 // The height of the peeking app list. 61 // The height of the peeking app list.
62 constexpr int kPeekingAppListHeight = 320; 62 constexpr int kPeekingAppListHeight = 320;
63 63
64 // The height of the half app list.
65 constexpr int kHalfAppListHeight = 561;
66
64 // The fraction of app list height that the app list must be released at in 67 // The fraction of app list height that the app list must be released at in
65 // order to transition to the next state. 68 // order to transition to the next state.
66 constexpr int kAppListThresholdDenominator = 3; 69 constexpr int kAppListThresholdDenominator = 3;
67 70
68 // The velocity the app list must be dragged in order to transition to the next 71 // The velocity the app list must be dragged in order to transition to the next
69 // state, measured in DIPs/event. 72 // state, measured in DIPs/event.
70 constexpr int kAppListDragVelocityThreshold = 25; 73 constexpr int kAppListDragVelocityThreshold = 25;
71 74
75 // The DIP distance from the bezel that a drag event must end within to transfer
76 // the |app_list_state_|.
77 constexpr int kAppListBezelMargin = 50;
78
72 // The opacity of the app list background. 79 // The opacity of the app list background.
73 constexpr float kAppListOpacity = 0.8; 80 constexpr float kAppListOpacity = 0.8;
74 81
75 // The vertical position for the appearing animation of the speech UI. 82 // The vertical position for the appearing animation of the speech UI.
76 constexpr float kSpeechUIAppearingPosition = 12; 83 constexpr float kSpeechUIAppearingPosition = 12;
77 84
78 bool IsFullscreenAppListEnabled() { 85 bool IsFullscreenAppListEnabled() {
79 // Cache this value to avoid repeated lookup. 86 // Cache this value to avoid repeated lookup.
80 static bool cached_value = features::IsFullscreenAppListEnabled(); 87 static bool cached_value = features::IsFullscreenAppListEnabled();
81 return cached_value; 88 return cached_value;
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
209 display_observer_.Add(display::Screen::GetScreen()); 216 display_observer_.Add(display::Screen::GetScreen());
210 } 217 }
211 218
212 AppListView::~AppListView() { 219 AppListView::~AppListView() {
213 delegate_->GetSpeechUI()->RemoveObserver(this); 220 delegate_->GetSpeechUI()->RemoveObserver(this);
214 animation_observer_.reset(); 221 animation_observer_.reset();
215 // Remove child views first to ensure no remaining dependencies on delegate_. 222 // Remove child views first to ensure no remaining dependencies on delegate_.
216 RemoveAllChildViews(true); 223 RemoveAllChildViews(true);
217 } 224 }
218 225
219 void AppListView::Initialize(gfx::NativeView parent, int initial_apps_page) { 226 void AppListView::Initialize(gfx::NativeView parent,
227 int initial_apps_page,
228 bool is_maximize_mode,
229 bool is_side_shelf) {
220 base::Time start_time = base::Time::Now(); 230 base::Time start_time = base::Time::Now();
231 is_maximize_mode_ = is_maximize_mode;
232 is_side_shelf_ = is_side_shelf;
221 InitContents(parent, initial_apps_page); 233 InitContents(parent, initial_apps_page);
222 AddAccelerator(ui::Accelerator(ui::VKEY_ESCAPE, ui::EF_NONE)); 234 AddAccelerator(ui::Accelerator(ui::VKEY_ESCAPE, ui::EF_NONE));
223 set_color(kContentsBackgroundColor); 235 set_color(kContentsBackgroundColor);
224 set_parent_window(parent); 236 set_parent_window(parent);
225 237
226 if (IsFullscreenAppListEnabled()) 238 if (features::IsFullscreenAppListEnabled())
227 InitializeFullscreen(parent, initial_apps_page); 239 InitializeFullscreen(parent, initial_apps_page);
228 else 240 else
229 InitializeBubble(parent, initial_apps_page); 241 InitializeBubble(parent, initial_apps_page);
230 242
231 InitChildWidgets(); 243 InitChildWidgets();
232 AddChildView(overlay_view_); 244 AddChildView(overlay_view_);
233 245
234 if (IsFullscreenAppListEnabled()) 246 if (IsFullscreenAppListEnabled())
235 SetState(app_list_state_); 247 SetState(app_list_state_);
236 248
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after
511 523
512 void AppListView::EndDrag(const gfx::Point& location) { 524 void AppListView::EndDrag(const gfx::Point& location) {
513 // Change the app list state based on where the drag ended. If fling velocity 525 // Change the app list state based on where the drag ended. If fling velocity
514 // was over the threshold, snap to the next state in the direction of the 526 // was over the threshold, snap to the next state in the direction of the
515 // fling. 527 // fling.
516 int const new_y_position = location.y() - initial_drag_point_.y() + 528 int const new_y_position = location.y() - initial_drag_point_.y() +
517 fullscreen_widget_->GetWindowBoundsInScreen().y(); 529 fullscreen_widget_->GetWindowBoundsInScreen().y();
518 if (std::abs(last_fling_velocity_) > kAppListDragVelocityThreshold) { 530 if (std::abs(last_fling_velocity_) > kAppListDragVelocityThreshold) {
519 // If the user releases drag with velocity over the threshold, snap to 531 // If the user releases drag with velocity over the threshold, snap to
520 // the next state, ignoring the drag release position. 532 // the next state, ignoring the drag release position.
521 if (app_list_state_ == FULLSCREEN) {
522 if (last_fling_velocity_ > 0)
523 SetState(PEEKING);
524 533
534 if (last_fling_velocity_ > 0) {
535 switch (app_list_state_) {
536 case PEEKING:
537 case HALF:
538 case FULLSCREEN_SEARCH:
539 SetState(CLOSED);
540 break;
541 case FULLSCREEN_ALL_APPS:
542 SetState(is_maximize_mode_ || is_side_shelf_ ? CLOSED : PEEKING);
543 break;
544 case CLOSED:
545 NOTREACHED();
546 break;
547 }
525 } else { 548 } else {
526 SetState(last_fling_velocity_ > 0 ? CLOSED : FULLSCREEN); 549 switch (app_list_state_) {
550 case FULLSCREEN_ALL_APPS:
551 case FULLSCREEN_SEARCH:
552 SetState(app_list_state_);
553 break;
554 case HALF:
555 SetState(FULLSCREEN_SEARCH);
556 break;
557 case PEEKING:
558 SetState(FULLSCREEN_ALL_APPS);
559 break;
560 case CLOSED:
561 NOTREACHED();
562 break;
563 }
527 } 564 }
528 last_fling_velocity_ = 0;
529 } else { 565 } else {
530 int display_height = display::Screen::GetScreen() 566 int display_height = display::Screen::GetScreen()
531 ->GetDisplayNearestView(parent_window()) 567 ->GetDisplayNearestView(parent_window())
532 .work_area() 568 .work_area()
533 .height(); 569 .height();
534 int default_peeking_y = display_height + kShelfSize - kPeekingAppListHeight; 570 int app_list_y_for_state = 0;
535 // The drag release velocity was too low, so use the release point. 571 int app_list_height = 0;
536 int app_list_snap_y = 572 switch (app_list_state_) {
537 (app_list_state_ == FULLSCREEN) ? 0 : default_peeking_y; 573 case FULLSCREEN_ALL_APPS:
538 // The DIP delta that must be exceeded for the app list to snap to the next 574 case FULLSCREEN_SEARCH:
539 // state. 575 app_list_y_for_state = 0;
540 int app_list_threshold = 576 app_list_height = display_height;
541 (fullscreen_widget_->GetWindowBoundsInScreen().height() + kShelfSize) / 577 break;
542 kAppListThresholdDenominator; 578 case HALF:
543 app_list_threshold -= 579 app_list_y_for_state = display_height - kHalfAppListHeight;
544 (app_list_state_ == FULLSCREEN ? 0 : kPeekingAppListHeight) / 580 app_list_height = kHalfAppListHeight;
545 kAppListThresholdDenominator; 581 break;
582 case PEEKING:
583 app_list_y_for_state = display_height - kPeekingAppListHeight;
584 app_list_height = kPeekingAppListHeight;
585 break;
586 case CLOSED:
587 NOTREACHED();
588 break;
589 }
546 590
547 // If the user releases +/- 1/3 of |app_list_threshold|, snap to the 591 int app_list_threshold = app_list_height / kAppListThresholdDenominator;
548 // next state. 592 int drag_delta = app_list_y_for_state - new_y_position;
549 if (std::abs(app_list_snap_y - new_y_position) < app_list_threshold) { 593 switch (app_list_state_) {
550 // The drag was not far enough so set the app list bounds to the target 594 case FULLSCREEN_ALL_APPS:
551 // bounds for the current state. 595 if (std::abs(drag_delta) > app_list_threshold)
552 SetState(app_list_state_); 596 SetState(is_maximize_mode_ || is_side_shelf_ ? CLOSED : PEEKING);
553 } else if ((app_list_snap_y + app_list_threshold) < new_y_position) { 597 else
554 // The drag was far enough to change states and was a downward drag, so 598 SetState(app_list_state_);
555 // set the app list bounds to the next state. 599 break;
556 SetState(app_list_state_ == FULLSCREEN ? PEEKING : CLOSED); 600 case FULLSCREEN_SEARCH:
557 } else { 601 if (std::abs(drag_delta) > app_list_threshold)
558 // The drag was far enough to change states and was an upward drag, so 602 SetState(CLOSED);
559 // set the app list bounds to the next state. 603 else
560 SetState(FULLSCREEN); 604 SetState(app_list_state_);
605 break;
606 case HALF:
607 if (std::abs(drag_delta) > app_list_threshold) {
608 SetState(drag_delta > 0 ? FULLSCREEN_SEARCH : CLOSED);
609 } else if (location.y() +
610 fullscreen_widget_->GetWindowBoundsInScreen().y() >=
611 display_height - kAppListBezelMargin) {
612 // If the user drags to the bezel, close the app list.
613 SetState(CLOSED);
614 } else {
615 SetState(app_list_state_);
616 }
617 break;
618 case PEEKING:
619 if (std::abs(drag_delta) > app_list_threshold) {
620 SetState(drag_delta > 0 ? FULLSCREEN_ALL_APPS : CLOSED);
621 } else if (location.y() +
622 fullscreen_widget_->GetWindowBoundsInScreen().y() >=
623 display_height - kAppListBezelMargin) {
624 // If the user drags to the bezel, close the app list.
625 SetState(CLOSED);
626 } else {
627 SetState(app_list_state_);
628 }
629 break;
630 case CLOSED:
631 NOTREACHED();
632 break;
561 } 633 }
562 } 634 }
563 } 635 }
564 636
637 void AppListView::SetStateFromSearchBoxView(bool empty) {
638 switch (app_list_state_) {
639 case PEEKING:
640 if (!empty)
641 SetState(HALF);
642 break;
643 case HALF:
644 if (empty)
645 SetState(PEEKING);
646 break;
647 case FULLSCREEN_SEARCH:
648 if (empty) {
649 SetState(FULLSCREEN_ALL_APPS);
650 app_list_main_view()->contents_view()->SetActiveState(
651 AppListModel::State::STATE_APPS);
652 }
653 break;
654 case FULLSCREEN_ALL_APPS:
655 if (!empty)
656 SetState(FULLSCREEN_SEARCH);
657 break;
658 case CLOSED:
659 NOTREACHED();
660 break;
661 }
662 }
663
664 void AppListView::OnMaximizeModeChanged(bool started) {
665 is_maximize_mode_ = started;
666 if (is_maximize_mode_ && !is_fullscreen()) {
667 // Set |app_list_state_| to a maximize mode friendly state.
668 SetState(app_list_state_ == PEEKING ? FULLSCREEN_ALL_APPS
669 : FULLSCREEN_SEARCH);
670 }
671 }
672
565 void AppListView::OnBeforeBubbleWidgetInit(views::Widget::InitParams* params, 673 void AppListView::OnBeforeBubbleWidgetInit(views::Widget::InitParams* params,
566 views::Widget* widget) const { 674 views::Widget* widget) const {
567 if (!params->native_widget) { 675 if (!params->native_widget) {
568 views::ViewsDelegate* views_delegate = views::ViewsDelegate::GetInstance(); 676 views::ViewsDelegate* views_delegate = views::ViewsDelegate::GetInstance();
569 if (views_delegate && !views_delegate->native_widget_factory().is_null()) { 677 if (views_delegate && !views_delegate->native_widget_factory().is_null()) {
570 params->native_widget = 678 params->native_widget =
571 views_delegate->native_widget_factory().Run(*params, widget); 679 views_delegate->native_widget_factory().Run(*params, widget);
572 } 680 }
573 } 681 }
574 // Apply a WM-provided shadow (see ui/wm/core/). 682 // Apply a WM-provided shadow (see ui/wm/core/).
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
688 } 796 }
689 797
690 void AppListView::SchedulePaintInRect(const gfx::Rect& rect) { 798 void AppListView::SchedulePaintInRect(const gfx::Rect& rect) {
691 BubbleDialogDelegateView::SchedulePaintInRect(rect); 799 BubbleDialogDelegateView::SchedulePaintInRect(rect);
692 if (GetBubbleFrameView()) 800 if (GetBubbleFrameView())
693 GetBubbleFrameView()->SchedulePaint(); 801 GetBubbleFrameView()->SchedulePaint();
694 } 802 }
695 803
696 void AppListView::SetState(AppListState new_state) { 804 void AppListView::SetState(AppListState new_state) {
697 gfx::Rect new_widget_bounds = fullscreen_widget_->GetWindowBoundsInScreen(); 805 gfx::Rect new_widget_bounds = fullscreen_widget_->GetWindowBoundsInScreen();
698 switch (new_state) { 806 AppListState new_state_override;
807 bool state_overridden = false;
vadimt 2017/06/13 19:20:31 You don't need this. Just initialize new_state_ove
newcomer 2017/06/13 20:25:06 Done.
808 if (is_side_shelf_ || is_maximize_mode_) {
809 // If side shelf or maximize mode are active, all transitions should be
810 // made to the maximize mode/side shelf friendly versions.
811 if (new_state == PEEKING) {
812 new_state_override = FULLSCREEN_ALL_APPS;
813 state_overridden = true;
814 } else if (new_state == HALF) {
815 new_state_override = FULLSCREEN_SEARCH;
816 state_overridden = true;
817 }
818 }
819
820 switch (state_overridden ? new_state_override : new_state) {
699 case PEEKING: { 821 case PEEKING: {
700 int display_height = display::Screen::GetScreen() 822 switch (app_list_state_) {
701 ->GetDisplayNearestView(parent_window()) 823 case HALF:
702 .work_area() 824 case FULLSCREEN_ALL_APPS:
703 .bottom(); 825 case PEEKING: {
704 int default_peeking_y = 826 int display_height = display::Screen::GetScreen()
705 display_height + kShelfSize - kPeekingAppListHeight; 827 ->GetDisplayNearestView(parent_window())
706 new_widget_bounds.set_y(default_peeking_y); 828 .work_area()
829 .bottom();
830 int peeking_app_list_y = display_height - kPeekingAppListHeight;
831 new_widget_bounds.set_y(peeking_app_list_y);
832 app_list_main_view_->contents_view()->SetActiveState(
833 AppListModel::STATE_START);
834 break;
835 }
836 case FULLSCREEN_SEARCH:
837 case CLOSED:
838 NOTREACHED();
839 break;
840 }
707 break; 841 break;
708 } 842 } break;
709 case FULLSCREEN: 843 case HALF:
844 switch (app_list_state_) {
845 case PEEKING:
846 case HALF: {
847 int display_height = display::Screen::GetScreen()
848 ->GetDisplayNearestView(parent_window())
849 .work_area()
850 .bottom();
851 int half_app_list_y = display_height - kHalfAppListHeight;
852 new_widget_bounds.set_y(half_app_list_y);
853 break;
854 }
855 case FULLSCREEN_SEARCH:
856 case FULLSCREEN_ALL_APPS:
857 case CLOSED:
858 NOTREACHED();
859 break;
860 }
861 break;
862 case FULLSCREEN_ALL_APPS:
863 new_widget_bounds.set_y(0);
864 app_list_main_view_->contents_view()->SetActiveState(
865 AppListModel::STATE_APPS);
866 break;
867 case FULLSCREEN_SEARCH:
710 new_widget_bounds.set_y(0); 868 new_widget_bounds.set_y(0);
711 break; 869 break;
712 case CLOSED: 870 case CLOSED:
713 app_list_main_view_->Close(); 871 app_list_main_view_->Close();
714 delegate_->Dismiss(); 872 delegate_->Dismiss();
715 break; 873 break;
716 } 874 }
717 fullscreen_widget_->SetBounds(new_widget_bounds); 875 fullscreen_widget_->SetBounds(new_widget_bounds);
718 app_list_state_ = new_state; 876 app_list_state_ = state_overridden ? new_state_override : new_state;
719 } 877 }
720 878
721 void AppListView::OnWidgetDestroying(views::Widget* widget) { 879 void AppListView::OnWidgetDestroying(views::Widget* widget) {
722 BubbleDialogDelegateView::OnWidgetDestroying(widget); 880 BubbleDialogDelegateView::OnWidgetDestroying(widget);
723 if (delegate_ && widget == GetWidget()) 881 if (delegate_ && widget == GetWidget())
724 delegate_->ViewClosing(); 882 delegate_->ViewClosing();
725 } 883 }
726 884
727 void AppListView::OnWidgetVisibilityChanged(views::Widget* widget, 885 void AppListView::OnWidgetVisibilityChanged(views::Widget* widget,
728 bool visible) { 886 bool visible) {
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
813 .work_area() 971 .work_area()
814 .size(); 972 .size();
815 size.Enlarge(0, kShelfSize); 973 size.Enlarge(0, kShelfSize);
816 fullscreen_widget_->SetSize(size); 974 fullscreen_widget_->SetSize(size);
817 975
818 // Update the |fullscreen_widget_| bounds to accomodate the new work area. 976 // Update the |fullscreen_widget_| bounds to accomodate the new work area.
819 SetState(app_list_state_); 977 SetState(app_list_state_);
820 } 978 }
821 979
822 } // namespace app_list 980 } // namespace app_list
OLDNEW
« no previous file with comments | « ui/app_list/views/app_list_view.h ('k') | ui/app_list/views/search_box_view.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698