#ifndef CHROMEOS_UI_FRAME_MULTITASK_MENU_MULTITASK_MENU_VIEW_H_
#define CHROMEOS_UI_FRAME_MULTITASK_MENU_MULTITASK_MENU_VIEW_H_
#include "base/memory/raw_ptr.h"
#include "base/scoped_observation.h"
#include "chromeos/ui/frame/caption_buttons/snap_controller.h"
#include "ui/aura/window_observer.h"
#include "ui/base/metadata/metadata_header_macros.h"
#include "ui/views/view.h"
namespace views {
class View;
}
namespace chromeos {
enum class SnapDirection;
class MultitaskButton;
class SplitButtonView;
class COMPONENT_EXPORT(CHROMEOS_UI_FRAME) MultitaskMenuView
: public views::View,
public aura::WindowObserver {
METADATA_HEADER(MultitaskMenuView, views::View)
public:
enum MultitaskButtons : uint8_t {
kHalfSplit = 1 << 0,
kPartialSplit = 1 << 1,
kFullscreen = 1 << 2,
kFloat = 1 << 3,
};
MultitaskMenuView(aura::Window* window,
base::RepeatingClosure close_callback,
base::RepeatingClosure dismiss_callback,
uint8_t buttons,
views::View* anchor_view);
MultitaskMenuView(const MultitaskMenuView&) = delete;
MultitaskMenuView& operator=(const MultitaskMenuView&) = delete;
~MultitaskMenuView() override;
SplitButtonView* partial_button() { return partial_button_.get(); }
void OnSizeButtonDrag(const gfx::Point& event_screen_location);
bool OnSizeButtonRelease(const gfx::Point& event_screen_location);
void AddedToWidget() override;
bool AcceleratorPressed(const ui::Accelerator& accelerator) override;
bool OnKeyPressed(const ui::KeyEvent& event) override;
void OnWindowDestroying(aura::Window* parent_window) override;
void OnWindowBoundsChanged(aura::Window* window,
const gfx::Rect& old_bounds,
const gfx::Rect& new_bounds,
ui::PropertyChangeReason reason) override;
void OnWindowVisibilityChanging(aura::Window* window, bool visible) override;
static void SetSkipMouseOutDelayForTesting(bool val);
private:
class MenuPreTargetHandler;
friend class MultitaskMenuViewTestApi;
void HalfButtonPressed(SnapDirection direction);
void PartialButtonPressed(SnapDirection direction);
void FullScreenButtonPressed();
void FloatButtonPressed();
raw_ptr<SplitButtonView> half_button_ = nullptr;
raw_ptr<SplitButtonView> partial_button_ = nullptr;
raw_ptr<MultitaskButton> full_button_ = nullptr;
raw_ptr<MultitaskButton> float_button_ = nullptr;
bool is_reversed_ = false;
raw_ptr<aura::Window> window_;
const raw_ptr<views::View, DanglingUntriaged> anchor_view_;
base::RepeatingClosure close_callback_;
base::RepeatingClosure dismiss_callback_;
std::unique_ptr<MenuPreTargetHandler> event_handler_;
base::ScopedObservation<aura::Window, aura::WindowObserver>
window_observation_{this};
};
}
#endif