Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(576)

Unified Diff: ui/arc/notification/arc_custom_notification_view.cc

Issue 2093563007: Add a floating close button for arc custom notification (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix typo Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/arc/notification/arc_custom_notification_view.h ('k') | ui/arc/notification/arc_notification_item.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/arc/notification/arc_custom_notification_view.cc
diff --git a/ui/arc/notification/arc_custom_notification_view.cc b/ui/arc/notification/arc_custom_notification_view.cc
index 5fefa7e0d09393799951ae47aaa1c16de03beae1..a87669382fae387dbac59bb147197d889f752aae 100644
--- a/ui/arc/notification/arc_custom_notification_view.cc
+++ b/ui/arc/notification/arc_custom_notification_view.cc
@@ -6,15 +6,64 @@
#include "components/exo/notification_surface.h"
#include "components/exo/surface.h"
+#include "third_party/skia/include/core/SkColor.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/resource/resource_bundle.h"
+#include "ui/resources/grit/ui_resources.h"
+#include "ui/strings/grit/ui_strings.h"
+#include "ui/views/background.h"
+#include "ui/views/border.h"
+#include "ui/views/controls/button/image_button.h"
#include "ui/views/widget/widget.h"
namespace arc {
ArcCustomNotificationView::ArcCustomNotificationView(
+ ArcCustomNotificationItem* item,
exo::NotificationSurface* surface)
- : surface_(surface) {}
+ : item_(item), surface_(surface) {
+ item_->AddObserver(this);
+ OnItemPinnedChanged();
+}
+
+ArcCustomNotificationView::~ArcCustomNotificationView() {
+ if (item_)
+ item_->RemoveObserver(this);
+}
+
+void ArcCustomNotificationView::CreateFloatingCloseButton() {
+ floating_close_button_ = new views::ImageButton(this);
+ floating_close_button_->set_background(
+ views::Background::CreateSolidBackground(SK_ColorTRANSPARENT));
+ floating_close_button_->SetBorder(
+ views::Border::CreateEmptyBorder(5, 5, 5, 5));
+
+ ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
+ floating_close_button_->SetImage(
+ views::CustomButton::STATE_NORMAL,
+ rb.GetImageSkiaNamed(IDR_NOTIFICATION_CLOSE));
+ floating_close_button_->SetImage(
+ views::CustomButton::STATE_HOVERED,
+ rb.GetImageSkiaNamed(IDR_NOTIFICATION_CLOSE_HOVER));
+ floating_close_button_->SetImage(
+ views::CustomButton::STATE_PRESSED,
+ rb.GetImageSkiaNamed(IDR_NOTIFICATION_CLOSE_PRESSED));
+ floating_close_button_->set_animate_on_state_change(false);
+ floating_close_button_->SetAccessibleName(l10n_util::GetStringUTF16(
+ IDS_MESSAGE_CENTER_CLOSE_NOTIFICATION_BUTTON_ACCESSIBLE_NAME));
+
+ views::Widget::InitParams params(views::Widget::InitParams::TYPE_CONTROL);
+ params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW;
+ params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+ params.parent = surface_->window();
-ArcCustomNotificationView::~ArcCustomNotificationView() {}
+ floating_close_button_widget_.reset(new views::Widget);
+ floating_close_button_widget_->Init(params);
+ floating_close_button_widget_->SetContentsView(floating_close_button_);
+ floating_close_button_widget_->Show();
+
+ Layout();
+}
void ArcCustomNotificationView::ViewHierarchyChanged(
const views::View::ViewHierarchyChangedDetails& details) {
@@ -35,4 +84,38 @@ void ArcCustomNotificationView::ViewHierarchyChanged(
Attach(surface_->window());
}
+void ArcCustomNotificationView::Layout() {
+ views::NativeViewHost::Layout();
+
+ if (!floating_close_button_widget_ || !GetWidget())
+ return;
+
+ gfx::Rect surface_local_bounds(surface_->window()->bounds().size());
+ gfx::Rect close_button_bounds(floating_close_button_->GetPreferredSize());
+ close_button_bounds.set_x(surface_local_bounds.right() -
+ close_button_bounds.width());
+ close_button_bounds.set_y(surface_local_bounds.y());
+ floating_close_button_widget_->SetBounds(close_button_bounds);
+}
+
+void ArcCustomNotificationView::ButtonPressed(views::Button* sender,
+ const ui::Event& event) {
+ if (item_ && !item_->pinned() && sender == floating_close_button_) {
+ item_->CloseFromCloseButton();
+ }
+}
+
+void ArcCustomNotificationView::OnItemDestroying() {
+ item_->RemoveObserver(this);
+ item_ = nullptr;
+}
+
+void ArcCustomNotificationView::OnItemPinnedChanged() {
+ if (item_->pinned() && floating_close_button_widget_) {
+ floating_close_button_widget_.reset();
+ } else if (!item_->pinned() && !floating_close_button_widget_) {
+ CreateFloatingCloseButton();
+ }
+}
+
} // namespace arc
« no previous file with comments | « ui/arc/notification/arc_custom_notification_view.h ('k') | ui/arc/notification/arc_notification_item.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698