| // 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_ANNOTATOR_ANNOTATOR_CONTROLLER_H_ | |
| #define ASH_ANNOTATOR_ANNOTATOR_CONTROLLER_H_ | |
| #include <memory> | |
| #include <optional> | |
| #include "ash/annotator/annotator_metrics.h" | |
| #include "ash/ash_export.h" | |
| #include "ash/public/cpp/annotator/annotator_controller_base.h" | |
| #include "base/functional/bind.h" | |
| #include "base/functional/callback.h" | |
| #include "base/functional/callback_forward.h" | |
| #include "base/memory/raw_ptr.h" | |
| #include "base/observer_list.h" | |
| #include "base/observer_list_types.h" | |
| #include "third_party/skia/include/core/SkColor.h" | |
| namespace aura { | |
| class Window; | |
| } // namespace aura | |
| namespace gfx { | |
| class Rect; | |
| } // namespace gfx | |
| namespace ash { | |
| struct AnnotatorTool; | |
| class AnnotatorClient; | |
| class AnnotationsOverlayView; | |
| class AnnotationsOverlayController; | |
| class AnnotationSourceWatcher; | |
| // The controller in charge of annotator UI. | |
| class ASH_EXPORT AnnotatorController : public AnnotatorControllerBase { | |
| public: | |
| AnnotatorController(); | |
| AnnotatorController(const AnnotatorController&) = delete; | |
| AnnotatorController& operator=(const AnnotatorController&) = delete; | |
| ~AnnotatorController() override; | |
| class AnnotatorObserver : public base::CheckedObserver { | |
| public: | |
| virtual void OnAnnotatorStateChanged(bool enabled) {} | |
| }; | |
| bool is_annotator_enabled() const { return annotator_enabled_; } | |
| AnnotationSourceWatcher* annotation_source_watcher() { | |
| return annotation_source_watcher_.get(); | |
| } | |
| // Sets the annotator tool. | |
| virtual void SetAnnotatorTool(const AnnotatorTool& tool); | |
| // Resets annotator tools and clears the canvas. | |
| void ResetTools(); | |
| // Shows annotation tray for `new_root`. | |
| void RegisterView(aura::Window* new_root); | |
| // Hides annotation tray for `current_root` if it was previously registered | |
| // with the controller. | |
| void UnregisterView(aura::Window* current_root); | |
| // Updates `current_root_` to be the given `new_root`. Updates annotation | |
| // tray's enabled state. | |
| void UpdateRootView(aura::Window* new_root); | |
| // Invoked when marker button is pressed. | |
| void EnableAnnotatorTool(); | |
| // Resets the canvas and disables the annotator functionality. | |
| void DisableAnnotator(); | |
| // Creates `annotations_overlay_controller_` for the `window`. This is | |
| // necessary, as it adds a view for annotating on top of the `window` and | |
| // loads the Ink library in the view. After the call, annotating is still | |
| // disabled, until the EnableAnnotatorTool() method is called. | |
| // TODO(b/342104047): Once the markup pod is implemented, make this method | |
| // private, called from EnableAnnotatorTool(). Add handling for multiple | |
| // displays. | |
| void CreateAnnotationOverlayForWindow( | |
| aura::Window* window, | |
| std::optional<gfx::Rect> partial_region_bounds); | |
| void CreateAnnotationOverlayForMarkerMode(aura::Window* window); | |
| // AnnotatorControllerBase: | |
| void SetToolClient(AnnotatorClient* client) override; | |
| bool GetAnnotatorAvailability() const override; | |
| void OnCanvasInitialized(bool success) override; | |
| void ToggleAnnotationTray() override; | |
| void OnUndoRedoAvailabilityChanged(bool undo_available, | |
| bool redo_available) override; | |
| // Returns a new instance of the concrete view that will be used as the | |
| // content view of the annotations overlay widget. | |
| std::unique_ptr<AnnotationsOverlayView> CreateAnnotationsOverlayView() const; | |
| // Updates the accessible name of the |annotation_tray_| in the accessibility | |
| // cache. | |
| void UpdateAnnotationTrayAccessibleName(bool is_annotator_enabled); | |
| // Adds/removes the specified |observer|. | |
| void AddObserver(AnnotatorObserver* observer); | |
| void RemoveObserver(AnnotatorObserver* observer); | |
| void set_canvas_initialized_callback_for_test(base::OnceClosure callback) { | |
| on_canvas_initialized_callback_for_test_ = std::move(callback); | |
| } | |
| private: | |
| friend class CaptureModeTestApi; | |
| // Updates the tray based on annotator availability. | |
| void UpdateTrayEnabledState(); | |
| // Toggles annotation overlay widget on or off. When on, the annotations | |
| // overlay widget's window will be shown and can consume all the events | |
| // targeting the underlying window. Otherwise, it's hidden and cannot accept | |
| // any events. | |
| void ToggleAnnotatorCanvas(); | |
| // Notifies observers that the |annotator_enabled_| state has changed. | |
| void NotifyStateChanged(); | |
| raw_ptr<AnnotatorClient> client_ = nullptr; | |
| // True if the canvas is initialized successfully, false if it failed to | |
| // initialize. An absent value indicates that the initialization has not | |
| // completed. | |
| std::optional<bool> canvas_initialized_state_; | |
| bool annotator_enabled_ = false; | |
| // The current root window for showing annotations. | |
| raw_ptr<aura::Window> current_root_ = nullptr; | |
| // If set, will be called when the canvas is initialized. | |
| base::OnceClosure on_canvas_initialized_callback_for_test_; | |
| // Controls and owns the overlay widget, which is used to host annotations. | |
| std::unique_ptr<AnnotationsOverlayController> annotations_overlay_controller_; | |
| std::unique_ptr<AnnotationSourceWatcher> annotation_source_watcher_; | |
| base::ObserverList<AnnotatorObserver> observers_; | |
| }; | |
| } // namespace ash | |
| #endif // ASH_ANNOTATOR_ANNOTATOR_CONTROLLER_H_ |