Index: chrome/browser/gtk/download_started_animation_gtk.cc |
=================================================================== |
--- chrome/browser/gtk/download_started_animation_gtk.cc (revision 71352) |
+++ chrome/browser/gtk/download_started_animation_gtk.cc (working copy) |
@@ -1,194 +0,0 @@ |
-// Copyright (c) 2010 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/download/download_started_animation.h" |
- |
-#include <gtk/gtk.h> |
- |
-#include "app/resource_bundle.h" |
-#include "base/message_loop.h" |
-#include "chrome/browser/tab_contents/tab_contents.h" |
-#include "chrome/common/notification_registrar.h" |
-#include "chrome/common/notification_source.h" |
-#include "gfx/rect.h" |
-#include "grit/theme_resources.h" |
-#include "ui/base/animation/linear_animation.h" |
- |
-namespace { |
- |
-// How long to spend moving downwards and fading out after waiting. |
-const int kMoveTimeMs = 600; |
- |
-// The animation framerate. |
-const int kFrameRateHz = 60; |
- |
-// What fraction of the frame height to move downward from the frame center. |
-// Note that setting this greater than 0.5 will mean moving past the bottom of |
-// the frame. |
-const double kMoveFraction = 1.0 / 3.0; |
- |
-class DownloadStartedAnimationGtk : public ui::LinearAnimation, |
- public NotificationObserver { |
- public: |
- explicit DownloadStartedAnimationGtk(TabContents* tab_contents); |
- |
- // DownloadStartedAnimation will delete itself, but this is public so |
- // that we can use DeleteSoon(). |
- virtual ~DownloadStartedAnimationGtk(); |
- |
- private: |
- // Move the arrow to wherever it should currently be. |
- void Reposition(); |
- |
- // Shut down cleanly. |
- void Close(); |
- |
- // Animation implementation. |
- virtual void AnimateToState(double state); |
- |
- // NotificationObserver |
- virtual void Observe(NotificationType type, |
- const NotificationSource& source, |
- const NotificationDetails& details); |
- |
- // The top level window that floats over the browser and displays the |
- // image. |
- GtkWidget* popup_; |
- |
- // Dimensions of the image. |
- int width_; |
- int height_; |
- |
- // The content area holding us. |
- TabContents* tab_contents_; |
- |
- // The content area at the start of the animation. We store this so that the |
- // download shelf's resizing of the content area doesn't cause the animation |
- // to move around. This means that once started, the animation won't move |
- // with the parent window, but it's so fast that this shouldn't cause too |
- // much heartbreak. |
- gfx::Rect tab_contents_bounds_; |
- |
- // A scoped container for notification registries. |
- NotificationRegistrar registrar_; |
- |
- DISALLOW_COPY_AND_ASSIGN(DownloadStartedAnimationGtk); |
-}; |
- |
-DownloadStartedAnimationGtk::DownloadStartedAnimationGtk( |
- TabContents* tab_contents) |
- : ui::LinearAnimation(kMoveTimeMs, kFrameRateHz, NULL), |
- tab_contents_(tab_contents) { |
- static GdkPixbuf* kDownloadImage = NULL; |
- if (!kDownloadImage) { |
- ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
- kDownloadImage = rb.GetPixbufNamed(IDR_DOWNLOAD_ANIMATION_BEGIN); |
- } |
- |
- width_ = gdk_pixbuf_get_width(kDownloadImage); |
- height_ = gdk_pixbuf_get_height(kDownloadImage); |
- |
- // If we're too small to show the download image, then don't bother - |
- // the shelf will be enough. |
- tab_contents_->GetContainerBounds(&tab_contents_bounds_); |
- if (tab_contents_bounds_.height() < height_) |
- return; |
- |
- registrar_.Add( |
- this, |
- NotificationType::TAB_CONTENTS_HIDDEN, |
- Source<TabContents>(tab_contents_)); |
- registrar_.Add( |
- this, |
- NotificationType::TAB_CONTENTS_DESTROYED, |
- Source<TabContents>(tab_contents_)); |
- |
- // TODO(estade): don't show up on the wrong virtual desktop. |
- |
- popup_ = gtk_window_new(GTK_WINDOW_POPUP); |
- GtkWidget* image = gtk_image_new_from_pixbuf(kDownloadImage); |
- gtk_container_add(GTK_CONTAINER(popup_), image); |
- |
- // Set the shape of the window to that of the arrow. Areas with |
- // opacity less than 0xff (i.e. <100% opacity) will be transparent. |
- GdkBitmap* mask = gdk_pixmap_new(NULL, width_, height_, 1); |
- gdk_pixbuf_render_threshold_alpha(kDownloadImage, mask, |
- 0, 0, |
- 0, 0, -1, -1, |
- 0xff); |
- gtk_widget_shape_combine_mask(popup_, mask, 0, 0); |
- g_object_unref(mask); |
- |
- Reposition(); |
- gtk_widget_show_all(popup_); |
- // Make sure our window has focus, is brought to the top, etc. |
- gtk_window_present(GTK_WINDOW(popup_)); |
- |
- Start(); |
-} |
- |
-DownloadStartedAnimationGtk::~DownloadStartedAnimationGtk() { |
-} |
- |
-void DownloadStartedAnimationGtk::Reposition() { |
- if (!tab_contents_) |
- return; |
- |
- // Align the image with the bottom left of the web contents (so that it |
- // points to the newly created download). |
- gtk_window_move(GTK_WINDOW(popup_), |
- tab_contents_bounds_.x(), |
- static_cast<int>(tab_contents_bounds_.bottom() - |
- height_ - height_ * (1 - GetCurrentValue()))); |
-} |
- |
-void DownloadStartedAnimationGtk::Close() { |
- if (!tab_contents_) |
- return; |
- |
- registrar_.Remove( |
- this, |
- NotificationType::TAB_CONTENTS_HIDDEN, |
- Source<TabContents>(tab_contents_)); |
- registrar_.Remove( |
- this, |
- NotificationType::TAB_CONTENTS_DESTROYED, |
- Source<TabContents>(tab_contents_)); |
- |
- tab_contents_ = NULL; |
- gtk_widget_destroy(popup_); |
- MessageLoop::current()->DeleteSoon(FROM_HERE, this); |
-} |
- |
-void DownloadStartedAnimationGtk::AnimateToState(double state) { |
- if (!tab_contents_) |
- return; |
- |
- if (state >= 1.0) { |
- Close(); |
- } else { |
- Reposition(); |
- |
- // Start at zero, peak halfway and end at zero. |
- double opacity = std::min(1.0 - pow(GetCurrentValue() - 0.5, 2) * 4.0, |
- static_cast<double>(1.0)); |
- |
- // This only works when there's a compositing manager running. Oh well. |
- gtk_window_set_opacity(GTK_WINDOW(popup_), opacity); |
- } |
-} |
- |
-void DownloadStartedAnimationGtk::Observe(NotificationType type, |
- const NotificationSource& source, |
- const NotificationDetails& details) { |
- Close(); |
-} |
- |
-} // namespace |
- |
-// static |
-void DownloadStartedAnimation::Show(TabContents* tab_contents) { |
- // The animation will delete itself. |
- new DownloadStartedAnimationGtk(tab_contents); |
-} |