| Index: ash/system/web_notification/web_notification_tray.cc
|
| diff --git a/ash/system/web_notification/web_notification_tray.cc b/ash/system/web_notification/web_notification_tray.cc
|
| index 699eeb7d41b564daa4444bc7459c764e3e639247..6d98d7a4e559fca6996a7e1a45c093d888ed941d 100644
|
| --- a/ash/system/web_notification/web_notification_tray.cc
|
| +++ b/ash/system/web_notification/web_notification_tray.cc
|
| @@ -43,7 +43,7 @@ const int kNotificationImageIconInset = 4;
|
|
|
| // Web Notification Bubble constants
|
| const int kWebNotificationBubbleMinHeight = 80;
|
| -const int kWebNotificationBubbleMaxHeight = 400;
|
| +const int kWebNotificationBubbleMaxHeight = 480;
|
| // Delay laying out the Bubble until all notifications have been added and icons
|
| // have had a chance to load.
|
| const int kUpdateDelayMs = 50;
|
| @@ -51,7 +51,7 @@ const int kUpdateDelayMs = 50;
|
| const int kMaxVisibleNotifications = 100;
|
|
|
| // Individual notifications constants
|
| -const int kWebNotificationWidth = 400;
|
| +const int kWebNotificationWidth = 320;
|
| const int kWebNotificationButtonWidth = 32;
|
| const int kWebNotificationIconSize = 40;
|
|
|
| @@ -124,7 +124,7 @@ class WebNotificationList {
|
| iter->display_source = display_source;
|
| iter->extension_id = extension_id;
|
| } else {
|
| - notifications_.push_back(
|
| + notifications_.push_front(
|
| WebNotification(id, title, message, display_source, extension_id));
|
| }
|
| }
|
| @@ -342,7 +342,8 @@ class WebNotificationView : public views::View,
|
|
|
| views::ColumnSet* columns = layout->AddColumnSet(0);
|
|
|
| - columns->AddPaddingColumn(0, kTrayPopupPaddingHorizontal/2);
|
| + int padding_width = kTrayPopupPaddingHorizontal/2;
|
| + columns->AddPaddingColumn(0, padding_width);
|
|
|
| // Notification Icon.
|
| columns->AddColumn(views::GridLayout::CENTER, views::GridLayout::LEADING,
|
| @@ -350,14 +351,16 @@ class WebNotificationView : public views::View,
|
| views::GridLayout::FIXED,
|
| kWebNotificationIconSize, kWebNotificationIconSize);
|
|
|
| - columns->AddPaddingColumn(0, kTrayPopupPaddingHorizontal/2);
|
| + columns->AddPaddingColumn(0, padding_width);
|
|
|
| // Notification message text.
|
| + int message_width = kWebNotificationWidth - kWebNotificationIconSize -
|
| + kWebNotificationButtonWidth - (padding_width * 3);
|
| columns->AddColumn(views::GridLayout::FILL, views::GridLayout::LEADING,
|
| 100, /* resize percent */
|
| - views::GridLayout::USE_PREF, 0, 0);
|
| + views::GridLayout::FIXED, message_width, message_width);
|
|
|
| - columns->AddPaddingColumn(0, kTrayPopupPaddingHorizontal/2);
|
| + columns->AddPaddingColumn(0, padding_width);
|
|
|
| // Close and menu buttons.
|
| columns->AddColumn(views::GridLayout::CENTER, views::GridLayout::LEADING,
|
| @@ -499,6 +502,7 @@ class WebNotificationTray::BubbleContentsView : public views::View {
|
| scroll_content_ = new views::View;
|
| scroll_content_->SetLayoutManager(
|
| new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 1));
|
| +
|
| scroller_ = new internal::FixedSizedScrollView;
|
| scroller_->SetContentsView(scroll_content_);
|
| AddChildView(scroller_);
|
| @@ -509,36 +513,16 @@ class WebNotificationTray::BubbleContentsView : public views::View {
|
|
|
| void Update(const WebNotificationList::Notifications& notifications) {
|
| scroll_content_->RemoveAllChildViews(true);
|
| - int num_children = notifications.size();
|
| - WebNotificationList::Notifications::const_iterator iter =
|
| - notifications.begin();
|
| - if (num_children > kMaxVisibleNotifications) {
|
| - std::advance(iter, num_children - kMaxVisibleNotifications);
|
| - num_children = kMaxVisibleNotifications;
|
| - }
|
| - for (; iter != notifications.end(); ++iter) {
|
| + int num_children = 0;
|
| + for (WebNotificationList::Notifications::const_iterator iter =
|
| + notifications.begin(); iter != notifications.end(); ++iter) {
|
| WebNotificationView* view = new WebNotificationView(tray_, *iter);
|
| scroll_content_->AddChildView(view);
|
| + if (++num_children >= kMaxVisibleNotifications)
|
| + break;
|
| }
|
| - // Layout this first to set the preferred size of the scroller.
|
| - PreferredSizeChanged();
|
| - Layout();
|
| - // Now layout the widget with this correctly sized.
|
| - PreferredSizeChanged();
|
| - GetWidget()->GetRootView()->Layout();
|
| - GetWidget()->GetRootView()->SchedulePaint();
|
| -
|
| - // Scroll to show the most recent notification.
|
| - if (num_children > 0) {
|
| - scroll_content_->ScrollRectToVisible(
|
| - scroll_content_->child_at(num_children - 1)->bounds());
|
| - }
|
| - }
|
| -
|
| - // Overridden from views::View:
|
| - virtual void Layout() OVERRIDE {
|
| SizeScrollContent();
|
| - views::View::Layout();
|
| + GetWidget()->GetRootView()->SchedulePaint();
|
| }
|
|
|
| private:
|
| @@ -549,13 +533,9 @@ class WebNotificationTray::BubbleContentsView : public views::View {
|
| std::max(scroll_size.height(),
|
| kWebNotificationBubbleMinHeight - button_height),
|
| kWebNotificationBubbleMaxHeight - button_height);
|
| - if (scroll_height < scroll_size.height()) {
|
| - scroll_size.set_height(scroll_height);
|
| - scroller_->SetFixedSize(scroll_size);
|
| - } else {
|
| - scroller_->SetFixedSize(gfx::Size());
|
| - }
|
| - scroller_->InvalidateLayout();
|
| + scroll_size.set_height(scroll_height);
|
| + scroller_->SetFixedSize(scroll_size);
|
| + scroller_->SizeToPreferredSize();
|
| }
|
|
|
| WebNotificationTray* tray_;
|
| @@ -659,6 +639,7 @@ class WebNotificationTray::Bubble : public internal::TrayBubbleView::Host,
|
| void UpdateBubbleView() {
|
| contents_view_->Update(tray_->notification_list()->notifications());
|
| bubble_view_->Show();
|
| + bubble_view_->UpdateBubble();
|
| }
|
|
|
| WebNotificationTray* tray_;
|
| @@ -817,6 +798,8 @@ void WebNotificationTray::SetShelfAlignment(ShelfAlignment alignment) {
|
| alignment == SHELF_ALIGNMENT_BOTTOM ?
|
| views::BoxLayout::kHorizontal : views::BoxLayout::kVertical,
|
| 0, 0, 0));
|
| + // Destroy any existing bubble so that it will be rebuilt correctly.
|
| + bubble_.reset();
|
| }
|
|
|
| bool WebNotificationTray::PerformAction(const views::Event& event) {
|
|
|