summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/views/tabs/base_tab_strip.cc29
-rw-r--r--chrome/browser/views/tabs/base_tab_strip.h6
-rw-r--r--chrome/browser/views/tabs/side_tab_strip.cc6
-rw-r--r--chrome/browser/views/tabs/side_tab_strip.h2
-rw-r--r--chrome/browser/views/tabs/tab_strip.cc18
-rw-r--r--chrome/browser/views/tabs/tab_strip.h2
6 files changed, 38 insertions, 25 deletions
diff --git a/chrome/browser/views/tabs/base_tab_strip.cc b/chrome/browser/views/tabs/base_tab_strip.cc
index c39f779..4f844ed 100644
--- a/chrome/browser/views/tabs/base_tab_strip.cc
+++ b/chrome/browser/views/tabs/base_tab_strip.cc
@@ -154,7 +154,7 @@ void BaseTabStrip::AddTabAt(int model_index,
if (tab_count() > 1 && GetWindow() && GetWindow()->IsVisible())
StartInsertTabAnimation(model_index, foreground);
else
- Layout();
+ DoLayout();
}
void BaseTabStrip::MoveTab(int from_model_index, int to_model_index) {
@@ -182,7 +182,7 @@ void BaseTabStrip::SetTabData(int model_index, const TabRendererData& data) {
if (GetWindow() && GetWindow()->IsVisible())
StartMiniTabAnimation();
else
- Layout();
+ DoLayout();
}
}
@@ -332,14 +332,10 @@ BaseTab* BaseTabStrip::GetTabAt(BaseTab* tab,
}
void BaseTabStrip::Layout() {
- StopAnimating(false);
-
- GenerateIdealBounds();
-
- for (int i = 0; i < tab_count(); ++i)
- tab_data_[i].tab->SetBounds(tab_data_[i].ideal_bounds);
-
- SchedulePaint();
+ // Only do a layout if our size changed.
+ if (last_layout_size_ == size())
+ return;
+ DoLayout();
}
bool BaseTabStrip::OnMouseDragged(const views::MouseEvent& event) {
@@ -462,3 +458,16 @@ void BaseTabStrip::PrepareForAnimation() {
AnimationDelegate* BaseTabStrip::CreateRemoveTabDelegate(BaseTab* tab) {
return new RemoveTabDelegate(this, tab);
}
+
+void BaseTabStrip::DoLayout() {
+ last_layout_size_ = size();
+
+ StopAnimating(false);
+
+ GenerateIdealBounds();
+
+ for (int i = 0; i < tab_count(); ++i)
+ tab_data_[i].tab->SetBounds(tab_data_[i].ideal_bounds);
+
+ SchedulePaint();
+}
diff --git a/chrome/browser/views/tabs/base_tab_strip.h b/chrome/browser/views/tabs/base_tab_strip.h
index 91f5e6c..e3f5231 100644
--- a/chrome/browser/views/tabs/base_tab_strip.h
+++ b/chrome/browser/views/tabs/base_tab_strip.h
@@ -232,6 +232,9 @@ class BaseTabStrip : public views::View,
// completes. The caller owns the returned object.
AnimationDelegate* CreateRemoveTabDelegate(BaseTab* tab);
+ // Invoked from Layout if the size changes or layout is really needed.
+ virtual void DoLayout();
+
private:
class RemoveTabDelegate;
@@ -255,6 +258,9 @@ class BaseTabStrip : public views::View,
bool attaching_dragged_tab_;
views::BoundsAnimator bounds_animator_;
+
+ // Size we last layed out at.
+ gfx::Size last_layout_size_;
};
#endif // CHROME_BROWSER_VIEWS_TABS_BASE_TAB_STRIP_H_
diff --git a/chrome/browser/views/tabs/side_tab_strip.cc b/chrome/browser/views/tabs/side_tab_strip.cc
index 4b97b08..84e8082 100644
--- a/chrome/browser/views/tabs/side_tab_strip.cc
+++ b/chrome/browser/views/tabs/side_tab_strip.cc
@@ -236,7 +236,7 @@ void SideTabStrip::StopAnimating(bool layout) {
bounds_animator().Cancel();
if (layout)
- Layout();
+ DoLayout();
}
void SideTabStrip::AnimateToIdealBounds() {
@@ -251,8 +251,8 @@ void SideTabStrip::AnimateToIdealBounds() {
bounds_animator().AnimateViewTo(separator_, separator_bounds_);
}
-void SideTabStrip::Layout() {
- BaseTabStrip::Layout();
+void SideTabStrip::DoLayout() {
+ BaseTabStrip::DoLayout();
newtab_button_->SetBounds(newtab_button_bounds_);
diff --git a/chrome/browser/views/tabs/side_tab_strip.h b/chrome/browser/views/tabs/side_tab_strip.h
index d5f0ffa..c847077 100644
--- a/chrome/browser/views/tabs/side_tab_strip.h
+++ b/chrome/browser/views/tabs/side_tab_strip.h
@@ -45,7 +45,7 @@ class SideTabStrip : public BaseTabStrip {
virtual void StartMoveTabAnimation();
virtual void StopAnimating(bool layout);
virtual void AnimateToIdealBounds();
- virtual void Layout();
+ virtual void DoLayout();
private:
// The "New Tab" button.
diff --git a/chrome/browser/views/tabs/tab_strip.cc b/chrome/browser/views/tabs/tab_strip.cc
index 1a1a99e..9b25dfa 100644
--- a/chrome/browser/views/tabs/tab_strip.cc
+++ b/chrome/browser/views/tabs/tab_strip.cc
@@ -235,7 +235,7 @@ void TabStrip::SelectTabAt(int old_model_index, int new_model_index) {
// a different size to the selected ones.
bool tiny_tabs = current_unselected_width_ != current_selected_width_;
if (!IsAnimating() && (!in_tab_close_ || tiny_tabs)) {
- Layout();
+ DoLayout();
} else {
SchedulePaint();
}
@@ -332,14 +332,6 @@ views::View* TabStrip::GetViewByID(int view_id) const {
return View::GetViewByID(view_id);
}
-void TabStrip::Layout() {
- BaseTabStrip::Layout();
-
- newtab_button_->SetBounds(newtab_button_bounds_);
-
- SchedulePaint();
-}
-
gfx::Size TabStrip::GetPreferredSize() {
return gfx::Size(0, Tab::GetMinimumUnselectedSize().height());
}
@@ -463,6 +455,12 @@ bool TabStrip::ShouldHighlightCloseButtonAfterRemove() {
return in_tab_close_;
}
+void TabStrip::DoLayout() {
+ BaseTabStrip::DoLayout();
+
+ newtab_button_->SetBounds(newtab_button_bounds_);
+}
+
void TabStrip::ViewHierarchyChanged(bool is_add,
views::View* parent,
views::View* child) {
@@ -958,7 +956,7 @@ void TabStrip::StopAnimating(bool layout) {
DCHECK(!IsAnimating());
if (layout)
- Layout();
+ DoLayout();
}
int TabStrip::GetMiniTabCount() const {
diff --git a/chrome/browser/views/tabs/tab_strip.h b/chrome/browser/views/tabs/tab_strip.h
index 188868d..f7ec80fd 100644
--- a/chrome/browser/views/tabs/tab_strip.h
+++ b/chrome/browser/views/tabs/tab_strip.h
@@ -73,7 +73,6 @@ class TabStrip : public BaseTabStrip,
// views::View overrides:
virtual void PaintChildren(gfx::Canvas* canvas);
virtual views::View* GetViewByID(int id) const;
- virtual void Layout();
virtual gfx::Size GetPreferredSize();
// NOTE: the drag and drop methods are invoked from FrameView. This is done to
// allow for a drop region that extends outside the bounds of the TabStrip.
@@ -92,6 +91,7 @@ class TabStrip : public BaseTabStrip,
virtual void StartMoveTabAnimation();
virtual void AnimateToIdealBounds();
virtual bool ShouldHighlightCloseButtonAfterRemove();
+ virtual void DoLayout();
// views::View implementation:
virtual void ViewHierarchyChanged(bool is_add,