blob: 2e18f9cf6424701bf5271830bfcee5b63bcc843e [file] [log] [blame]
// Copyright 2017 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/sidebar/sidebar_widget.h"
#include <memory>
#include <utility>
#include "ash/app_list/views/app_list_view.h"
#include "ash/message_center/message_center_view.h"
#include "ash/public/cpp/app_list/app_list_features.h"
#include "ash/root_window_controller.h"
#include "ash/screen_util.h"
#include "ash/session/session_controller.h"
#include "ash/shelf/shelf.h"
#include "ash/shelf/shelf_widget.h"
#include "ash/shell.h"
#include "ash/system/message_center/notification_tray.h"
#include "ash/system/status_area_widget.h"
#include "ash/system/tray/tray_constants.h"
#include "base/strings/utf_string_conversions.h"
#include "ui/aura/window.h"
#include "ui/display/display.h"
#include "ui/display/screen.h"
#include "ui/message_center/message_center.h"
#include "ui/message_center/message_center_style.h"
#include "ui/message_center/public/cpp/message_center_constants.h"
#include "ui/views/background.h"
#include "ui/views/controls/button/label_button.h"
#include "ui/views/layout/box_layout.h"
#include "ui/views/layout/fill_layout.h"
#include "ui/views/widget/widget_delegate.h"
#include "ui/views/widget/widget_observer.h"
namespace ash {
namespace {
display::Display GetCurrentDisplay(aura::Window* window) {
return display::Screen::GetScreen()->GetDisplayNearestWindow(window);
}
const SkColor kLightShadingColor = SkColorSetARGB(200, 0, 0, 0);
// The blur radius of the background.
constexpr int kSidebarBackgroundBlurRadius = 30;
gfx::Rect CalculateBounds(const gfx::Rect& display_bounds) {
return gfx::Rect(display_bounds.x() + display_bounds.width() -
message_center::kNotificationWidth,
display_bounds.y(), message_center::kNotificationWidth,
display_bounds.height());
}
} // namespace
class SidebarWidget::DelegateView : public views::WidgetDelegateView,
public views::ButtonListener {
public:
DelegateView(Shelf* shelf, SidebarInitMode mode)
: container_(new views::View()), background_(new views::View) {
bool is_background_blur_enabled =
app_list::features::IsBackgroundBlurEnabled();
background_->SetPaintToLayer(ui::LAYER_SOLID_COLOR);
background_->layer()->SetFillsBoundsOpaquely(false);
background_->layer()->SetColor(kLightShadingColor);
background_->layer()->SetOpacity(
is_background_blur_enabled
? app_list::AppListView::kAppListOpacityWithBlur
: app_list::AppListView::kAppListOpacity);
if (is_background_blur_enabled)
background_->layer()->SetBackgroundBlur(kSidebarBackgroundBlurRadius);
auto* message_center = message_center::MessageCenter::Get();
gfx::Rect display_bounds = shelf->GetUserWorkAreaBounds();
bool initially_message_center_settings_visible =
(mode == SidebarInitMode::MESSAGE_CENTER_SETTINGS);
message_center_view_ =
new MessageCenterView(message_center, display_bounds.height(),
initially_message_center_settings_visible);
message_center_view_->SetNotifications(
message_center->GetVisibleNotifications());
auto container_layout =
std::make_unique<views::BoxLayout>(views::BoxLayout::kVertical);
container_->SetPaintToLayer();
container_->layer()->SetFillsBoundsOpaquely(false);
container_->AddChildView(message_center_view_);
container_layout->SetFlexForView(message_center_view_, 1);
container_->SetLayoutManager(std::move(container_layout));
AddChildView(background_);
AddChildView(container_);
}
// Overridden from View:
void Layout() override {
DCHECK(message_center_view_);
background_->SetBoundsRect(GetLocalBounds());
container_->SetBoundsRect(GetLocalBounds());
int message_center_height = height();
message_center_view_->SetBounds(0, 0, width(), message_center_height);
}
// Overridden from ButtonListener:
void ButtonPressed(views::Button* sender, const ui::Event& event) override {}
ash::MessageCenterView* message_center_view() { return message_center_view_; }
private:
views::View* container_;
views::View* background_;
ash::MessageCenterView* message_center_view_;
DISALLOW_COPY_AND_ASSIGN(DelegateView);
};
SidebarWidget::SidebarWidget(aura::Window* sidebar_container,
Sidebar* sidebar,
Shelf* shelf,
SidebarInitMode mode)
: sidebar_(sidebar),
shelf_(shelf),
delegate_view_(new DelegateView(shelf, mode)) {
DCHECK(sidebar_container);
DCHECK(sidebar_);
DCHECK(shelf_);
display::Screen::GetScreen()->AddObserver(this);
views::Widget::InitParams params(
views::Widget::InitParams::TYPE_WINDOW_FRAMELESS);
params.name = "SidebarWidget";
params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW;
params.shadow_type = views::Widget::InitParams::SHADOW_TYPE_DROP;
params.delegate = delegate_view_;
params.parent = sidebar_container;
Init(params);
SetContentsView(delegate_view_);
gfx::Rect display_bounds = shelf->GetUserWorkAreaBounds();
SetBounds(CalculateBounds(display_bounds));
}
SidebarWidget::~SidebarWidget() {
display::Screen::GetScreen()->RemoveObserver(this);
}
void SidebarWidget::Reinitialize(SidebarInitMode mode) {
switch (mode) {
case SidebarInitMode::NORMAL:
delegate_view_->message_center_view()->SetSettingsVisible(false);
break;
case SidebarInitMode::MESSAGE_CENTER_SETTINGS:
delegate_view_->message_center_view()->SetSettingsVisible(true);
break;
}
}
void SidebarWidget::OnDisplayAdded(const display::Display& new_display) {}
void SidebarWidget::OnDisplayRemoved(const display::Display& old_display) {}
void SidebarWidget::OnDisplayMetricsChanged(const display::Display& display,
uint32_t metrics) {
if (GetCurrentDisplay(GetNativeView()).id() == display.id()) {
gfx::Rect display_bounds = shelf_->GetUserWorkAreaBounds();
SetBounds(CalculateBounds(display_bounds));
}
}
} // namespace ash