OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/app_list/views/search_result_view.h" | 5 #include "ui/app_list/views/search_result_view.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "ui/app_list/app_list_constants.h" | 9 #include "ui/app_list/app_list_constants.h" |
10 #include "ui/app_list/search_result.h" | 10 #include "ui/app_list/search_result.h" |
11 #include "ui/app_list/views/progress_bar_view.h" | 11 #include "ui/app_list/views/progress_bar_view.h" |
12 #include "ui/app_list/views/search_result_actions_view.h" | 12 #include "ui/app_list/views/search_result_actions_view.h" |
13 #include "ui/app_list/views/search_result_list_view.h" | 13 #include "ui/app_list/views/search_result_list_view.h" |
14 #include "ui/gfx/canvas.h" | 14 #include "ui/gfx/canvas.h" |
15 #include "ui/gfx/font.h" | 15 #include "ui/gfx/font.h" |
16 #include "ui/gfx/image/image_skia_operations.h" | 16 #include "ui/gfx/image/image_skia_operations.h" |
17 #include "ui/gfx/render_text.h" | 17 #include "ui/gfx/render_text.h" |
18 #include "ui/views/controls/button/image_button.h" | 18 #include "ui/views/controls/button/image_button.h" |
19 #include "ui/views/controls/image_view.h" | 19 #include "ui/views/controls/image_view.h" |
20 #include "ui/views/controls/menu/menu_runner.h" | 20 #include "ui/views/controls/menu/menu_runner.h" |
21 | 21 |
22 namespace app_list { | 22 namespace app_list { |
23 | 23 |
24 namespace { | 24 namespace { |
25 | 25 |
26 const int kPreferredWidth = 300; | 26 const int kPreferredWidth = 300; |
27 const int kPreferredHeight = 52; | 27 const int kPreferredHeight = 52; |
28 const int kIconDimension = 32; | |
29 const int kIconPadding = 14; | 28 const int kIconPadding = 14; |
30 const int kIconViewWidth = kIconDimension + 2 * kIconPadding; | |
31 const int kTextTrailPadding = kIconPadding; | 29 const int kTextTrailPadding = kIconPadding; |
32 const int kBorderSize = 1; | 30 const int kBorderSize = 1; |
33 | 31 |
34 // Extra margin at the right of the rightmost action icon. | 32 // Extra margin at the right of the rightmost action icon. |
35 const int kActionButtonRightMargin = 8; | 33 const int kActionButtonRightMargin = 8; |
36 | 34 |
| 35 int GetIconViewWidth() { |
| 36 return kListIconSize + 2 * kIconPadding; |
| 37 } |
| 38 |
37 // Creates a RenderText of given |text| and |styles|. Caller takes ownership | 39 // Creates a RenderText of given |text| and |styles|. Caller takes ownership |
38 // of returned RenderText. | 40 // of returned RenderText. |
39 gfx::RenderText* CreateRenderText(const base::string16& text, | 41 gfx::RenderText* CreateRenderText(const base::string16& text, |
40 const SearchResult::Tags& tags) { | 42 const SearchResult::Tags& tags) { |
41 gfx::RenderText* render_text = gfx::RenderText::CreateInstance(); | 43 gfx::RenderText* render_text = gfx::RenderText::CreateInstance(); |
42 render_text->SetText(text); | 44 render_text->SetText(text); |
43 render_text->SetColor(kResultDefaultTextColor); | 45 render_text->SetColor(kResultDefaultTextColor); |
44 | 46 |
45 for (SearchResult::Tags::const_iterator it = tags.begin(); | 47 for (SearchResult::Tags::const_iterator it = tags.begin(); |
46 it != tags.end(); | 48 it != tags.end(); |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
136 gfx::Size SearchResultView::GetPreferredSize() const { | 138 gfx::Size SearchResultView::GetPreferredSize() const { |
137 return gfx::Size(kPreferredWidth, kPreferredHeight); | 139 return gfx::Size(kPreferredWidth, kPreferredHeight); |
138 } | 140 } |
139 | 141 |
140 void SearchResultView::Layout() { | 142 void SearchResultView::Layout() { |
141 gfx::Rect rect(GetContentsBounds()); | 143 gfx::Rect rect(GetContentsBounds()); |
142 if (rect.IsEmpty()) | 144 if (rect.IsEmpty()) |
143 return; | 145 return; |
144 | 146 |
145 gfx::Rect icon_bounds(rect); | 147 gfx::Rect icon_bounds(rect); |
146 icon_bounds.set_width(kIconViewWidth); | 148 icon_bounds.set_width(GetIconViewWidth()); |
147 icon_bounds.Inset(kIconPadding, (rect.height() - kIconDimension) / 2); | 149 icon_bounds.Inset(kIconPadding, (rect.height() - kListIconSize) / 2); |
148 icon_bounds.Intersect(rect); | 150 icon_bounds.Intersect(rect); |
149 icon_->SetBoundsRect(icon_bounds); | 151 icon_->SetBoundsRect(icon_bounds); |
150 | 152 |
151 const int max_actions_width = | 153 const int max_actions_width = |
152 (rect.right() - kActionButtonRightMargin - icon_bounds.right()) / 2; | 154 (rect.right() - kActionButtonRightMargin - icon_bounds.right()) / 2; |
153 int actions_width = std::min(max_actions_width, | 155 int actions_width = std::min(max_actions_width, |
154 actions_view_->GetPreferredSize().width()); | 156 actions_view_->GetPreferredSize().width()); |
155 | 157 |
156 gfx::Rect actions_bounds(rect); | 158 gfx::Rect actions_bounds(rect); |
157 actions_bounds.set_x(rect.right() - kActionButtonRightMargin - actions_width); | 159 actions_bounds.set_x(rect.right() - kActionButtonRightMargin - actions_width); |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
214 canvas->FillRect(content_rect, kSelectedColor); | 216 canvas->FillRect(content_rect, kSelectedColor); |
215 else if (hover) | 217 else if (hover) |
216 canvas->FillRect(content_rect, kHighlightedColor); | 218 canvas->FillRect(content_rect, kHighlightedColor); |
217 else | 219 else |
218 canvas->FillRect(content_rect, kContentsBackgroundColor); | 220 canvas->FillRect(content_rect, kContentsBackgroundColor); |
219 | 221 |
220 gfx::Rect border_bottom = gfx::SubtractRects(rect, content_rect); | 222 gfx::Rect border_bottom = gfx::SubtractRects(rect, content_rect); |
221 canvas->FillRect(border_bottom, kResultBorderColor); | 223 canvas->FillRect(border_bottom, kResultBorderColor); |
222 | 224 |
223 gfx::Rect text_bounds(rect); | 225 gfx::Rect text_bounds(rect); |
224 text_bounds.set_x(kIconViewWidth); | 226 text_bounds.set_x(GetIconViewWidth()); |
225 if (actions_view_->visible()) { | 227 if (actions_view_->visible()) { |
226 text_bounds.set_width( | 228 text_bounds.set_width( |
227 rect.width() - kIconViewWidth - kTextTrailPadding - | 229 rect.width() - GetIconViewWidth() - kTextTrailPadding - |
228 actions_view_->bounds().width() - | 230 actions_view_->bounds().width() - |
229 (actions_view_->has_children() ? kActionButtonRightMargin : 0)); | 231 (actions_view_->has_children() ? kActionButtonRightMargin : 0)); |
230 } else { | 232 } else { |
231 text_bounds.set_width( | 233 text_bounds.set_width(rect.width() - GetIconViewWidth() - |
232 rect.width() - kIconViewWidth - kTextTrailPadding - | 234 kTextTrailPadding - progress_bar_->bounds().width() - |
233 progress_bar_->bounds().width() - kActionButtonRightMargin); | 235 kActionButtonRightMargin); |
234 } | 236 } |
235 text_bounds.set_x(GetMirroredXWithWidthInView(text_bounds.x(), | 237 text_bounds.set_x(GetMirroredXWithWidthInView(text_bounds.x(), |
236 text_bounds.width())); | 238 text_bounds.width())); |
237 | 239 |
238 if (title_text_ && details_text_) { | 240 if (title_text_ && details_text_) { |
239 gfx::Size title_size(text_bounds.width(), | 241 gfx::Size title_size(text_bounds.width(), |
240 title_text_->GetStringSize().height()); | 242 title_text_->GetStringSize().height()); |
241 gfx::Size details_size(text_bounds.width(), | 243 gfx::Size details_size(text_bounds.width(), |
242 details_text_->GetStringSize().height()); | 244 details_text_->GetStringSize().height()); |
243 int total_height = title_size.height() + + details_size.height(); | 245 int total_height = title_size.height() + + details_size.height(); |
(...skipping 28 matching lines...) Expand all Loading... |
272 gfx::ImageSkia image(result_ ? result_->icon() : gfx::ImageSkia()); | 274 gfx::ImageSkia image(result_ ? result_->icon() : gfx::ImageSkia()); |
273 // Note this might leave the view with an old icon. But it is needed to avoid | 275 // Note this might leave the view with an old icon. But it is needed to avoid |
274 // flash when a SearchResult's icon is loaded asynchronously. In this case, it | 276 // flash when a SearchResult's icon is loaded asynchronously. In this case, it |
275 // looks nicer to keep the stale icon for a little while on screen instead of | 277 // looks nicer to keep the stale icon for a little while on screen instead of |
276 // clearing it out. It should work correctly as long as the SearchResult does | 278 // clearing it out. It should work correctly as long as the SearchResult does |
277 // not forget to SetIcon when it's ready. | 279 // not forget to SetIcon when it's ready. |
278 if (image.isNull()) | 280 if (image.isNull()) |
279 return; | 281 return; |
280 | 282 |
281 // Scales down big icons but leave small ones unchanged. | 283 // Scales down big icons but leave small ones unchanged. |
282 if (image.width() > kIconDimension || image.height() > kIconDimension) { | 284 if (image.width() > kListIconSize || image.height() > kListIconSize) { |
283 image = gfx::ImageSkiaOperations::CreateResizedImage( | 285 image = gfx::ImageSkiaOperations::CreateResizedImage( |
284 image, | 286 image, |
285 skia::ImageOperations::RESIZE_BEST, | 287 skia::ImageOperations::RESIZE_BEST, |
286 gfx::Size(kIconDimension, kIconDimension)); | 288 gfx::Size(kListIconSize, kListIconSize)); |
287 } else { | 289 } else { |
288 icon_->ResetImageSize(); | 290 icon_->ResetImageSize(); |
289 } | 291 } |
290 | 292 |
291 // Set the image to an empty image before we reset the image because | 293 // Set the image to an empty image before we reset the image because |
292 // since we're using the same backing store for our images, sometimes | 294 // since we're using the same backing store for our images, sometimes |
293 // ImageView won't detect that we have a new image set due to the pixel | 295 // ImageView won't detect that we have a new image set due to the pixel |
294 // buffer pointers remaining the same despite the image changing. | 296 // buffer pointers remaining the same despite the image changing. |
295 icon_->SetImage(gfx::ImageSkia()); | 297 icon_->SetImage(gfx::ImageSkia()); |
296 icon_->SetImage(image); | 298 icon_->SetImage(image); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
346 if (context_menu_runner_->RunMenuAt(GetWidget(), | 348 if (context_menu_runner_->RunMenuAt(GetWidget(), |
347 NULL, | 349 NULL, |
348 gfx::Rect(point, gfx::Size()), | 350 gfx::Rect(point, gfx::Size()), |
349 views::MENU_ANCHOR_TOPLEFT, | 351 views::MENU_ANCHOR_TOPLEFT, |
350 source_type) == | 352 source_type) == |
351 views::MenuRunner::MENU_DELETED) | 353 views::MenuRunner::MENU_DELETED) |
352 return; | 354 return; |
353 } | 355 } |
354 | 356 |
355 } // namespace app_list | 357 } // namespace app_list |
OLD | NEW |