summaryrefslogtreecommitdiffstats
path: root/ash/wm/shelf_layout_manager.cc
diff options
context:
space:
mode:
Diffstat (limited to 'ash/wm/shelf_layout_manager.cc')
-rw-r--r--ash/wm/shelf_layout_manager.cc191
1 files changed, 145 insertions, 46 deletions
diff --git a/ash/wm/shelf_layout_manager.cc b/ash/wm/shelf_layout_manager.cc
index 0d344fe..7083521 100644
--- a/ash/wm/shelf_layout_manager.cc
+++ b/ash/wm/shelf_layout_manager.cc
@@ -42,7 +42,7 @@ ui::Layer* GetLayer(views::Widget* widget) {
const int ShelfLayoutManager::kWorkspaceAreaBottomInset = 2;
// static
-const int ShelfLayoutManager::kAutoHideHeight = 2;
+const int ShelfLayoutManager::kAutoHideSize = 2;
// Notifies ShelfLayoutManager any time the mouse moves.
class ShelfLayoutManager::AutoHideEventFilter : public aura::EventFilter {
@@ -122,7 +122,7 @@ ShelfLayoutManager::ShelfLayoutManager(views::Widget* status)
: root_window_(Shell::GetInstance()->GetRootWindow()),
in_layout_(false),
auto_hide_behavior_(SHELF_AUTO_HIDE_BEHAVIOR_DEFAULT),
- shelf_height_(status->GetWindowScreenBounds().height()),
+ alignment_(SHELF_ALIGNMENT_BOTTOM),
launcher_(NULL),
status_(status),
workspace_manager_(NULL),
@@ -148,12 +148,12 @@ bool ShelfLayoutManager::IsVisible() const {
}
gfx::Rect ShelfLayoutManager::GetMaximizedWindowBounds(
- aura::Window* window) const {
+ aura::Window* window) {
// TODO: needs to be multi-mon aware.
gfx::Rect bounds(gfx::Screen::GetMonitorNearestWindow(window).bounds());
if (auto_hide_behavior_ == SHELF_AUTO_HIDE_BEHAVIOR_DEFAULT ||
auto_hide_behavior_ == SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS) {
- bounds.set_height(bounds.height() - kAutoHideHeight);
+ AdjustBoundsBasedOnAlignment(kAutoHideSize, &bounds);
return bounds;
}
// SHELF_AUTO_HIDE_BEHAVIOR_NEVER maximized windows don't get any taller.
@@ -161,13 +161,18 @@ gfx::Rect ShelfLayoutManager::GetMaximizedWindowBounds(
}
gfx::Rect ShelfLayoutManager::GetUnmaximizedWorkAreaBounds(
- aura::Window* window) const {
+ aura::Window* window) {
// TODO: needs to be multi-mon aware.
gfx::Rect bounds(gfx::Screen::GetMonitorNearestWindow(window).bounds());
- if (auto_hide_behavior_ == SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS)
- bounds.set_height(bounds.height() - kAutoHideHeight);
- else
- bounds.set_height(bounds.height() - shelf_height_);
+ int size;
+ if (auto_hide_behavior_ == SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS) {
+ size = kAutoHideSize;
+ } else {
+ int width, height;
+ GetShelfSize(&width, &height);
+ size = std::max(width, height);
+ }
+ AdjustBoundsBasedOnAlignment(size, &bounds);
return bounds;
}
@@ -176,12 +181,40 @@ void ShelfLayoutManager::SetLauncher(Launcher* launcher) {
return;
launcher_ = launcher;
- shelf_height_ =
- std::max(status_->GetWindowScreenBounds().height(),
- launcher_widget()->GetWindowScreenBounds().height());
LayoutShelf();
}
+void ShelfLayoutManager::SetAlignment(ShelfAlignment alignment) {
+ if (alignment_ == alignment)
+ return;
+
+ alignment_ = alignment;
+ if (launcher_)
+ launcher_->SetAlignment(alignment);
+ LayoutShelf();
+}
+
+gfx::Rect ShelfLayoutManager::GetIdealBounds() {
+ // TODO: this is wrong. Figure out what monitor shelf is on and everything
+ // should be based on it.
+ gfx::Rect bounds(
+ gfx::Screen::GetMonitorNearestWindow(status_->GetNativeView()).bounds());
+ int width = 0, height = 0;
+ GetShelfSize(&width, &height);
+ switch (alignment_) {
+ case SHELF_ALIGNMENT_BOTTOM:
+ return gfx::Rect(bounds.x(), bounds.bottom() - height,
+ bounds.width(), height);
+ case SHELF_ALIGNMENT_LEFT:
+ return gfx::Rect(bounds.x(), bounds.y(), width, bounds.height());
+ case SHELF_ALIGNMENT_RIGHT:
+ return gfx::Rect(bounds.right() - width, bounds.bottom() - height, width,
+ height);
+ }
+ NOTREACHED();
+ return gfx::Rect();
+}
+
void ShelfLayoutManager::LayoutShelf() {
AutoReset<bool> auto_reset_in_layout(&in_layout_, true);
StopAnimating();
@@ -191,8 +224,7 @@ void ShelfLayoutManager::LayoutShelf() {
GetLayer(launcher_widget())->SetOpacity(target_bounds.opacity);
launcher_widget()->SetBounds(target_bounds.launcher_bounds);
- launcher_->SetStatusWidth(
- target_bounds.status_bounds.width());
+ launcher_->SetStatusSize(target_bounds.status_bounds.size());
}
GetLayer(status_)->SetOpacity(target_bounds.opacity);
status_->SetBounds(target_bounds.status_bounds);
@@ -352,47 +384,96 @@ void ShelfLayoutManager::StopAnimating() {
GetLayer(status_)->GetAnimator()->StopAnimating();
}
+void ShelfLayoutManager::GetShelfSize(int* width, int* height) {
+ *width = *height = 0;
+ gfx::Rect status_bounds(status_->GetWindowScreenBounds());
+ gfx::Size launcher_size = launcher_ ?
+ launcher_widget()->GetContentsView()->GetPreferredSize() : gfx::Size();
+ if (alignment_ == SHELF_ALIGNMENT_BOTTOM) {
+ *height = std::max(launcher_size.height(), status_bounds.height());
+ } else {
+ // TODO: include status when supports alignment.
+ *width = launcher_size.width();
+ }
+}
+
+void ShelfLayoutManager::AdjustBoundsBasedOnAlignment(int inset,
+ gfx::Rect* bounds) const {
+ switch (alignment_) {
+ case SHELF_ALIGNMENT_BOTTOM:
+ bounds->Inset(gfx::Insets(0, 0, inset, 0));
+ break;
+ case SHELF_ALIGNMENT_LEFT:
+ bounds->Inset(gfx::Insets(0, inset, 0, 0));
+ break;
+ case SHELF_ALIGNMENT_RIGHT:
+ bounds->Inset(gfx::Insets(0, 0, 0, inset));
+ break;
+ }
+}
+
void ShelfLayoutManager::CalculateTargetBounds(
const State& state,
- TargetBounds* target_bounds) const {
+ TargetBounds* target_bounds) {
const gfx::Rect& available_bounds(
status_->GetNativeView()->GetRootWindow()->bounds());
- int y = available_bounds.bottom();
- int shelf_height = 0;
+ gfx::Rect status_bounds(status_->GetWindowScreenBounds());
+ gfx::Size launcher_size = launcher_ ?
+ launcher_widget()->GetContentsView()->GetPreferredSize() : gfx::Size();
+ int shelf_size = 0;
+ int shelf_width = 0, shelf_height = 0;
+ GetShelfSize(&shelf_width, &shelf_height);
if (state.visibility_state == VISIBLE ||
(state.visibility_state == AUTO_HIDE &&
- state.auto_hide_state == AUTO_HIDE_SHOWN))
- shelf_height = shelf_height_;
- else if (state.visibility_state == AUTO_HIDE &&
- state.auto_hide_state == AUTO_HIDE_HIDDEN)
- shelf_height = kAutoHideHeight;
- y -= shelf_height;
- gfx::Rect status_bounds(status_->GetWindowScreenBounds());
- // The status widget should extend to the bottom and right edges.
- target_bounds->status_bounds = gfx::Rect(
- base::i18n::IsRTL() ? available_bounds.x() :
- available_bounds.right() - status_bounds.width(),
- y + shelf_height_ - status_bounds.height(),
- status_bounds.width(), status_bounds.height());
- if (launcher_widget()) {
- gfx::Rect launcher_bounds(launcher_widget()->GetWindowScreenBounds());
- target_bounds->launcher_bounds = gfx::Rect(
- available_bounds.x(),
- y + (shelf_height_ - launcher_bounds.height()) / 2,
- available_bounds.width(),
- launcher_bounds.height());
+ state.auto_hide_state == AUTO_HIDE_SHOWN)) {
+ shelf_size = std::max(shelf_width, shelf_height);
+ } else if (state.visibility_state == AUTO_HIDE &&
+ state.auto_hide_state == AUTO_HIDE_HIDDEN) {
+ shelf_size = kAutoHideSize;
+ }
+ if (alignment_ == SHELF_ALIGNMENT_BOTTOM) {
+ int y = available_bounds.bottom();
+ y -= shelf_size;
+ // The status widget should extend to the bottom and right edges.
+ target_bounds->status_bounds = gfx::Rect(
+ base::i18n::IsRTL() ? available_bounds.x() :
+ available_bounds.right() - status_bounds.width(),
+ y + shelf_height - status_bounds.height(),
+ status_bounds.width(), status_bounds.height());
+ if (launcher_widget()) {
+ target_bounds->launcher_bounds = gfx::Rect(
+ available_bounds.x(),
+ y + (shelf_height - launcher_size.height()) / 2,
+ available_bounds.width(),
+ launcher_size.height());
+ }
+ target_bounds->work_area_insets.Set(
+ 0, 0, GetWorkAreaSize(state, shelf_height), 0);
+ } else {
+ int x = (alignment_ == SHELF_ALIGNMENT_LEFT) ?
+ available_bounds.x() + shelf_size - shelf_width :
+ available_bounds.right() - shelf_size;
+ target_bounds->status_bounds = gfx::Rect(
+ x, available_bounds.bottom() - status_bounds.height(),
+ shelf_width, status_bounds.height());
+ if (launcher_widget()) {
+ target_bounds->launcher_bounds = gfx::Rect(
+ x,
+ available_bounds.y(),
+ launcher_size.width(),
+ available_bounds.height());
+ }
+ if (alignment_ == SHELF_ALIGNMENT_LEFT) {
+ target_bounds->work_area_insets.Set(
+ 0, GetWorkAreaSize(state, shelf_width), 0, 0);
+ } else {
+ target_bounds->work_area_insets.Set(
+ 0, 0, 0, GetWorkAreaSize(state, shelf_width));
+ }
}
-
target_bounds->opacity =
(state.visibility_state == VISIBLE ||
state.visibility_state == AUTO_HIDE) ? 1.0f : 0.0f;
-
- int work_area_bottom = 0;
- if (state.visibility_state == VISIBLE)
- work_area_bottom = shelf_height_;
- else if (state.visibility_state == AUTO_HIDE)
- work_area_bottom = kAutoHideHeight;
- target_bounds->work_area_insets.Set(0, 0, work_area_bottom, 0);
}
void ShelfLayoutManager::UpdateShelfBackground(
@@ -451,7 +532,17 @@ void ShelfLayoutManager::UpdateHitTestBounds() {
if (state_.visibility_state == VISIBLE) {
// Let clicks at the very top of the launcher through so windows can be
// resized with the bottom-right corner and bottom edge.
- insets.Set(kWorkspaceAreaBottomInset, 0, 0, 0);
+ switch (alignment_) {
+ case SHELF_ALIGNMENT_BOTTOM:
+ insets.Set(kWorkspaceAreaBottomInset, 0, 0, 0);
+ break;
+ case SHELF_ALIGNMENT_LEFT:
+ insets.Set(0, 0, 0, kWorkspaceAreaBottomInset);
+ break;
+ case SHELF_ALIGNMENT_RIGHT:
+ insets.Set(0, kWorkspaceAreaBottomInset, 0, 0);
+ break;
+ }
}
if (launcher_widget() && launcher_widget()->GetNativeWindow())
launcher_widget()->GetNativeWindow()->set_hit_test_bounds_override_outer(
@@ -467,5 +558,13 @@ bool ShelfLayoutManager::IsShelfWindow(aura::Window* window) {
(status_ && status_->GetNativeWindow()->Contains(window));
}
+int ShelfLayoutManager::GetWorkAreaSize(const State& state, int size) const {
+ if (state.visibility_state == VISIBLE)
+ return size;
+ if (state.visibility_state == AUTO_HIDE)
+ return kAutoHideSize;
+ return 0;
+}
+
} // namespace internal
} // namespace ash