OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/views/toolbar/browser_actions_container.h" | 5 #include "chrome/browser/ui/views/toolbar/browser_actions_container.h" |
6 | 6 |
7 #include "base/compiler_specific.h" | 7 #include "base/compiler_specific.h" |
8 #include "base/stl_util.h" | 8 #include "base/stl_util.h" |
9 #include "chrome/browser/extensions/extension_action_manager.h" | 9 #include "chrome/browser/extensions/extension_action_manager.h" |
10 #include "chrome/browser/extensions/extension_util.h" | 10 #include "chrome/browser/extensions/extension_util.h" |
(...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
311 BrowserActionsContainerObserver* observer) { | 311 BrowserActionsContainerObserver* observer) { |
312 observers_.AddObserver(observer); | 312 observers_.AddObserver(observer); |
313 } | 313 } |
314 | 314 |
315 void BrowserActionsContainer::RemoveObserver( | 315 void BrowserActionsContainer::RemoveObserver( |
316 BrowserActionsContainerObserver* observer) { | 316 BrowserActionsContainerObserver* observer) { |
317 observers_.RemoveObserver(observer); | 317 observers_.RemoveObserver(observer); |
318 } | 318 } |
319 | 319 |
320 gfx::Size BrowserActionsContainer::GetPreferredSize() const { | 320 gfx::Size BrowserActionsContainer::GetPreferredSize() const { |
321 size_t icon_count = browser_action_views_.size() - | 321 size_t icon_count = GetIconCount(); |
322 (in_overflow_mode() ? main_container_->VisibleBrowserActions() : 0); | |
323 | 322 |
324 // If there are no actions to show, or we are in overflow mode and the main | 323 // If there are no actions to show, or we are in overflow mode and the main |
325 // container is already showing them all, then no further work is required. | 324 // container is already showing them all, then no further work is required. |
326 if (icon_count == 0) | 325 if (icon_count == 0) |
327 return gfx::Size(); | 326 return gfx::Size(); |
328 | 327 |
329 if (in_overflow_mode()) { | 328 if (in_overflow_mode()) { |
330 // When in overflow, y is multiline, so the pixel count is IconHeight() | 329 // When in overflow, y is multiline, so the pixel count is IconHeight() |
331 // times the number of rows needed. | 330 // times the number of rows needed. |
332 return gfx::Size( | 331 return gfx::Size( |
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
617 OnBrowserActionVisibilityChanged(); | 616 OnBrowserActionVisibilityChanged(); |
618 return; | 617 return; |
619 } | 618 } |
620 | 619 |
621 // Up until now we've only been modifying the resize_amount, but now it is | 620 // Up until now we've only been modifying the resize_amount, but now it is |
622 // time to set the container size to the size we have resized to, and then | 621 // time to set the container size to the size we have resized to, and then |
623 // animate to the nearest icon count size if necessary (which may be 0). | 622 // animate to the nearest icon count size if necessary (which may be 0). |
624 int max_width = IconCountToWidth(-1, false); | 623 int max_width = IconCountToWidth(-1, false); |
625 container_width_ = | 624 container_width_ = |
626 std::min(std::max(0, container_width_ - resize_amount), max_width); | 625 std::min(std::max(0, container_width_ - resize_amount), max_width); |
627 SaveDesiredSizeAndAnimate(gfx::Tween::EASE_OUT, | 626 |
628 WidthToIconCount(container_width_)); | 627 // Save off the desired number of visible icons. We do this now instead of at |
628 // the end of the animation so that even if the browser is shut down while | |
629 // animating, the right value will be restored on next run. | |
630 // NOTE: Don't save the icon count in incognito because there may be fewer | |
631 // icons in that mode. The result is that the container in a normal window is | |
632 // always at least as wide as in an incognito window. | |
633 int visible_icons = WidthToIconCount(container_width_); | |
634 if (!profile_->IsOffTheRecord()) | |
635 model_->SetVisibleIconCount(visible_icons); | |
636 | |
637 Animate(gfx::Tween::EASE_OUT, visible_icons); | |
629 } | 638 } |
630 | 639 |
631 void BrowserActionsContainer::AnimationProgressed( | 640 void BrowserActionsContainer::AnimationProgressed( |
632 const gfx::Animation* animation) { | 641 const gfx::Animation* animation) { |
633 DCHECK_EQ(resize_animation_.get(), animation); | 642 DCHECK_EQ(resize_animation_.get(), animation); |
634 resize_amount_ = static_cast<int>(resize_animation_->GetCurrentValue() * | 643 resize_amount_ = static_cast<int>(resize_animation_->GetCurrentValue() * |
635 (container_width_ - animation_target_size_)); | 644 (container_width_ - animation_target_size_)); |
636 OnBrowserActionVisibilityChanged(); | 645 OnBrowserActionVisibilityChanged(); |
637 } | 646 } |
638 | 647 |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
789 DCHECK(browser_action_views_[i]->extension() != extension) << | 798 DCHECK(browser_action_views_[i]->extension() != extension) << |
790 "Asked to add a browser action view for an extension that already " | 799 "Asked to add a browser action view for an extension that already " |
791 "exists."; | 800 "exists."; |
792 } | 801 } |
793 #endif | 802 #endif |
794 CloseOverflowMenu(); | 803 CloseOverflowMenu(); |
795 | 804 |
796 if (!ShouldDisplayBrowserAction(extension)) | 805 if (!ShouldDisplayBrowserAction(extension)) |
797 return; | 806 return; |
798 | 807 |
799 size_t visible_actions = VisibleBrowserActionsAfterAnimation(); | |
800 | |
801 // Add the new browser action to the vector and the view hierarchy. | 808 // Add the new browser action to the vector and the view hierarchy. |
802 if (profile_->IsOffTheRecord()) | 809 if (profile_->IsOffTheRecord()) |
803 index = model_->OriginalIndexToIncognito(index); | 810 index = model_->OriginalIndexToIncognito(index); |
804 BrowserActionView* view = | 811 BrowserActionView* view = |
805 new BrowserActionView(extension, | 812 new BrowserActionView(extension, |
806 GetExtensionAction(*extension, profile_), | 813 GetExtensionAction(*extension, profile_), |
807 browser_, | 814 browser_, |
808 this); | 815 this); |
809 browser_action_views_.insert(browser_action_views_.begin() + index, view); | 816 browser_action_views_.insert(browser_action_views_.begin() + index, view); |
810 AddChildViewAt(view, index); | 817 AddChildViewAt(view, index); |
811 | 818 |
812 // If we are still initializing the container, don't bother animating. | 819 // If we are still initializing the container, don't bother animating. |
813 if (!model_->extensions_initialized()) | 820 if (!model_->extensions_initialized()) |
814 return; | 821 return; |
815 | 822 |
816 // Enlarge the container if it was already at maximum size and we're not in | 823 // Enlarge the container if it was already at maximum size and we're not in |
817 // the middle of upgrading. | 824 // the middle of upgrading. |
818 if ((model_->GetVisibleIconCount() < 0) && | 825 if ((model_->GetVisibleIconCount() < 0) && |
819 !extensions::ExtensionSystem::Get(profile_)->runtime_data()-> | 826 !extensions::ExtensionSystem::Get(profile_)->runtime_data()-> |
820 IsBeingUpgraded(extension)) { | 827 IsBeingUpgraded(extension)) { |
821 suppress_chevron_ = true; | 828 suppress_chevron_ = true; |
822 SaveDesiredSizeAndAnimate(gfx::Tween::LINEAR, visible_actions + 1); | 829 Animate(gfx::Tween::LINEAR, browser_action_views_.size()); |
823 } else { | 830 } else { |
824 // Just redraw the (possibly modified) visible icon set. | 831 // Just redraw the (possibly modified) visible icon set. |
825 OnBrowserActionVisibilityChanged(); | 832 OnBrowserActionVisibilityChanged(); |
826 } | 833 } |
827 } | 834 } |
828 | 835 |
829 void BrowserActionsContainer::ToolbarExtensionRemoved( | 836 void BrowserActionsContainer::ToolbarExtensionRemoved( |
830 const Extension* extension) { | 837 const Extension* extension) { |
831 CloseOverflowMenu(); | 838 CloseOverflowMenu(); |
832 | 839 |
(...skipping 14 matching lines...) Expand all Loading... | |
847 // If we have more icons than we can show, then we must not be changing | 854 // If we have more icons than we can show, then we must not be changing |
848 // the container size (since we either removed an icon from the main | 855 // the container size (since we either removed an icon from the main |
849 // area and one from the overflow list will have shifted in, or we | 856 // area and one from the overflow list will have shifted in, or we |
850 // removed an entry directly from the overflow list). | 857 // removed an entry directly from the overflow list). |
851 OnBrowserActionVisibilityChanged(); | 858 OnBrowserActionVisibilityChanged(); |
852 } else { | 859 } else { |
853 // Either we went from overflow to no-overflow, or we shrunk the no- | 860 // Either we went from overflow to no-overflow, or we shrunk the no- |
854 // overflow container by 1. Either way the size changed, so animate. | 861 // overflow container by 1. Either way the size changed, so animate. |
855 if (chevron_) | 862 if (chevron_) |
856 chevron_->SetVisible(false); | 863 chevron_->SetVisible(false); |
857 SaveDesiredSizeAndAnimate(gfx::Tween::EASE_OUT, | 864 Animate(gfx::Tween::EASE_OUT, browser_action_views_.size()); |
Finnur
2014/08/21 10:47:51
I can't say for sure if this is correct. I suspect
Devlin
2014/08/21 13:56:30
Sorry; I didn't explain very well.
I'm fairly cer
Finnur
2014/08/21 14:08:30
No, I would agree that there's no need to save the
Devlin
2014/08/21 15:24:59
Ah yes, sorry, width. :) (that should teach me to
| |
858 browser_action_views_.size()); | |
859 } | 865 } |
860 return; // We have found the action to remove, bail out. | 866 return; // We have found the action to remove, bail out. |
861 } | 867 } |
862 } | 868 } |
863 } | 869 } |
864 | 870 |
865 void BrowserActionsContainer::ToolbarExtensionMoved(const Extension* extension, | 871 void BrowserActionsContainer::ToolbarExtensionMoved(const Extension* extension, |
866 int index) { | 872 int index) { |
867 if (!ShouldDisplayBrowserAction(extension)) | 873 if (!ShouldDisplayBrowserAction(extension)) |
868 return; | 874 return; |
(...skipping 30 matching lines...) Expand all Loading... | |
899 if (view) | 905 if (view) |
900 view->UpdateState(); | 906 view->UpdateState(); |
901 } | 907 } |
902 | 908 |
903 bool BrowserActionsContainer::ShowExtensionActionPopup( | 909 bool BrowserActionsContainer::ShowExtensionActionPopup( |
904 const Extension* extension) { | 910 const Extension* extension) { |
905 return ShowPopupForExtension(extension, false, false); | 911 return ShowPopupForExtension(extension, false, false); |
906 } | 912 } |
907 | 913 |
908 void BrowserActionsContainer::ToolbarVisibleCountChanged() { | 914 void BrowserActionsContainer::ToolbarVisibleCountChanged() { |
915 int old_container_width = container_width_; | |
909 SetContainerWidth(); | 916 SetContainerWidth(); |
917 if (old_container_width != container_width_) | |
918 Animate(gfx::Tween::EASE_OUT, GetIconCount()); | |
Finnur
2014/08/21 10:47:51
I am unclear on this one too...
Devlin
2014/08/21 13:56:30
Here, we just say "Animate to the number of icons
| |
910 } | 919 } |
911 | 920 |
912 void BrowserActionsContainer::ToolbarHighlightModeChanged( | 921 void BrowserActionsContainer::ToolbarHighlightModeChanged( |
913 bool is_highlighting) { | 922 bool is_highlighting) { |
914 // The visual highlighting is done in OnPaint(). It's a bit of a pain that | 923 // The visual highlighting is done in OnPaint(). It's a bit of a pain that |
915 // we delete and recreate everything here, but given everything else going on | 924 // we delete and recreate everything here, but given everything else going on |
916 // (the lack of highlight, n more extensions appearing, etc), it's not worth | 925 // (the lack of highlight, n more extensions appearing, etc), it's not worth |
917 // the extra complexity to create and insert only the new extensions. | 926 // the extra complexity to create and insert only the new extensions. |
918 DeleteBrowserActionViews(); | 927 DeleteBrowserActionViews(); |
919 CreateBrowserActionViews(); | 928 CreateBrowserActionViews(); |
920 SaveDesiredSizeAndAnimate(gfx::Tween::LINEAR, browser_action_views_.size()); | 929 Animate(gfx::Tween::LINEAR, browser_action_views_.size()); |
Finnur
2014/08/21 10:47:50
This is probably a good change, since if the brows
| |
921 } | 930 } |
922 | 931 |
923 void BrowserActionsContainer::LoadImages() { | 932 void BrowserActionsContainer::LoadImages() { |
924 ui::ThemeProvider* tp = GetThemeProvider(); | 933 ui::ThemeProvider* tp = GetThemeProvider(); |
925 if (!tp || !chevron_) | 934 if (!tp || !chevron_) |
926 return; | 935 return; |
927 | 936 |
928 chevron_->SetImage(views::Button::STATE_NORMAL, | 937 chevron_->SetImage(views::Button::STATE_NORMAL, |
929 *tp->GetImageSkiaNamed(IDR_BROWSER_ACTIONS_OVERFLOW)); | 938 *tp->GetImageSkiaNamed(IDR_BROWSER_ACTIONS_OVERFLOW)); |
930 | 939 |
931 const int kImages[] = IMAGE_GRID(IDR_DEVELOPER_MODE_HIGHLIGHT); | 940 const int kImages[] = IMAGE_GRID(IDR_DEVELOPER_MODE_HIGHLIGHT); |
932 highlight_painter_.reset(views::Painter::CreateImageGridPainter(kImages)); | 941 highlight_painter_.reset(views::Painter::CreateImageGridPainter(kImages)); |
933 } | 942 } |
934 | 943 |
935 void BrowserActionsContainer::OnBrowserActionVisibilityChanged() { | 944 void BrowserActionsContainer::OnBrowserActionVisibilityChanged() { |
936 SetVisible(!browser_action_views_.empty()); | 945 SetVisible(!browser_action_views_.empty()); |
937 if (owner_view_) { | 946 if (owner_view_) { |
938 owner_view_->Layout(); | 947 owner_view_->Layout(); |
939 owner_view_->SchedulePaint(); | 948 owner_view_->SchedulePaint(); |
940 } | 949 } |
941 } | 950 } |
942 | 951 |
943 void BrowserActionsContainer::SetContainerWidth() { | 952 void BrowserActionsContainer::SetContainerWidth() { |
944 // The slave only draws the overflow (what isn't visible in the other | 953 int visible_actions = GetIconCount(); |
945 // container). | |
946 int visible_actions = in_overflow_mode() ? | |
947 model_->toolbar_items().size() - model_->GetVisibleIconCount() : | |
948 model_->GetVisibleIconCount(); | |
949 if (visible_actions < 0) // All icons should be visible. | |
950 visible_actions = model_->toolbar_items().size(); | |
951 if (chevron_) { | 954 if (chevron_) { |
952 chevron_->SetVisible( | 955 chevron_->SetVisible( |
953 static_cast<size_t>(visible_actions) < model_->toolbar_items().size()); | 956 static_cast<size_t>(visible_actions) < model_->toolbar_items().size()); |
954 } | 957 } |
955 container_width_ = | 958 container_width_ = |
956 IconCountToWidth(visible_actions, chevron_ && chevron_->visible()); | 959 IconCountToWidth(visible_actions, chevron_ && chevron_->visible()); |
957 } | 960 } |
958 | 961 |
959 void BrowserActionsContainer::CloseOverflowMenu() { | 962 void BrowserActionsContainer::CloseOverflowMenu() { |
960 if (overflow_menu_) | 963 if (overflow_menu_) |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1017 std::max(0, available_space + kItemSpacing) / IconWidth(true)); | 1020 std::max(0, available_space + kItemSpacing) / IconWidth(true)); |
1018 } | 1021 } |
1019 | 1022 |
1020 int BrowserActionsContainer::MinimumNonemptyWidth() const { | 1023 int BrowserActionsContainer::MinimumNonemptyWidth() const { |
1021 if (!chevron_) | 1024 if (!chevron_) |
1022 return ToolbarView::kStandardSpacing; | 1025 return ToolbarView::kStandardSpacing; |
1023 return (ToolbarView::kStandardSpacing * 2) + kChevronSpacing + | 1026 return (ToolbarView::kStandardSpacing * 2) + kChevronSpacing + |
1024 chevron_->GetPreferredSize().width(); | 1027 chevron_->GetPreferredSize().width(); |
1025 } | 1028 } |
1026 | 1029 |
1027 void BrowserActionsContainer::SaveDesiredSizeAndAnimate( | 1030 void BrowserActionsContainer::Animate(gfx::Tween::Type tween_type, |
1028 gfx::Tween::Type tween_type, | 1031 size_t num_visible_icons) { |
1029 size_t num_visible_icons) { | |
1030 // Save off the desired number of visible icons. We do this now instead of at | |
1031 // the end of the animation so that even if the browser is shut down while | |
1032 // animating, the right value will be restored on next run. | |
1033 // NOTE: Don't save the icon count in incognito because there may be fewer | |
1034 // icons in that mode. The result is that the container in a normal window is | |
1035 // always at least as wide as in an incognito window. | |
1036 if (!profile_->IsOffTheRecord()) | |
1037 model_->SetVisibleIconCount(num_visible_icons); | |
Devlin
2014/08/21 00:06:29
Had to move this to OnResize because otherwise the
| |
1038 int target_size = IconCountToWidth(num_visible_icons, | 1032 int target_size = IconCountToWidth(num_visible_icons, |
1039 num_visible_icons < browser_action_views_.size()); | 1033 num_visible_icons < browser_action_views_.size()); |
1040 if (resize_animation_ && !disable_animations_during_testing_) { | 1034 if (resize_animation_ && !disable_animations_during_testing_) { |
1041 // Animate! We have to set the animation_target_size_ after calling Reset(), | 1035 // Animate! We have to set the animation_target_size_ after calling Reset(), |
1042 // because that could end up calling AnimationEnded which clears the value. | 1036 // because that could end up calling AnimationEnded which clears the value. |
1043 resize_animation_->Reset(); | 1037 resize_animation_->Reset(); |
1044 resize_animation_->SetTweenType(tween_type); | 1038 resize_animation_->SetTweenType(tween_type); |
1045 animation_target_size_ = target_size; | 1039 animation_target_size_ = target_size; |
1046 resize_animation_->Show(); | 1040 resize_animation_->Show(); |
1047 } else { | 1041 } else { |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1080 BrowserActionView* BrowserActionsContainer::GetViewForExtension( | 1074 BrowserActionView* BrowserActionsContainer::GetViewForExtension( |
1081 const Extension* extension) { | 1075 const Extension* extension) { |
1082 for (BrowserActionViews::iterator view = browser_action_views_.begin(); | 1076 for (BrowserActionViews::iterator view = browser_action_views_.begin(); |
1083 view != browser_action_views_.end(); ++view) { | 1077 view != browser_action_views_.end(); ++view) { |
1084 if ((*view)->extension() == extension) | 1078 if ((*view)->extension() == extension) |
1085 return *view; | 1079 return *view; |
1086 } | 1080 } |
1087 | 1081 |
1088 return NULL; | 1082 return NULL; |
1089 } | 1083 } |
1084 | |
1085 size_t BrowserActionsContainer::GetIconCount() const { | |
1086 int visible_icons = model_->GetVisibleIconCount(); | |
1087 if (visible_icons == -1) | |
1088 visible_icons = model_->toolbar_items().size(); | |
1089 return in_overflow_mode() ? | |
1090 model_->toolbar_items().size() - visible_icons : visible_icons; | |
1091 } | |
OLD | NEW |