Chromium Code Reviews| Index: chrome/browser/ui/panels/panel_overflow_strip.cc |
| diff --git a/chrome/browser/ui/panels/panel_overflow_strip.cc b/chrome/browser/ui/panels/panel_overflow_strip.cc |
| index e145e1cdbf96a1691cbd71f9d39c3f891631e2cb..eb20991a295ee41c5a81ebd9c35ac1841f4dfe3c 100644 |
| --- a/chrome/browser/ui/panels/panel_overflow_strip.cc |
| +++ b/chrome/browser/ui/panels/panel_overflow_strip.cc |
| @@ -8,12 +8,14 @@ |
| #include "chrome/browser/ui/panels/panel_manager.h" |
| #include "chrome/browser/ui/panels/panel_mouse_watcher.h" |
| #include "chrome/browser/ui/panels/panel_strip.h" |
| +#include "chrome/common/chrome_notification_types.h" |
| +#include "content/public/browser/notification_service.h" |
| #include "ui/base/animation/slide_animation.h" |
| namespace { |
| // The width of the overflow area that is expanded to show more info, i.e. |
| // titles, when the mouse hovers over the area. |
| -const int kOverflowAreaHoverWidth = 200; |
| +static const int kOverflowAreaHoverWidth = 200; |
| // Maximium number of overflow panels allowed to be shown. |
| const size_t kMaxVisibleOverflowPanelsAllowed = 6; |
| @@ -24,6 +26,8 @@ const int kOverflowHoverAnimationMs = 180; |
| PanelOverflowStrip::PanelOverflowStrip(PanelManager* panel_manager) |
| : panel_manager_(panel_manager), |
| + current_display_width_(0), |
| + max_visible_panels_(kMaxVisibleOverflowPanelsAllowed), |
| are_overflow_titles_shown_(false), |
| overflow_hover_animator_start_width_(0), |
| overflow_hover_animator_end_width_(0) { |
| @@ -38,9 +42,16 @@ void PanelOverflowStrip::SetDisplayArea(const gfx::Rect& display_area) { |
| return; |
| display_area_ = display_area; |
| + UpdateCurrentWidth(); |
| + |
| Refresh(); |
| } |
| +void PanelOverflowStrip::UpdateCurrentWidth() { |
| + current_display_width_ = are_overflow_titles_shown_ ? kOverflowAreaHoverWidth |
| + : display_area_.width(); |
| +} |
| + |
| void PanelOverflowStrip::AddPanel(Panel* panel) { |
| // TODO(jianli): consider using other container to improve the perf for |
| // inserting to the front. http://crbug.com/106222 |
| @@ -106,7 +117,6 @@ void PanelOverflowStrip::DoRefresh(size_t start_index, size_t end_index) { |
| if (panels_.empty() || start_index == panels_.size()) |
| return; |
| - DCHECK(start_index < panels_.size()); |
| DCHECK(end_index < panels_.size()); |
| for (size_t index = start_index; index <= end_index; ++index) { |
| @@ -130,11 +140,11 @@ gfx::Rect PanelOverflowStrip::ComputeLayout( |
| if (are_overflow_titles_shown_) { |
|
jennb
2011/12/15 01:40:27
Could combine this with conditional in else-if:
a
|
| // Both icon and title are visible when the mouse hovers over the overflow |
| // area. |
| - bounds.set_width(kOverflowAreaHoverWidth); |
| + bounds.set_width(current_display_width_); |
| bounds.set_height(iconified_size.height()); |
| - } else if (index < kMaxVisibleOverflowPanelsAllowed) { |
| + } else if (static_cast<int>(index) < max_visible_panels_) { |
| // Only the icon is visible. |
| - bounds.set_width(iconified_size.width()); |
| + bounds.set_width(current_display_width_); |
| bounds.set_height(iconified_size.height()); |
| } else { |
| // Invisible for overflow-on-overflow. |
| @@ -155,17 +165,14 @@ bool PanelOverflowStrip::ShouldShowOverflowTitles( |
| if (panels_.empty()) |
| return false; |
| - int width; |
| Panel* top_visible_panel; |
| if (are_overflow_titles_shown_) { |
| - width = kOverflowAreaHoverWidth; |
| top_visible_panel = panels_.back(); |
| } else { |
| - width = display_area_.width(); |
| - top_visible_panel = panels_.size() >= kMaxVisibleOverflowPanelsAllowed ? |
| - panels_[kMaxVisibleOverflowPanelsAllowed - 1] : panels_.back(); |
| + top_visible_panel = num_panels() >= max_visible_panels_ ? |
| + panels_[max_visible_panels_ - 1] : panels_.back(); |
| } |
| - return mouse_position.x() <= display_area_.x() + width && |
| + return mouse_position.x() <= display_area_.x() + current_display_width_ && |
| top_visible_panel->GetBounds().y() <= mouse_position.y() && |
| mouse_position.y() <= display_area_.bottom(); |
| } |
| @@ -175,11 +182,13 @@ void PanelOverflowStrip::ShowOverflowTitles(bool show_overflow_titles) { |
| return; |
| are_overflow_titles_shown_ = show_overflow_titles; |
| + UpdateCurrentWidth(); |
| + |
| if (panels_.empty()) |
| return; |
| if (show_overflow_titles) { |
| - overflow_hover_animator_start_width_ = display_area_.width(); |
| + overflow_hover_animator_start_width_ = current_display_width_; |
| overflow_hover_animator_end_width_ = kOverflowAreaHoverWidth; |
| // We need to bring all overflow panels to the top of z-order since the |
| @@ -189,7 +198,7 @@ void PanelOverflowStrip::ShowOverflowTitles(bool show_overflow_titles) { |
| (*iter)->EnsureFullyVisible(); |
| } |
| } else { |
| - overflow_hover_animator_start_width_ = kOverflowAreaHoverWidth; |
| + overflow_hover_animator_start_width_ = current_display_width_; |
| overflow_hover_animator_end_width_ = display_area_.width(); |
| } |
| @@ -203,21 +212,28 @@ void PanelOverflowStrip::ShowOverflowTitles(bool show_overflow_titles) { |
| overflow_hover_animator_->Show(); |
| } |
| +void PanelOverflowStrip::AnimationEnded(const ui::Animation* animation) { |
| + content::NotificationService::current()->Notify( |
| + chrome::NOTIFICATION_PANEL_BOUNDS_ANIMATIONS_FINISHED, |
| + content::Source<PanelOverflowStrip>(this), |
| + content::NotificationService::NoDetails()); |
| +} |
| + |
| void PanelOverflowStrip::AnimationProgressed(const ui::Animation* animation) { |
| - int current_width = overflow_hover_animator_->CurrentValueBetween( |
| + int current_display_width = overflow_hover_animator_->CurrentValueBetween( |
| overflow_hover_animator_start_width_, overflow_hover_animator_end_width_); |
| - bool end_of_shrinking = current_width == display_area_.width(); |
| + bool end_of_shrinking = current_display_width == display_area_.width(); |
| // Update each overflow panel. |
| for (size_t i = 0; i < panels_.size(); ++i) { |
| Panel* overflow_panel = panels_[i]; |
| gfx::Rect bounds = overflow_panel->GetBounds(); |
| - if (i >= kMaxVisibleOverflowPanelsAllowed && end_of_shrinking) { |
| + if (static_cast<int>(i) >= max_visible_panels_ && end_of_shrinking) { |
| bounds.set_width(0); |
| bounds.set_height(0); |
| } else { |
| - bounds.set_width(current_width); |
| + bounds.set_width(current_display_width); |
| bounds.set_height(overflow_panel->IconOnlySize().height()); |
| } |