Chromium Code Reviews| Index: ui/message_center/notification_view.cc |
| diff --git a/ui/message_center/notification_view.cc b/ui/message_center/notification_view.cc |
| index 39acf9f5eaf80485d49a80476c6c4020615e0c30..bb59f169126d956b951216319d17a225c319aba0 100644 |
| --- a/ui/message_center/notification_view.cc |
| +++ b/ui/message_center/notification_view.cc |
| @@ -22,18 +22,22 @@ |
| namespace { |
| // Notification dimensions. |
| +const int kIconTopPadding = 0; |
| const int kIconLeftPadding = 0; |
| +const int kIconBottomPadding = 0; |
| const int kIconColumnWidth = message_center::kNotificationIconWidth; |
| const int kIconToTextPadding = 15; |
| -const int kTextToClosePadding = 10; |
| -const int kCloseColumnWidth = 8; |
| -const int kCloseRightPadding = 6; |
| -const int kIconTopPadding = 0; |
| const int kTextTopPadding = 9; |
| -const int kCloseTopPadding = 6; |
| -const int kIconBottomPadding = 0; |
| const int kTextBottomPadding = 12; |
| +const int kTextToClosePadding = 10; |
| +const int kCloseTopPadding = 6; |
| +const int kCloseRightPadding = 6; |
| +const int kCloseColumnWidth = 8; |
| const int kItemTitleToDetailsPadding = 3; |
| +const int kImageTopPadding = 0; |
| +const int kImageLeftPadding = 0; |
| +const int kImageBottomPadding = 0; |
| +const int kImageRightPadding = 0; |
| // Notification colors. The text background colors below are used only to keep |
| // view::Label from modifying the text color and will not actually be drawn. |
| @@ -88,6 +92,38 @@ ItemView::ItemView( |
| ItemView::~ItemView() { |
| } |
| +// ProportionalImageViews match their heights to their widths to preserve the |
| +// proportions of their images. |
| +class ProportionalImageView : public views::ImageView { |
| + public: |
| + ProportionalImageView(); |
| + virtual ~ProportionalImageView(); |
| + |
| + // Overridden from views::View. |
| + virtual int GetHeightForWidth(int width) OVERRIDE; |
| +}; |
| + |
| +ProportionalImageView::ProportionalImageView() { |
| +} |
| + |
| +ProportionalImageView::~ProportionalImageView() { |
| +} |
| + |
| +int ProportionalImageView::GetHeightForWidth(int width) { |
| + int height = 0; |
| + gfx::ImageSkia image = GetImage(); |
| + if (image.width() > 0 && image.height() > 0) { |
| + double proportion = image.height() / (double) image.width(); |
| + height = 0.5 + width * proportion; |
| + if (height > message_center::kNotificationMaximumImageHeight) { |
| + height = message_center::kNotificationMaximumImageHeight; |
| + width = 0.5 + height / proportion; |
| + } |
| + SetImageSize(gfx::Size(width, height)); |
| + } |
| + return height; |
| +} |
| + |
| } // namespace |
| namespace message_center { |
| @@ -130,8 +166,15 @@ void NotificationView::SetUpView() { |
| kCloseColumnWidth + kCloseRightPadding); |
| // Close button + padding. |
| - // First row: Icon. This vertically spans the close button padding row, the |
| - // close button row, and all item rows. |
| + // Figure out how many rows the icon should span. |
| + int span = 2; // Two rows for the close button padding and close button. |
| + if (notification_.items.size() > 0) { |
| + span += notification_.items.size(); // One row per item. |
| + } else { |
| + span += 1; // One row for the message. |
| + } |
|
Jun Mukai
2012/12/20 18:26:49
remove braces for 1-line if.
dharcourt
2012/12/20 20:51:32
Done.
|
| + |
| + // First row: Icon. |
| layout->StartRow(0, 0); |
| views::ImageView* icon = new views::ImageView(); |
| icon->SetImageSize(gfx::Size(message_center::kNotificationIconWidth, |
| @@ -141,7 +184,7 @@ void NotificationView::SetUpView() { |
| icon->SetVerticalAlignment(views::ImageView::LEADING); |
| icon->set_border(MakePadding(kIconTopPadding, kIconLeftPadding, |
| kIconBottomPadding, kIconToTextPadding)); |
| - layout->AddView(icon, 1, 2 + notification_.items.size()); |
| + layout->AddView(icon, 1, span); |
| // First row: Title. This vertically spans the close button padding row and |
| // the close button row. |
| @@ -152,7 +195,8 @@ void NotificationView::SetUpView() { |
| title->SetEnabledColor(kTitleColor); |
| title->SetBackgroundColor(kTitleBackgroundColor); |
| title->set_border(MakePadding(kTextTopPadding, 0, 3, kTextToClosePadding)); |
| - layout->AddView(title, 1, 2); |
| + layout->AddView(title, 1, 2, |
| + views::GridLayout::LEADING, views::GridLayout::LEADING); |
| // First row: Close button padding. |
| views::View* padding = new views::ImageView(); |
| @@ -161,23 +205,56 @@ void NotificationView::SetUpView() { |
| // Second row: Close button, which has to be on a row of its own because its |
| // top padding can't be set using empty borders (ImageButtons don't support |
| - // borders). The resize factor of this row (100) is much higher than that of |
| - // other rows (0) to ensure the first row's height stays at kCloseTopPadding. |
| - layout->StartRow(100, 0); |
| + // borders). The resize factor of this row (1) is higher than that of the |
| + // first rows (0) to ensure the first row's height stays at kCloseTopPadding. |
| + layout->StartRow(1, 0); |
| layout->SkipColumns(2); |
| DCHECK(close_button_); |
| layout->AddView(close_button_); |
| - // One row for each notification item, including appropriate padding. |
| + // One row for the message if appropriate. The resize factor of this row (2) |
| + // is higher than that of preceding rows (0 and 1) to ensure the content of |
| + // the notification is top-aligned. |
| + if (notification_.items.size() == 0) { |
| + layout->StartRow(2, 0); |
| + layout->SkipColumns(1); |
| + views::Label* message = new views::Label(notification_.message); |
| + message->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| + message->SetElideBehavior(views::Label::ELIDE_AT_END); |
| + message->SetEnabledColor(kMessageColor); |
| + message->SetBackgroundColor(kMessageBackgroundColor); |
| + message->set_border(MakePadding(0, 0, 3, kTextToClosePadding)); |
| + layout->AddView(message, 1, 1, |
| + views::GridLayout::LEADING, views::GridLayout::LEADING); |
| + layout->SkipColumns(1); |
| + } |
| + |
| + // One row for each notification item, including appropriate padding. The |
| + // resize factor of the last row of items (3) is higher than that of all |
| + // preceding rows (0, 1, and 2) to ensure the content of the notification is |
| + // top-aligned. |
| for (int i = 0, n = notification_.items.size(); i < n; ++i) { |
| int bottom_padding = (i < n - 1) ? 4 : (kTextBottomPadding - 2); |
| - layout->StartRow(0, 0); |
| + int resize_factor = (i < n - 1) ? 2 : 3; |
| + layout->StartRow(resize_factor, 0); |
| layout->SkipColumns(1); |
| ItemView* item = new ItemView(notification_.items[i]); |
| item->set_border(MakePadding(0, 0, bottom_padding, kTextToClosePadding)); |
| layout->AddView(item); |
| layout->SkipColumns(1); |
| } |
| + |
| + // One row for the image. |
| + layout->StartRow(0, 0); |
| + views::ImageView* image = new ProportionalImageView(); |
| + image->SetImageSize(notification_.image.size()); |
| + image->SetImage(notification_.image); |
| + image->SetHorizontalAlignment(views::ImageView::CENTER); |
| + image->SetVerticalAlignment(views::ImageView::LEADING); |
| + image->set_border(MakePadding(kImageTopPadding, kImageLeftPadding, |
| + kImageBottomPadding, kImageRightPadding)); |
| + layout->AddView(image, 3, 1, |
| + views::GridLayout::FILL, views::GridLayout::LEADING); |
| } |
| } // namespace message_center |