Index: ui/aura_shell/app_list/tile_view.cc |
diff --git a/ui/aura_shell/app_list/tile_view.cc b/ui/aura_shell/app_list/tile_view.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..82bb2d4501508617eab26b9fc9662478f2c60907 |
--- /dev/null |
+++ b/ui/aura_shell/app_list/tile_view.cc |
@@ -0,0 +1,162 @@ |
+// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "ui/aura_shell/app_list/tile_view.h" |
+ |
+#include "base/utf_string_conversions.h" |
+#include "ui/base/resource/resource_bundle.h" |
+#include "ui/gfx/canvas.h" |
+#include "ui/gfx/font.h" |
+#include "ui/aura_shell/app_list/app_list_view.h" |
+#include "ui/aura_shell/app_list/app_list_item_model.h" |
+#include "ui/aura_shell/app_list/drop_shadow_label.h" |
+#include "ui/aura_shell/app_list/tiles_page_view.h" |
+#include "ui/views/controls/image_view.h" |
+#include "ui/views/controls/label.h" |
+#include "ui/views/widget/widget.h" |
+#include "third_party/skia/include/core/SkColor.h" |
+ |
+namespace aura_shell { |
+ |
+namespace { |
+ |
+const double kFocusedScale = 1.1; |
+ |
+// TitleLabel for a TileView. |
+class TitleLabel : public DropShadowLabel { |
+ public: |
+ TitleLabel() { |
+ ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
+ SetFont(rb.GetFont(ResourceBundle::BaseFont).DeriveFont( |
+ 2, gfx::Font::BOLD)); |
+ SetBackgroundColor(0); |
+ SetEnabledColor(SK_ColorWHITE); |
+ } |
+ |
+ virtual ~TitleLabel() {} |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(TitleLabel); |
+}; |
+ |
+} // namespace |
+ |
+TileView::TileView(AppListItemModel* model) |
+ : model_(model), |
+ icon_(new views::ImageView), |
+ label_(new TitleLabel) { |
+ set_focusable(true); |
+ |
+ AddChildView(icon_); |
+ ItemIconChanged(); |
+ |
+ AddChildView(label_); |
+ ItemTitleChanged(); |
+ |
+ model_->AddObserver(this); |
+} |
+ |
+TileView::~TileView() { |
+ model_->RemoveObserver(this); |
+} |
+ |
+void TileView::ItemIconChanged() { |
+ icon_->SetImage(model_->icon()); |
+} |
+ |
+void TileView::ItemTitleChanged() { |
+ label_->SetText(UTF8ToUTF16(model_->title())); |
+} |
+ |
+void TileView::Activate(int event_flags) { |
+ model_->Activate(event_flags); |
+ static_cast<AppListView*>(GetWidget()->widget_delegate())->Close(); |
+} |
+ |
+gfx::Size TileView::GetPreferredSize() { |
+ return gfx::Size(kTileSize, kTileSize); |
+} |
+ |
+void TileView::Layout() { |
+ gfx::Rect rect(GetContentsBounds()); |
+ |
+ gfx::Size title_size = label_->GetPreferredSize(); |
+ |
+ if (!HasFocus()) { |
+ const int horiz_padding = (kTileSize - kIconSize) / 2; |
+ const int vert_padding = (kTileSize - title_size.height() - kIconSize) / 2; |
+ rect.Inset(horiz_padding, vert_padding); |
+ } |
+ |
+ icon_->SetBounds(rect.x(), rect.y(), |
+ rect.width(), rect.height() - title_size.height()); |
+ |
+ label_->SetBounds(rect.x(), rect.bottom() - title_size.height(), |
+ rect.width(), title_size.height()); |
+} |
+ |
+void TileView::OnFocus() { |
+ gfx::Size icon_size = icon_->GetPreferredSize(); |
+ icon_size.set_width(icon_size.width() * kFocusedScale); |
+ icon_size.set_height(icon_size.height() * kFocusedScale); |
+ |
+ gfx::Size max_size = GetPreferredSize(); |
+ if (icon_size.width() > max_size.width() || |
+ icon_size.height() > max_size.height()) { |
+ double aspect = |
+ static_cast<double>(icon_size.width()) / icon_size.height(); |
+ |
+ if (aspect > 1) { |
+ icon_size.set_width(max_size.width()); |
+ icon_size.set_height(icon_size.width() / aspect); |
+ } else { |
+ icon_size.set_height(max_size.height()); |
+ icon_size.set_width(icon_size.height() * aspect); |
+ } |
+ } |
+ |
+ icon_->SetImageSize(icon_size); |
+ Layout(); |
+ |
+ TilesPageView* tiles_page = static_cast<TilesPageView*>(parent()); |
+ tiles_page->UpdateFocusedTile(this); |
+ |
+ View::OnFocus(); |
+} |
+ |
+void TileView::OnBlur() { |
+ icon_->ResetImageSize(); |
+ Layout(); |
+ SchedulePaint(); |
+} |
+ |
+bool TileView::OnKeyPressed(const views::KeyEvent& event) { |
+ if (event.key_code() == ui::VKEY_RETURN) { |
+ Activate(event.flags()); |
+ return true; |
+ } |
+ |
+ return false; |
+} |
+ |
+bool TileView::OnMousePressed(const views::MouseEvent& event) { |
+ views::View* hit_view = GetEventHandlerForPoint(event.location()); |
+ bool hit = hit_view != this; |
+ if (hit) |
+ RequestFocus(); |
+ |
+ return hit; |
+} |
+ |
+void TileView::OnMouseReleased(const views::MouseEvent& event) { |
+ views::View* hit_view = GetEventHandlerForPoint(event.location()); |
+ if (hit_view != this) |
+ Activate(event.flags()); |
+} |
+ |
+void TileView::OnPaintFocusBorder(gfx::Canvas* canvas) { |
+ // No focus border for TileView. |
+} |
+ |
+} // namespace aura_shell |