123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- // Copyright 2021 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #ifndef ASH_CAPTURE_MODE_FOLDER_SELECTION_DIALOG_CONTROLLER_H_
- #define ASH_CAPTURE_MODE_FOLDER_SELECTION_DIALOG_CONTROLLER_H_
- #include "ash/wm/window_dimmer.h"
- #include "base/callback_forward.h"
- #include "base/files/file_path.h"
- #include "base/memory/scoped_refptr.h"
- #include "base/scoped_observation.h"
- #include "ui/aura/window.h"
- #include "ui/shell_dialogs/select_file_dialog.h"
- #include "ui/wm/core/transient_window_manager.h"
- #include "ui/wm/core/transient_window_observer.h"
- namespace ui {
- class Event;
- } // namespace ui
- namespace ash {
- // Creates, shows and controls capture mode's folder selection dialog.
- class FolderSelectionDialogController : public ui::SelectFileDialog::Listener,
- public wm::TransientWindowObserver {
- public:
- class Delegate {
- public:
- // Called to inform the delegate that the user selected the given |path|.
- virtual void OnFolderSelected(const base::FilePath& path) = 0;
- // Called to inform the delegate that the dialog window has been added.
- virtual void OnSelectionWindowAdded() = 0;
- // Called to inform the delegate that the dialog window has been closed.
- // This will be called for both when the user selects and accepts a folder
- // or cancels or closes the dialog without making a selection.
- virtual void OnSelectionWindowClosed() = 0;
- protected:
- virtual ~Delegate() = default;
- };
- // Constructs and shows a folder selection dialog under the given |root|
- // window.
- FolderSelectionDialogController(Delegate* delegate, aura::Window* root);
- FolderSelectionDialogController(const FolderSelectionDialogController&) =
- delete;
- FolderSelectionDialogController& operator=(
- const FolderSelectionDialogController&) = delete;
- ~FolderSelectionDialogController() override;
- aura::Window* dialog_window() { return dialog_window_; }
- bool did_user_select_a_folder() const { return did_user_select_a_folder_; }
- // Returns false while the dialog window is shown, and the |event| is
- // targeting a window in the dialog subtree (in this case, the
- // |CaptureModeSession| should not consume this event and let it go through to
- // the dialog). Returns true otherwise so the session can consume this event.
- bool ShouldConsumeEvent(const ui::Event* event) const;
- // ui::SelectFileDialog::Listener:
- void FileSelected(const base::FilePath& path,
- int index,
- void* params) override;
- // wm::TransientWindowObserver:
- void OnTransientChildAdded(aura::Window* window,
- aura::Window* transient) override;
- void OnTransientChildRemoved(aura::Window* window,
- aura::Window* transient) override;
- private:
- friend class CaptureModeTestApi;
- Delegate* const delegate_;
- // Dims everything behind the dialog (including the capture bar, the settings
- // menu, and any capture-related UIs). The dimming window is the transient
- // parent of the dialog window.
- WindowDimmer dialog_background_dimmer_;
- // Provides us with the APIs needed to construct a folder selection dialog.
- scoped_refptr<ui::SelectFileDialog> select_folder_dialog_;
- // This is the window of the dialog that gets created by
- // |select_folder_dialog_| as a transient child of the dimming window.
- aura::Window* dialog_window_ = nullptr;
- // It will be set to true when user selects a folder from the dialog.
- bool did_user_select_a_folder_ = false;
- // An optional callback that will be invoked when |dialog_window_| gets added.
- base::OnceClosure on_dialog_window_added_callback_for_test_;
- // We observe the transient window manager of the dimming window to know when
- // the dialog window is added or removed.
- base::ScopedObservation<wm::TransientWindowManager,
- wm::TransientWindowObserver>
- window_observation_{this};
- };
- } // namespace ash
- #endif // ASH_CAPTURE_MODE_FOLDER_SELECTION_DIALOG_CONTROLLER_H_
|