Commit 21350ed2 authored by David Black's avatar David Black Committed by Commit Bot

Update holding space styles for focused and selected states.

Focused state:
- Blue ring drawn outside of view.

Selected state:
- Blue ring drawn at border of view.
- Semi-transparent blue overlay drawn over view.

This CL also updates size of the pin icon.

Bug: 1131267
Change-Id: Ia3e45e0c42cbe99e40893ab5efc2e085eb91f2af
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2434766
Commit-Queue: David Black <dmblack@google.com>
Reviewed-by: default avatarAhmed Mehfooz <amehfooz@chromium.org>
Cr-Commit-Position: refs/heads/master@{#811486}
parent 670499d7
...@@ -25,11 +25,13 @@ constexpr int kHoldingSpaceChipsPerRow = 2; ...@@ -25,11 +25,13 @@ constexpr int kHoldingSpaceChipsPerRow = 2;
constexpr int kHoldingSpaceColumnSpacing = 8; constexpr int kHoldingSpaceColumnSpacing = 8;
constexpr int kHoldingSpaceColumnWidth = 160; constexpr int kHoldingSpaceColumnWidth = 160;
constexpr int kHoldingSpaceCornerRadius = 8; constexpr int kHoldingSpaceCornerRadius = 8;
constexpr int kHoldingSpacePinIconSize = 20;
constexpr int kHoldingSpaceRowSpacing = 8; constexpr int kHoldingSpaceRowSpacing = 8;
constexpr gfx::Insets kHoldingSpaceScreenshotPadding(8); constexpr gfx::Insets kHoldingSpaceScreenshotPadding(8);
constexpr int kHoldingSpaceScreenshotSpacing = 8; constexpr int kHoldingSpaceScreenshotSpacing = 8;
constexpr gfx::Size kHoldingSpaceScreenshotSize(104, 80); constexpr gfx::Size kHoldingSpaceScreenshotSize(104, 80);
constexpr gfx::Insets kHoldingSpaceScreenshotsContainerPadding(8, 0); constexpr gfx::Insets kHoldingSpaceScreenshotsContainerPadding(8, 0);
constexpr float kHoldingSpaceSelectedOverlayOpacity = 0.24f;
constexpr int kHoldingSpaceTrayIconMainAxisMargin = 6; constexpr int kHoldingSpaceTrayIconMainAxisMargin = 6;
// Context menu commands. // Context menu commands.
......
...@@ -6,16 +6,11 @@ ...@@ -6,16 +6,11 @@
#include "ash/public/cpp/holding_space/holding_space_constants.h" #include "ash/public/cpp/holding_space/holding_space_constants.h"
#include "ash/public/cpp/holding_space/holding_space_item.h" #include "ash/public/cpp/holding_space/holding_space_item.h"
#include "ash/public/cpp/shelf_config.h"
#include "ash/style/ash_color_provider.h" #include "ash/style/ash_color_provider.h"
#include "ash/system/holding_space/holding_space_item_view.h" #include "ash/system/holding_space/holding_space_item_view.h"
#include "ash/system/tray/tray_popup_item_style.h" #include "ash/system/tray/tray_popup_item_style.h"
#include "ash/system/tray/tray_popup_utils.h" #include "ash/system/tray/tray_popup_utils.h"
#include "ash/system/user/rounded_image_view.h" #include "ash/system/user/rounded_image_view.h"
#include "ui/base/dragdrop/drag_drop_types.h"
#include "ui/views/animation/flood_fill_ink_drop_ripple.h"
#include "ui/views/animation/ink_drop_impl.h"
#include "ui/views/background.h"
#include "ui/views/controls/label.h" #include "ui/views/controls/label.h"
#include "ui/views/layout/box_layout.h" #include "ui/views/layout/box_layout.h"
#include "ui/views/metadata/metadata_impl_macros.h" #include "ui/views/metadata/metadata_impl_macros.h"
...@@ -42,16 +37,6 @@ HoldingSpaceItemChipView::HoldingSpaceItemChipView( ...@@ -42,16 +37,6 @@ HoldingSpaceItemChipView::HoldingSpaceItemChipView(
TrayPopupItemStyle(TrayPopupItemStyle::FontStyle::DETAILED_VIEW_LABEL) TrayPopupItemStyle(TrayPopupItemStyle::FontStyle::DETAILED_VIEW_LABEL)
.SetupLabel(label_); .SetupLabel(label_);
const auto* color_provider = AshColorProvider::Get();
SetBackground(views::CreateRoundedRectBackground(
color_provider->GetControlsLayerColor(
AshColorProvider::ControlsLayerType::kControlBackgroundColorInactive),
kHoldingSpaceCornerRadius));
SetInkDropMode(InkDropMode::ON_NO_GESTURE_HANDLER);
SetInkDropVisibleOpacity(
color_provider->GetRippleAttributes().inkdrop_opacity);
// Subscribe to be notified of changes to `item_`'s image. // Subscribe to be notified of changes to `item_`'s image.
image_subscription_ = image_subscription_ =
item->image().AddImageSkiaChangedCallback(base::BindRepeating( item->image().AddImageSkiaChangedCallback(base::BindRepeating(
...@@ -59,7 +44,7 @@ HoldingSpaceItemChipView::HoldingSpaceItemChipView( ...@@ -59,7 +44,7 @@ HoldingSpaceItemChipView::HoldingSpaceItemChipView(
UpdateImage(); UpdateImage();
AddPin(this /*parent*/); AddPin(/*parent=*/this);
} }
HoldingSpaceItemChipView::~HoldingSpaceItemChipView() = default; HoldingSpaceItemChipView::~HoldingSpaceItemChipView() = default;
......
...@@ -14,13 +14,16 @@ ...@@ -14,13 +14,16 @@
#include "ash/system/holding_space/holding_space_item_view_delegate.h" #include "ash/system/holding_space/holding_space_item_view_delegate.h"
#include "base/bind.h" #include "base/bind.h"
#include "ui/base/class_property.h" #include "ui/base/class_property.h"
#include "ui/gfx/canvas.h"
#include "ui/gfx/color_palette.h" #include "ui/gfx/color_palette.h"
#include "ui/gfx/paint_vector_icon.h" #include "ui/gfx/paint_vector_icon.h"
#include "ui/views/accessibility/view_accessibility.h" #include "ui/views/accessibility/view_accessibility.h"
#include "ui/views/background.h"
#include "ui/views/controls/button/image_button.h" #include "ui/views/controls/button/image_button.h"
#include "ui/views/controls/focus_ring.h"
#include "ui/views/controls/highlight_path_generator.h" #include "ui/views/controls/highlight_path_generator.h"
#include "ui/views/metadata/metadata_impl_macros.h" #include "ui/views/metadata/metadata_impl_macros.h"
#include "ui/views/painter.h"
#include "ui/views/style/platform_style.h"
#include "ui/views/vector_icons.h" #include "ui/views/vector_icons.h"
namespace ash { namespace ash {
...@@ -32,6 +35,37 @@ namespace { ...@@ -32,6 +35,37 @@ namespace {
// overridden by subclasses. // overridden by subclasses.
DEFINE_UI_CLASS_PROPERTY_KEY(bool, kIsHoldingSpaceItemViewProperty, false) DEFINE_UI_CLASS_PROPERTY_KEY(bool, kIsHoldingSpaceItemViewProperty, false)
// CallbackPainter -------------------------------------------------------------
// A painter which delegates painting to a callback.
class CallbackPainter : public views::Painter {
public:
using Callback = base::RepeatingCallback<void(gfx::Canvas*, gfx::Size)>;
CallbackPainter(const CallbackPainter&) = delete;
CallbackPainter& operator=(const CallbackPainter&) = delete;
~CallbackPainter() override = default;
// Creates a painted layer which delegates painting to `callback`.
static std::unique_ptr<ui::LayerOwner> CreatePaintedLayer(Callback callback) {
auto owner = views::Painter::CreatePaintedLayer(
base::WrapUnique(new CallbackPainter(callback)));
owner->layer()->SetFillsBoundsOpaquely(false);
return owner;
}
private:
explicit CallbackPainter(Callback callback) : callback_(callback) {}
// views::Painter:
gfx::Size GetMinimumSize() const override { return gfx::Size(); }
void Paint(gfx::Canvas* canvas, const gfx::Size& size) override {
callback_.Run(canvas, size);
}
Callback callback_;
};
} // namespace } // namespace
// HoldingSpaceItemView -------------------------------------------------------- // HoldingSpaceItemView --------------------------------------------------------
...@@ -47,24 +81,39 @@ HoldingSpaceItemView::HoldingSpaceItemView( ...@@ -47,24 +81,39 @@ HoldingSpaceItemView::HoldingSpaceItemView(
SetNotifyEnterExitOnChild(true); SetNotifyEnterExitOnChild(true);
SetPaintToLayer(); // Accessibility.
layer()->SetFillsBoundsOpaquely(false);
GetViewAccessibility().OverrideName(item->text()); GetViewAccessibility().OverrideName(item->text());
GetViewAccessibility().OverrideRole(ax::mojom::Role::kButton);
// Install the selection ring before installing the focus ring so that the // Background.
// selection ring will paint beneath the focus ring. SetBackground(views::CreateRoundedRectBackground(
views::FocusRing* selection_ring = views::FocusRing::Install(this); AshColorProvider::Get()->GetControlsLayerColor(
selection_ring->SetColor(gfx::kPlaceholderColor); AshColorProvider::ControlsLayerType::kControlBackgroundColorInactive),
selection_ring->SetHasFocusPredicate( kHoldingSpaceCornerRadius));
[this](views::View* selection_ring) { return this->selected(); });
SetFocusBehavior(FocusBehavior::ALWAYS); // Layer.
views::FocusRing* focus_ring = views::FocusRing::Install(this); SetPaintToLayer();
focus_ring->SetColor(ShelfConfig::Get()->shelf_focus_border_color()); layer()->SetFillsBoundsOpaquely(false);
// The selection ring, focus ring, and ink drop layers should match the corner // Focus.
// radius of this view. Installation of a highlight path generator does this. SetFocusBehavior(FocusBehavior::ALWAYS);
focused_layer_owner_ =
CallbackPainter::CreatePaintedLayer(base::BindRepeating(
&HoldingSpaceItemView::OnPaintFocus, base::Unretained(this)));
layer()->Add(focused_layer_owner_->layer());
// Selection.
selected_layer_owner_ =
CallbackPainter::CreatePaintedLayer(base::BindRepeating(
&HoldingSpaceItemView::OnPaintSelect, base::Unretained(this)));
layer()->Add(selected_layer_owner_->layer());
// Ink drop.
SetInkDropMode(InkDropMode::ON_NO_GESTURE_HANDLER);
SetInkDropVisibleOpacity(
AshColorProvider::Get()->GetRippleAttributes().inkdrop_opacity);
// Ink drop layers should match the corner radius of this view.
views::InstallRoundRectHighlightPathGenerator(this, gfx::Insets(), views::InstallRoundRectHighlightPathGenerator(this, gfx::Insets(),
kHoldingSpaceCornerRadius); kHoldingSpaceCornerRadius);
...@@ -85,6 +134,32 @@ SkColor HoldingSpaceItemView::GetInkDropBaseColor() const { ...@@ -85,6 +134,32 @@ SkColor HoldingSpaceItemView::GetInkDropBaseColor() const {
return AshColorProvider::Get()->GetRippleAttributes().base_color; return AshColorProvider::Get()->GetRippleAttributes().base_color;
} }
void HoldingSpaceItemView::OnBoundsChanged(const gfx::Rect& previous_bounds) {
gfx::Rect bounds = GetLocalBounds();
selected_layer_owner_->layer()->SetBounds(bounds);
selected_layer_owner_->layer()->SchedulePaint(
selected_layer_owner_->layer()->bounds());
// The focus ring is painted just outside the bounds for this view.
const float kFocusInsets =
-2.f - (views::PlatformStyle::kFocusHaloThickness / 2.f);
bounds.Inset(gfx::Insets(kFocusInsets));
focused_layer_owner_->layer()->SetBounds(bounds);
focused_layer_owner_->layer()->SchedulePaint(
focused_layer_owner_->layer()->bounds());
}
void HoldingSpaceItemView::OnFocus() {
focused_layer_owner_->layer()->SchedulePaint(
focused_layer_owner_->layer()->bounds());
}
void HoldingSpaceItemView::OnBlur() {
focused_layer_owner_->layer()->SchedulePaint(
focused_layer_owner_->layer()->bounds());
}
void HoldingSpaceItemView::OnGestureEvent(ui::GestureEvent* event) { void HoldingSpaceItemView::OnGestureEvent(ui::GestureEvent* event) {
delegate_->OnHoldingSpaceItemViewGestureEvent(this, *event); delegate_->OnHoldingSpaceItemViewGestureEvent(this, *event);
} }
...@@ -118,7 +193,9 @@ void HoldingSpaceItemView::SetSelected(bool selected) { ...@@ -118,7 +193,9 @@ void HoldingSpaceItemView::SetSelected(bool selected) {
return; return;
selected_ = selected; selected_ = selected;
InvalidateLayout();
selected_layer_owner_->layer()->SchedulePaint(
selected_layer_owner_->layer()->bounds());
} }
void HoldingSpaceItemView::AddPin(views::View* parent) { void HoldingSpaceItemView::AddPin(views::View* parent) {
...@@ -130,10 +207,10 @@ void HoldingSpaceItemView::AddPin(views::View* parent) { ...@@ -130,10 +207,10 @@ void HoldingSpaceItemView::AddPin(views::View* parent) {
const SkColor icon_color = AshColorProvider::Get()->GetContentLayerColor( const SkColor icon_color = AshColorProvider::Get()->GetContentLayerColor(
AshColorProvider::ContentLayerType::kSystemMenuIconColor); AshColorProvider::ContentLayerType::kSystemMenuIconColor);
const gfx::ImageSkia unpinned_icon = const gfx::ImageSkia unpinned_icon = gfx::CreateVectorIcon(
gfx::CreateVectorIcon(views::kUnpinIcon, icon_color); views::kUnpinIcon, kHoldingSpacePinIconSize, icon_color);
const gfx::ImageSkia pinned_icon = const gfx::ImageSkia pinned_icon = gfx::CreateVectorIcon(
gfx::CreateVectorIcon(views::kPinIcon, icon_color); views::kPinIcon, kHoldingSpacePinIconSize, icon_color);
pin_->SetImage(views::Button::STATE_NORMAL, unpinned_icon); pin_->SetImage(views::Button::STATE_NORMAL, unpinned_icon);
pin_->SetToggledImage(views::Button::STATE_NORMAL, &pinned_icon); pin_->SetToggledImage(views::Button::STATE_NORMAL, &pinned_icon);
...@@ -141,6 +218,47 @@ void HoldingSpaceItemView::AddPin(views::View* parent) { ...@@ -141,6 +218,47 @@ void HoldingSpaceItemView::AddPin(views::View* parent) {
base::Unretained(this))); base::Unretained(this)));
} }
void HoldingSpaceItemView::OnPaintFocus(gfx::Canvas* canvas, gfx::Size size) {
if (!HasFocus())
return;
cc::PaintFlags flags;
flags.setAntiAlias(true);
flags.setColor(AshColorProvider::Get()->GetControlsLayerColor(
AshColorProvider::ControlsLayerType::kFocusRingColor));
flags.setStrokeWidth(views::PlatformStyle::kFocusHaloThickness);
flags.setStyle(cc::PaintFlags::kStroke_Style);
gfx::Rect bounds = gfx::Rect(size);
bounds.Inset(gfx::Insets(flags.getStrokeWidth() / 2));
canvas->DrawRoundRect(bounds, kHoldingSpaceCornerRadius, flags);
}
void HoldingSpaceItemView::OnPaintSelect(gfx::Canvas* canvas, gfx::Size size) {
if (!selected_)
return;
const SkColor color = AshColorProvider::Get()->GetControlsLayerColor(
AshColorProvider::ControlsLayerType::kFocusRingColor);
const SkColor overlay_color =
SkColorSetA(color, kHoldingSpaceSelectedOverlayOpacity * 0xFF);
cc::PaintFlags flags;
flags.setAntiAlias(true);
flags.setColor(overlay_color);
gfx::Rect bounds = gfx::Rect(size);
canvas->DrawRoundRect(bounds, kHoldingSpaceCornerRadius, flags);
flags.setColor(color);
flags.setStrokeWidth(views::PlatformStyle::kFocusHaloThickness);
flags.setStyle(cc::PaintFlags::kStroke_Style);
bounds.Inset(gfx::Insets(flags.getStrokeWidth() / 2));
canvas->DrawRoundRect(bounds, kHoldingSpaceCornerRadius, flags);
}
void HoldingSpaceItemView::OnPinPressed() { void HoldingSpaceItemView::OnPinPressed() {
const bool is_item_pinned = HoldingSpaceController::Get()->model()->GetItem( const bool is_item_pinned = HoldingSpaceController::Get()->model()->GetItem(
HoldingSpaceItem::GetFileBackedItemId(HoldingSpaceItem::Type::kPinnedFile, HoldingSpaceItem::GetFileBackedItemId(HoldingSpaceItem::Type::kPinnedFile,
......
...@@ -5,6 +5,8 @@ ...@@ -5,6 +5,8 @@
#ifndef ASH_SYSTEM_HOLDING_SPACE_HOLDING_SPACE_ITEM_VIEW_H_ #ifndef ASH_SYSTEM_HOLDING_SPACE_HOLDING_SPACE_ITEM_VIEW_H_
#define ASH_SYSTEM_HOLDING_SPACE_HOLDING_SPACE_ITEM_VIEW_H_ #define ASH_SYSTEM_HOLDING_SPACE_HOLDING_SPACE_ITEM_VIEW_H_
#include <memory>
#include "ash/ash_export.h" #include "ash/ash_export.h"
#include "ui/views/animation/ink_drop_host_view.h" #include "ui/views/animation/ink_drop_host_view.h"
#include "ui/views/metadata/metadata_header_macros.h" #include "ui/views/metadata/metadata_header_macros.h"
...@@ -34,21 +36,26 @@ class ASH_EXPORT HoldingSpaceItemView : public views::InkDropHostView { ...@@ -34,21 +36,26 @@ class ASH_EXPORT HoldingSpaceItemView : public views::InkDropHostView {
// views::InkDropHostView: // views::InkDropHostView:
SkColor GetInkDropBaseColor() const override; SkColor GetInkDropBaseColor() const override;
void OnBoundsChanged(const gfx::Rect& previous_bounds) override;
void OnFocus() override;
void OnBlur() override;
void OnGestureEvent(ui::GestureEvent* event) override; void OnGestureEvent(ui::GestureEvent* event) override;
bool OnKeyPressed(const ui::KeyEvent& event) override; bool OnKeyPressed(const ui::KeyEvent& event) override;
void OnMouseEvent(ui::MouseEvent* event) override; void OnMouseEvent(ui::MouseEvent* event) override;
bool OnMousePressed(const ui::MouseEvent& event) override; bool OnMousePressed(const ui::MouseEvent& event) override;
void OnMouseReleased(const ui::MouseEvent& event) override; void OnMouseReleased(const ui::MouseEvent& event) override;
const HoldingSpaceItem* item() const { return item_; }
void SetSelected(bool selected); void SetSelected(bool selected);
bool selected() const { return selected_; } bool selected() const { return selected_; }
const HoldingSpaceItem* item() const { return item_; }
protected: protected:
void AddPin(views::View* parent); void AddPin(views::View* parent);
private: private:
void OnPaintFocus(gfx::Canvas* canvas, gfx::Size size);
void OnPaintSelect(gfx::Canvas* canvas, gfx::Size size);
void OnPinPressed(); void OnPinPressed();
void UpdatePin(); void UpdatePin();
...@@ -56,6 +63,10 @@ class ASH_EXPORT HoldingSpaceItemView : public views::InkDropHostView { ...@@ -56,6 +63,10 @@ class ASH_EXPORT HoldingSpaceItemView : public views::InkDropHostView {
const HoldingSpaceItem* const item_; const HoldingSpaceItem* const item_;
views::ToggleImageButton* pin_ = nullptr; views::ToggleImageButton* pin_ = nullptr;
// Owners for the layers used to paint focused and selected states.
std::unique_ptr<ui::LayerOwner> selected_layer_owner_;
std::unique_ptr<ui::LayerOwner> focused_layer_owner_;
// Whether or not this view is selected. // Whether or not this view is selected.
bool selected_ = false; bool selected_ = false;
......
...@@ -99,6 +99,8 @@ PinnedFilesContainer::PinnedFilesContainer( ...@@ -99,6 +99,8 @@ PinnedFilesContainer::PinnedFilesContainer(
scroll_view->SetBackgroundColor(base::nullopt); scroll_view->SetBackgroundColor(base::nullopt);
scroll_view->SetDrawOverflowIndicator(false); scroll_view->SetDrawOverflowIndicator(false);
scroll_view->SetVisible(false); scroll_view->SetVisible(false);
scroll_view->SetPaintToLayer();
scroll_view->layer()->SetFillsBoundsOpaquely(false);
scroll_view->ClipHeightTo(0, INT_MAX); scroll_view->ClipHeightTo(0, INT_MAX);
item_chips_container_ = scroll_view->SetContents( item_chips_container_ = scroll_view->SetContents(
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment