Commit 384cc65f authored by sadrul@chromium.org's avatar sadrul@chromium.org

ash uber tray: Add a tray item for the user.

The item includes the logged in users name/email, and buttons to
shut-down/signout/lock.

BUG=110130
TEST=none

Review URL: https://chromiumcodereview.appspot.com/9561003

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@124349 0039d316-1c4b-4281-b951-d872f2087c98
parent 7c52775c
...@@ -123,6 +123,8 @@ ...@@ -123,6 +123,8 @@
'system/tray/system_tray_delegate.h', 'system/tray/system_tray_delegate.h',
'system/tray/system_tray_item.cc', 'system/tray/system_tray_item.cc',
'system/tray/system_tray_item.h', 'system/tray/system_tray_item.h',
'system/tray_user.cc',
'system/tray_user.h',
'tooltips/tooltip_controller.cc', 'tooltips/tooltip_controller.cc',
'tooltips/tooltip_controller.h', 'tooltips/tooltip_controller.h',
'volume_control_delegate.h', 'volume_control_delegate.h',
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include "ash/system/settings/tray_settings.h" #include "ash/system/settings/tray_settings.h"
#include "ash/system/tray/system_tray_delegate.h" #include "ash/system/tray/system_tray_delegate.h"
#include "ash/system/tray/system_tray.h" #include "ash/system/tray/system_tray.h"
#include "ash/system/tray_user.h"
#include "ash/tooltips/tooltip_controller.h" #include "ash/tooltips/tooltip_controller.h"
#include "ash/wm/activation_controller.h" #include "ash/wm/activation_controller.h"
#include "ash/wm/base_layout_manager.h" #include "ash/wm/base_layout_manager.h"
...@@ -50,6 +51,7 @@ ...@@ -50,6 +51,7 @@
#include "ash/wm/workspace/workspace_manager.h" #include "ash/wm/workspace/workspace_manager.h"
#include "base/bind.h" #include "base/bind.h"
#include "base/command_line.h" #include "base/command_line.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/aura/client/aura_constants.h" #include "ui/aura/client/aura_constants.h"
#include "ui/aura/layout_manager.h" #include "ui/aura/layout_manager.h"
#include "ui/aura/root_window.h" #include "ui/aura/root_window.h"
...@@ -189,6 +191,18 @@ class DummySystemTrayDelegate : public SystemTrayDelegate { ...@@ -189,6 +191,18 @@ class DummySystemTrayDelegate : public SystemTrayDelegate {
private: private:
// SystemTrayDelegate implementation. // SystemTrayDelegate implementation.
virtual const std::string GetUserName() OVERRIDE {
return "chronos";
}
virtual const std::string GetUserEmail() OVERRIDE {
return "chr@nos";
}
virtual const SkBitmap& GetUserImage() OVERRIDE {
return null_image_;
}
virtual void ShowSettings() OVERRIDE { virtual void ShowSettings() OVERRIDE {
} }
...@@ -211,8 +225,13 @@ class DummySystemTrayDelegate : public SystemTrayDelegate { ...@@ -211,8 +225,13 @@ class DummySystemTrayDelegate : public SystemTrayDelegate {
volume_ = volume; volume_ = volume;
} }
virtual void ShutDown() OVERRIDE {}
virtual void SignOut() OVERRIDE {}
virtual void LockScreen() OVERRIDE {}
bool muted_; bool muted_;
float volume_; float volume_;
SkBitmap null_image_;
DISALLOW_COPY_AND_ASSIGN(DummySystemTrayDelegate); DISALLOW_COPY_AND_ASSIGN(DummySystemTrayDelegate);
}; };
...@@ -396,19 +415,20 @@ void Shell::Init() { ...@@ -396,19 +415,20 @@ void Shell::Init() {
tray_.reset(new SystemTray()); tray_.reset(new SystemTray());
status_widget_->GetContentsView()->AddChildView(tray_.get()); status_widget_->GetContentsView()->AddChildView(tray_.get());
if (delegate_.get())
tray_delegate_.reset(delegate_->CreateSystemTrayDelegate(tray_.get()));
if (!tray_delegate_.get())
tray_delegate_.reset(new DummySystemTrayDelegate());
internal::TrayVolume* tray_volume = new internal::TrayVolume(); internal::TrayVolume* tray_volume = new internal::TrayVolume();
internal::TrayBrightness* tray_brightness = new internal::TrayBrightness(); internal::TrayBrightness* tray_brightness = new internal::TrayBrightness();
audio_controller_ = tray_volume; audio_controller_ = tray_volume;
brightness_controller_ = tray_brightness; brightness_controller_ = tray_brightness;
tray_->AddTrayItem(new internal::TrayUser());
tray_->AddTrayItem(tray_volume); tray_->AddTrayItem(tray_volume);
tray_->AddTrayItem(tray_brightness); tray_->AddTrayItem(tray_brightness);
tray_->AddTrayItem(new internal::TraySettings()); tray_->AddTrayItem(new internal::TraySettings());
if (delegate_.get())
tray_delegate_.reset(delegate_->CreateSystemTrayDelegate(tray_.get()));
if (!tray_delegate_.get())
tray_delegate_.reset(new DummySystemTrayDelegate());
} }
aura::Window* default_container = aura::Window* default_container =
......
...@@ -93,7 +93,7 @@ void SystemTray::AddTrayItem(SystemTrayItem* item) { ...@@ -93,7 +93,7 @@ void SystemTray::AddTrayItem(SystemTrayItem* item) {
views::View* tray_item = item->CreateTrayView(); views::View* tray_item = item->CreateTrayView();
if (tray_item) { if (tray_item) {
AddChildView(tray_item); AddChildViewAt(tray_item, 0);
PreferredSizeChanged(); PreferredSizeChanged();
} }
} }
......
...@@ -6,12 +6,19 @@ ...@@ -6,12 +6,19 @@
#define ASH_SYSTEM_TRAY_SYSTEM_TRAY_DELEGATE_H_ #define ASH_SYSTEM_TRAY_SYSTEM_TRAY_DELEGATE_H_
#pragma once #pragma once
class SkBitmap;
namespace ash { namespace ash {
class SystemTrayDelegate { class SystemTrayDelegate {
public: public:
virtual ~SystemTrayDelegate() {} virtual ~SystemTrayDelegate() {}
// Gets information about the logged in user.
virtual const std::string GetUserName() = 0;
virtual const std::string GetUserEmail() = 0;
virtual const SkBitmap& GetUserImage() = 0;
// Shows settings. // Shows settings.
virtual void ShowSettings() = 0; virtual void ShowSettings() = 0;
...@@ -29,6 +36,15 @@ class SystemTrayDelegate { ...@@ -29,6 +36,15 @@ class SystemTrayDelegate {
// Sets the volume level. // Sets the volume level.
virtual void SetVolumeLevel(float level) = 0; virtual void SetVolumeLevel(float level) = 0;
// Attempts to shut down the system.
virtual void ShutDown() = 0;
// Attempts to sign out the user.
virtual void SignOut() = 0;
// Attempts to lock the screen.
virtual void LockScreen() = 0;
}; };
} // namespace ash } // namespace ash
......
// Copyright (c) 2012 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 "ash/system/tray_user.h"
#include "ash/shell.h"
#include "ash/system/tray/system_tray_delegate.h"
#include "base/utf_string_conversions.h"
#include "grit/ui_resources.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/gfx/size.h"
#include "ui/views/controls/button/button.h"
#include "ui/views/controls/button/text_button.h"
#include "ui/views/controls/image_view.h"
#include "ui/views/controls/label.h"
#include "ui/views/layout/box_layout.h"
#include "ui/views/view.h"
namespace {
// A custom textbutton with some extra vertical padding, and custom border,
// alignment and hover-effects.
class TrayButton : public views::TextButton {
public:
TrayButton(views::ButtonListener* listener, std::string text)
: views::TextButton(listener, ASCIIToUTF16(text)),
hover_(false),
hover_bg_(views::Background::CreateSolidBackground(SkColorSetARGB(
10, 0, 0, 0))) {
set_alignment(ALIGN_CENTER);
}
private:
// Overridden from views::View.
virtual gfx::Size GetPreferredSize() OVERRIDE {
gfx::Size size = views::TextButton::GetPreferredSize();
size.Enlarge(0, 16);
return size;
}
virtual void OnMouseEntered(const views::MouseEvent& event) OVERRIDE {
hover_ = true;
SchedulePaint();
}
virtual void OnMouseExited(const views::MouseEvent& event) OVERRIDE {
hover_ = false;
SchedulePaint();
}
virtual void OnPaintBackground(gfx::Canvas* canvas) OVERRIDE {
if (hover_)
hover_bg_->Paint(canvas, this);
else
views::TextButton::OnPaintBackground(canvas);
}
bool hover_;
views::Background* hover_bg_;
DISALLOW_COPY_AND_ASSIGN(TrayButton);
};
class UserView : public views::View,
public views::ButtonListener {
public:
UserView() {
SetLayoutManager(new views::BoxLayout(views::BoxLayout::kVertical,
0, 0, 3));
views::View* user = new views::View;
user->SetLayoutManager(new views::BoxLayout(views::BoxLayout::kVertical,
14, 5, 0));
ash::SystemTrayDelegate* tray = ash::Shell::GetInstance()->tray_delegate();
username_ = new views::Label(ASCIIToUTF16(tray->GetUserName()));
username_->SetFont(username_->font().DeriveFont(2));
username_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
user->AddChildView(username_);
email_ = new views::Label(ASCIIToUTF16(tray->GetUserEmail()));
email_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
email_->SetEnabled(false);
user->AddChildView(email_);
AddChildView(user);
views::View* button_container = new views::View;
views::BoxLayout *layout = new
views::BoxLayout(views::BoxLayout::kHorizontal, 0, 5, 0);
layout->set_spread_blank_space(true);
button_container->SetLayoutManager(layout);
shutdown_ = new TrayButton(this, std::string("Shut down"));
signout_ = new TrayButton(this, std::string("Sign out"));
lock_ = new TrayButton(this, std::string("Lock"));
button_container->AddChildView(shutdown_);
button_container->AddChildView(signout_);
button_container->AddChildView(lock_);
shutdown_->set_border(NULL);
signout_->set_border(views::Border::CreateSolidSidedBorder(
0, 1, 0, 1, SkColorSetARGB(25, 0, 0, 0)));
lock_->set_border(NULL);
AddChildView(button_container);
}
private:
// Overridden from views::ButtonListener.
virtual void ButtonPressed(views::Button* sender,
const views::Event& event) OVERRIDE {
ash::SystemTrayDelegate* tray = ash::Shell::GetInstance()->tray_delegate();
if (sender == shutdown_)
tray->ShutDown();
else if (sender == signout_)
tray->SignOut();
else if (sender == lock_)
tray->LockScreen();
}
views::Label* username_;
views::Label* email_;
TrayButton* shutdown_;
TrayButton* signout_;
TrayButton* lock_;
DISALLOW_COPY_AND_ASSIGN(UserView);
};
} // namespace
namespace ash {
namespace internal {
TrayUser::TrayUser() {
}
TrayUser::~TrayUser() {
}
views::View* TrayUser::CreateTrayView() {
views::ImageView* avatar = new views::ImageView;
avatar->SetImage(ash::Shell::GetInstance()->tray_delegate()->GetUserImage());
avatar->SetImageSize(gfx::Size(32, 32));
return avatar;
}
views::View* TrayUser::CreateDefaultView() {
return new UserView;
}
views::View* TrayUser::CreateDetailedView() {
return NULL;
}
void TrayUser::DestroyTrayView() {
}
void TrayUser::DestroyDefaultView() {
}
void TrayUser::DestroyDetailedView() {
}
} // namespace internal
} // namespace ash
// Copyright (c) 2012 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.
#ifndef ASH_SYSTEM_TRAY_USER_H_
#define ASH_SYSTEM_TRAY_USER_H_
#pragma once
#include "ash/system/tray/system_tray_item.h"
namespace ash {
namespace internal {
class TrayUser : public SystemTrayItem {
public:
TrayUser();
virtual ~TrayUser();
private:
// Overridden from SystemTrayItem
virtual views::View* CreateTrayView() OVERRIDE;
virtual views::View* CreateDefaultView() OVERRIDE;
virtual views::View* CreateDetailedView() OVERRIDE;
virtual void DestroyTrayView() OVERRIDE;
virtual void DestroyDefaultView() OVERRIDE;
virtual void DestroyDetailedView() OVERRIDE;
DISALLOW_COPY_AND_ASSIGN(TrayUser);
};
} // namespace internal
} // namespace ash
#endif // ASH_SYSTEM_TRAY_USER_H_
...@@ -13,6 +13,8 @@ ...@@ -13,6 +13,8 @@
#include "chrome/browser/chromeos/audio/audio_handler.h" #include "chrome/browser/chromeos/audio/audio_handler.h"
#include "chrome/browser/chromeos/dbus/dbus_thread_manager.h" #include "chrome/browser/chromeos/dbus/dbus_thread_manager.h"
#include "chrome/browser/chromeos/dbus/power_manager_client.h" #include "chrome/browser/chromeos/dbus/power_manager_client.h"
#include "chrome/browser/chromeos/login/user.h"
#include "chrome/browser/chromeos/login/user_manager.h"
#include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_list.h" #include "chrome/browser/ui/browser_list.h"
...@@ -35,6 +37,18 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate, ...@@ -35,6 +37,18 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate,
} }
// Overridden from ash::SystemTrayDelegate. // Overridden from ash::SystemTrayDelegate.
virtual const std::string GetUserName() OVERRIDE {
return UserManager::Get()->logged_in_user().GetDisplayName();
}
virtual const std::string GetUserEmail() OVERRIDE {
return UserManager::Get()->logged_in_user().email();
}
virtual const SkBitmap& GetUserImage() OVERRIDE {
return UserManager::Get()->logged_in_user().image();
}
virtual void ShowSettings() OVERRIDE { virtual void ShowSettings() OVERRIDE {
BrowserList::GetLastActive()->OpenOptionsDialog(); BrowserList::GetLastActive()->OpenOptionsDialog();
} }
...@@ -59,6 +73,19 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate, ...@@ -59,6 +73,19 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate,
AudioHandler::GetInstance()->SetVolumePercent(level * 100.f); AudioHandler::GetInstance()->SetVolumePercent(level * 100.f);
} }
virtual void ShutDown() OVERRIDE {
DBusThreadManager::Get()->GetPowerManagerClient()->RequestShutdown();
}
virtual void SignOut() OVERRIDE {
BrowserList::AttemptUserExit();
}
virtual void LockScreen() OVERRIDE {
DBusThreadManager::Get()->GetPowerManagerClient()->
NotifyScreenLockRequested();
}
private: private:
ash::SystemTray* tray_; ash::SystemTray* tray_;
......
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