Chromium Code Reviews| Index: ui/app_list/search_result_view.cc |
| diff --git a/ui/app_list/search_result_view.cc b/ui/app_list/search_result_view.cc |
| index 7c71e8e9fccb6b89dad6b46e986b6e1fa6f2868c..98e6b5b664d064b987dac0e98cbbbf4c9b740c54 100644 |
| --- a/ui/app_list/search_result_view.cc |
| +++ b/ui/app_list/search_result_view.cc |
| @@ -8,7 +8,9 @@ |
| #include "ui/app_list/search_result_list_view.h" |
| #include "ui/gfx/canvas.h" |
| #include "ui/gfx/font.h" |
| +#include "ui/gfx/image/image_skia_operations.h" |
| #include "ui/gfx/render_text.h" |
| +#include "ui/views/controls/button/image_button.h" |
| #include "ui/views/controls/image_view.h" |
| namespace { |
| @@ -21,6 +23,15 @@ const int kIconViewWidth = kIconDimension + 2 * kIconPadding; |
| const int kTextTrailPadding = kIconPadding; |
| const int kBorderSize = 1; |
| +// Maximum dimensions of a search result's action icons. |
| +const int kActionIconDimension = 24; |
| + |
| +// Total space (including padding) used for each action icon's button. |
| +const int kActionButtonWidth = 32; |
| + |
| +// Extra margin at the right of the rightmost action icon. |
| +const int kActionButtonRightMargin = 8; |
| + |
| const SkColor kBorderColor = SkColorSetARGB(0x0F, 0, 0, 0); |
| const SkColor kDefaultTextColor = SkColorSetRGB(0x33, 0x33, 0x33); |
| @@ -89,10 +100,11 @@ namespace app_list { |
| const char SearchResultView::kViewClassName[] = "ui/app_list/SearchResultView"; |
| SearchResultView::SearchResultView(SearchResultListView* list_view, |
| - views::ButtonListener* listener) |
| - : views::CustomButton(listener), |
| + SearchResultViewDelegate* delegate) |
| + : views::CustomButton(this), |
| result_(NULL), |
| list_view_(list_view), |
| + delegate_(delegate), |
| icon_(new IconView) { |
| AddChildView(icon_); |
| } |
| @@ -109,6 +121,7 @@ void SearchResultView::SetResult(SearchResult* result) { |
| result_->AddObserver(this); |
| OnIconChanged(); |
| + OnActionIconsChanged(); |
| UpdateTitleText(); |
| UpdateDetailsText(); |
| SchedulePaint(); |
| @@ -155,6 +168,17 @@ void SearchResultView::Layout() { |
| icon_bounds.set_width(kIconViewWidth); |
| icon_bounds.Inset(kIconPadding, (rect.height() - kIconDimension) / 2); |
| icon_->SetBoundsRect(icon_bounds.Intersect(rect)); |
| + |
| + size_t num_buttons = action_buttons_.size(); |
| + for (size_t i = 0; i < num_buttons; ++i) { |
| + views::ImageButton* button = action_buttons_[i]; |
| + gfx::Rect button_bounds( |
| + rect.width() - kActionButtonRightMargin - |
|
xiyuan
2012/08/28 01:01:49
nit: rect.width() -> rect.right()
Currently it is
Daniel Erat
2012/08/28 16:45:37
Done.
|
| + (num_buttons - i) * kActionButtonWidth, |
| + (rect.height() - kActionIconDimension) / 2, |
|
xiyuan
2012/08/28 01:01:49
nit: similar to above, add "rect.y() +" so that it
Daniel Erat
2012/08/28 16:45:37
Done.
|
| + kActionButtonWidth, kActionIconDimension); |
| + button->SetBoundsRect(button_bounds); |
| + } |
| } |
| void SearchResultView::OnPaint(gfx::Canvas* canvas) { |
| @@ -178,7 +202,10 @@ void SearchResultView::OnPaint(gfx::Canvas* canvas) { |
| gfx::Rect text_bounds(rect); |
| text_bounds.set_x(kIconViewWidth); |
| - text_bounds.set_width(rect.width() - kIconViewWidth - kTextTrailPadding); |
| + text_bounds.set_width( |
| + rect.width() - kIconViewWidth - kTextTrailPadding - |
| + action_buttons_.size() * kActionButtonWidth - |
| + (!action_buttons_.empty() ? kActionButtonRightMargin : 0)); |
| if (title_text_.get() && details_text_.get()) { |
| gfx::Size title_size(text_bounds.width(), |
| @@ -204,6 +231,22 @@ void SearchResultView::OnPaint(gfx::Canvas* canvas) { |
| } |
| } |
| +void SearchResultView::ButtonPressed(views::Button* sender, |
| + const ui::Event& event) { |
| + if (sender == this) { |
| + delegate_->SearchResultActivated(this, event); |
| + return; |
| + } |
| + |
| + for (size_t i = 0; i < action_buttons_.size(); ++i) { |
| + if (sender == action_buttons_[i]) { |
| + delegate_->SearchResultActionActivated(this, i, event); |
| + return; |
| + } |
| + } |
| + NOTREACHED() << "Got unexpected button press on " << sender; |
| +} |
| + |
| void SearchResultView::OnIconChanged() { |
| gfx::ImageSkia image(result_ ? result_->icon() : gfx::ImageSkia()); |
| // Note this might leave the view with an old icon. But it is needed to avoid |
| @@ -215,12 +258,44 @@ void SearchResultView::OnIconChanged() { |
| return; |
| // Scales down big icons but leave small ones unchanged. |
| - if (image.width() > kIconDimension || image.height() > kIconDimension) |
| - icon_->SetImageSize(gfx::Size(kIconDimension, kIconDimension)); |
| - else |
| + if (image.width() > kIconDimension || image.height() > kIconDimension) { |
| + image = gfx::ImageSkiaOperations::CreateResizedImage( |
|
Daniel Erat
2012/08/27 23:16:51
I can take this out if you were intentionally usin
xiyuan
2012/08/28 01:01:49
Think your change is better than old code. The per
|
| + image, |
| + skia::ImageOperations::RESIZE_BEST, |
| + gfx::Size(kIconDimension, kIconDimension)); |
| + } else { |
| icon_->ResetImageSize(); |
| + } |
| icon_->SetImage(image); |
| } |
| +void SearchResultView::OnActionIconsChanged() { |
| + while (action_buttons_.size() > |
| + (result_ ? result_->action_icons().size() : 0)) { |
| + RemoveChildView(action_buttons_.back()); |
| + action_buttons_.pop_back(); |
| + } |
| + |
| + if (result_) { |
| + while (action_buttons_.size() < result_->action_icons().size()) { |
| + views::ImageButton* button = new views::ImageButton(this); |
| + button->SetImageAlignment(views::ImageButton::ALIGN_CENTER, |
| + views::ImageButton::ALIGN_MIDDLE); |
| + AddChildView(button); |
| + action_buttons_.push_back(button); |
| + } |
| + |
| + const SearchResult::ActionIconSets& icons = result_->action_icons(); |
| + for (size_t i = 0; i < icons.size(); ++i) { |
| + const SearchResult::ActionIconSet& icon = icons.at(i); |
| + views::ImageButton* button = action_buttons_[i]; |
| + button->SetImage(views::CustomButton::BS_NORMAL, &icon.base_image); |
| + button->SetImage(views::CustomButton::BS_HOT, &icon.hover_image); |
| + button->SetImage(views::CustomButton::BS_PUSHED, &icon.pressed_image); |
| + button->SetTooltipText(icon.tooltip_text); |
| + } |
| + } |
| +} |
| + |
| } // namespace app_list |