// Copyright 2024 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_GAME_DASHBOARD_GAME_DASHBOARD_BUTTON_REVEAL_CONTROLLER_H_
#define ASH_GAME_DASHBOARD_GAME_DASHBOARD_BUTTON_REVEAL_CONTROLLER_H_
#include "base/memory/raw_ptr.h"
#include "base/timer/timer.h"
#include "ui/events/event_handler.h"
#include "ui/gfx/geometry/point.h"
namespace ash {
class GameDashboardContext;
// GameDashboardButtonRevealController is responsible for determining when to
// hide/show the GameDashboardButton when the window is in fullscreen.
class GameDashboardButtonRevealController : public ui::EventHandler {
public:
explicit GameDashboardButtonRevealController(GameDashboardContext* context);
GameDashboardButtonRevealController(
const GameDashboardButtonRevealController&) = delete;
GameDashboardButtonRevealController& operator=(
const GameDashboardButtonRevealController&) = delete;
~GameDashboardButtonRevealController() override;
void StopTopEdgeTimer() { top_edge_hover_timer_.Stop(); }
// Updates the visibility of the Game Dashboard button widget. If
// `target_visibility` is true, then the widget will be visible, otherwise it
// will not be visible. If `animate` is true, the widget will slide up/down
// with a short animation to `target_visibility`, otherwise, the widget will
// move without any animation.
void UpdateVisibility(bool target_visibility, bool animate);
// ui::EventHandler:
void OnMouseEvent(ui::MouseEvent* event) override;
void OnGestureEvent(ui::GestureEvent* event) override;
void OnTouchEvent(ui::TouchEvent* event) override;
private:
friend class GameDashboardContextTestApi;
// Checks if the Game Dashboard button can be shown. Returns true if its
// widget is not visible and `mouse_screen_location` is within the Game
// Dashboard button reveal bounds.
bool CanShowGameDashboardButton(const gfx::Point& mouse_screen_location);
// Checks if the Game Dashboard button can be hidden. Returns true if its
// widget is visible, the Game Dashboard main menu is closed, and
// `mouse_screen_location` is within the Game Dashboard reveal bounds.
bool CanHideGameDashboardButton(const gfx::Point& mouse_screen_location);
// Returns true if `event_screen_location` is within the Game Dashboard
// button's reveal bounds, which is the top section of the window with the
// given `reveal height`.
bool IsEventWithinButtonRevealBounds(const gfx::Point& event_screen_location,
int reveal_height);
// Returns true if `mouse_screen_location` is outside the window's frame
// header.
bool IsMouseOutsideHeaderBounds(const gfx::Point& mouse_screen_location);
// Called when the `top_edge_hover_timer_` is fired.
void OnTopEdgeHoverTimeout();
// Callbacks when the animation has ended in `UpdateVisibility()`.
void OnAnimationEnd(bool target_visibility);
const raw_ptr<GameDashboardContext> context_;
// Timer to track cursor being held at the top edge of the screen.
base::OneShotTimer top_edge_hover_timer_;
// Gesture scroll begin position when drag starts.
std::optional<gfx::Point> gesture_scroll_start_pos_;
base::WeakPtrFactory<GameDashboardButtonRevealController> weak_ptr_factory_{
this};
};
} // namespace ash
#endif // ASH_GAME_DASHBOARD_GAME_DASHBOARD_BUTTON_REVEAL_CONTROLLER_H_