14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 24e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 34e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// found in the LICENSE file. 44e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/app_list/app_list_folder_item.h" 61e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/guid.h" 8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/app_list/app_list_constants.h" 91e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/app_list/app_list_item_list.h" 104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/gfx/canvas.h" 114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/gfx/image/canvas_image_source.h" 124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/gfx/image/image_skia_operations.h" 134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace app_list { 154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace { 174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const int kItemIconDimension = 16; 194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Generates the folder icon with the top 4 child item icons laid in 2x2 tile. 214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class FolderImageSource : public gfx::CanvasImageSource { 224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public: 234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) typedef std::vector<gfx::ImageSkia> Icons; 244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FolderImageSource(const Icons& icons, const gfx::Size& size) 264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : gfx::CanvasImageSource(size, false), 274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) icons_(icons), 284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) size_(size) { 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(icons.size() <= kNumFolderTopItems); 304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual ~FolderImageSource() {} 334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private: 354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void DrawIcon(gfx::Canvas* canvas, 364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const gfx::ImageSkia& icon, 374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const gfx::Size icon_size, 384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int x, int y) { 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (icon.isNull()) 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::ImageSkia resized( 434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::ImageSkiaOperations::CreateResizedImage( 444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) icon, skia::ImageOperations::RESIZE_BEST, icon_size)); 454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) canvas->DrawImageInt(resized, 0, 0, resized.width(), resized.height(), 464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) x, y, resized.width(), resized.height(), true); 474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // gfx::CanvasImageSource overrides: 504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void Draw(gfx::Canvas* canvas) OVERRIDE { 514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Draw folder circle. 524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Point center = gfx::Point(size().width() / 2 , size().height() / 2); 534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SkPaint paint; 544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) paint.setStyle(SkPaint::kFill_Style); 554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) paint.setAntiAlias(true); 56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) paint.setColor(kFolderBubbleColor); 574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) canvas->DrawCircle(center, size().width() / 2, paint); 584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (icons_.size() == 0) 604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Draw top items' icons. 634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const gfx::Size item_icon_size = 644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Size(kItemIconDimension, kItemIconDimension); 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Rects top_icon_bounds = 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AppListFolderItem::GetTopIconsBounds(gfx::Rect(size())); 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i= 0; i < kNumFolderTopItems && i < icons_.size(); ++i) { 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DrawIcon(canvas, icons_[i], item_icon_size, 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) top_icon_bounds[i].x(), top_icon_bounds[i].y()); 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Icons icons_; 754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Size size_; 764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FolderImageSource); 784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} // namespace 814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 8223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)AppListFolderItem::AppListFolderItem(const std::string& id, 8323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) FolderType folder_type) 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : AppListItem(id), 8523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) folder_type_(folder_type), 861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) item_list_(new AppListItemList) { 871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) item_list_->AddObserver(this); 884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)AppListFolderItem::~AppListFolderItem() { 914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) for (size_t i = 0; i < top_items_.size(); ++i) 924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) top_items_[i]->RemoveObserver(this); 931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) item_list_->RemoveObserver(this); 944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void AppListFolderItem::UpdateIcon() { 974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FolderImageSource::Icons top_icons; 984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) for (size_t i = 0; i < top_items_.size(); ++i) 994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) top_icons.push_back(top_items_[i]->icon()); 1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const gfx::Size icon_size = gfx::Size(kGridIconDimension, kGridIconDimension); 1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::ImageSkia icon = gfx::ImageSkia( 1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) new FolderImageSource(top_icons, icon_size), 1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) icon_size); 1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetIcon(icon, false); 1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const gfx::ImageSkia& AppListFolderItem::GetTopIcon(size_t item_index) { 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(item_index <= top_items_.size()); 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return top_items_[item_index]->icon(); 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)gfx::Rect AppListFolderItem::GetTargetIconRectInFolderForItem( 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AppListItem* item, 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Rect& folder_icon_bounds) { 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < top_items_.size(); ++i) { 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (item->id() == top_items_[i]->id()) { 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Rects rects = AppListFolderItem::GetTopIconsBounds(folder_icon_bounds); 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return rects[i]; 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect target_rect(folder_icon_bounds); 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) target_rect.ClampToCenteredSize( 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Size(kItemIconDimension, kItemIconDimension)); 1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return target_rect; 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void AppListFolderItem::Activate(int event_flags) { 1301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Folder handling is implemented by the View, so do nothing. 1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// static 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char AppListFolderItem::kItemType[] = "FolderItem"; 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// static 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)Rects AppListFolderItem::GetTopIconsBounds( 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Rect& folder_icon_bounds) { 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const int delta_to_center = 1; 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Point icon_center = folder_icon_bounds.CenterPoint(); 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Rects top_icon_bounds; 1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Get the top left icon bounds. 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int left_x = icon_center.x() - kItemIconDimension - delta_to_center; 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int top_y = icon_center.y() - kItemIconDimension - delta_to_center; 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect top_left(left_x, top_y, kItemIconDimension, kItemIconDimension); 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) top_icon_bounds.push_back(top_left); 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Get the top right icon bounds. 1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int right_x = icon_center.x() + delta_to_center; 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect top_right(right_x, top_y, kItemIconDimension, kItemIconDimension); 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) top_icon_bounds.push_back(top_right); 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Get the bottom left icon bounds. 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int bottom_y = icon_center.y() + delta_to_center; 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect bottom_left( 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) left_x, bottom_y, kItemIconDimension, kItemIconDimension); 1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) top_icon_bounds.push_back(bottom_left); 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Get the bottom right icon bounds. 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect bottom_right( 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) right_x, bottom_y, kItemIconDimension, kItemIconDimension); 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) top_icon_bounds.push_back(bottom_right); 1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return top_icon_bounds; 1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char* AppListFolderItem::GetItemType() const { 1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return AppListFolderItem::kItemType; 1704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)ui::MenuModel* AppListFolderItem::GetContextMenuModel() { 1734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // TODO(stevenjb/jennyz): Implement. 1744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return NULL; 1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)AppListItem* AppListFolderItem::FindChildItem(const std::string& id) { 1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return item_list_->FindItem(id); 1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)size_t AppListFolderItem::ChildItemCount() const { 1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return item_list_->item_count(); 1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void AppListFolderItem::OnExtensionPreferenceChanged() { 186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) for (size_t i = 0; i < item_list_->item_count(); ++i) 187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) item_list_->item_at(i)->OnExtensionPreferenceChanged(); 188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool AppListFolderItem::CompareForTest(const AppListItem* other) const { 1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!AppListItem::CompareForTest(other)) 1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const AppListFolderItem* other_folder = 1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<const AppListFolderItem*>(other); 1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (other_folder->item_list()->item_count() != item_list_->item_count()) 1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < item_list_->item_count(); ++i) { 1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!item_list()->item_at(i)->CompareForTest( 1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) other_folder->item_list()->item_at(i))) 2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::string AppListFolderItem::GenerateId() { 2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return base::GenerateGUID(); 2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void AppListFolderItem::ItemIconChanged() { 2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) UpdateIcon(); 2114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 2124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void AppListFolderItem::OnListItemAdded(size_t index, 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AppListItem* item) { 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (index <= kNumFolderTopItems) 2161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) UpdateTopItems(); 2171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 2181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void AppListFolderItem::OnListItemRemoved(size_t index, 2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AppListItem* item) { 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (index <= kNumFolderTopItems) 2221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) UpdateTopItems(); 2231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 2241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void AppListFolderItem::OnListItemMoved(size_t from_index, 2261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) size_t to_index, 2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AppListItem* item) { 2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (from_index <= kNumFolderTopItems || to_index <= kNumFolderTopItems) 2291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) UpdateTopItems(); 2301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 2311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void AppListFolderItem::UpdateTopItems() { 2334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) for (size_t i = 0; i < top_items_.size(); ++i) 2344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) top_items_[i]->RemoveObserver(this); 2354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) top_items_.clear(); 2364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) for (size_t i = 0; 2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) i < kNumFolderTopItems && i < item_list_->item_count(); ++i) { 2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AppListItem* item = item_list_->item_at(i); 2404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) item->AddObserver(this); 2414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) top_items_.push_back(item); 2424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 2434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) UpdateIcon(); 2444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 2454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} // namespace app_list 247