Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(55)

Unified Diff: ui/app_list/views/app_list_item_view.cc

Issue 645853013: Remove some platform specific stuff from views. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/app_list/views/app_list_item_view.h ('k') | ui/app_list/views/app_list_main_view.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/app_list/views/app_list_item_view.cc
diff --git a/ui/app_list/views/app_list_item_view.cc b/ui/app_list/views/app_list_item_view.cc
deleted file mode 100644
index 072e4b3fecf805a0cf1130e5efec7a12800e7167..0000000000000000000000000000000000000000
--- a/ui/app_list/views/app_list_item_view.cc
+++ /dev/null
@@ -1,556 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/app_list/views/app_list_item_view.h"
-
-#include <algorithm>
-
-#include "base/strings/utf_string_conversions.h"
-#include "ui/accessibility/ax_view_state.h"
-#include "ui/app_list/app_list_constants.h"
-#include "ui/app_list/app_list_folder_item.h"
-#include "ui/app_list/app_list_item.h"
-#include "ui/app_list/views/apps_grid_view.h"
-#include "ui/app_list/views/cached_label.h"
-#include "ui/app_list/views/progress_bar_view.h"
-#include "ui/base/dragdrop/drag_utils.h"
-#include "ui/base/l10n/l10n_util.h"
-#include "ui/base/resource/resource_bundle.h"
-#include "ui/compositor/layer.h"
-#include "ui/compositor/scoped_layer_animation_settings.h"
-#include "ui/gfx/animation/throb_animation.h"
-#include "ui/gfx/canvas.h"
-#include "ui/gfx/font_list.h"
-#include "ui/gfx/image/image_skia_operations.h"
-#include "ui/gfx/point.h"
-#include "ui/gfx/shadow_value.h"
-#include "ui/gfx/transform_util.h"
-#include "ui/strings/grit/ui_strings.h"
-#include "ui/views/background.h"
-#include "ui/views/controls/image_view.h"
-#include "ui/views/controls/label.h"
-#include "ui/views/controls/menu/menu_runner.h"
-#include "ui/views/drag_controller.h"
-
-namespace app_list {
-
-namespace {
-
-const int kTopPadding = 20;
-const int kIconTitleSpacing = 7;
-const int kProgressBarHorizontalPadding = 12;
-
-// Radius of the folder dropping preview circle.
-const int kFolderPreviewRadius = 40;
-
-const int kLeftRightPaddingChars = 1;
-
-// Scale to transform the icon when a drag starts.
-const float kDraggingIconScale = 1.5f;
-
-// Delay in milliseconds of when the dragging UI should be shown for mouse drag.
-const int kMouseDragUIDelayInMs = 200;
-
-const gfx::ShadowValues& GetIconShadows() {
- CR_DEFINE_STATIC_LOCAL(
- const gfx::ShadowValues,
- icon_shadows,
- (1,
- gfx::ShadowValue(gfx::Point(0, 2), 2, SkColorSetARGB(0x24, 0, 0, 0))));
- return icon_shadows;
-}
-
-gfx::FontList GetFontList() {
- ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
- const gfx::FontList& font_list = rb.GetFontList(kItemTextFontStyle);
-// The font is different on each platform. The font size is adjusted on some
-// platforms to keep a consistent look.
-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
- // Reducing the font size by 2 makes it the same as the Windows font size.
- const int kFontSizeDelta = -2;
- return font_list.DeriveWithSizeDelta(kFontSizeDelta);
-#else
- return font_list;
-#endif
-}
-
-} // namespace
-
-// static
-const char AppListItemView::kViewClassName[] = "ui/app_list/AppListItemView";
-
-AppListItemView::AppListItemView(AppsGridView* apps_grid_view,
- AppListItem* item)
- : CustomButton(apps_grid_view),
- is_folder_(item->GetItemType() == AppListFolderItem::kItemType),
- is_in_folder_(item->IsInFolder()),
- item_weak_(item),
- apps_grid_view_(apps_grid_view),
- icon_(new views::ImageView),
- title_(new CachedLabel),
- progress_bar_(new ProgressBarView),
- ui_state_(UI_STATE_NORMAL),
- touch_dragging_(false),
- is_installing_(false),
- is_highlighted_(false) {
- icon_->set_interactive(false);
-
- title_->SetBackgroundColor(0);
- title_->SetAutoColorReadabilityEnabled(false);
- title_->SetEnabledColor(kGridTitleColor);
-
- static const gfx::FontList font_list = GetFontList();
- title_->SetFontList(font_list);
- title_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
- title_->Invalidate();
- SetTitleSubpixelAA();
-
- AddChildView(icon_);
- AddChildView(title_);
- AddChildView(progress_bar_);
-
- SetIcon(item->icon(), item->has_shadow());
- SetItemName(base::UTF8ToUTF16(item->GetDisplayName()),
- base::UTF8ToUTF16(item->name()));
- SetItemIsInstalling(item->is_installing());
- SetItemIsHighlighted(item->highlighted());
- item->AddObserver(this);
-
- set_context_menu_controller(this);
- set_request_focus_on_press(false);
-
- SetAnimationDuration(0);
-}
-
-AppListItemView::~AppListItemView() {
- if (item_weak_)
- item_weak_->RemoveObserver(this);
-}
-
-void AppListItemView::SetIcon(const gfx::ImageSkia& icon, bool has_shadow) {
- // Clear icon and bail out if item icon is empty.
- if (icon.isNull()) {
- icon_->SetImage(NULL);
- return;
- }
-
- gfx::ImageSkia resized(gfx::ImageSkiaOperations::CreateResizedImage(
- icon,
- skia::ImageOperations::RESIZE_BEST,
- gfx::Size(kGridIconDimension, kGridIconDimension)));
- if (has_shadow) {
- gfx::ImageSkia shadow(gfx::ImageSkiaOperations::CreateImageWithDropShadow(
- resized, GetIconShadows()));
- icon_->SetImage(shadow);
- return;
- }
-
- icon_->SetImage(resized);
-}
-
-void AppListItemView::SetUIState(UIState state) {
- if (ui_state_ == state)
- return;
-
- ui_state_ = state;
-
- switch (ui_state_) {
- case UI_STATE_NORMAL:
- title_->SetVisible(!is_installing_);
- progress_bar_->SetVisible(is_installing_);
- break;
- case UI_STATE_DRAGGING:
- title_->SetVisible(false);
- progress_bar_->SetVisible(false);
- break;
- case UI_STATE_DROPPING_IN_FOLDER:
- break;
- }
-#if !defined(OS_WIN)
- ui::ScopedLayerAnimationSettings settings(layer()->GetAnimator());
- switch (ui_state_) {
- case UI_STATE_NORMAL:
- layer()->SetTransform(gfx::Transform());
- break;
- case UI_STATE_DRAGGING: {
- const gfx::Rect bounds(layer()->bounds().size());
- layer()->SetTransform(gfx::GetScaleTransform(
- bounds.CenterPoint(),
- kDraggingIconScale));
- break;
- }
- case UI_STATE_DROPPING_IN_FOLDER:
- break;
- }
-#endif // !OS_WIN
-
- SchedulePaint();
-}
-
-void AppListItemView::SetTouchDragging(bool touch_dragging) {
- if (touch_dragging_ == touch_dragging)
- return;
-
- touch_dragging_ = touch_dragging;
- SetUIState(touch_dragging_ ? UI_STATE_DRAGGING : UI_STATE_NORMAL);
-}
-
-void AppListItemView::OnMouseDragTimer() {
- DCHECK(apps_grid_view_->IsDraggedView(this));
- SetUIState(UI_STATE_DRAGGING);
-}
-
-void AppListItemView::SetTitleSubpixelAA() {
- // TODO(tapted): Enable AA for folders as well, taking care to play nice with
- // the folder bubble animation.
- bool enable_aa = !is_in_folder_ && ui_state_ == UI_STATE_NORMAL &&
- !is_highlighted_ && !apps_grid_view_->IsSelectedView(this) &&
- !apps_grid_view_->IsAnimatingView(this);
-
- bool currently_enabled = title_->background() != NULL;
- if (currently_enabled == enable_aa)
- return;
-
- if (enable_aa) {
- title_->SetBackgroundColor(app_list::kContentsBackgroundColor);
- title_->set_background(views::Background::CreateSolidBackground(
- app_list::kContentsBackgroundColor));
- } else {
- // In other cases, keep the background transparent to ensure correct
- // interactions with animations. This will temporarily disable subpixel AA.
- title_->SetBackgroundColor(0);
- title_->set_background(NULL);
- }
- title_->Invalidate();
- title_->SchedulePaint();
-}
-
-void AppListItemView::Prerender() {
- title_->PaintToBackingImage();
-}
-
-void AppListItemView::CancelContextMenu() {
- if (context_menu_runner_)
- context_menu_runner_->Cancel();
-}
-
-gfx::ImageSkia AppListItemView::GetDragImage() {
- return icon_->GetImage();
-}
-
-void AppListItemView::OnDragEnded() {
- mouse_drag_timer_.Stop();
- SetUIState(UI_STATE_NORMAL);
-}
-
-gfx::Point AppListItemView::GetDragImageOffset() {
- gfx::Point image = icon_->GetImageBounds().origin();
- return gfx::Point(icon_->x() + image.x(), icon_->y() + image.y());
-}
-
-void AppListItemView::SetAsAttemptedFolderTarget(bool is_target_folder) {
- if (is_target_folder)
- SetUIState(UI_STATE_DROPPING_IN_FOLDER);
- else
- SetUIState(UI_STATE_NORMAL);
-}
-
-void AppListItemView::SetItemName(const base::string16& display_name,
- const base::string16& full_name) {
- title_->SetText(display_name);
- title_->Invalidate();
-
- title_->SetTooltipText(display_name == full_name ? base::string16()
- : full_name);
-
- // Use full name for accessibility.
- SetAccessibleName(
- is_folder_ ? l10n_util::GetStringFUTF16(
- IDS_APP_LIST_FOLDER_BUTTON_ACCESSIBILE_NAME, full_name)
- : full_name);
- Layout();
-}
-
-void AppListItemView::SetItemIsHighlighted(bool is_highlighted) {
- is_highlighted_ = is_highlighted;
- SchedulePaint();
-}
-
-void AppListItemView::SetItemIsInstalling(bool is_installing) {
- is_installing_ = is_installing;
- if (ui_state_ == UI_STATE_NORMAL) {
- title_->SetVisible(!is_installing);
- progress_bar_->SetVisible(is_installing);
- }
- SchedulePaint();
-}
-
-void AppListItemView::SetItemPercentDownloaded(int percent_downloaded) {
- // A percent_downloaded() of -1 can mean it's not known how much percent is
- // completed, or the download hasn't been marked complete, as is the case
- // while an extension is being installed after being downloaded.
- if (percent_downloaded == -1)
- return;
- progress_bar_->SetValue(percent_downloaded / 100.0);
-}
-
-const char* AppListItemView::GetClassName() const {
- return kViewClassName;
-}
-
-void AppListItemView::Layout() {
- gfx::Rect rect(GetContentsBounds());
-
- const int left_right_padding =
- title_->font_list().GetExpectedTextWidth(kLeftRightPaddingChars);
- rect.Inset(left_right_padding, kTopPadding, left_right_padding, 0);
- const int y = rect.y();
-
- icon_->SetBoundsRect(GetIconBoundsForTargetViewBounds(GetContentsBounds()));
- const gfx::Size title_size = title_->GetPreferredSize();
- gfx::Rect title_bounds(rect.x() + (rect.width() - title_size.width()) / 2,
- y + kGridIconDimension + kIconTitleSpacing,
- title_size.width(),
- title_size.height());
- title_bounds.Intersect(rect);
- title_->SetBoundsRect(title_bounds);
-
- gfx::Rect progress_bar_bounds(progress_bar_->GetPreferredSize());
- progress_bar_bounds.set_x(GetContentsBounds().x() +
- kProgressBarHorizontalPadding);
- progress_bar_bounds.set_y(title_bounds.y());
- progress_bar_->SetBoundsRect(progress_bar_bounds);
-}
-
-void AppListItemView::SchedulePaintInRect(const gfx::Rect& r) {
- SetTitleSubpixelAA();
- views::CustomButton::SchedulePaintInRect(r);
-}
-
-void AppListItemView::OnPaint(gfx::Canvas* canvas) {
- if (apps_grid_view_->IsDraggedView(this))
- return;
-
- gfx::Rect rect(GetContentsBounds());
- if (is_highlighted_ && !is_installing_) {
- canvas->FillRect(rect, kHighlightedColor);
- return;
- }
- if (apps_grid_view_->IsSelectedView(this))
- canvas->FillRect(rect, kSelectedColor);
-
- if (ui_state_ == UI_STATE_DROPPING_IN_FOLDER) {
- DCHECK(apps_grid_view_->model()->folders_enabled());
-
- // Draw folder dropping preview circle.
- gfx::Point center = gfx::Point(icon_->x() + icon_->size().width() / 2,
- icon_->y() + icon_->size().height() / 2);
- SkPaint paint;
- paint.setStyle(SkPaint::kFill_Style);
- paint.setAntiAlias(true);
- paint.setColor(kFolderBubbleColor);
- canvas->DrawCircle(center, kFolderPreviewRadius, paint);
- }
-}
-
-void AppListItemView::ShowContextMenuForView(views::View* source,
- const gfx::Point& point,
- ui::MenuSourceType source_type) {
- ui::MenuModel* menu_model =
- item_weak_ ? item_weak_->GetContextMenuModel() : NULL;
- if (!menu_model)
- return;
-
- context_menu_runner_.reset(
- new views::MenuRunner(menu_model, views::MenuRunner::HAS_MNEMONICS));
- if (context_menu_runner_->RunMenuAt(GetWidget(),
- NULL,
- gfx::Rect(point, gfx::Size()),
- views::MENU_ANCHOR_TOPLEFT,
- source_type) ==
- views::MenuRunner::MENU_DELETED) {
- return;
- }
-}
-
-void AppListItemView::StateChanged() {
- const bool is_folder_ui_enabled = apps_grid_view_->model()->folders_enabled();
- if (is_folder_ui_enabled)
- apps_grid_view_->ClearAnySelectedView();
-
- if (state() == STATE_HOVERED || state() == STATE_PRESSED) {
- if (!is_folder_ui_enabled)
- apps_grid_view_->SetSelectedView(this);
- title_->SetEnabledColor(kGridTitleHoverColor);
- } else {
- if (!is_folder_ui_enabled)
- apps_grid_view_->ClearSelectedView(this);
- SetItemIsHighlighted(false);
- if (item_weak_)
- item_weak_->set_highlighted(false);
- title_->SetEnabledColor(kGridTitleColor);
- }
- title_->Invalidate();
-}
-
-bool AppListItemView::ShouldEnterPushedState(const ui::Event& event) {
- // Don't enter pushed state for ET_GESTURE_TAP_DOWN so that hover gray
- // background does not show up during scroll.
- if (event.type() == ui::ET_GESTURE_TAP_DOWN)
- return false;
-
- return views::CustomButton::ShouldEnterPushedState(event);
-}
-
-bool AppListItemView::OnMousePressed(const ui::MouseEvent& event) {
- CustomButton::OnMousePressed(event);
-
- if (!ShouldEnterPushedState(event))
- return true;
-
- apps_grid_view_->InitiateDrag(this, AppsGridView::MOUSE, event);
-
- if (apps_grid_view_->IsDraggedView(this)) {
- mouse_drag_timer_.Start(FROM_HERE,
- base::TimeDelta::FromMilliseconds(kMouseDragUIDelayInMs),
- this, &AppListItemView::OnMouseDragTimer);
- }
- return true;
-}
-
-bool AppListItemView::OnKeyPressed(const ui::KeyEvent& event) {
- // Disable space key to press the button. The keyboard events received
- // by this view are forwarded from a Textfield (SearchBoxView) and key
- // released events are not forwarded. This leaves the button in pressed
- // state.
- if (event.key_code() == ui::VKEY_SPACE)
- return false;
-
- return CustomButton::OnKeyPressed(event);
-}
-
-void AppListItemView::OnMouseReleased(const ui::MouseEvent& event) {
- CustomButton::OnMouseReleased(event);
- apps_grid_view_->EndDrag(false);
-}
-
-void AppListItemView::OnMouseCaptureLost() {
- // We don't cancel the dag on mouse capture lost for windows as entering a
- // synchronous drag causes mouse capture to be lost and pressing escape
- // dismisses the app list anyway.
-#if !defined(OS_WIN)
- CustomButton::OnMouseCaptureLost();
- apps_grid_view_->EndDrag(true);
-#endif
-}
-
-bool AppListItemView::OnMouseDragged(const ui::MouseEvent& event) {
- CustomButton::OnMouseDragged(event);
- if (apps_grid_view_->IsDraggedView(this)) {
- // If the drag is no longer happening, it could be because this item
- // got removed, in which case this item has been destroyed. So, bail out
- // now as there will be nothing else to do anyway as
- // apps_grid_view_->dragging() will be false.
- if (!apps_grid_view_->UpdateDragFromItem(AppsGridView::MOUSE, event))
- return true;
- }
-
- // Shows dragging UI when it's confirmed without waiting for the timer.
- if (ui_state_ != UI_STATE_DRAGGING &&
- apps_grid_view_->dragging() &&
- apps_grid_view_->IsDraggedView(this)) {
- mouse_drag_timer_.Stop();
- SetUIState(UI_STATE_DRAGGING);
- }
- return true;
-}
-
-void AppListItemView::OnGestureEvent(ui::GestureEvent* event) {
- switch (event->type()) {
- case ui::ET_GESTURE_SCROLL_BEGIN:
- if (touch_dragging_) {
- apps_grid_view_->InitiateDrag(this, AppsGridView::TOUCH, *event);
- event->SetHandled();
- }
- break;
- case ui::ET_GESTURE_SCROLL_UPDATE:
- if (touch_dragging_ && apps_grid_view_->IsDraggedView(this)) {
- apps_grid_view_->UpdateDragFromItem(AppsGridView::TOUCH, *event);
- event->SetHandled();
- }
- break;
- case ui::ET_GESTURE_SCROLL_END:
- case ui::ET_SCROLL_FLING_START:
- if (touch_dragging_) {
- SetTouchDragging(false);
- apps_grid_view_->EndDrag(false);
- event->SetHandled();
- }
- break;
- case ui::ET_GESTURE_LONG_PRESS:
- if (!apps_grid_view_->has_dragged_view())
- SetTouchDragging(true);
- event->SetHandled();
- break;
- case ui::ET_GESTURE_LONG_TAP:
- case ui::ET_GESTURE_END:
- if (touch_dragging_)
- SetTouchDragging(false);
- break;
- default:
- break;
- }
- if (!event->handled())
- CustomButton::OnGestureEvent(event);
-}
-
-void AppListItemView::OnSyncDragEnd() {
- SetUIState(UI_STATE_NORMAL);
-}
-
-const gfx::Rect& AppListItemView::GetIconBounds() const {
- return icon_->bounds();
-}
-
-void AppListItemView::SetDragUIState() {
- SetUIState(UI_STATE_DRAGGING);
-}
-
-gfx::Rect AppListItemView::GetIconBoundsForTargetViewBounds(
- const gfx::Rect& target_bounds) {
- gfx::Rect rect(target_bounds);
-
- const int left_right_padding =
- title_->font_list().GetExpectedTextWidth(kLeftRightPaddingChars);
- rect.Inset(left_right_padding, kTopPadding, left_right_padding, 0);
-
- gfx::Rect icon_bounds(rect.x(), rect.y(), rect.width(), kGridIconDimension);
- icon_bounds.Inset(gfx::ShadowValue::GetMargin(GetIconShadows()));
- return icon_bounds;
-}
-
-void AppListItemView::ItemIconChanged() {
- SetIcon(item_weak_->icon(), item_weak_->has_shadow());
-}
-
-void AppListItemView::ItemNameChanged() {
- SetItemName(base::UTF8ToUTF16(item_weak_->GetDisplayName()),
- base::UTF8ToUTF16(item_weak_->name()));
-}
-
-void AppListItemView::ItemIsInstallingChanged() {
- SetItemIsInstalling(item_weak_->is_installing());
-}
-
-void AppListItemView::ItemPercentDownloadedChanged() {
- SetItemPercentDownloaded(item_weak_->percent_downloaded());
-}
-
-void AppListItemView::ItemBeingDestroyed() {
- DCHECK(item_weak_);
- item_weak_->RemoveObserver(this);
- item_weak_ = NULL;
-}
-
-} // namespace app_list
« no previous file with comments | « ui/app_list/views/app_list_item_view.h ('k') | ui/app_list/views/app_list_main_view.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698