#ifndef UI_VIEWS_BUBBLE_BUBBLE_DIALOG_MODEL_HOST_H_
#define UI_VIEWS_BUBBLE_BUBBLE_DIALOG_MODEL_HOST_H_
#include <memory>
#include <vector>
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "base/types/pass_key.h"
#include "ui/base/models/dialog_model.h"
#include "ui/base/mojom/ui_base_types.mojom-shared.h"
#include "ui/color/color_provider.h"
#include "ui/views/bubble/bubble_dialog_delegate_view.h"
#include "ui/views/view.h"
namespace views {
class VIEWS_EXPORT DialogModelSectionHost : public BoxLayoutView,
public ui::DialogModelFieldHost {
METADATA_HEADER(DialogModelSectionHost, BoxLayoutView)
public:
[[nodiscard]] static std::unique_ptr<DialogModelSectionHost> Create(
ui::DialogModelSection* section,
ui::ElementIdentifier initially_focused_field_id =
ui::ElementIdentifier());
protected:
using BoxLayoutView::BoxLayoutView;
};
class BubbleDialogModelHostContentsView;
class VIEWS_EXPORT BubbleDialogModelHost : public BubbleDialogDelegate,
public ui::DialogModelHost,
public ui::DialogModelFieldHost {
public:
enum class FieldType { kText, kControl, kMenuItem };
class VIEWS_EXPORT CustomView : public ui::DialogModelCustomField::Field {
public:
CustomView(std::unique_ptr<View> view,
FieldType field_type,
View* focusable_view = nullptr);
CustomView(const CustomView&) = delete;
CustomView& operator=(const CustomView&) = delete;
~CustomView() override;
std::unique_ptr<View> TransferView();
FieldType field_type() const { return field_type_; }
View* TransferFocusableView() {
return std::exchange(focusable_view_, nullptr);
}
private:
std::unique_ptr<View> view_;
const FieldType field_type_;
raw_ptr<View> focusable_view_;
};
BubbleDialogModelHost(std::unique_ptr<ui::DialogModel> model,
View* anchor_view,
BubbleBorder::Arrow arrow,
bool autosize = true);
BubbleDialogModelHost(base::PassKey<BubbleDialogModelHost>,
std::unique_ptr<ui::DialogModel> model,
View* anchor_view,
BubbleBorder::Arrow arrow,
ui::mojom::ModalType modal_type,
bool autosize);
~BubbleDialogModelHost() override;
static std::unique_ptr<BubbleDialogModelHost> CreateModal(
std::unique_ptr<ui::DialogModel> model,
ui::mojom::ModalType modal_type,
bool autosize = true);
View* GetInitiallyFocusedView() override;
void OnWidgetInitialized() override;
void Close() override;
void OnDialogButtonChanged() override;
private:
class ThemeChangedObserver : public ViewObserver {
public:
ThemeChangedObserver(BubbleDialogModelHost* parent,
BubbleDialogModelHostContentsView* contents_view);
ThemeChangedObserver(const ThemeChangedObserver&) = delete;
ThemeChangedObserver& operator=(const ThemeChangedObserver&) = delete;
~ThemeChangedObserver() override;
void OnViewThemeChanged(View*) override;
private:
const raw_ptr<BubbleDialogModelHost> parent_;
base::ScopedObservation<View, ViewObserver> observation_{this};
};
[[nodiscard]] BubbleDialogModelHostContentsView* InitContentsView(
ui::DialogModelSection* contents);
void OnContentsViewChanged();
void OnWindowClosing();
void UpdateDialogButtons();
void UpdateWindowIcon(const ui::ColorProvider* color_provider);
void UpdateSpacingAndMargins();
bool IsModalDialog() const;
std::unique_ptr<ui::DialogModel> model_;
const raw_ptr<BubbleDialogModelHostContentsView> contents_view_;
base::CallbackListSubscription on_contents_changed_subscription_;
ThemeChangedObserver theme_observer_;
};
}
#endif