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

Side by Side Diff: ui/message_center/views/notification_view_md.cc

Issue 2941043004: Show number of hidden items in new-style list notification. (Closed)
Patch Set: Fix layout problem and some nits. Created 3 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 unified diff | Download patch
« no previous file with comments | « ui/message_center/views/notification_view_md.h ('k') | ui/strings/ui_strings.grd » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/message_center/views/notification_view_md.h" 5 #include "ui/message_center/views/notification_view_md.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include "base/strings/string_util.h" 9 #include "base/strings/string_util.h"
10 #include "ui/base/cursor/cursor.h" 10 #include "ui/base/cursor/cursor.h"
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
54 constexpr SkColor kSmallImageBackgroundColor = SK_ColorWHITE; 54 constexpr SkColor kSmallImageBackgroundColor = SK_ColorWHITE;
55 // Background of small icon image. 55 // Background of small icon image.
56 const SkColor kSmallImageColor = SkColorSetRGB(0x43, 0x43, 0x43); 56 const SkColor kSmallImageColor = SkColorSetRGB(0x43, 0x43, 0x43);
57 // Background of inline actions area. 57 // Background of inline actions area.
58 const SkColor kActionsRowBackgroundColor = SkColorSetRGB(0xee, 0xee, 0xee); 58 const SkColor kActionsRowBackgroundColor = SkColorSetRGB(0xee, 0xee, 0xee);
59 59
60 // Max number of lines for message_view_. 60 // Max number of lines for message_view_.
61 constexpr int kMaxLinesForMessageView = 1; 61 constexpr int kMaxLinesForMessageView = 1;
62 constexpr int kMaxLinesForExpandedMessageView = 4; 62 constexpr int kMaxLinesForExpandedMessageView = 4;
63 63
64 constexpr int kListNotificationOverflowIndicatorSpacing = 4;
64 constexpr int kCompactTitleMessageViewSpacing = 12; 65 constexpr int kCompactTitleMessageViewSpacing = 12;
65 66
66 constexpr int kProgressBarHeight = 4; 67 constexpr int kProgressBarHeight = 4;
67 68
68 const gfx::ImageSkia CreateSolidColorImage(int width, 69 const gfx::ImageSkia CreateSolidColorImage(int width,
69 int height, 70 int height,
70 SkColor color) { 71 SkColor color) {
71 SkBitmap bitmap; 72 SkBitmap bitmap;
72 bitmap.allocN32Pixels(width, height); 73 bitmap.allocN32Pixels(width, height);
73 bitmap.eraseColor(color); 74 bitmap.eraseColor(color);
(...skipping 21 matching lines...) Expand all
95 const gfx::ImageSkia GetProductIcon() { 96 const gfx::ImageSkia GetProductIcon() {
96 return gfx::CreateVectorIcon(kProductIcon, kSmallImageColor); 97 return gfx::CreateVectorIcon(kProductIcon, kSmallImageColor);
97 } 98 }
98 99
99 // ItemView //////////////////////////////////////////////////////////////////// 100 // ItemView ////////////////////////////////////////////////////////////////////
100 101
101 // ItemViews are responsible for drawing each list notification item's title and 102 // ItemViews are responsible for drawing each list notification item's title and
102 // message next to each other within a single column. 103 // message next to each other within a single column.
103 class ItemView : public views::View { 104 class ItemView : public views::View {
104 public: 105 public:
105 explicit ItemView(const message_center::NotificationItem& item); 106 explicit ItemView(const message_center::NotificationItem& item,
107 int num_remaining);
106 ~ItemView() override; 108 ~ItemView() override;
107 109
110 void SetRemainingCountVisible(bool visible);
111
112 class LayoutManager : public views::FillLayout {
fukino 2017/06/26 04:00:13 nit: This class can be private.
tetsui 2017/06/26 05:10:46 Done.
113 public:
114 LayoutManager(ItemView* item_view)
115 : views::FillLayout(), item_view_(item_view) {}
116
117 void Layout(View* host) override {
118 gfx::Rect container_bounds = host->GetContentsBounds();
119 if (item_view_->remaining_count_->visible()) {
120 // Show the full content of the overflow indicator and collapse the
121 // message container.
122 container_bounds.set_width(
123 container_bounds.width() -
124 item_view_->remaining_count_->GetPreferredSize().width() -
125 kListNotificationOverflowIndicatorSpacing);
126 }
127 item_view_->container_->SetBoundsRect(container_bounds);
128 item_view_->remaining_count_->SetBoundsRect(host->GetContentsBounds());
129 }
130
131 private:
132 ItemView* item_view_;
133 };
134
108 private: 135 private:
136 // Container of the title and the message.
137 views::View* container_;
138 // Overflow indicator e.g. "+3" shown on the right bottom.
139 views::Label* remaining_count_;
140
109 DISALLOW_COPY_AND_ASSIGN(ItemView); 141 DISALLOW_COPY_AND_ASSIGN(ItemView);
110 }; 142 };
111 143
112 ItemView::ItemView(const message_center::NotificationItem& item) { 144 ItemView::ItemView(const message_center::NotificationItem& item,
113 SetLayoutManager( 145 int num_remaining) {
146 SetLayoutManager(new ItemView::LayoutManager(this));
147
148 container_ = new views::View;
149 AddChildView(container_);
150 container_->SetLayoutManager(
114 new views::BoxLayout(views::BoxLayout::kHorizontal, gfx::Insets(), 151 new views::BoxLayout(views::BoxLayout::kHorizontal, gfx::Insets(),
115 message_center::kItemTitleToMessagePadding)); 152 message_center::kItemTitleToMessagePadding));
116 153
117 views::Label* title = new views::Label(item.title); 154 views::Label* title = new views::Label(item.title);
118 title->set_collapse_when_hidden(true); 155 title->set_collapse_when_hidden(true);
119 title->SetHorizontalAlignment(gfx::ALIGN_LEFT); 156 title->SetHorizontalAlignment(gfx::ALIGN_LEFT);
120 title->SetEnabledColor(message_center::kRegularTextColor); 157 title->SetEnabledColor(message_center::kRegularTextColor);
121 title->SetBackgroundColor(message_center::kDimTextBackgroundColor); 158 title->SetBackgroundColor(message_center::kDimTextBackgroundColor);
122 AddChildView(title); 159 container_->AddChildView(title);
123 160
124 views::Label* message = new views::Label(item.message); 161 views::Label* message = new views::Label(item.message);
125 message->set_collapse_when_hidden(true); 162 message->set_collapse_when_hidden(true);
126 message->SetHorizontalAlignment(gfx::ALIGN_LEFT); 163 message->SetHorizontalAlignment(gfx::ALIGN_LEFT);
127 message->SetEnabledColor(message_center::kDimTextColor); 164 message->SetEnabledColor(message_center::kDimTextColor);
128 message->SetBackgroundColor(message_center::kDimTextBackgroundColor); 165 message->SetBackgroundColor(message_center::kDimTextBackgroundColor);
129 AddChildView(message); 166 container_->AddChildView(message);
167
168 remaining_count_ = new views::Label();
169 remaining_count_->SetHorizontalAlignment(gfx::ALIGN_RIGHT);
170 remaining_count_->SetEnabledColor(message_center::kDimTextColor);
171 remaining_count_->SetBackgroundColor(message_center::kDimTextBackgroundColor);
172 AddChildView(remaining_count_);
173 if (num_remaining > 0) {
174 remaining_count_->SetText(l10n_util::GetStringFUTF16Int(
175 IDS_MESSAGE_CENTER_LIST_NOTIFICATION_OVERFLOW_INDICATOR,
176 num_remaining));
177 }
178 remaining_count_->SetVisible(false);
130 } 179 }
131 180
132 ItemView::~ItemView() {} 181 ItemView::~ItemView() {}
133 182
183 void ItemView::SetRemainingCountVisible(bool visible) {
184 remaining_count_->SetVisible(visible);
185 }
186
134 // CompactTitleMessageView ///////////////////////////////////////////////////// 187 // CompactTitleMessageView /////////////////////////////////////////////////////
135 188
136 // CompactTitleMessageView shows notification title and message in a single 189 // CompactTitleMessageView shows notification title and message in a single
137 // line. This view is used for NOTIFICATION_TYPE_PROGRESS. 190 // line. This view is used for NOTIFICATION_TYPE_PROGRESS.
138 class CompactTitleMessageView : public views::View { 191 class CompactTitleMessageView : public views::View {
139 public: 192 public:
140 explicit CompactTitleMessageView(); 193 explicit CompactTitleMessageView();
141 ~CompactTitleMessageView() override; 194 ~CompactTitleMessageView() override;
142 195
143 void OnPaint(gfx::Canvas* canvas) override; 196 void OnPaint(gfx::Canvas* canvas) override;
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after
514 } 567 }
515 568
516 void NotificationViewMD::CreateOrUpdateListItemViews( 569 void NotificationViewMD::CreateOrUpdateListItemViews(
517 const Notification& notification) { 570 const Notification& notification) {
518 for (auto* item_view : item_views_) 571 for (auto* item_view : item_views_)
519 delete item_view; 572 delete item_view;
520 item_views_.clear(); 573 item_views_.clear();
521 574
522 const std::vector<NotificationItem>& items = notification.items(); 575 const std::vector<NotificationItem>& items = notification.items();
523 576
524 for (size_t i = 0; i < items.size() && i < kNotificationMaximumItems; ++i) { 577 for (size_t i = 0; i < items.size() && i < kMaxLinesForExpandedMessageView;
525 ItemView* item_view = new ItemView(items[i]); 578 ++i) {
579 ItemView* item_view = new ItemView(items[i], items.size() - i - 1);
fukino 2017/06/26 04:18:37 Optional nit: Since only the first and the last it
tetsui 2017/06/26 05:10:46 Done.
526 item_views_.push_back(item_view); 580 item_views_.push_back(item_view);
527 left_content_->AddChildView(item_view); 581 left_content_->AddChildView(item_view);
528 } 582 }
529 583
530 // Needed when CreateOrUpdateViews is called for update. 584 // Needed when CreateOrUpdateViews is called for update.
531 if (!item_views_.empty()) 585 if (!item_views_.empty())
532 left_content_->InvalidateLayout(); 586 left_content_->InvalidateLayout();
533 } 587 }
534 588
535 void NotificationViewMD::CreateOrUpdateIconView( 589 void NotificationViewMD::CreateOrUpdateIconView(
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
691 745
692 void NotificationViewMD::UpdateViewForExpandedState(bool expanded) { 746 void NotificationViewMD::UpdateViewForExpandedState(bool expanded) {
693 header_row_->SetExpanded(expanded); 747 header_row_->SetExpanded(expanded);
694 if (message_view_) { 748 if (message_view_) {
695 message_view_->SetLineLimit(expanded ? kMaxLinesForExpandedMessageView 749 message_view_->SetLineLimit(expanded ? kMaxLinesForExpandedMessageView
696 : kMaxLinesForMessageView); 750 : kMaxLinesForMessageView);
697 } 751 }
698 if (image_container_) 752 if (image_container_)
699 image_container_->SetVisible(expanded); 753 image_container_->SetVisible(expanded);
700 actions_row_->SetVisible(expanded && actions_row_->has_children()); 754 actions_row_->SetVisible(expanded && actions_row_->has_children());
701 for (size_t i = 1; i < item_views_.size(); ++i) { 755 for (size_t i = kMaxLinesForMessageView; i < item_views_.size(); ++i) {
702 item_views_[i]->SetVisible(expanded); 756 item_views_[i]->SetVisible(expanded);
703 } 757 }
758 if (!item_views_.empty()) {
759 item_views_.front()->SetRemainingCountVisible(!expanded);
760 item_views_.back()->SetRemainingCountVisible(expanded);
761 }
704 } 762 }
705 763
706 void NotificationViewMD::UpdateControlButtonsVisibility() { 764 void NotificationViewMD::UpdateControlButtonsVisibility() {
707 const bool target_visibility = IsMouseHovered() || HasFocus() || 765 const bool target_visibility = IsMouseHovered() || HasFocus() ||
708 (header_row_->IsExpandButtonEnabled() && 766 (header_row_->IsExpandButtonEnabled() &&
709 header_row_->expand_button()->HasFocus()) || 767 header_row_->expand_button()->HasFocus()) ||
710 (header_row_->IsCloseButtonEnabled() && 768 (header_row_->IsCloseButtonEnabled() &&
711 header_row_->close_button()->HasFocus()) || 769 header_row_->close_button()->HasFocus()) ||
712 (header_row_->IsSettingsButtonEnabled() && 770 (header_row_->IsSettingsButtonEnabled() &&
713 header_row_->settings_button()->HasFocus()); 771 header_row_->settings_button()->HasFocus());
714 772
715 header_row_->SetControlButtonsVisible(target_visibility); 773 header_row_->SetControlButtonsVisible(target_visibility);
716 } 774 }
717 775
718 } // namespace message_center 776 } // namespace message_center
OLDNEW
« no previous file with comments | « ui/message_center/views/notification_view_md.h ('k') | ui/strings/ui_strings.grd » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698