Chromium Code Reviews| Index: chrome/browser/ui/infobar_container_delegate.cc |
| diff --git a/chrome/browser/ui/infobar_container_delegate.cc b/chrome/browser/ui/infobar_container_delegate.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..129cf43262ee2fc559b0b7a8a0cb3f610b4b4068 |
| --- /dev/null |
| +++ b/chrome/browser/ui/infobar_container_delegate.cc |
| @@ -0,0 +1,85 @@ |
| +// Copyright 2014 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "chrome/browser/ui/infobar_container_delegate.h" |
| +#include "ui/gfx/animation/slide_animation.h" |
| + |
| +const int InfoBarContainerDelegate::kDefaultBarTargetHeight = 36; |
| +const int InfoBarContainerDelegate::kMaximumArrowTargetHeight = 24; |
| +const int InfoBarContainerDelegate::kDefaultArrowTargetHalfWidth = |
| + kDefaultArrowTargetHeight; |
|
Lei Zhang
2014/12/12 10:11:33
This creates a static initializer and the sizes st
|
| +const int InfoBarContainerDelegate::kMaximumArrowTargetHalfWidth = 14; |
| + |
| +InfoBarContainerDelegate::InfoBarContainerDelegate() |
| + : top_arrow_target_height_(kDefaultArrowTargetHeight) { |
| +} |
| + |
| +InfoBarContainerDelegate::~InfoBarContainerDelegate() { |
| +} |
| + |
| +void InfoBarContainerDelegate::SetMaxTopArrowHeight( |
| + int height, |
| + infobars::InfoBarContainer* container) { |
| + // Decrease the height by the arrow stroke thickness, which is the separator |
| + // line height, because the infobar arrow target heights are without-stroke. |
| + top_arrow_target_height_ = std::min( |
| + std::max(height - kSeparatorLineHeight, 0), kMaximumArrowTargetHeight); |
| + container->UpdateInfoBarArrowTargetHeights(); |
| +} |
| + |
| +int InfoBarContainerDelegate::ArrowTargetHeightForInfoBar( |
| + size_t index, |
| + const gfx::SlideAnimation& animation) const { |
| + if (!DrawInfoBarArrows(nullptr)) |
| + return 0; |
| + if (index == 0) |
| + return top_arrow_target_height_; |
| + if ((index > 1) || animation.IsShowing()) |
| + return kDefaultArrowTargetHeight; |
| + // When the first infobar is animating closed, we animate the second infobar's |
| + // arrow target height from the default to the top target height. Note that |
| + // the animation values here are going from 1.0 -> 0.0 as the top bar closes. |
| + return top_arrow_target_height_ + static_cast<int>( |
| + (kDefaultArrowTargetHeight - top_arrow_target_height_) * |
| + animation.GetCurrentValue()); |
| +} |
| + |
| +void InfoBarContainerDelegate::ComputeInfoBarElementSizes( |
| + const gfx::SlideAnimation& animation, |
| + int arrow_target_height, |
| + int bar_target_height, |
| + int* arrow_height, |
| + int* arrow_half_width, |
| + int* bar_height) const { |
| + // Find the desired arrow height/half-width. The arrow area is |
| + // *arrow_height * *arrow_half_width. When the bar is opening or closing, |
| + // scaling each of these with the square root of the animation value causes a |
| + // linear animation of the area, which matches the perception of the animation |
| + // of the bar portion. |
| + double scale_factor = sqrt(animation.GetCurrentValue()); |
| + *arrow_height = static_cast<int>(arrow_target_height * scale_factor); |
| + if (animation.is_animating()) { |
| + *arrow_half_width = static_cast<int>( |
| + std::min(arrow_target_height, kMaximumArrowTargetHalfWidth) * |
| + scale_factor); |
| + } else { |
| + // When the infobar is not animating (i.e. fully open), we set the |
| + // half-width to be proportionally the same distance between its default and |
| + // maximum values as the height is between its. |
| + *arrow_half_width = kDefaultArrowTargetHalfWidth + |
| + ((kMaximumArrowTargetHalfWidth - kDefaultArrowTargetHalfWidth) * |
| + ((*arrow_height - kDefaultArrowTargetHeight) / |
| + (kMaximumArrowTargetHeight - kDefaultArrowTargetHeight))); |
| + } |
| + // Add pixels for the stroke, if the arrow is to be visible at all. Without |
| + // this, changing the arrow height from 0 to kSeparatorLineHeight would |
| + // produce no visible effect, because the stroke would paint atop the divider |
| + // line above the infobar. |
| + if (*arrow_height) |
| + *arrow_height += kSeparatorLineHeight; |
| + |
| + *bar_height = animation.CurrentValueBetween( |
| + 0, |
| + (bar_target_height == -1) ? kDefaultBarTargetHeight : bar_target_height); |
| +} |