diff options
author | varkha@chromium.org <varkha@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-08-08 02:16:29 +0000 |
---|---|---|
committer | varkha@chromium.org <varkha@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-08-08 02:16:29 +0000 |
commit | 7d6c372945b66064e03c794cfa3d22599da25c7b (patch) | |
tree | 00d5c81397823d515b4204f3c7d91d526a741b15 | |
parent | acea86fc381183c470e472f0b2791f27aa79bb99 (diff) | |
download | chromium_src-7d6c372945b66064e03c794cfa3d22599da25c7b.zip chromium_src-7d6c372945b66064e03c794cfa3d22599da25c7b.tar.gz chromium_src-7d6c372945b66064e03c794cfa3d22599da25c7b.tar.bz2 |
Docked area should have a drawn background visually separating it from the workspace
BUG=267582
Review URL: https://chromiumcodereview.appspot.com/22483003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@216354 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | ash/wm/dock/docked_window_layout_manager.cc | 52 | ||||
-rw-r--r-- | ash/wm/dock/docked_window_layout_manager.h | 8 |
2 files changed, 58 insertions, 2 deletions
diff --git a/ash/wm/dock/docked_window_layout_manager.cc b/ash/wm/dock/docked_window_layout_manager.cc index d9d1c07..d73a0cc 100644 --- a/ash/wm/dock/docked_window_layout_manager.cc +++ b/ash/wm/dock/docked_window_layout_manager.cc @@ -15,6 +15,7 @@ #include "ash/wm/window_properties.h" #include "ash/wm/window_util.h" #include "base/auto_reset.h" +#include "third_party/skia/include/core/SkColor.h" #include "ui/aura/client/activation_client.h" #include "ui/aura/client/aura_constants.h" #include "ui/aura/focus_manager.h" @@ -33,6 +34,39 @@ const int kWindowIdealSpacing = 4; namespace { +const SkColor kDockBackgroundColor = SkColorSetARGB(0xff, 0x10, 0x10, 0x10); +const float kDockBackgroundOpacity = 0.5f; + +class DockedBackgroundWidget : public views::Widget { + public: + explicit DockedBackgroundWidget(aura::Window* container) { + InitWidget(container); + } + + private: + void InitWidget(aura::Window* parent) { + views::Widget::InitParams params; + params.type = views::Widget::InitParams::TYPE_POPUP; + params.opacity = views::Widget::InitParams::OPAQUE_WINDOW; + params.can_activate = false; + params.keep_on_top = false; + params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; + params.parent = parent; + params.accept_events = false; + set_focus_on_creation(false); + Init(params); + DCHECK_EQ(GetNativeView()->GetRootWindow(), parent->GetRootWindow()); + views::View* content_view = new views::View; + content_view->set_background( + views::Background::CreateSolidBackground(kDockBackgroundColor)); + SetContentsView(content_view); + GetNativeWindow()->layer()->SetOpacity(kDockBackgroundOpacity); + Hide(); + } + + DISALLOW_COPY_AND_ASSIGN(DockedBackgroundWidget); +}; + DockedWindowLayoutManager* GetDockLayoutManager(aura::Window* window, const gfx::Point& location) { gfx::Rect near_location(location, gfx::Size()); @@ -69,7 +103,8 @@ DockedWindowLayoutManager::DockedWindowLayoutManager( shelf_hidden_(false), docked_width_(0), alignment_(DOCKED_ALIGNMENT_NONE), - last_active_window_(NULL) { + last_active_window_(NULL), + background_widget_(new DockedBackgroundWidget(dock_container_)) { DCHECK(dock_container); aura::client::GetActivationClient(Shell::GetPrimaryRootWindow())-> AddObserver(this); @@ -546,6 +581,17 @@ void DockedWindowLayoutManager::UpdateDockBounds() { DockedWindowLayoutManagerObserver, observer_list_, OnDockBoundsChanging(bounds)); + + // Show or hide background for docked area. + gfx::Rect background_bounds(docked_bounds_); + const gfx::Rect work_area = + Shell::GetScreen()->GetDisplayNearestWindow(dock_container_).work_area(); + background_bounds.set_height(work_area.height()); + background_widget_->SetBounds(background_bounds); + if (docked_width_ > 0) + background_widget_->Show(); + else + background_widget_->Hide(); } void DockedWindowLayoutManager::UpdateStacking(aura::Window* active_window) { @@ -571,13 +617,15 @@ void DockedWindowLayoutManager::UpdateStacking(aura::Window* active_window) { for (aura::Window::Windows::const_iterator it = dock_container_->children().begin(); it != dock_container_->children().end(); ++it) { + if (!IsUsedByLayout(*it)) + continue; gfx::Rect bounds = (*it)->bounds(); window_ordering.insert(std::make_pair(bounds.y() + bounds.height() / 2, *it)); } int active_center_y = active_window->bounds().CenterPoint().y(); - aura::Window* previous_window = NULL; + aura::Window* previous_window = background_widget_->GetNativeWindow(); for (std::map<int, aura::Window*>::const_iterator it = window_ordering.begin(); it != window_ordering.end() && it->first < active_center_y; ++it) { diff --git a/ash/wm/dock/docked_window_layout_manager.h b/ash/wm/dock/docked_window_layout_manager.h index 28c81fcc..aa02b34 100644 --- a/ash/wm/dock/docked_window_layout_manager.h +++ b/ash/wm/dock/docked_window_layout_manager.h @@ -13,6 +13,7 @@ #include "base/basictypes.h" #include "base/compiler_specific.h" #include "base/gtest_prod_util.h" +#include "base/memory/scoped_ptr.h" #include "base/observer_list.h" #include "ui/aura/client/activation_change_observer.h" #include "ui/aura/layout_manager.h" @@ -28,6 +29,10 @@ namespace gfx { class Point; } +namespace views { +class Widget; +} + namespace ash { class Launcher; @@ -182,6 +187,9 @@ class ASH_EXPORT DockedWindowLayoutManager // are currently focused. aura::Window* last_active_window_; + // Widget used to paint a background for the docked area. + scoped_ptr<views::Widget> background_widget_; + // Observers of dock bounds changes. ObserverList<DockedWindowLayoutManagerObserver> observer_list_; |