Commit 22f9d317 authored by sky@chromium.org's avatar sky@chromium.org

Now that the launcher is sized to the width of the root window we need

to tell it the size of the launcher so that it doesn't layout on top
of the status.

BUG=106432
TEST=covered by tests.
R=ben@chromium.org


Review URL: http://codereview.chromium.org/8953004

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@114658 0039d316-1c4b-4281-b951-d872f2087c98
parent 81086d41
......@@ -153,6 +153,7 @@
'drag_drop_controller_unittest.cc',
'image_grid_unittest.cc',
'launcher/launcher_model_unittest.cc',
'launcher/launcher_unittest.cc',
'launcher/view_model_unittest.cc',
'launcher/view_model_utils_unittest.cc',
'modal_container_layout_manager_unittest.cc',
......
......@@ -4,20 +4,95 @@
#include "ui/aura_shell/launcher/launcher.h"
#include "grit/ui_resources.h"
#include "ui/aura/window.h"
#include "ui/aura_shell/launcher/launcher_model.h"
#include "ui/aura_shell/launcher/launcher_view.h"
#include "ui/aura_shell/shell.h"
#include "ui/aura_shell/shell_delegate.h"
#include "ui/aura_shell/shell_window_ids.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/gfx/canvas.h"
#include "ui/gfx/compositor/layer.h"
#include "ui/gfx/image/image.h"
#include "ui/views/painter.h"
#include "ui/views/widget/widget.h"
namespace aura_shell {
namespace {
// Used to draw the background of the shelf.
class ShelfPainter : public views::Painter {
public:
ShelfPainter() {
ResourceBundle& rb = ResourceBundle::GetSharedInstance();
image_ = *rb.GetImageNamed(IDR_AURA_LAUNCHER_BACKGROUND).ToSkBitmap();
}
virtual void Paint(int w, int h, gfx::Canvas* canvas) OVERRIDE {
canvas->TileImageInt(image_, 0, 0, w, h);
}
private:
SkBitmap image_;
DISALLOW_COPY_AND_ASSIGN(ShelfPainter);
};
} // namespace
// The contents view of the Widget. This view contains LauncherView and
// sizes it to the width of the widget minus the size of the status area.
class Launcher::DelegateView : public views::WidgetDelegateView {
public:
explicit DelegateView();
virtual ~DelegateView();
void SetStatusWidth(int width);
int status_width() const { return status_width_; }
// views::View overrides
virtual gfx::Size GetPreferredSize() OVERRIDE;
virtual void Layout() OVERRIDE;
private:
int status_width_;
DISALLOW_COPY_AND_ASSIGN(DelegateView);
};
Launcher::DelegateView::DelegateView()
: status_width_(0) {
set_background(
views::Background::CreateBackgroundPainter(true, new ShelfPainter()));
}
Launcher::DelegateView::~DelegateView() {
}
void Launcher::DelegateView::SetStatusWidth(int width) {
if (status_width_ == width)
return;
status_width_ = width;
Layout();
}
gfx::Size Launcher::DelegateView::GetPreferredSize() {
return child_count() > 0 ? child_at(0)->GetPreferredSize() : gfx::Size();
}
void Launcher::DelegateView::Layout() {
if (child_count() == 0)
return;
child_at(0)->SetBounds(0, 0, std::max(0, width() - status_width_), height());
}
Launcher::Launcher(aura::Window* window_container)
: widget_(NULL),
window_container_(window_container) {
window_container_(window_container),
delegate_view_(NULL) {
window_container->AddObserver(this);
model_.reset(new LauncherModel);
......@@ -31,11 +106,13 @@ Launcher::Launcher(aura::Window* window_container)
internal::LauncherView* launcher_view =
new internal::LauncherView(model_.get());
launcher_view->Init();
params.delegate = launcher_view;
delegate_view_ = new DelegateView;
delegate_view_->AddChildView(launcher_view);
params.delegate = delegate_view_;
widget_->Init(params);
gfx::Size pref = static_cast<views::View*>(launcher_view)->GetPreferredSize();
widget_->SetBounds(gfx::Rect(0, 0, pref.width(), pref.height()));
widget_->SetContentsView(launcher_view);
widget_->SetContentsView(delegate_view_);
widget_->Show();
widget_->GetNativeView()->SetName("LauncherView");
}
......@@ -49,6 +126,14 @@ Launcher::~Launcher() {
}
}
void Launcher::SetStatusWidth(int width) {
delegate_view_->SetStatusWidth(width);
}
int Launcher::GetStatusWidth() {
return delegate_view_->status_width();
}
void Launcher::MaybeAdd(aura::Window* window) {
if (known_windows_[window] == true)
return; // We already tried to add this window.
......
......@@ -30,10 +30,16 @@ class AURA_SHELL_EXPORT Launcher : public aura::WindowObserver {
explicit Launcher(aura::Window* window_container);
~Launcher();
// Sets the width of the status area.
void SetStatusWidth(int width);
int GetStatusWidth();
LauncherModel* model() { return model_.get(); }
views::Widget* widget() { return widget_; }
private:
class DelegateView;
typedef std::map<aura::Window*, bool> WindowMap;
// If necessary asks the delegate if an entry should be created in the
......@@ -57,6 +63,9 @@ class AURA_SHELL_EXPORT Launcher : public aura::WindowObserver {
// the delegate if the window should added to the launcher.
WindowMap known_windows_;
// Contents view of the widget. Houses the LauncherView.
DelegateView* delegate_view_;
DISALLOW_COPY_AND_ASSIGN(Launcher);
};
......
// Copyright (c) 2011 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 "ui/aura_shell/launcher/launcher.h"
#include "ui/aura_shell/shell.h"
#include "ui/aura_shell/test/aura_shell_test_base.h"
#include "ui/views/view.h"
#include "ui/views/widget/widget.h"
typedef aura_shell::test::AuraShellTestBase LauncherTest;
namespace aura_shell {
// Makes sure invoking SetStatusWidth on the launcher changes the size of the
// LauncherView.
TEST_F(LauncherTest, SetStatusWidth) {
Launcher* launcher = Shell::GetInstance()->launcher();
ASSERT_TRUE(launcher);
views::View* launcher_view = launcher->widget()->GetContentsView();
ASSERT_EQ(1, launcher_view->child_count());
launcher_view = launcher_view->child_at(0);
int total_width = launcher->widget()->GetWindowScreenBounds().width();
ASSERT_GT(total_width, 0);
launcher->SetStatusWidth(total_width / 2);
EXPECT_EQ(total_width - total_width / 2, launcher_view->width());
}
} // namespace aura_shell
......@@ -19,14 +19,12 @@
#include "ui/base/animation/throb_animation.h"
#include "ui/base/models/simple_menu_model.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/gfx/canvas.h"
#include "ui/gfx/compositor/layer.h"
#include "ui/gfx/image/image.h"
#include "ui/views/animation/bounds_animator.h"
#include "ui/views/controls/button/image_button.h"
#include "ui/views/controls/menu/menu_model_adapter.h"
#include "ui/views/controls/menu/menu_runner.h"
#include "ui/views/painter.h"
#include "ui/views/widget/widget.h"
using ui::Animation;
......@@ -128,25 +126,6 @@ class FadeInAnimationDelegate :
DISALLOW_COPY_AND_ASSIGN(FadeInAnimationDelegate);
};
// Used to draw the background of the shelf.
class ShelfPainter : public views::Painter {
public:
ShelfPainter() {
ResourceBundle& rb = ResourceBundle::GetSharedInstance();
image_ = *rb.GetImageNamed(IDR_AURA_LAUNCHER_BACKGROUND).ToSkBitmap();
}
virtual void Paint(int w, int h, gfx::Canvas* canvas) OVERRIDE {
canvas->TileImageInt(image_, 0, 0, w, h);
}
private:
SkBitmap image_;
DISALLOW_COPY_AND_ASSIGN(ShelfPainter);
};
} // namespace
// AnimationDelegate used when inserting a new item. This steadily decreased the
......@@ -227,9 +206,6 @@ void LauncherView::Init() {
ResourceBundle& rb = ResourceBundle::GetSharedInstance();
model_->AddObserver(this);
set_background(
views::Background::CreateBackgroundPainter(true, new ShelfPainter()));
new_browser_button_ = new views::ImageButton(this);
ShellDelegate* delegate = Shell::GetInstance()->delegate();
int new_browser_button_image_id = delegate ?
......
......@@ -7,6 +7,8 @@
#include "base/auto_reset.h"
#include "ui/aura/root_window.h"
#include "ui/aura/screen_aura.h"
#include "ui/aura_shell/launcher/launcher.h"
#include "ui/aura_shell/shell.h"
#include "ui/gfx/compositor/layer.h"
#include "ui/gfx/compositor/layer_animator.h"
#include "ui/views/widget/widget.h"
......@@ -54,6 +56,8 @@ void ShelfLayoutManager::LayoutShelf() {
GetLayer(status_)->SetOpacity(target_opacity);
launcher_->SetBounds(target_bounds.launcher_bounds);
status_->SetBounds(target_bounds.status_bounds);
Shell::GetInstance()->launcher()->SetStatusWidth(
target_bounds.status_bounds.width());
aura::RootWindow::GetInstance()->screen()->set_work_area_insets(
target_bounds.work_area_insets);
}
......
......@@ -21,10 +21,12 @@ class Widget;
namespace aura_shell {
namespace internal {
// ShelfLayoutManager is a layout manager responsible for the launcher.
// Also supports showing and hiding the launcher/status area
// as well as positioning them.
// Exported for unit tests.
// ShelfLayoutManager is the layout manager responsible for the launcher and
// status widgets. The launcher is given the total available width and told the
// width of the status area. This allows the launcher to draw the background and
// layout to the status area.
// To respond to bounds changes in the status area StatusAreaLayoutManager works
// closely with ShelfLayoutManager.
class AURA_SHELL_EXPORT ShelfLayoutManager : public aura::LayoutManager,
public ui::LayerAnimationObserver {
public:
......
......@@ -7,6 +7,7 @@
#include "ui/aura/root_window.h"
#include "ui/aura/screen_aura.h"
#include "ui/aura/window.h"
#include "ui/aura_shell/launcher/launcher.h"
#include "ui/aura_shell/shell.h"
#include "ui/aura_shell/shell_window_ids.h"
#include "ui/aura_shell/test/aura_shell_test_base.h"
......@@ -104,5 +105,30 @@ TEST_F(ShelfLayoutManagerTest, LayoutShelfWhileAnimating) {
gfx::Screen::GetPrimaryMonitorBounds().bottom());
}
// Makes sure the launcher is initially sized correctly.
TEST_F(ShelfLayoutManagerTest, LauncherInitiallySized) {
Launcher* launcher = Shell::GetInstance()->launcher();
ASSERT_TRUE(launcher);
ShelfLayoutManager* shelf_layout_manager = GetShelfLayoutManager();
ASSERT_TRUE(shelf_layout_manager);
ASSERT_TRUE(shelf_layout_manager->status());
int status_width =
shelf_layout_manager->status()->GetWindowScreenBounds().width();
// Test only makes sense if the status is > 0, which is better be.
EXPECT_GT(status_width, 0);
EXPECT_EQ(status_width, launcher->GetStatusWidth());
}
// Makes sure the launcher is sized when the status area changes size.
TEST_F(ShelfLayoutManagerTest, LauncherUpdatedWhenStatusAreaChangesSize) {
Launcher* launcher = Shell::GetInstance()->launcher();
ASSERT_TRUE(launcher);
ShelfLayoutManager* shelf_layout_manager = GetShelfLayoutManager();
ASSERT_TRUE(shelf_layout_manager);
ASSERT_TRUE(shelf_layout_manager->status());
shelf_layout_manager->status()->SetBounds(gfx::Rect(0, 0, 200, 200));
EXPECT_EQ(200, launcher->GetStatusWidth());
}
} // namespace internal
} // namespace aura_shell
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment