Index: chrome/browser/ui/views/frame/contents_container.cc |
diff --git a/chrome/browser/ui/views/frame/contents_container.cc b/chrome/browser/ui/views/frame/contents_container.cc |
index c3056f794c1bae32a7fef3a4d53838dd82a89b5b..084c87f7cda3e1f73fb423c599a5c9d027497a95 100644 |
--- a/chrome/browser/ui/views/frame/contents_container.cc |
+++ b/chrome/browser/ui/views/frame/contents_container.cc |
@@ -4,18 +4,33 @@ |
#include "chrome/browser/views/frame/contents_container.h" |
+#include "app/slide_animation.h" |
+#include "third_party/skia/include/core/SkColor.h" |
+#include "views/background.h" |
+#include "views/widget/root_view.h" |
+#include "views/widget/widget.h" |
+ |
+// Min/max opacity of the overlay. |
+static const int kMinOpacity = 0; |
+static const int kMaxOpacity = 192; |
+ |
ContentsContainer::ContentsContainer(views::View* active) |
: active_(active), |
preview_(NULL), |
preview_tab_contents_(NULL), |
+ active_overlay_(NULL), |
active_top_margin_(0) { |
AddChildView(active_); |
} |
ContentsContainer::~ContentsContainer() { |
+ // We don't need to explicitly delete active_overlay_ as it'll be deleted by |
+ // virtue of being a child window. |
} |
void ContentsContainer::MakePreviewContentsActiveContents() { |
+ RemoveFade(); |
+ |
active_ = preview_; |
preview_ = NULL; |
Layout(); |
@@ -52,6 +67,53 @@ gfx::Rect ContentsContainer::GetPreviewBounds() { |
return gfx::Rect(screen_loc, size()); |
} |
+void ContentsContainer::FadeActiveContents() { |
+ if (active_overlay_) |
+ return; |
+ |
+#if !defined(OS_WIN) |
+ // TODO: fix this. I'm disabling as z-order isn't right on linux so that |
+ // overlay ends up obscuring the omnibox. |
+ return; |
+#endif |
+ |
+ overlay_animation_.reset(new SlideAnimation(this)); |
+ overlay_animation_->SetDuration(300); |
+ overlay_animation_->SetSlideDuration(300); |
+ overlay_animation_->Show(); |
+ |
+ active_overlay_ = views::Widget::CreatePopupWidget(views::Widget::Transparent, |
+ views::Widget::NotAcceptEvents, |
+ views::Widget::DeleteOnDestroy, |
+ views::Widget::MirrorOriginInRTL); |
+ active_overlay_->SetOpacity(0); |
+ gfx::Point screen_origin; |
+ views::View::ConvertPointToScreen(active_, &screen_origin); |
+ gfx::Rect overlay_bounds(screen_origin, active_->size()); |
+ active_overlay_->Init(active_->GetWidget()->GetNativeView(), overlay_bounds); |
+ views::View* content_view = new views::View(); |
+ content_view->set_background( |
+ views::Background::CreateSolidBackground(SK_ColorWHITE)); |
+ active_overlay_->SetContentsView(content_view); |
+ active_overlay_->Show(); |
+ active_overlay_->MoveAbove(active_->GetWidget()); |
+} |
+ |
+void ContentsContainer::RemoveFade() { |
+ overlay_animation_.reset(); |
+ if (active_overlay_) { |
+ active_overlay_->Close(); |
+ active_overlay_ = NULL; |
+ } |
+} |
+ |
+void ContentsContainer::AnimationProgressed(const Animation* animation) { |
+ active_overlay_->SetOpacity( |
+ Tween::ValueBetween(animation->GetCurrentValue(), kMinOpacity, |
+ kMaxOpacity)); |
+ active_overlay_->GetRootView()->SchedulePaint(); |
+} |
+ |
void ContentsContainer::Layout() { |
// The active view always gets the full bounds. |
active_->SetBounds(0, active_top_margin_, width(), |