chromium/ash/wm/window_cycle/window_cycle_item_view.h

// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef ASH_WM_WINDOW_CYCLE_WINDOW_CYCLE_ITEM_VIEW_H_
#define ASH_WM_WINDOW_CYCLE_WINDOW_CYCLE_ITEM_VIEW_H_

#include "ash/ash_export.h"
#include "ash/wm/scoped_layer_tree_synchronizer.h"
#include "ash/wm/window_mini_view.h"
#include "base/memory/raw_ptr.h"
#include "ui/base/metadata/metadata_header_macros.h"

namespace aura {
class Window;
}  // namespace aura

namespace gfx {
class Size;
}  // namespace gfx

namespace ui {
class MouseEvent;
}  // namespace ui

namespace ash {

class SnapGroup;
class WindowCycleController;

// This view represents a single aura::Window by displaying a title and a
// thumbnail of the window's contents.
class ASH_EXPORT WindowCycleItemView : public WindowMiniView {
  METADATA_HEADER(WindowCycleItemView, WindowMiniView)

 public:
  explicit WindowCycleItemView(aura::Window* window);
  WindowCycleItemView(const WindowCycleItemView&) = delete;
  WindowCycleItemView& operator=(const WindowCycleItemView&) = delete;
  ~WindowCycleItemView() override;

  // All previews are the same height (this is achieved via a combination of
  // scaling and padding).
  static constexpr int kFixedPreviewHeightDp = 256;

  // WindowMiniView:
  void OnMouseEntered(const ui::MouseEvent& event) override;
  bool OnMousePressed(const ui::MouseEvent& event) override;
  gfx::Size GetPreviewViewSize() const override;
  void Layout(PassKey) override;

  // views::View:
  gfx::Size CalculatePreferredSize(
      const views::SizeBounds& available_size) const override;
  bool HandleAccessibleAction(const ui::AXActionData& action_data) override;

  // WindowMiniViewBase:
  void RefreshItemVisuals() override;

 private:
  std::unique_ptr<ScopedLayerTreeSynchronizer> layer_tree_synchronizer_;
  const raw_ptr<WindowCycleController> window_cycle_controller_;
};

// Container view used to host multiple `WindowCycleItemView`s and be the focus
// target for window groups while tabbing in window cycle view.
class ASH_EXPORT GroupContainerCycleView : public WindowMiniViewBase {
  METADATA_HEADER(GroupContainerCycleView, WindowMiniViewBase)

 public:
  explicit GroupContainerCycleView(SnapGroup* snap_group);
  GroupContainerCycleView(const GroupContainerCycleView&) = delete;
  GroupContainerCycleView& operator=(const GroupContainerCycleView&) = delete;
  ~GroupContainerCycleView() override;

  const std::vector<raw_ptr<WindowCycleItemView, VectorExperimental>>&
  mini_views() const {
    return mini_views_;
  }

  // WindowMiniViewBase:
  bool Contains(aura::Window* window) const override;
  aura::Window* GetWindowAtPoint(const gfx::Point& screen_point) const override;
  void SetShowPreview(bool show) override;
  void RefreshItemVisuals() override;
  int TryRemovingChildItem(aura::Window* destroying_window) override;
  gfx::RoundedCornersF GetRoundedCorners() const override;
  void SetSelectedWindowForFocus(aura::Window* window) override;
  void ClearFocusSelection() override;

  // views::View:
  void GetAccessibleNodeData(ui::AXNodeData* node_data) override;

 private:
  std::vector<raw_ptr<WindowCycleItemView, VectorExperimental>> mini_views_;

  // True if the `SnapGroup` represented by `this` has horizontal window layout,
  // false otherwise.
  bool is_layout_horizontal_ = false;

  // True if `this` is the first time a focus selection request is made to this
  // item.
  bool is_first_focus_selection_request_ = true;
};

}  // namespace ash

#endif  // ASH_WM_WINDOW_CYCLE_WINDOW_CYCLE_ITEM_VIEW_H_