#ifndef ASH_ANNOTATOR_ANNOTATIONS_OVERLAY_CONTROLLER_H_
#define ASH_ANNOTATOR_ANNOTATIONS_OVERLAY_CONTROLLER_H_
#include <memory>
#include <optional>
#include "ash/ash_export.h"
#include "base/memory/raw_ptr.h"
#include "base/scoped_observation.h"
#include "ui/aura/window_observer.h"
#include "ui/display/display_observer.h"
#include "ui/display/screen.h"
#include "ui/views/widget/unique_widget_ptr.h"
#include "ui/views/widget/widget.h"
namespace aura {
class Window;
}
namespace gfx{
class Rect;
}
namespace ash {
class AnnotationsOverlayView;
class ASH_EXPORT AnnotationsOverlayController
: public aura::WindowObserver,
public display::DisplayObserver {
public:
AnnotationsOverlayController(aura::Window* window,
std::optional<gfx::Rect> partial_region_bounds);
AnnotationsOverlayController(const AnnotationsOverlayController&) = delete;
AnnotationsOverlayController& operator=(const AnnotationsOverlayController&) =
delete;
~AnnotationsOverlayController() override;
bool is_enabled() const { return is_enabled_; }
void Toggle();
aura::Window* GetOverlayNativeWindow();
void OnWindowBoundsChanged(aura::Window* window,
const gfx::Rect& old_bounds,
const gfx::Rect& new_bounds,
ui::PropertyChangeReason reason) override;
void OnWindowDestroying(aura::Window* window) override;
void OnDisplayMetricsChanged(const display::Display& display,
uint32_t metrics) override;
private:
void Start();
void Stop();
void UpdateWidgetStacking();
void SetBounds(const gfx::Rect& bounds_in_parent);
gfx::Rect GetOverlayWidgetBounds() const;
void Reset();
views::UniqueWidgetPtr overlay_widget_ = std::make_unique<views::Widget>();
raw_ptr<AnnotationsOverlayView> annotations_overlay_view_ = nullptr;
bool is_enabled_ = false;
raw_ptr<aura::Window> window_ = nullptr;
std::optional<gfx::Rect> partial_region_bounds_;
base::ScopedObservation<display::Screen, display::DisplayObserver>
display_observation_{this};
base::ScopedObservation<aura::Window, aura::WindowObserver>
window_observation_{this};
};
}
#endif