#ifndef ASH_STYLE_DROP_DOWN_CHECKBOX_H_
#define ASH_STYLE_DROP_DOWN_CHECKBOX_H_
#include <memory>
#include "ash/ash_export.h"
#include "base/scoped_observation.h"
#include "ui/base/metadata/metadata_header_macros.h"
#include "ui/base/models/list_model.h"
#include "ui/base/models/list_selection_model.h"
#include "ui/views/controls/button/button.h"
#include "ui/views/widget/unique_widget_ptr.h"
namespace views {
class ImageView;
class Label;
}
namespace ash {
class ASH_EXPORT DropDownCheckbox : public views::Button,
public views::WidgetObserver {
METADATA_HEADER(DropDownCheckbox, views::Button)
public:
using ItemModel = ui::ListModel<std::u16string>;
using SelectedIndices = ui::ListSelectionModel::SelectedIndices;
using SelectedItems = std::vector<std::u16string>;
DropDownCheckbox(const std::u16string& title, ItemModel* model);
DropDownCheckbox(const DropDownCheckbox&) = delete;
DropDownCheckbox& operator=(const DropDownCheckbox&) = delete;
~DropDownCheckbox() override;
void SetSelectedAction(base::RepeatingClosure callback);
SelectedIndices GetSelectedIndices() const;
SelectedItems GetSelectedItems() const;
bool IsMenuRunning() const;
void SetCallback(PressedCallback callback) override;
void OnBoundsChanged(const gfx::Rect& previous_bounds) override;
void OnBlur() override;
void AddedToWidget() override;
void RemovedFromWidget() override;
void Layout(PassKey) override;
void OnWidgetBoundsChanged(views::Widget* widget,
const gfx::Rect& bounds) override;
private:
class SelectionModel;
class MenuView;
class EventHandler;
gfx::Rect GetExpectedMenuBounds() const;
void OnDropDownCheckboxPressed();
void ShowDropDownMenu();
void CloseDropDownMenu();
void OnPerformAction();
raw_ptr<ItemModel> model_;
const raw_ptr<views::Label> title_ = nullptr;
const raw_ptr<views::ImageView> drop_down_arrow_ = nullptr;
std::unique_ptr<SelectionModel> selection_model_;
base::RepeatingClosure callback_;
std::unique_ptr<EventHandler> event_handler_;
raw_ptr<MenuView> menu_view_ = nullptr;
views::UniqueWidgetPtr menu_;
base::TimeTicks closed_time_;
base::ScopedObservation<views::Widget, views::WidgetObserver>
widget_observer_{this};
};
}
#endif