| 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..cd0d47a4bf8898ba1bee81a73b6e7c0188c840ce 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) {
|
| @@ -127,14 +137,9 @@ gfx::Rect PanelOverflowStrip::ComputeLayout(
|
| bounds.set_x(display_area_.x());
|
| bounds.set_y(bottom - iconified_size.height());
|
|
|
| - if (are_overflow_titles_shown_) {
|
| - // Both icon and title are visible when the mouse hovers over the overflow
|
| - // area.
|
| - bounds.set_width(kOverflowAreaHoverWidth);
|
| - bounds.set_height(iconified_size.height());
|
| - } else if (index < kMaxVisibleOverflowPanelsAllowed) {
|
| - // Only the icon is visible.
|
| - bounds.set_width(iconified_size.width());
|
| + if (are_overflow_titles_shown_ ||
|
| + static_cast<int>(index) < max_visible_panels_) {
|
| + bounds.set_width(current_display_width_);
|
| bounds.set_height(iconified_size.height());
|
| } else {
|
| // Invisible for overflow-on-overflow.
|
| @@ -155,17 +160,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 +177,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 +193,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 +207,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());
|
| }
|
|
|
|
|