1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file. 4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/app_list/views/tile_item_view.h" 6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/app_list/app_list_constants.h" 9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/app_list/app_list_item.h" 10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/app_list/app_list_model.h" 11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/app_list/app_list_view_delegate.h" 126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "ui/app_list/search_result.h" 13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/app_list/views/app_list_main_view.h" 14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/gfx/canvas.h" 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/gfx/color_analysis.h" 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/gfx/color_utils.h" 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/views/background.h" 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/views/controls/image_view.h" 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/views/controls/label.h" 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/views/layout/box_layout.h" 21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace { 23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const int kTileSize = 90; 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const int kTileHorizontalPadding = 10; 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace app_list { 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TileItemView::TileItemView() 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) : views::CustomButton(this), 33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) item_(NULL), 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) icon_(new views::ImageView), 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci title_(new views::Label) { 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) views::BoxLayout* layout_manager = new views::BoxLayout( 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) views::BoxLayout::kVertical, kTileHorizontalPadding, 0, 0); 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) layout_manager->set_main_axis_alignment( 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) views::BoxLayout::MAIN_AXIS_ALIGNMENT_CENTER); 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetLayoutManager(layout_manager); 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) icon_->SetImageSize(gfx::Size(kTileIconSize, kTileIconSize)); 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) title_->SetAutoColorReadabilityEnabled(false); 46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) title_->SetEnabledColor(kGridTitleColor); 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci title_->set_background(views::Background::CreateSolidBackground( 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci app_list::kContentsBackgroundColor)); 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) title_->SetFontList(rb.GetFontList(kItemTextFontStyle)); 50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) title_->SetHorizontalAlignment(gfx::ALIGN_CENTER); 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // When |item_| is NULL, the tile is invisible. Calling SetSearchResult with a 53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // non-NULL item makes the tile visible. 54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SetVisible(false); 55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) AddChildView(icon_); 57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) AddChildView(title_); 58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TileItemView::~TileItemView() { 616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (item_) 626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) item_->RemoveObserver(this); 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void TileItemView::SetSearchResult(SearchResult* item) { 666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) SetVisible(item != NULL); 676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) SearchResult* old_item = item_; 696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (old_item) 706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) old_item->RemoveObserver(this); 71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) item_ = item; 736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (!item) 75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) item_->AddObserver(this); 78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) title_->SetText(item_->title()); 806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Only refresh the icon if it's different from the old one. This prevents 826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // flickering. 836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (old_item == NULL || 846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) !item->icon().BackedBySameObjectAs(old_item->icon())) { 856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) OnIconChanged(); 866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)gfx::Size TileItemView::GetPreferredSize() const { 90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return gfx::Size(kTileSize, kTileSize); 91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void TileItemView::ButtonPressed(views::Button* sender, 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const ui::Event& event) { 956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) item_->Open(event.flags()); 966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void TileItemView::OnIconChanged() { 996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) icon_->SetImage(item_->icon()); 1006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 1016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void TileItemView::OnResultDestroying() { 1036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (item_) 1046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) item_->RemoveObserver(this); 1056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) item_ = NULL; 106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 10846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} // namespace app_list 109