chromium/ash/wm/splitview/split_view_highlight_view.h

// Copyright 2018 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_SPLITVIEW_SPLIT_VIEW_HIGHLIGHT_VIEW_H_
#define ASH_WM_SPLITVIEW_SPLIT_VIEW_HIGHLIGHT_VIEW_H_

#include <optional>

#include "ash/ash_export.h"
#include "ash/wm/splitview/split_view_drag_indicators.h"
#include "ash/wm/splitview/split_view_utils.h"
#include "ui/base/metadata/metadata_header_macros.h"
#include "ui/views/view.h"

namespace ash {

// View that is used for displaying and animating the highlights which tell
// users where to drag windows to enter splitview, and previews the space which
// a snapped window will occupy. It is a view consists of one solid color layer
// with rounded corners. If animations are needed, they are performed by
// animating the layer's clip rect.
class ASH_EXPORT SplitViewHighlightView : public views::View {
  METADATA_HEADER(SplitViewHighlightView, views::View)

 public:
  explicit SplitViewHighlightView(bool is_right_or_bottom);
  ~SplitViewHighlightView() override;

  SplitViewHighlightView(const SplitViewHighlightView&) = delete;
  SplitViewHighlightView& operator=(const SplitViewHighlightView&) = delete;

  // Updates bounds, animating if |animation_type| has a value.
  void SetBounds(const gfx::Rect& bounds,
                 const std::optional<SplitviewAnimationType>& animation_type);

  // Called to update the opacity of the highlights view on transition from
  // |previous_window_dragging_state| to |window_dragging_state|. If
  // |previews_only|, then there shall be no visible drag indicators except for
  // snap previews. The highlights are white if |can_dragged_window_be_snapped|,
  // black otherwise.
  void OnWindowDraggingStateChanged(
      SplitViewDragIndicators::WindowDraggingState window_dragging_state,
      SplitViewDragIndicators::WindowDraggingState
          previous_window_dragging_state,
      bool previews_only,
      bool can_dragged_window_be_snapped);

 private:
  // Determines whether this particular highlight view is located at the right
  // or bottom of the screen. These highlights animate in the opposite direction
  // as left or top highlights, so when we use |SetBounds()| extra calucations
  // have to be done to ensure the animation is correct.
  const bool is_right_or_bottom_;
};

}  // namespace ash

#endif  // ASH_WM_SPLITVIEW_SPLIT_VIEW_HIGHLIGHT_VIEW_H_