Home | History | Annotate | Download | only in views
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_UI_VIEWS_FULLSCREEN_EXIT_BUBBLE_H__
      6 #define CHROME_BROWSER_UI_VIEWS_FULLSCREEN_EXIT_BUBBLE_H__
      7 #pragma once
      8 
      9 #include "base/memory/scoped_ptr.h"
     10 #include "base/timer.h"
     11 #include "chrome/browser/command_updater.h"
     12 #include "ui/base/animation/animation_delegate.h"
     13 #include "views/controls/link.h"
     14 
     15 namespace ui {
     16 class SlideAnimation;
     17 }
     18 
     19 #if defined(OS_LINUX)
     20 namespace views {
     21 class WidgetGtk;
     22 }
     23 #endif
     24 
     25 // FullscreenExitBubble is responsible for showing a bubble atop the screen in
     26 // fullscreen mode, telling users how to exit and providing a click target.
     27 // The bubble auto-hides, and re-shows when the user moves to the screen top.
     28 
     29 class FullscreenExitBubble : public views::LinkController,
     30                              public ui::AnimationDelegate {
     31  public:
     32   explicit FullscreenExitBubble(
     33       views::Widget* frame,
     34       CommandUpdater::CommandUpdaterDelegate* delegate);
     35   virtual ~FullscreenExitBubble();
     36 
     37  private:
     38   class FullscreenExitView;
     39 
     40   static const double kOpacity;          // Opacity of the bubble, 0.0 - 1.0
     41   static const int kInitialDelayMs;      // Initial time bubble remains onscreen
     42   static const int kIdleTimeMs;          // Time before mouse idle triggers hide
     43   static const int kPositionCheckHz;     // How fast to check the mouse position
     44   static const int kSlideInRegionHeightPx;
     45                                          // Height of region triggering slide-in
     46   static const int kSlideInDurationMs;   // Duration of slide-in animation
     47   static const int kSlideOutDurationMs;  // Duration of slide-out animation
     48 
     49   // views::LinkController
     50   virtual void LinkActivated(views::Link* source, int event_flags);
     51 
     52   // ui::AnimationDelegate
     53   virtual void AnimationProgressed(const ui::Animation* animation);
     54   virtual void AnimationEnded(const ui::Animation* animation);
     55 
     56   // Called repeatedly to get the current mouse position and animate the bubble
     57   // on or off the screen as appropriate.
     58   void CheckMousePosition();
     59 
     60   // Hides the bubble.  This is a separate function so it can be called by a
     61   // timer.
     62   void Hide();
     63 
     64   // Returns the current desirable rect for the popup window.  If
     65   // |ignore_animation_state| is true this returns the rect assuming the popup
     66   // is fully onscreen.
     67   gfx::Rect GetPopupRect(bool ignore_animation_state) const;
     68 
     69   // The root view containing us.
     70   views::View* root_view_;
     71 
     72   // Someone who can toggle fullscreen mode on and off when the user requests
     73   // it.
     74   CommandUpdater::CommandUpdaterDelegate* delegate_;
     75 
     76   views::Widget* popup_;
     77 
     78   // The contents of the popup.
     79   FullscreenExitView* view_;
     80 
     81   // Animation controlling sliding into/out of the top of the screen.
     82   scoped_ptr<ui::SlideAnimation> size_animation_;
     83 
     84   // Timer to delay before allowing the bubble to hide after it's initially
     85   // shown.
     86   base::OneShotTimer<FullscreenExitBubble> initial_delay_;
     87 
     88   // Timer to see how long the mouse has been idle.
     89   base::OneShotTimer<FullscreenExitBubble> idle_timeout_;
     90 
     91   // Timer to poll the current mouse position.  We can't just listen for mouse
     92   // events without putting a non-empty HWND onscreen (or hooking Windows, which
     93   // has other problems), so instead we run a low-frequency poller to see if the
     94   // user has moved in or out of our show/hide regions.
     95   base::RepeatingTimer<FullscreenExitBubble> mouse_position_checker_;
     96 
     97   // The most recently seen mouse position, in screen coordinates.  Used to see
     98   // if the mouse has moved since our last check.
     99   gfx::Point last_mouse_pos_;
    100 
    101   DISALLOW_COPY_AND_ASSIGN(FullscreenExitBubble);
    102 };
    103 
    104 #endif  // CHROME_BROWSER_UI_VIEWS_FULLSCREEN_EXIT_BUBBLE_H__
    105