Chromium Code Reviews| Index: ui/message_center/views/notification_view.cc |
| diff --git a/ui/message_center/views/notification_view.cc b/ui/message_center/views/notification_view.cc |
| index fe91d1b09469a099755b1165664ef94720302697..254fcbf13501358a449bd3e870c278c0f1db818b 100644 |
| --- a/ui/message_center/views/notification_view.cc |
| +++ b/ui/message_center/views/notification_view.cc |
| @@ -59,6 +59,9 @@ namespace { |
| // Dimensions. |
| const int kProgressBarBottomPadding = 0; |
| +const int kCloseIconTopPadding = 5; |
| +const int kCloseIconRightPadding = 5; |
| + |
| // static |
| scoped_ptr<views::Border> MakeEmptyBorder(int top, |
| int left, |
| @@ -228,7 +231,8 @@ views::View* NotificationView::TargetForRect(views::View* root, |
| action_buttons_.end()); |
| if (settings_button_view_) |
| buttons.push_back(settings_button_view_); |
| - buttons.push_back(close_button()); |
| + if (close_button_) |
| + buttons.push_back(close_button_.get()); |
| for (size_t i = 0; i < buttons.size(); ++i) { |
| gfx::Point point_in_child = point; |
| @@ -241,6 +245,7 @@ views::View* NotificationView::TargetForRect(views::View* root, |
| } |
| void NotificationView::CreateOrUpdateViews(const Notification& notification) { |
| + CreateOrUpdateCloseButtonView(notification); |
| CreateOrUpdateTitleView(notification); |
| CreateOrUpdateMessageView(notification); |
| CreateOrUpdateProgressBarView(notification); |
| @@ -308,7 +313,6 @@ NotificationView::NotificationView(MessageCenterController* controller, |
| // image to overlap the content as needed to provide large enough click and |
| // touch areas (<http://crbug.com/168822> and <http://crbug.com/168856>). |
| AddChildView(small_image()); |
| - AddChildView(close_button()); |
| SetAccessibleName(notification); |
| SetEventTargeter( |
| @@ -378,6 +382,16 @@ void NotificationView::Layout() { |
| int top_height = top_view_->GetHeightForWidth(content_width); |
| top_view_->SetBounds(insets.left(), insets.top(), content_width, top_height); |
| + // Close button. |
| + if (close_button_) { |
| + gfx::Rect content_bounds = GetContentsBounds(); |
| + gfx::Size close_size(close_button_->GetPreferredSize()); |
| + gfx::Rect close_rect(content_bounds.right() - close_size.width(), |
| + content_bounds.y(), close_size.width(), |
| + close_size.height()); |
| + close_button_->SetBoundsRect(close_rect); |
| + } |
| + |
| // Icon. |
| icon_view_->SetBounds(insets.left(), insets.top(), kIconSize, kIconSize); |
| @@ -445,6 +459,10 @@ void NotificationView::ButtonPressed(views::Button* sender, |
| } |
| } |
| + if (close_button_ && sender == close_button_.get()) { |
| + controller_->RemoveNotification(notification_id(), true); // By user. |
|
dewittj
2016/02/10 00:03:15
nit: should be consistent in comments, so this sho
|
| + } |
| + |
| // Let the superclass handle everything else. |
| // Warning: This may cause the NotificationView itself to be deleted, |
| // so don't do anything afterwards. |
| @@ -772,6 +790,29 @@ void NotificationView::CreateOrUpdateActionButtonViews( |
| } |
| } |
| +void NotificationView::CreateOrUpdateCloseButtonView( |
| + const Notification& notification) { |
| + set_slide_out_enabled(!notification.pinned()); |
| + |
| + if (!notification.pinned() && !close_button_) { |
| + PaddedButton* close = new PaddedButton(this); |
| + close->SetPadding(-kCloseIconRightPadding, kCloseIconTopPadding); |
| + close->SetNormalImage(IDR_NOTIFICATION_CLOSE); |
| + close->SetHoveredImage(IDR_NOTIFICATION_CLOSE_HOVER); |
| + close->SetPressedImage(IDR_NOTIFICATION_CLOSE_PRESSED); |
| + close->set_animate_on_state_change(false); |
| + close->SetAccessibleName(l10n_util::GetStringUTF16( |
| + IDS_MESSAGE_CENTER_CLOSE_NOTIFICATION_BUTTON_ACCESSIBLE_NAME)); |
| + // The close button should be added to view hierarchy by the derived class. |
| + // This ensures that it is on top of other views. |
| + close->set_owned_by_client(); |
| + close_button_.reset(close); |
| + AddChildView(close_button_.get()); |
| + } else if (notification.pinned() && close_button_) { |
| + close_button_.reset(); |
| + } |
| +} |
| + |
| int NotificationView::GetMessageLineLimit(int title_lines, int width) const { |
| // Image notifications require that the image must be kept flush against |
| // their icons, but we can allow more text if no image. |
| @@ -813,4 +854,22 @@ int NotificationView::GetMessageHeight(int width, int limit) const { |
| message_view_->GetSizeForWidthAndLines(width, limit).height() : 0; |
| } |
| +bool NotificationView::IsCloseButtonFocused() { |
| + if (!close_button_) |
| + return false; |
| + |
| + views::FocusManager* focus_manager = GetFocusManager(); |
| + return focus_manager && |
| + focus_manager->GetFocusedView() == close_button_.get(); |
| +} |
| + |
| +void NotificationView::RequestFocusOnCloseButton() { |
| + if (close_button_) |
| + close_button_->RequestFocus(); |
| +} |
| + |
| +bool NotificationView::IsPinned() { |
| + return !close_button_; |
| +} |
| + |
| } // namespace message_center |