Index: ash/wm/panel_layout_manager.cc |
diff --git a/ash/wm/panel_layout_manager.cc b/ash/wm/panel_layout_manager.cc |
index 3f95a19a05534e0238e4480f8659e0385492104e..ab3f8ee89260da3d99c1167fe052ce0d7715e325 100644 |
--- a/ash/wm/panel_layout_manager.cc |
+++ b/ash/wm/panel_layout_manager.cc |
@@ -11,6 +11,8 @@ |
#include "ash/shell.h" |
#include "ash/wm/frame_painter.h" |
#include "ash/wm/property_util.h" |
+#include "ash/wm/window_animations.h" |
+#include "ash/wm/window_util.h" |
#include "base/auto_reset.h" |
#include "base/bind.h" |
#include "base/bind_helpers.h" |
@@ -19,6 +21,7 @@ |
#include "third_party/skia/include/core/SkPath.h" |
#include "ui/aura/client/activation_client.h" |
#include "ui/aura/client/aura_constants.h" |
+#include "ui/aura/focus_manager.h" |
#include "ui/aura/root_window.h" |
#include "ui/aura/window.h" |
#include "ui/gfx/canvas.h" |
@@ -34,8 +37,6 @@ const int kPanelMarginEdge = 4; |
const int kPanelMarginMiddle = 8; |
const int kPanelIdealSpacing = 4; |
-const int kMinimizedHeight = 24; |
- |
const float kMaxHeightFactor = .80f; |
const float kMaxWidthFactor = .50f; |
@@ -159,6 +160,7 @@ void PanelLayoutManager::StartDragging(aura::Window* panel) { |
DCHECK(!dragged_panel_); |
DCHECK(panel->parent() == panel_container_); |
dragged_panel_ = panel; |
+ Relayout(); |
} |
void PanelLayoutManager::FinishDragging() { |
@@ -176,28 +178,10 @@ void PanelLayoutManager::ToggleMinimize(aura::Window* panel) { |
DCHECK(panel->parent() == panel_container_); |
if (panel->GetProperty(aura::client::kShowStateKey) == |
ui::SHOW_STATE_MINIMIZED) { |
- const gfx::Rect& old_bounds = panel->bounds(); |
panel->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL); |
- |
- gfx::Rect new_bounds(old_bounds); |
- const gfx::Rect* restore_bounds = GetRestoreBoundsInScreen(panel); |
- if (restore_bounds) { |
- new_bounds.set_height(restore_bounds->height()); |
- new_bounds.set_y(old_bounds.bottom() - restore_bounds->height()); |
- SetChildBounds(panel, new_bounds); |
- ClearRestoreBounds(panel); |
- } |
} else { |
- const gfx::Rect& old_bounds = panel->bounds(); |
panel->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MINIMIZED); |
- SetRestoreBoundsInParent(panel, old_bounds); |
- SetChildBounds(panel, |
- gfx::Rect(old_bounds.x(), |
- old_bounds.bottom() - kMinimizedHeight, |
- old_bounds.width(), |
- kMinimizedHeight)); |
} |
- Relayout(); |
} |
//////////////////////////////////////////////////////////////////////////////// |
@@ -210,6 +194,7 @@ void PanelLayoutManager::OnWindowAddedToLayout(aura::Window* child) { |
if (child == callout_widget_->GetNativeWindow()) |
return; |
panel_windows_.push_back(child); |
+ child->AddObserver(this); |
Relayout(); |
} |
@@ -218,6 +203,7 @@ void PanelLayoutManager::OnWillRemoveWindowFromLayout(aura::Window* child) { |
std::find(panel_windows_.begin(), panel_windows_.end(), child); |
if (found != panel_windows_.end()) |
panel_windows_.erase(found); |
+ child->RemoveObserver(this); |
if (dragged_panel_ == child) |
dragged_panel_ = NULL; |
@@ -279,6 +265,22 @@ void PanelLayoutManager::OnLauncherIconPositionsChanged() { |
Relayout(); |
} |
+///////////////////////////////////////////////////////////////////////////// |
+// PanelLayoutManager, WindowObserver implementation: |
+ |
+void PanelLayoutManager::OnWindowPropertyChanged(aura::Window* window, |
+ const void* key, |
+ intptr_t old) { |
+ if (key != aura::client::kShowStateKey) |
+ return; |
+ ui::WindowShowState new_state = |
+ window->GetProperty(aura::client::kShowStateKey); |
+ if (new_state == ui::SHOW_STATE_MINIMIZED) |
+ MinimizePanel(window); |
+ else |
+ RestorePanel(window); |
+} |
+ |
//////////////////////////////////////////////////////////////////////////////// |
// PanelLayoutManager, aura::client::ActivationChangeObserver implementation: |
void PanelLayoutManager::OnWindowActivated(aura::Window* active, |
@@ -291,9 +293,23 @@ void PanelLayoutManager::OnWindowActivated(aura::Window* active, |
} |
} |
- |
//////////////////////////////////////////////////////////////////////////////// |
// PanelLayoutManager private implementation: |
+ |
+void PanelLayoutManager::MinimizePanel(aura::Window* panel) { |
+ views::corewm::SetWindowVisibilityAnimationType( |
+ panel, WINDOW_VISIBILITY_ANIMATION_TYPE_MINIMIZE); |
+ panel->Hide(); |
+ if (wm::IsActiveWindow(panel)) |
+ wm::DeactivateWindow(panel); |
+ Relayout(); |
+} |
+ |
+void PanelLayoutManager::RestorePanel(aura::Window* panel) { |
+ panel->Show(); |
+ Relayout(); |
+} |
+ |
void PanelLayoutManager::Relayout() { |
if (!launcher_ || !launcher_->widget()) |
return; |
@@ -324,7 +340,9 @@ void PanelLayoutManager::Relayout() { |
if (icon_bounds.IsEmpty()) |
continue; |
- if (panel->HasFocus()) { |
+ if (panel->HasFocus() || |
+ panel->Contains( |
+ aura::client::GetFocusClient(panel)->GetFocusedWindow())) { |
DCHECK(!active_panel); |
active_panel = panel; |
} |