15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/app_list/views/app_list_item_view.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/accessibility/ax_view_state.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/app_list/app_list_constants.h" 12c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/app_list/app_list_folder_item.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/app_list/app_list_item.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/app_list/views/apps_grid_view.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/app_list/views/cached_label.h" 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/app_list/views/progress_bar_view.h" 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/base/dragdrop/drag_utils.h" 18c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/base/l10n/l10n_util.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/scoped_layer_animation_settings.h" 22d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/gfx/animation/throb_animation.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/canvas.h" 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/gfx/font_list.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image_skia_operations.h" 26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ui/gfx/point.h" 276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "ui/gfx/shadow_value.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/transform_util.h" 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/strings/grit/ui_strings.h" 30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "ui/views/background.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/image_view.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/label.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/menu/menu_runner.h" 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/views/drag_controller.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace app_list { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kTopPadding = 20; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kIconTitleSpacing = 7; 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kProgressBarHorizontalPadding = 12; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Radius of the folder dropping preview circle. 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const int kFolderPreviewRadius = 40; 46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kLeftRightPaddingChars = 1; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Scale to transform the icon when a drag starts. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const float kDraggingIconScale = 1.5f; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Delay in milliseconds of when the dragging UI should be shown for mouse drag. 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const int kMouseDragUIDelayInMs = 200; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)const gfx::ShadowValues& GetIconShadows() { 566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) CR_DEFINE_STATIC_LOCAL( 576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const gfx::ShadowValues, 586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) icon_shadows, 596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) (1, 606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) gfx::ShadowValue(gfx::Point(0, 2), 2, SkColorSetARGB(0x24, 0, 0, 0)))); 616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return icon_shadows; 626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccigfx::FontList GetFontList() { 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const gfx::FontList& font_list = rb.GetFontList(kItemTextFontStyle); 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// The font is different on each platform. The font size is adjusted on some 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// platforms to keep a consistent look. 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_LINUX) && !defined(OS_CHROMEOS) 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Reducing the font size by 2 makes it the same as the Windows font size. 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const int kFontSizeDelta = -2; 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return font_list.DeriveWithSizeDelta(kFontSizeDelta); 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return font_list; 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char AppListItemView::kViewClassName[] = "ui/app_list/AppListItemView"; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AppListItemView::AppListItemView(AppsGridView* apps_grid_view, 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AppListItem* item) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : CustomButton(apps_grid_view), 8603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) is_folder_(item->GetItemType() == AppListFolderItem::kItemType), 8703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) is_in_folder_(item->IsInFolder()), 8803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) item_weak_(item), 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apps_grid_view_(apps_grid_view), 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_(new views::ImageView), 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) title_(new CachedLabel), 92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch progress_bar_(new ProgressBarView), 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_state_(UI_STATE_NORMAL), 9403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) touch_dragging_(false), 9503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) is_installing_(false), 9603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) is_highlighted_(false) { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_->set_interactive(false); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title_->SetBackgroundColor(0); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title_->SetAutoColorReadabilityEnabled(false); 101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch title_->SetEnabledColor(kGridTitleColor); 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static const gfx::FontList font_list = GetFontList(); 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci title_->SetFontList(font_list); 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) title_->SetHorizontalAlignment(gfx::ALIGN_LEFT); 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) title_->Invalidate(); 107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SetTitleSubpixelAA(); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildView(icon_); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildView(title_); 111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch AddChildView(progress_bar_); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SetIcon(item->icon(), item->has_shadow()); 11403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SetItemName(base::UTF8ToUTF16(item->GetDisplayName()), 11503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::UTF8ToUTF16(item->name())); 11603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SetItemIsInstalling(item->is_installing()); 11703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SetItemIsHighlighted(item->highlighted()); 11803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) item->AddObserver(this); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_context_menu_controller(this); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_request_focus_on_press(false); 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetAnimationDuration(0); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AppListItemView::~AppListItemView() { 12703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (item_weak_) 12803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) item_weak_->RemoveObserver(this); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void AppListItemView::SetIcon(const gfx::ImageSkia& icon, bool has_shadow) { 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Clear icon and bail out if item icon is empty. 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (icon.isNull()) { 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_->SetImage(NULL); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) gfx::ImageSkia resized(gfx::ImageSkiaOperations::CreateResizedImage( 1396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) icon, 1406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) skia::ImageOperations::RESIZE_BEST, 1416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) gfx::Size(kGridIconDimension, kGridIconDimension))); 14203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (has_shadow) { 1436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) gfx::ImageSkia shadow(gfx::ImageSkiaOperations::CreateImageWithDropShadow( 1446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) resized, GetIconShadows())); 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) icon_->SetImage(shadow); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) icon_->SetImage(resized); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppListItemView::SetUIState(UIState state) { 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ui_state_ == state) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_state_ = state; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (ui_state_) { 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case UI_STATE_NORMAL: 16003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) title_->SetVisible(!is_installing_); 16103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) progress_bar_->SetVisible(is_installing_); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 163a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case UI_STATE_DRAGGING: 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title_->SetVisible(false); 16558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch progress_bar_->SetVisible(false); 166a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case UI_STATE_DROPPING_IN_FOLDER: 168a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 169a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if !defined(OS_WIN) 171a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ui::ScopedLayerAnimationSettings settings(layer()->GetAnimator()); 172a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) switch (ui_state_) { 173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case UI_STATE_NORMAL: 174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) layer()->SetTransform(gfx::Transform()); 175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case UI_STATE_DRAGGING: { 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect bounds(layer()->bounds().size()); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layer()->SetTransform(gfx::GetScaleTransform( 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds.CenterPoint(), 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kDraggingIconScale)); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 182f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case UI_STATE_DROPPING_IN_FOLDER: 184f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) break; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#endif // !OS_WIN 187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SchedulePaint(); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppListItemView::SetTouchDragging(bool touch_dragging) { 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (touch_dragging_ == touch_dragging) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) touch_dragging_ = touch_dragging; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetUIState(touch_dragging_ ? UI_STATE_DRAGGING : UI_STATE_NORMAL); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppListItemView::OnMouseDragTimer() { 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(apps_grid_view_->IsDraggedView(this)); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetUIState(UI_STATE_DRAGGING); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 204010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void AppListItemView::SetTitleSubpixelAA() { 205010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // TODO(tapted): Enable AA for folders as well, taking care to play nice with 206010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // the folder bubble animation. 20703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) bool enable_aa = !is_in_folder_ && ui_state_ == UI_STATE_NORMAL && 20803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) !is_highlighted_ && !apps_grid_view_->IsSelectedView(this) && 209010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) !apps_grid_view_->IsAnimatingView(this); 210010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 211010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) bool currently_enabled = title_->background() != NULL; 212010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (currently_enabled == enable_aa) 213010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 214010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 215010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (enable_aa) { 216010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) title_->SetBackgroundColor(app_list::kContentsBackgroundColor); 217010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) title_->set_background(views::Background::CreateSolidBackground( 218010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) app_list::kContentsBackgroundColor)); 219010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else { 220010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // In other cases, keep the background transparent to ensure correct 221010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // interactions with animations. This will temporarily disable subpixel AA. 222010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) title_->SetBackgroundColor(0); 223010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) title_->set_background(NULL); 224010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 225010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) title_->Invalidate(); 226010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) title_->SchedulePaint(); 227010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 228010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AppListItemView::Prerender() { 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) title_->PaintToBackingImage(); 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid AppListItemView::CancelContextMenu() { 2347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (context_menu_runner_) 2357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch context_menu_runner_->Cancel(); 2367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 2377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 238eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochgfx::ImageSkia AppListItemView::GetDragImage() { 2394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return icon_->GetImage(); 240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 241eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 242f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void AppListItemView::OnDragEnded() { 243f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mouse_drag_timer_.Stop(); 244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetUIState(UI_STATE_NORMAL); 245f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 246f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 247a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)gfx::Point AppListItemView::GetDragImageOffset() { 248a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::Point image = icon_->GetImageBounds().origin(); 249a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return gfx::Point(icon_->x() + image.x(), icon_->y() + image.y()); 250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 251a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 252f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void AppListItemView::SetAsAttemptedFolderTarget(bool is_target_folder) { 253f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (is_target_folder) 254f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetUIState(UI_STATE_DROPPING_IN_FOLDER); 255f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) else 256f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetUIState(UI_STATE_NORMAL); 257f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 258f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 25903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void AppListItemView::SetItemName(const base::string16& display_name, 26003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const base::string16& full_name) { 26103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) title_->SetText(display_name); 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) title_->Invalidate(); 26303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 26403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) title_->SetTooltipText(display_name == full_name ? base::string16() 26503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) : full_name); 26603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 267a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Use full name for accessibility. 26803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SetAccessibleName( 26903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) is_folder_ ? l10n_util::GetStringFUTF16( 27003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) IDS_APP_LIST_FOLDER_BUTTON_ACCESSIBILE_NAME, full_name) 27103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) : full_name); 272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Layout(); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void AppListItemView::SetItemIsHighlighted(bool is_highlighted) { 27603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) is_highlighted_ = is_highlighted; 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apps_grid_view_->EnsureViewVisible(this); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SchedulePaint(); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void AppListItemView::SetItemIsInstalling(bool is_installing) { 28203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) is_installing_ = is_installing; 28303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (is_installing_) 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) apps_grid_view_->EnsureViewVisible(this); 28503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 28603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (ui_state_ == UI_STATE_NORMAL) { 28703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) title_->SetVisible(!is_installing); 28803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) progress_bar_->SetVisible(is_installing); 28903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SchedulePaint(); 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void AppListItemView::SetItemPercentDownloaded(int percent_downloaded) { 294ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // A percent_downloaded() of -1 can mean it's not known how much percent is 295ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // completed, or the download hasn't been marked complete, as is the case 296ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // while an extension is being installed after being downloaded. 29703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (percent_downloaded == -1) 298ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return; 29903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) progress_bar_->SetValue(percent_downloaded / 100.0); 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 302b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)const char* AppListItemView::GetClassName() const { 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kViewClassName; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppListItemView::Layout() { 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect rect(GetContentsBounds()); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const int left_right_padding = 3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) title_->font_list().GetExpectedTextWidth(kLeftRightPaddingChars); 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rect.Inset(left_right_padding, kTopPadding, left_right_padding, 0); 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int y = rect.y(); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) icon_->SetBoundsRect(GetIconBoundsForTargetViewBounds(GetContentsBounds())); 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Size title_size = title_->GetPreferredSize(); 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect title_bounds(rect.x() + (rect.width() - title_size.width()) / 2, 3176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) y + kGridIconDimension + kIconTitleSpacing, 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) title_size.width(), 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) title_size.height()); 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) title_bounds.Intersect(rect); 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) title_->SetBoundsRect(title_bounds); 322eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 323eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gfx::Rect progress_bar_bounds(progress_bar_->GetPreferredSize()); 324eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch progress_bar_bounds.set_x(GetContentsBounds().x() + 325eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch kProgressBarHorizontalPadding); 326eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch progress_bar_bounds.set_y(title_bounds.y()); 327eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch progress_bar_->SetBoundsRect(progress_bar_bounds); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 330010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void AppListItemView::SchedulePaintInRect(const gfx::Rect& r) { 331010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SetTitleSubpixelAA(); 332010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) views::CustomButton::SchedulePaintInRect(r); 333010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 334010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppListItemView::OnPaint(gfx::Canvas* canvas) { 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (apps_grid_view_->IsDraggedView(this)) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect rect(GetContentsBounds()); 34003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (is_highlighted_ && !is_installing_) { 341b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) canvas->FillRect(rect, kHighlightedColor); 342f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; 343f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 344f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (apps_grid_view_->IsSelectedView(this)) 345f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) canvas->FillRect(rect, kSelectedColor); 346f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 347f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (ui_state_ == UI_STATE_DROPPING_IN_FOLDER) { 348f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(apps_grid_view_->model()->folders_enabled()); 349f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 350f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Draw folder dropping preview circle. 351f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Point center = gfx::Point(icon_->x() + icon_->size().width() / 2, 352f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) icon_->y() + icon_->size().height() / 2); 353f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SkPaint paint; 354f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) paint.setStyle(SkPaint::kFill_Style); 355f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) paint.setAntiAlias(true); 356f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) paint.setColor(kFolderBubbleColor); 357f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) canvas->DrawCircle(center, kFolderPreviewRadius, paint); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppListItemView::ShowContextMenuForView(views::View* source, 3627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const gfx::Point& point, 3637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ui::MenuSourceType source_type) { 36403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ui::MenuModel* menu_model = 36503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) item_weak_ ? item_weak_->GetContextMenuModel() : NULL; 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!menu_model) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 369116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch context_menu_runner_.reset( 370116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new views::MenuRunner(menu_model, views::MenuRunner::HAS_MNEMONICS)); 3715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (context_menu_runner_->RunMenuAt(GetWidget(), 3725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu NULL, 3735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu gfx::Rect(point, gfx::Size()), 3745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu views::MENU_ANCHOR_TOPLEFT, 375116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch source_type) == 3765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu views::MenuRunner::MENU_DELETED) { 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppListItemView::StateChanged() { 38246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const bool is_folder_ui_enabled = apps_grid_view_->model()->folders_enabled(); 383f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (is_folder_ui_enabled) 384f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) apps_grid_view_->ClearAnySelectedView(); 385f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (state() == STATE_HOVERED || state() == STATE_PRESSED) { 387f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!is_folder_ui_enabled) 388f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) apps_grid_view_->SetSelectedView(this); 389eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch title_->SetEnabledColor(kGridTitleHoverColor); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 391f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!is_folder_ui_enabled) 392f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) apps_grid_view_->ClearSelectedView(this); 39303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) is_highlighted_ = false; 39403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (item_weak_) 39503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) item_weak_->SetHighlighted(false); 396eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch title_->SetEnabledColor(kGridTitleColor); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) title_->Invalidate(); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AppListItemView::ShouldEnterPushedState(const ui::Event& event) { 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't enter pushed state for ET_GESTURE_TAP_DOWN so that hover gray 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // background does not show up during scroll. 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (event.type() == ui::ET_GESTURE_TAP_DOWN) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return views::CustomButton::ShouldEnterPushedState(event); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AppListItemView::OnMousePressed(const ui::MouseEvent& event) { 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CustomButton::OnMousePressed(event); 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!ShouldEnterPushedState(event)) 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apps_grid_view_->InitiateDrag(this, AppsGridView::MOUSE, event); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (apps_grid_view_->IsDraggedView(this)) { 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_drag_timer_.Start(FROM_HERE, 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(kMouseDragUIDelayInMs), 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, &AppListItemView::OnMouseDragTimer); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AppListItemView::OnKeyPressed(const ui::KeyEvent& event) { 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Disable space key to press the button. The keyboard events received 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // by this view are forwarded from a Textfield (SearchBoxView) and key 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // released events are not forwarded. This leaves the button in pressed 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // state. 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (event.key_code() == ui::VKEY_SPACE) 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return CustomButton::OnKeyPressed(event); 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppListItemView::OnMouseReleased(const ui::MouseEvent& event) { 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CustomButton::OnMouseReleased(event); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apps_grid_view_->EndDrag(false); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppListItemView::OnMouseCaptureLost() { 443eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // We don't cancel the dag on mouse capture lost for windows as entering a 444eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // synchronous drag causes mouse capture to be lost and pressing escape 445eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // dismisses the app list anyway. 446eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if !defined(OS_WIN) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CustomButton::OnMouseCaptureLost(); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apps_grid_view_->EndDrag(true); 449eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AppListItemView::OnMouseDragged(const ui::MouseEvent& event) { 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CustomButton::OnMouseDragged(event); 454a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (apps_grid_view_->IsDraggedView(this)) { 455a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // If the drag is no longer happening, it could be because this item 456a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // got removed, in which case this item has been destroyed. So, bail out 457a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // now as there will be nothing else to do anyway as 458a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // apps_grid_view_->dragging() will be false. 459a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!apps_grid_view_->UpdateDragFromItem(AppsGridView::MOUSE, event)) 460a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return true; 461a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Shows dragging UI when it's confirmed without waiting for the timer. 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ui_state_ != UI_STATE_DRAGGING && 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apps_grid_view_->dragging() && 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apps_grid_view_->IsDraggedView(this)) { 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_drag_timer_.Stop(); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetUIState(UI_STATE_DRAGGING); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AppListItemView::OnGestureEvent(ui::GestureEvent* event) { 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (event->type()) { 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ui::ET_GESTURE_SCROLL_BEGIN: 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (touch_dragging_) { 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apps_grid_view_->InitiateDrag(this, AppsGridView::TOUCH, *event); 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event->SetHandled(); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ui::ET_GESTURE_SCROLL_UPDATE: 4825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (touch_dragging_ && apps_grid_view_->IsDraggedView(this)) { 483eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch apps_grid_view_->UpdateDragFromItem(AppsGridView::TOUCH, *event); 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event->SetHandled(); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ui::ET_GESTURE_SCROLL_END: 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ui::ET_SCROLL_FLING_START: 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (touch_dragging_) { 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetTouchDragging(false); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apps_grid_view_->EndDrag(false); 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event->SetHandled(); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ui::ET_GESTURE_LONG_PRESS: 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!apps_grid_view_->has_dragged_view()) 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetTouchDragging(true); 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event->SetHandled(); 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case ui::ET_GESTURE_LONG_TAP: 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ui::ET_GESTURE_END: 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (touch_dragging_) 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetTouchDragging(false); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!event->handled()) 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CustomButton::OnGestureEvent(event); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 512a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void AppListItemView::OnSyncDragEnd() { 513a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SetUIState(UI_STATE_NORMAL); 514a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 515a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 5165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const gfx::Rect& AppListItemView::GetIconBounds() const { 5175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return icon_->bounds(); 5185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AppListItemView::SetDragUIState() { 5215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetUIState(UI_STATE_DRAGGING); 5225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)gfx::Rect AppListItemView::GetIconBoundsForTargetViewBounds( 5255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Rect& target_bounds) { 5265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect rect(target_bounds); 5275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const int left_right_padding = 5295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) title_->font_list().GetExpectedTextWidth(kLeftRightPaddingChars); 5305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) rect.Inset(left_right_padding, kTopPadding, left_right_padding, 0); 5315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) gfx::Rect icon_bounds(rect.x(), rect.y(), rect.width(), kGridIconDimension); 5336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) icon_bounds.Inset(gfx::ShadowValue::GetMargin(GetIconShadows())); 5345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return icon_bounds; 5355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 53703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void AppListItemView::ItemIconChanged() { 53803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SetIcon(item_weak_->icon(), item_weak_->has_shadow()); 53903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 54003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 54103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void AppListItemView::ItemNameChanged() { 54203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SetItemName(base::UTF8ToUTF16(item_weak_->GetDisplayName()), 54303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::UTF8ToUTF16(item_weak_->name())); 54403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 54503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 54603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void AppListItemView::ItemHighlightedChanged() { 54703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SetItemIsHighlighted(item_weak_->highlighted()); 54803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 54903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 55003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void AppListItemView::ItemIsInstallingChanged() { 55103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SetItemIsInstalling(item_weak_->is_installing()); 55203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 55303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 55403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void AppListItemView::ItemPercentDownloadedChanged() { 55503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SetItemPercentDownloaded(item_weak_->percent_downloaded()); 55603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 55703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 55803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void AppListItemView::ItemBeingDestroyed() { 55903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DCHECK(item_weak_); 56003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) item_weak_->RemoveObserver(this); 56103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) item_weak_ = NULL; 56203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 56303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace app_list 565