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" 10c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "grit/ui_strings.h" 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/accessibility/ax_view_state.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/app_list/app_list_constants.h" 13c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/app_list/app_list_folder_item.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/app_list/app_list_item.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/app_list/views/apps_grid_view.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/app_list/views/cached_label.h" 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/app_list/views/progress_bar_view.h" 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/base/dragdrop/drag_utils.h" 19c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/base/l10n/l10n_util.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/scoped_layer_animation_settings.h" 23d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/gfx/animation/throb_animation.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/canvas.h" 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/gfx/font_list.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image_skia_operations.h" 27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ui/gfx/point.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/transform_util.h" 29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "ui/views/background.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/image_view.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/label.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/menu/menu_runner.h" 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/views/drag_controller.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace app_list { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kTopPadding = 20; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kIconTitleSpacing = 7; 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kProgressBarHorizontalPadding = 12; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// The font is different on each platform. The font size is adjusted on some 44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// platforms to keep a consistent look. 45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if defined(OS_LINUX) && !defined(OS_CHROMEOS) 46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Reducing the font size by 2 makes it the same as the Windows font size. 47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const int kFontSizeDelta = -2; 48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#else 49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const int kFontSizeDelta = 0; 50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif 51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Radius of the folder dropping preview circle. 53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const int kFolderPreviewRadius = 40; 54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kLeftRightPaddingChars = 1; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Scale to transform the icon when a drag starts. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const float kDraggingIconScale = 1.5f; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Delay in milliseconds of when the dragging UI should be shown for mouse drag. 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const int kMouseDragUIDelayInMs = 200; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char AppListItemView::kViewClassName[] = "ui/app_list/AppListItemView"; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AppListItemView::AppListItemView(AppsGridView* apps_grid_view, 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AppListItem* item) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : CustomButton(apps_grid_view), 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) item_(item), 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apps_grid_view_(apps_grid_view), 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_(new views::ImageView), 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) title_(new CachedLabel), 75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch progress_bar_(new ProgressBarView), 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_state_(UI_STATE_NORMAL), 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) touch_dragging_(false) { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_->set_interactive(false); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title_->SetBackgroundColor(0); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title_->SetAutoColorReadabilityEnabled(false); 83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch title_->SetEnabledColor(kGridTitleColor); 84010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) title_->SetFontList( 85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) rb.GetFontList(kItemTextFontStyle).DeriveWithSizeDelta(kFontSizeDelta)); 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) title_->SetHorizontalAlignment(gfx::ALIGN_LEFT); 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) title_->SetVisible(!item_->is_installing()); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) title_->Invalidate(); 89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SetTitleSubpixelAA(); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::ShadowValue kIconShadows[] = { 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ShadowValue(gfx::Point(0, 2), 2, SkColorSetARGB(0x24, 0, 0, 0)), 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_shadows_.assign(kIconShadows, kIconShadows + arraysize(kIconShadows)); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildView(icon_); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildView(title_); 98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch AddChildView(progress_bar_); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ItemIconChanged(); 101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ItemNameChanged(); 102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ItemIsInstallingChanged(); 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) item_->AddObserver(this); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_context_menu_controller(this); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_request_focus_on_press(false); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetAnimationDuration(0); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AppListItemView::~AppListItemView() { 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) item_->RemoveObserver(this); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppListItemView::SetIconSize(const gfx::Size& size) { 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (icon_size_ == size) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_size_ = size; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateIcon(); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppListItemView::UpdateIcon() { 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Skip if |icon_size_| has not been determined. 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (icon_size_.IsEmpty()) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::ImageSkia icon = item_->icon(); 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Clear icon and bail out if item icon is empty. 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (icon.isNull()) { 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_->SetImage(NULL); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ImageSkia resized(gfx::ImageSkiaOperations::CreateResizedImage(icon, 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) skia::ImageOperations::RESIZE_BEST, icon_size_)); 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (item_->has_shadow()) { 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::ImageSkia shadow( 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::ImageSkiaOperations::CreateImageWithDropShadow(resized, 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) icon_shadows_)); 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) icon_->SetImage(shadow); 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) icon_->SetImage(resized); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AppListItemView::UpdateTooltip() { 149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::string display_name = item_->GetDisplayName(); 150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) title_->SetTooltipText(display_name == item_->name() ? base::string16() 151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : base::UTF8ToUTF16(item_->name())); 15258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppListItemView::SetUIState(UIState state) { 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ui_state_ == state) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_state_ = state; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (ui_state_) { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case UI_STATE_NORMAL: 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) title_->SetVisible(!item_->is_installing()); 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) progress_bar_->SetVisible(item_->is_installing()); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 165a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case UI_STATE_DRAGGING: 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title_->SetVisible(false); 16758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch progress_bar_->SetVisible(false); 168a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 169a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case UI_STATE_DROPPING_IN_FOLDER: 170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 171a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 172a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if !defined(OS_WIN) 173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ui::ScopedLayerAnimationSettings settings(layer()->GetAnimator()); 174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) switch (ui_state_) { 175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case UI_STATE_NORMAL: 176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) layer()->SetTransform(gfx::Transform()); 177a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 178a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case UI_STATE_DRAGGING: { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect bounds(layer()->bounds().size()); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layer()->SetTransform(gfx::GetScaleTransform( 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds.CenterPoint(), 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kDraggingIconScale)); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 184f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 185f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case UI_STATE_DROPPING_IN_FOLDER: 186f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) break; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#endif // !OS_WIN 189f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SchedulePaint(); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppListItemView::SetTouchDragging(bool touch_dragging) { 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (touch_dragging_ == touch_dragging) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) touch_dragging_ = touch_dragging; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetUIState(touch_dragging_ ? UI_STATE_DRAGGING : UI_STATE_NORMAL); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppListItemView::OnMouseDragTimer() { 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(apps_grid_view_->IsDraggedView(this)); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetUIState(UI_STATE_DRAGGING); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 206010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void AppListItemView::SetTitleSubpixelAA() { 207010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // TODO(tapted): Enable AA for folders as well, taking care to play nice with 208010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // the folder bubble animation. 209010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) bool enable_aa = !item_->IsInFolder() && ui_state_ == UI_STATE_NORMAL && 210010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) !item_->highlighted() && 211010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) !apps_grid_view_->IsSelectedView(this) && 212010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) !apps_grid_view_->IsAnimatingView(this); 213010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 214010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) bool currently_enabled = title_->background() != NULL; 215010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (currently_enabled == enable_aa) 216010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 217010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 218010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (enable_aa) { 219010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) title_->SetBackgroundColor(app_list::kContentsBackgroundColor); 220010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) title_->set_background(views::Background::CreateSolidBackground( 221010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) app_list::kContentsBackgroundColor)); 222010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else { 223010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // In other cases, keep the background transparent to ensure correct 224010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // interactions with animations. This will temporarily disable subpixel AA. 225010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) title_->SetBackgroundColor(0); 226010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) title_->set_background(NULL); 227010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 228010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) title_->Invalidate(); 229010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) title_->SchedulePaint(); 230010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 231010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AppListItemView::Prerender() { 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) title_->PaintToBackingImage(); 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid AppListItemView::CancelContextMenu() { 2377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (context_menu_runner_) 2387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch context_menu_runner_->Cancel(); 2397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 2407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 241eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochgfx::ImageSkia AppListItemView::GetDragImage() { 2424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return icon_->GetImage(); 243eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 244eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 245f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void AppListItemView::OnDragEnded() { 246f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mouse_drag_timer_.Stop(); 247f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetUIState(UI_STATE_NORMAL); 248f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 249f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)gfx::Point AppListItemView::GetDragImageOffset() { 251a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::Point image = icon_->GetImageBounds().origin(); 252a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return gfx::Point(icon_->x() + image.x(), icon_->y() + image.y()); 253a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 254a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 255f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void AppListItemView::SetAsAttemptedFolderTarget(bool is_target_folder) { 256f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (is_target_folder) 257f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetUIState(UI_STATE_DROPPING_IN_FOLDER); 258f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) else 259f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetUIState(UI_STATE_NORMAL); 260f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 261f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppListItemView::ItemIconChanged() { 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateIcon(); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 266a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void AppListItemView::ItemNameChanged() { 267a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) title_->SetText(base::UTF8ToUTF16(item_->GetDisplayName())); 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) title_->Invalidate(); 26958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) UpdateTooltip(); 270a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Use full name for accessibility. 271c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SetAccessibleName(item_->GetItemType() == AppListFolderItem::kItemType 272c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ? l10n_util::GetStringFUTF16( 273c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch IDS_APP_LIST_FOLDER_BUTTON_ACCESSIBILE_NAME, 274c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::UTF8ToUTF16(item_->name())) 275c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch : base::UTF8ToUTF16(item_->name())); 276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Layout(); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppListItemView::ItemHighlightedChanged() { 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apps_grid_view_->EnsureViewVisible(this); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SchedulePaint(); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AppListItemView::ItemIsInstallingChanged() { 2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (item_->is_installing()) 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) apps_grid_view_->EnsureViewVisible(this); 2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) title_->SetVisible(!item_->is_installing()); 2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) progress_bar_->SetVisible(item_->is_installing()); 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SchedulePaint(); 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AppListItemView::ItemPercentDownloadedChanged() { 293ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // A percent_downloaded() of -1 can mean it's not known how much percent is 294ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // completed, or the download hasn't been marked complete, as is the case 295ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // while an extension is being installed after being downloaded. 2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (item_->percent_downloaded() == -1) 297ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return; 2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) progress_bar_->SetValue(item_->percent_downloaded() / 100.0); 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 301b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)const char* AppListItemView::GetClassName() const { 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kViewClassName; 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppListItemView::Layout() { 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect rect(GetContentsBounds()); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const int left_right_padding = 3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) title_->font_list().GetExpectedTextWidth(kLeftRightPaddingChars); 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rect.Inset(left_right_padding, kTopPadding, left_right_padding, 0); 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int y = rect.y(); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) icon_->SetBoundsRect(GetIconBoundsForTargetViewBounds(GetContentsBounds())); 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Size title_size = title_->GetPreferredSize(); 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect title_bounds(rect.x() + (rect.width() - title_size.width()) / 2, 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) y + icon_size_.height() + kIconTitleSpacing, 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) title_size.width(), 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) title_size.height()); 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) title_bounds.Intersect(rect); 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) title_->SetBoundsRect(title_bounds); 321eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 322eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gfx::Rect progress_bar_bounds(progress_bar_->GetPreferredSize()); 323eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch progress_bar_bounds.set_x(GetContentsBounds().x() + 324eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch kProgressBarHorizontalPadding); 325eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch progress_bar_bounds.set_y(title_bounds.y()); 326eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch progress_bar_->SetBoundsRect(progress_bar_bounds); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 329010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void AppListItemView::SchedulePaintInRect(const gfx::Rect& r) { 330010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SetTitleSubpixelAA(); 331010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) views::CustomButton::SchedulePaintInRect(r); 332010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 333010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppListItemView::OnPaint(gfx::Canvas* canvas) { 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (apps_grid_view_->IsDraggedView(this)) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect rect(GetContentsBounds()); 3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (item_->highlighted() && !item_->is_installing()) { 340b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) canvas->FillRect(rect, kHighlightedColor); 341f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; 342f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 343f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (apps_grid_view_->IsSelectedView(this)) 344f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) canvas->FillRect(rect, kSelectedColor); 345f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 346f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (ui_state_ == UI_STATE_DROPPING_IN_FOLDER) { 347f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(apps_grid_view_->model()->folders_enabled()); 348f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 349f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Draw folder dropping preview circle. 350f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Point center = gfx::Point(icon_->x() + icon_->size().width() / 2, 351f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) icon_->y() + icon_->size().height() / 2); 352f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SkPaint paint; 353f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) paint.setStyle(SkPaint::kFill_Style); 354f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) paint.setAntiAlias(true); 355f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) paint.setColor(kFolderBubbleColor); 356f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) canvas->DrawCircle(center, kFolderPreviewRadius, paint); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppListItemView::ShowContextMenuForView(views::View* source, 3617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const gfx::Point& point, 3627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ui::MenuSourceType source_type) { 3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::MenuModel* menu_model = item_->GetContextMenuModel(); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!menu_model) 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context_menu_runner_.reset(new views::MenuRunner(menu_model)); 3685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (context_menu_runner_->RunMenuAt(GetWidget(), 3695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu NULL, 3705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu gfx::Rect(point, gfx::Size()), 3715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu views::MENU_ANCHOR_TOPLEFT, 3725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu source_type, 3735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu views::MenuRunner::HAS_MNEMONICS) == 3745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu views::MenuRunner::MENU_DELETED) { 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppListItemView::StateChanged() { 38046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const bool is_folder_ui_enabled = apps_grid_view_->model()->folders_enabled(); 381f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (is_folder_ui_enabled) 382f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) apps_grid_view_->ClearAnySelectedView(); 383f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (state() == STATE_HOVERED || state() == STATE_PRESSED) { 385f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!is_folder_ui_enabled) 386f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) apps_grid_view_->SetSelectedView(this); 387eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch title_->SetEnabledColor(kGridTitleHoverColor); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 389f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!is_folder_ui_enabled) 390f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) apps_grid_view_->ClearSelectedView(this); 3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) item_->SetHighlighted(false); 392eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch title_->SetEnabledColor(kGridTitleColor); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) title_->Invalidate(); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AppListItemView::ShouldEnterPushedState(const ui::Event& event) { 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't enter pushed state for ET_GESTURE_TAP_DOWN so that hover gray 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // background does not show up during scroll. 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (event.type() == ui::ET_GESTURE_TAP_DOWN) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return views::CustomButton::ShouldEnterPushedState(event); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AppListItemView::OnMousePressed(const ui::MouseEvent& event) { 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CustomButton::OnMousePressed(event); 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!ShouldEnterPushedState(event)) 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apps_grid_view_->InitiateDrag(this, AppsGridView::MOUSE, event); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (apps_grid_view_->IsDraggedView(this)) { 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_drag_timer_.Start(FROM_HERE, 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(kMouseDragUIDelayInMs), 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, &AppListItemView::OnMouseDragTimer); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AppListItemView::OnKeyPressed(const ui::KeyEvent& event) { 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Disable space key to press the button. The keyboard events received 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // by this view are forwarded from a Textfield (SearchBoxView) and key 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // released events are not forwarded. This leaves the button in pressed 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // state. 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (event.key_code() == ui::VKEY_SPACE) 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return CustomButton::OnKeyPressed(event); 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppListItemView::OnMouseReleased(const ui::MouseEvent& event) { 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CustomButton::OnMouseReleased(event); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apps_grid_view_->EndDrag(false); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppListItemView::OnMouseCaptureLost() { 439eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // We don't cancel the dag on mouse capture lost for windows as entering a 440eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // synchronous drag causes mouse capture to be lost and pressing escape 441eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // dismisses the app list anyway. 442eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if !defined(OS_WIN) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CustomButton::OnMouseCaptureLost(); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apps_grid_view_->EndDrag(true); 445eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AppListItemView::OnMouseDragged(const ui::MouseEvent& event) { 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CustomButton::OnMouseDragged(event); 450a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (apps_grid_view_->IsDraggedView(this)) { 451a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // If the drag is no longer happening, it could be because this item 452a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // got removed, in which case this item has been destroyed. So, bail out 453a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // now as there will be nothing else to do anyway as 454a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // apps_grid_view_->dragging() will be false. 455a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!apps_grid_view_->UpdateDragFromItem(AppsGridView::MOUSE, event)) 456a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return true; 457a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Shows dragging UI when it's confirmed without waiting for the timer. 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ui_state_ != UI_STATE_DRAGGING && 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apps_grid_view_->dragging() && 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apps_grid_view_->IsDraggedView(this)) { 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_drag_timer_.Stop(); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetUIState(UI_STATE_DRAGGING); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AppListItemView::OnGestureEvent(ui::GestureEvent* event) { 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (event->type()) { 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ui::ET_GESTURE_SCROLL_BEGIN: 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (touch_dragging_) { 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apps_grid_view_->InitiateDrag(this, AppsGridView::TOUCH, *event); 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event->SetHandled(); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ui::ET_GESTURE_SCROLL_UPDATE: 4785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (touch_dragging_ && apps_grid_view_->IsDraggedView(this)) { 479eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch apps_grid_view_->UpdateDragFromItem(AppsGridView::TOUCH, *event); 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event->SetHandled(); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ui::ET_GESTURE_SCROLL_END: 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ui::ET_SCROLL_FLING_START: 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (touch_dragging_) { 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetTouchDragging(false); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apps_grid_view_->EndDrag(false); 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event->SetHandled(); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ui::ET_GESTURE_LONG_PRESS: 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!apps_grid_view_->has_dragged_view()) 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetTouchDragging(true); 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event->SetHandled(); 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case ui::ET_GESTURE_LONG_TAP: 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ui::ET_GESTURE_END: 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (touch_dragging_) 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetTouchDragging(false); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!event->handled()) 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CustomButton::OnGestureEvent(event); 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 508a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void AppListItemView::OnSyncDragEnd() { 509a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SetUIState(UI_STATE_NORMAL); 510a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 511a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 5125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const gfx::Rect& AppListItemView::GetIconBounds() const { 5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return icon_->bounds(); 5145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AppListItemView::SetDragUIState() { 5175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetUIState(UI_STATE_DRAGGING); 5185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)gfx::Rect AppListItemView::GetIconBoundsForTargetViewBounds( 5215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Rect& target_bounds) { 5225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect rect(target_bounds); 5235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const int left_right_padding = 5255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) title_->font_list().GetExpectedTextWidth(kLeftRightPaddingChars); 5265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) rect.Inset(left_right_padding, kTopPadding, left_right_padding, 0); 5275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect icon_bounds(rect.x(), rect.y(), rect.width(), icon_size_.height()); 5295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) icon_bounds.Inset(gfx::ShadowValue::GetMargin(icon_shadows_)); 5305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return icon_bounds; 5315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace app_list 534