Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/tile_item_view.h" | 5 #include "ui/app_list/views/tile_item_view.h" |
| 6 | 6 |
| 7 #include "ui/app_list/app_list_constants.h" | 7 #include "ui/app_list/app_list_constants.h" |
| 8 #include "ui/app_list/app_list_features.h" | 8 #include "ui/app_list/app_list_features.h" |
| 9 #include "ui/app_list/views/app_list_main_view.h" | 9 #include "ui/app_list/views/app_list_main_view.h" |
| 10 #include "ui/gfx/canvas.h" | 10 #include "ui/gfx/canvas.h" |
| 11 #include "ui/gfx/font_list.h" | |
| 11 #include "ui/gfx/image/canvas_image_source.h" | 12 #include "ui/gfx/image/canvas_image_source.h" |
| 12 #include "ui/gfx/image/image_skia_operations.h" | 13 #include "ui/gfx/image/image_skia_operations.h" |
| 13 #include "ui/views/background.h" | 14 #include "ui/views/background.h" |
| 14 #include "ui/views/controls/image_view.h" | 15 #include "ui/views/controls/image_view.h" |
| 15 #include "ui/views/controls/label.h" | 16 #include "ui/views/controls/label.h" |
| 16 #include "ui/views/layout/box_layout.h" | 17 #include "ui/views/layout/box_layout.h" |
| 17 | 18 |
| 18 namespace { | 19 namespace { |
| 19 | 20 |
| 20 constexpr int kTopPadding = 5; | 21 constexpr int kTopPadding = 5; |
| 21 constexpr int kTileSize = 90; | 22 constexpr int kTileSize = 90; |
| 22 constexpr int kIconTitleSpacing = 6; | 23 constexpr int kIconTitleSpacing = 6; |
| 23 | 24 |
| 24 constexpr int kBadgeBackgroundRadius = 10; | 25 constexpr int kBadgeBackgroundRadius = 10; |
| 25 | 26 |
| 27 // Layout constants used when fullscreen app list feature is enabled. | |
| 28 constexpr int kItemTopPadding = 4; | |
| 29 constexpr int kItemWidth = 80; | |
| 30 constexpr int kItemHeight = 90; | |
| 31 | |
| 26 // The background image source for badge. | 32 // The background image source for badge. |
| 27 class BadgeBackgroundImageSource : public gfx::CanvasImageSource { | 33 class BadgeBackgroundImageSource : public gfx::CanvasImageSource { |
| 28 public: | 34 public: |
| 29 explicit BadgeBackgroundImageSource(int size) | 35 explicit BadgeBackgroundImageSource(int size) |
| 30 : CanvasImageSource(gfx::Size(size, size), false), | 36 : CanvasImageSource(gfx::Size(size, size), false), |
| 31 radius_(static_cast<float>(size / 2)) {} | 37 radius_(static_cast<float>(size / 2)) {} |
| 32 ~BadgeBackgroundImageSource() override = default; | 38 ~BadgeBackgroundImageSource() override = default; |
| 33 | 39 |
| 34 private: | 40 private: |
| 35 // gfx::CanvasImageSource overrides: | 41 // gfx::CanvasImageSource overrides: |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 48 | 54 |
| 49 } // namespace | 55 } // namespace |
| 50 | 56 |
| 51 namespace app_list { | 57 namespace app_list { |
| 52 | 58 |
| 53 TileItemView::TileItemView() | 59 TileItemView::TileItemView() |
| 54 : views::CustomButton(this), | 60 : views::CustomButton(this), |
| 55 parent_background_color_(SK_ColorTRANSPARENT), | 61 parent_background_color_(SK_ColorTRANSPARENT), |
| 56 icon_(new views::ImageView), | 62 icon_(new views::ImageView), |
| 57 badge_(nullptr), | 63 badge_(nullptr), |
| 58 title_(new views::Label) { | 64 title_(new views::Label), |
| 65 price_(nullptr), | |
| 66 rating_(nullptr), | |
| 67 is_fullscreen_app_list_enabled_(features::IsFullscreenAppListEnabled()) { | |
| 59 // Prevent the icon view from interfering with our mouse events. | 68 // Prevent the icon view from interfering with our mouse events. |
| 60 icon_->set_can_process_events_within_subtree(false); | 69 icon_->set_can_process_events_within_subtree(false); |
| 61 icon_->SetVerticalAlignment(views::ImageView::LEADING); | 70 icon_->SetVerticalAlignment(views::ImageView::LEADING); |
| 62 | 71 |
| 63 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); | 72 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
| 64 title_->SetAutoColorReadabilityEnabled(false); | 73 title_->SetAutoColorReadabilityEnabled(false); |
| 65 title_->SetEnabledColor(kGridTitleColor); | 74 title_->SetEnabledColor(kGridTitleColor); |
| 66 title_->SetFontList(rb.GetFontList(kItemTextFontStyle)); | 75 title_->SetFontList(rb.GetFontList(kItemTextFontStyle)); |
| 67 title_->SetHorizontalAlignment(gfx::ALIGN_CENTER); | 76 title_->SetHorizontalAlignment(gfx::ALIGN_CENTER); |
| 68 title_->SetHandlesTooltips(false); | 77 title_->SetHandlesTooltips(false); |
| 69 | 78 |
| 70 AddChildView(icon_); | 79 AddChildView(icon_); |
| 71 if (features::IsFullscreenAppListEnabled()) { | 80 AddChildView(title_); |
| 81 | |
| 82 if (is_fullscreen_app_list_enabled_) { | |
| 72 badge_ = new views::ImageView(); | 83 badge_ = new views::ImageView(); |
| 73 badge_->set_can_process_events_within_subtree(false); | 84 badge_->set_can_process_events_within_subtree(false); |
| 74 badge_->SetVerticalAlignment(views::ImageView::LEADING); | 85 badge_->SetVerticalAlignment(views::ImageView::LEADING); |
| 75 AddChildView(badge_); | 86 AddChildView(badge_); |
| 87 | |
| 88 price_ = new views::Label; | |
| 89 price_->SetEnabledColor(kAppPriceColor); | |
| 90 price_->SetFontList(gfx::FontList(kAppPriceFontList)); | |
|
xiyuan
2017/06/20 22:19:23
Roboto is the current default UI font. Let's try n
weidongg
2017/06/22 00:59:16
Good to know, thanks. Done.
| |
| 91 price_->SetHorizontalAlignment(gfx::ALIGN_RIGHT); | |
| 92 AddChildView(price_); | |
| 93 | |
| 94 rating_ = new views::Label; | |
| 95 rating_->SetEnabledColor(kAppRatingColor); | |
| 96 rating_->SetFontList(gfx::FontList(kAppRatingFontList)); | |
| 97 rating_->SetHorizontalAlignment(gfx::ALIGN_LEFT); | |
| 98 AddChildView(rating_); | |
| 76 } | 99 } |
| 77 AddChildView(title_); | |
| 78 } | 100 } |
| 79 | 101 |
| 80 TileItemView::~TileItemView() = default; | 102 TileItemView::~TileItemView() = default; |
| 81 | 103 |
| 82 void TileItemView::SetSelected(bool selected) { | 104 void TileItemView::SetSelected(bool selected) { |
| 83 if (selected == selected_) | 105 if (selected == selected_) |
| 84 return; | 106 return; |
| 85 | 107 |
| 86 selected_ = selected; | 108 selected_ = selected; |
| 87 UpdateBackgroundColor(); | 109 UpdateBackgroundColor(); |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 141 badge_->SetImage(gfx::ImageSkiaOperations::CreateImageWithDropShadow( | 163 badge_->SetImage(gfx::ImageSkiaOperations::CreateImageWithDropShadow( |
| 142 icon_with_background, shadow_values)); | 164 icon_with_background, shadow_values)); |
| 143 badge_->SetVisible(true); | 165 badge_->SetVisible(true); |
| 144 } | 166 } |
| 145 | 167 |
| 146 void TileItemView::SetTitle(const base::string16& title) { | 168 void TileItemView::SetTitle(const base::string16& title) { |
| 147 title_->SetText(title); | 169 title_->SetText(title); |
| 148 SetAccessibleName(title); | 170 SetAccessibleName(title); |
| 149 } | 171 } |
| 150 | 172 |
| 173 void TileItemView::SetPrice(const base::string16& price) { | |
| 174 if (!price_) | |
| 175 return; | |
| 176 price_->SetText(price); | |
| 177 } | |
| 178 | |
| 179 void TileItemView::SetRating(const base::string16& rating) { | |
| 180 if (!rating_) | |
| 181 return; | |
| 182 rating_->SetText(rating); | |
| 183 } | |
| 184 | |
| 151 void TileItemView::StateChanged(ButtonState old_state) { | 185 void TileItemView::StateChanged(ButtonState old_state) { |
| 152 UpdateBackgroundColor(); | 186 UpdateBackgroundColor(); |
| 153 } | 187 } |
| 154 | 188 |
| 155 void TileItemView::Layout() { | 189 void TileItemView::Layout() { |
|
Qiang(Joe) Xu
2017/06/21 17:43:12
I think we would better not do Layout here. TileIt
weidongg
2017/06/22 00:59:16
Yes, agree. Rebased to your change.
| |
| 156 gfx::Rect rect(GetContentsBounds()); | 190 gfx::Rect rect(GetContentsBounds()); |
| 157 if (rect.IsEmpty()) | 191 if (rect.IsEmpty()) |
| 158 return; | 192 return; |
| 159 | 193 |
| 160 rect.Inset(0, kTopPadding, 0, 0); | 194 rect.Inset(0, is_fullscreen_app_list_enabled_ ? kItemTopPadding : kTopPadding, |
| 195 0, 0); | |
| 161 icon_->SetBoundsRect(rect); | 196 icon_->SetBoundsRect(rect); |
| 162 | 197 |
| 163 if (badge_) { | 198 if (badge_) { |
| 164 gfx::Rect badge_rect(rect); | 199 gfx::Rect badge_rect(rect); |
| 165 gfx::Size icon_size = icon_->GetImage().size(); | 200 gfx::Size icon_size = icon_->GetImage().size(); |
| 166 badge_rect.Offset( | 201 badge_rect.Offset( |
| 167 (icon_size.width() - kAppBadgeIconSize) / 2, | 202 (icon_size.width() - kAppBadgeIconSize) / 2, |
| 168 icon_size.height() - kBadgeBackgroundRadius - kAppBadgeIconSize / 2); | 203 icon_size.height() - kBadgeBackgroundRadius - kAppBadgeIconSize / 2); |
| 169 badge_->SetBoundsRect(badge_rect); | 204 badge_->SetBoundsRect(badge_rect); |
| 170 } | 205 } |
| 171 | 206 |
| 172 rect.Inset(0, kGridIconDimension + kIconTitleSpacing, 0, 0); | 207 rect.Inset(0, kGridIconDimension + kIconTitleSpacing, 0, 0); |
| 173 rect.set_height(title_->GetPreferredSize().height()); | 208 rect.set_height(title_->GetPreferredSize().height()); |
| 174 title_->SetBoundsRect(rect); | 209 title_->SetBoundsRect(rect); |
| 210 | |
| 211 if (price_) { | |
| 212 gfx::Rect price_rect(rect); | |
| 213 price_rect.Inset(0, title_->GetPreferredSize().height(), 0, 0); | |
| 214 price_rect.set_height(price_->GetPreferredSize().height()); | |
| 215 price_->SetBoundsRect(price_rect); | |
| 216 } | |
| 217 | |
| 218 if (rating_) { | |
| 219 gfx::Rect rating_rect(rect); | |
| 220 rating_rect.Inset(0, title_->GetPreferredSize().height(), 0, 0); | |
| 221 rating_rect.set_height(rating_->GetPreferredSize().height()); | |
| 222 rating_->SetBoundsRect(rating_rect); | |
| 223 } | |
| 175 } | 224 } |
| 176 | 225 |
| 177 const char* TileItemView::GetClassName() const { | 226 const char* TileItemView::GetClassName() const { |
| 178 return "TileItemView"; | 227 return "TileItemView"; |
| 179 } | 228 } |
| 180 | 229 |
| 181 void TileItemView::ImageShadowAnimationProgressed( | 230 void TileItemView::ImageShadowAnimationProgressed( |
| 182 ImageShadowAnimator* animator) { | 231 ImageShadowAnimator* animator) { |
| 183 icon_->SetImage(animator->shadow_image()); | 232 icon_->SetImage(animator->shadow_image()); |
| 184 } | 233 } |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 203 // Tell the label what color it will be drawn onto. It will use whether the | 252 // Tell the label what color it will be drawn onto. It will use whether the |
| 204 // background color is opaque or transparent to decide whether to use subpixel | 253 // background color is opaque or transparent to decide whether to use subpixel |
| 205 // rendering. Does not actually set the label's background color. | 254 // rendering. Does not actually set the label's background color. |
| 206 title_->SetBackgroundColor(background_color); | 255 title_->SetBackgroundColor(background_color); |
| 207 | 256 |
| 208 SetBackground(std::move(background)); | 257 SetBackground(std::move(background)); |
| 209 SchedulePaint(); | 258 SchedulePaint(); |
| 210 } | 259 } |
| 211 | 260 |
| 212 gfx::Size TileItemView::CalculatePreferredSize() const { | 261 gfx::Size TileItemView::CalculatePreferredSize() const { |
| 213 return gfx::Size(kTileSize, kTileSize); | 262 if (is_fullscreen_app_list_enabled_) |
| 263 return gfx::Size(kItemWidth, kItemHeight); | |
| 264 else | |
|
xiyuan
2017/06/20 22:19:23
Don't use else after return.
See https://chromium
weidongg
2017/06/22 00:59:16
Done.
| |
| 265 return gfx::Size(kTileSize, kTileSize); | |
| 214 } | 266 } |
| 215 | 267 |
| 216 bool TileItemView::GetTooltipText(const gfx::Point& p, | 268 bool TileItemView::GetTooltipText(const gfx::Point& p, |
| 217 base::string16* tooltip) const { | 269 base::string16* tooltip) const { |
| 218 // Use the label to generate a tooltip, so that it will consider its text | 270 // Use the label to generate a tooltip, so that it will consider its text |
| 219 // truncation in making the tooltip. We do not want the label itself to have a | 271 // truncation in making the tooltip. We do not want the label itself to have a |
| 220 // tooltip, so we only temporarily enable it to get the tooltip text from the | 272 // tooltip, so we only temporarily enable it to get the tooltip text from the |
| 221 // label, then disable it again. | 273 // label, then disable it again. |
| 222 title_->SetHandlesTooltips(true); | 274 title_->SetHandlesTooltips(true); |
| 223 bool handled = title_->GetTooltipText(p, tooltip); | 275 bool handled = title_->GetTooltipText(p, tooltip); |
| 224 title_->SetHandlesTooltips(false); | 276 title_->SetHandlesTooltips(false); |
| 225 return handled; | 277 return handled; |
| 226 } | 278 } |
| 227 | 279 |
| 228 } // namespace app_list | 280 } // namespace app_list |
| OLD | NEW |