Index: chrome/browser/ui/views/infobars/infobar_view.cc |
=================================================================== |
--- chrome/browser/ui/views/infobars/infobar_view.cc (revision 80169) |
+++ chrome/browser/ui/views/infobars/infobar_view.cc (working copy) |
@@ -56,6 +56,8 @@ |
close_button_(NULL), |
ALLOW_THIS_IN_INITIALIZER_LIST(delete_factory_(this)), |
target_height_(kDefaultTargetHeight), |
+ tab_height_(0), |
+ bar_height_(0), |
fill_path_(new SkPath), |
stroke_path_(new SkPath) { |
set_parent_owned(false); // InfoBar deletes itself at the appropriate time. |
@@ -245,12 +247,9 @@ |
// |
// gfx::CanvasSkia* canvas_skia = canvas->AsCanvasSkia(); |
// canvas_skia->clipPath(*fill_path_); |
- int tab_height = AnimatedTabHeight(); |
- int bar_height = AnimatedBarHeight(); |
- DCHECK_EQ(tab_height + bar_height, height()) |
- << "Animation progressed between OnBoundsChanged & PaintChildren."; |
- canvas->ClipRectInt(0, tab_height, width(), bar_height); |
- |
+ DCHECK_EQ(tab_height_ + bar_height_, height()) |
+ << "Infobar piecewise heights do not match overall height"; |
+ canvas->ClipRectInt(0, tab_height_, width(), bar_height_); |
views::View::PaintChildren(canvas); |
canvas->Restore(); |
} |
@@ -268,6 +267,13 @@ |
return 0; |
} |
+void InfoBarView::SetTargetHeight(int height) { |
+ if (target_height_ != height) { |
+ target_height_ = height; |
+ OnSizeChanged(); |
+ } |
+} |
+ |
int InfoBarView::StartX() const { |
// Ensure we don't return a value greater than EndX(), so children can safely |
// set something's width to "EndX() - StartX()" without risking that being |
@@ -286,8 +292,7 @@ |
} |
int InfoBarView::OffsetY(const gfx::Size prefsize) const { |
- return CenterY(prefsize) + AnimatedTabHeight() - |
- (target_height_ - AnimatedBarHeight()); |
+ return CenterY(prefsize) + tab_height_ - (target_height_ - bar_height_); |
} |
void InfoBarView::PlatformSpecificHide(bool animate) { |
@@ -305,41 +310,22 @@ |
DestroyFocusTracker(restore_focus); |
} |
-void InfoBarView::GetAccessibleState(ui::AccessibleViewState* state) { |
- if (delegate()) { |
- state->name = l10n_util::GetStringUTF16( |
- (delegate()->GetInfoBarType() == InfoBarDelegate::WARNING_TYPE) ? |
- IDS_ACCNAME_INFOBAR_WARNING : IDS_ACCNAME_INFOBAR_PAGE_ACTION); |
- } |
- state->role = ui::AccessibilityTypes::ROLE_ALERT; |
-} |
+void InfoBarView::PlatformSpecificOnSizeChanged() { |
+ int old_tab_height = tab_height_; |
+ int old_bar_height = bar_height_; |
+ tab_height_ = static_cast<int>(kTabHeight * animation()->GetCurrentValue()); |
+ bar_height_ = |
+ static_cast<int>(target_height_ * animation()->GetCurrentValue()); |
+ if ((old_tab_height == tab_height_) && (old_bar_height == bar_height_)) |
+ return; |
-int InfoBarView::AnimatedTabHeight() const { |
- return static_cast<int>(kTabHeight * animation()->GetCurrentValue()); |
-} |
- |
-int InfoBarView::AnimatedBarHeight() const { |
- return static_cast<int>(target_height_ * animation()->GetCurrentValue()); |
-} |
- |
-gfx::Size InfoBarView::GetPreferredSize() { |
- return gfx::Size(0, AnimatedTabHeight() + AnimatedBarHeight()); |
-} |
- |
-void InfoBarView::OnBoundsChanged(const gfx::Rect& previous_bounds) { |
- int tab_height = AnimatedTabHeight(); |
- int bar_height = AnimatedBarHeight(); |
- int divider_y = tab_height - 1; |
- DCHECK_EQ(tab_height + bar_height, height()) |
- << "Animation progressed between Layout & OnBoundsChanged."; |
- |
- int mirrored_x = GetMirroredXWithWidthInView(0, kTabWidth); |
stroke_path_->rewind(); |
fill_path_->rewind(); |
- |
- if (tab_height) { |
- stroke_path_->moveTo(SkIntToScalar(mirrored_x), |
- SkIntToScalar(divider_y)); |
+ if (tab_height_) { |
+ int divider_y = tab_height_ - 1; |
+ stroke_path_->moveTo( |
+ SkIntToScalar(GetMirroredXWithWidthInView(0, kTabWidth)), |
+ SkIntToScalar(divider_y)); |
stroke_path_->rCubicTo( |
SkScalarDiv(kCurveWidth, 2), 0.0, |
SkScalarDiv(kCurveWidth, 2), |
@@ -372,12 +358,29 @@ |
// a fill at a very different place than we'd want. |
stroke_path_->offset(SK_ScalarHalf, SK_ScalarHalf); |
} |
- if (bar_height) { |
- fill_path_->addRect(0.0, SkIntToScalar(tab_height), |
+ if (bar_height_) { |
+ fill_path_->addRect(0.0, SkIntToScalar(tab_height_), |
SkIntToScalar(width()), SkIntToScalar(height())); |
} |
+ |
+ // Ensure that notifying our container of our size change will result in a |
+ // re-layout. |
+ InvalidateLayout(); |
Sheridan Rawlins
2011/04/01 18:41:48
InvalidateLayout only needs_layout, but doesn't ca
Peter Kasting
2011/04/01 19:07:15
We will notify the container immediately upon retu
|
} |
+void InfoBarView::GetAccessibleState(ui::AccessibleViewState* state) { |
+ if (delegate()) { |
+ state->name = l10n_util::GetStringUTF16( |
+ (delegate()->GetInfoBarType() == InfoBarDelegate::WARNING_TYPE) ? |
+ IDS_ACCNAME_INFOBAR_WARNING : IDS_ACCNAME_INFOBAR_PAGE_ACTION); |
+ } |
+ state->role = ui::AccessibilityTypes::ROLE_ALERT; |
+} |
+ |
+gfx::Size InfoBarView::GetPreferredSize() { |
+ return gfx::Size(0, tab_height_ + bar_height_); |
+} |
+ |
void InfoBarView::FocusWillChange(View* focused_before, View* focused_now) { |
// This will trigger some screen readers to read the entire contents of this |
// infobar. |