Index: ash/wm/shelf_layout_manager.h |
diff --git a/ash/wm/shelf_layout_manager.h b/ash/wm/shelf_layout_manager.h |
index b0a9b3cbef077dd39f7e19fc5e67fd73b23ed71e..0a4e1e5dd53eaa69574a5c1711ba21442c0da977 100644 |
--- a/ash/wm/shelf_layout_manager.h |
+++ b/ash/wm/shelf_layout_manager.h |
@@ -6,11 +6,11 @@ |
#define ASH_WM_SHELF_LAYOUT_MANAGER_H_ |
#pragma once |
+#include "ash/ash_export.h" |
+#include "ash/launcher/launcher.h" |
#include "base/basictypes.h" |
#include "base/compiler_specific.h" |
#include "ui/aura/layout_manager.h" |
-#include "ash/ash_export.h" |
-#include "ui/gfx/compositor/layer_animation_observer.h" |
#include "ui/gfx/insets.h" |
#include "ui/gfx/rect.h" |
@@ -31,9 +31,24 @@ namespace internal { |
// layout to the status area. |
// To respond to bounds changes in the status area StatusAreaLayoutManager works |
// closely with ShelfLayoutManager. |
-class ASH_EXPORT ShelfLayoutManager : public aura::LayoutManager, |
- public ui::ImplicitAnimationObserver { |
+class ASH_EXPORT ShelfLayoutManager : public aura::LayoutManager { |
public: |
+ enum VisibilityState { |
+ // Completely visible. |
+ VISIBLE, |
+ |
+ // A couple of pixels are reserved at the bottom for the shelf. |
+ AUTO_HIDE, |
+ |
+ // Nothing is shown. Used for fullscreen windows. |
+ HIDDEN, |
+ }; |
+ |
+ enum AutoHideState { |
+ AUTO_HIDE_SHOWN, |
+ AUTO_HIDE_HIDDEN, |
+ }; |
+ |
// We reserve a small area at the bottom of the workspace area to ensure that |
// the bottom-of-window resize handle can be hit. |
// TODO(jamescook): Some day we may want the workspace area to be an even |
@@ -42,24 +57,38 @@ class ASH_EXPORT ShelfLayoutManager : public aura::LayoutManager, |
// the invisible parts of the launcher. |
static const int kWorkspaceAreaBottomInset; |
- ShelfLayoutManager(views::Widget* launcher, views::Widget* status); |
+ explicit ShelfLayoutManager(views::Widget* status); |
virtual ~ShelfLayoutManager(); |
+ // Returns the bounds the specified window should be when maximized. |
+ gfx::Rect GetMaximizedWindowBounds(aura::Window* window) const; |
+ gfx::Rect GetUnmaximizedWorkAreaBounds(aura::Window* window) const; |
+ |
bool in_layout() const { return in_layout_; } |
// Stops any animations and sets the bounds of the launcher and status |
// widgets. |
void LayoutShelf(); |
- // Sets the visibility of the shelf to |visible|. |
- void SetVisible(bool visible); |
- bool visible() const { return visible_; } |
- |
- views::Widget* launcher() { return launcher_; } |
+ // Sets the visibility of the shelf to |state|. |
+ void SetState(VisibilityState visibility_state, |
+ AutoHideState auto_hide_state); |
+ VisibilityState visibility_state() const { return state_.visibility_state; } |
+ AutoHideState auto_hide_state() const { return state_.auto_hide_state; } |
+ |
+ // Sets whether any windows overlap the shelf. If a window overlaps the shelf |
+ // the shelf renders slightly differently. |
+ void SetWindowOverlapsShelf(bool value); |
+ |
+ void SetLauncher(Launcher* launcher); |
+ views::Widget* launcher() { return launcher_ ? launcher_->widget() : NULL; } |
+ const views::Widget* launcher() const { |
+ return launcher_ ? launcher_->widget() : NULL; |
+ } |
views::Widget* status() { return status_; } |
// See description above field. |
- int max_height() const { return max_height_; } |
+ int shelf_height() const { return shelf_height_; } |
// Overridden from aura::LayoutManager: |
virtual void OnWindowResized() OVERRIDE; |
@@ -72,35 +101,56 @@ class ASH_EXPORT ShelfLayoutManager : public aura::LayoutManager, |
private: |
struct TargetBounds { |
+ TargetBounds() : opacity(0.0f) {} |
+ |
+ float opacity; |
gfx::Rect launcher_bounds; |
gfx::Rect status_bounds; |
gfx::Insets work_area_insets; |
}; |
+ struct State { |
+ State() : visibility_state(VISIBLE), auto_hide_state(AUTO_HIDE_HIDDEN) {} |
+ |
+ // Returns true if the two states are considered equal. As |
+ // |auto_hide_state| only matters if |visibility_state| is |AUTO_HIDE|, |
+ // Equals() ignores the |auto_hide_state| as appropriate. |
+ bool Equals(const State& other) const { |
+ return other.visibility_state == visibility_state && |
+ (visibility_state != AUTO_HIDE || |
+ other.auto_hide_state == auto_hide_state); |
+ } |
+ |
+ VisibilityState visibility_state; |
+ AutoHideState auto_hide_state; |
+ }; |
+ |
// Stops any animations. |
void StopAnimating(); |
// Calculates the target bounds assuming visibility of |visible|. |
- void CalculateTargetBounds(bool visible, |
- TargetBounds* target_bounds); |
+ void CalculateTargetBounds(const State& state, |
+ TargetBounds* target_bounds) const; |
- // Implementation of ImplicitAnimationObserver |
- virtual void OnImplicitAnimationsCompleted() OVERRIDE; |
+ // Returns whether the shelf should draw a background. |
+ bool GetShelfRendersBackground() const; |
// True when inside LayoutShelf method. Used to prevent calling LayoutShelf |
// again from SetChildBounds(). |
bool in_layout_; |
- // Current visibility. When the visibility changes this field is reset once |
- // the animation completes. |
- bool visible_; |
+ // Current state. |
+ State state_; |
- // Max height needed. |
- int max_height_; |
+ // Height of the shelf (max of launcher and status). |
+ int shelf_height_; |
- views::Widget* launcher_; |
+ Launcher* launcher_; |
views::Widget* status_; |
+ // Do any windows overlap the shelf? This is maintained by WorkspaceManager. |
+ bool window_overlaps_shelf_; |
+ |
aura::RootWindow* root_window_; |
DISALLOW_COPY_AND_ASSIGN(ShelfLayoutManager); |