#ifndef ASH_APP_LIST_VIEWS_CONTINUE_TASK_VIEW_H_
#define ASH_APP_LIST_VIEWS_CONTINUE_TASK_VIEW_H_
#include <memory>
#include "ash/app_list/model/search/search_result.h"
#include "ash/app_list/model/search/search_result_observer.h"
#include "ash/ash_export.h"
#include "base/memory/raw_ptr.h"
#include "ui/base/mojom/menu_source_type.mojom-forward.h"
#include "ui/menus/simple_menu_model.h"
#include "ui/views/context_menu_controller.h"
#include "ui/views/controls/button/button.h"
namespace views {
class ImageView;
class Label;
class MenuRunner;
}
namespace ash {
class AppListViewDelegate;
enum ContinueTaskCommandId {
kOpenResult = 0,
kRemoveResult = 1,
kHideContinueSection = 2,
};
class ASH_EXPORT ContinueTaskView : public views::Button,
public views::ContextMenuController,
public ui::SimpleMenuModel::Delegate,
public SearchResultObserver {
METADATA_HEADER(ContinueTaskView, views::Button)
public:
enum class TaskResultType {
kLocalFile = 0,
kDriveFile = 1,
kUnknown = 2,
kHelpApp = 3,
kDesksAdminTemplate = 4,
kMaxValue = kDesksAdminTemplate,
};
ContinueTaskView(AppListViewDelegate* view_delegate, bool tablet_mode);
ContinueTaskView(const ContinueTaskView&) = delete;
ContinueTaskView& operator=(const ContinueTaskView&) = delete;
~ContinueTaskView() override;
gfx::Size CalculatePreferredSize(
const views::SizeBounds& available_size) const override;
gfx::Size GetMinimumSize() const override;
gfx::Size GetMaximumSize() const override;
void OnThemeChanged() override;
void OnResultDestroying() override;
void OnMetadataChanged() override;
void SetResult(SearchResult* result);
bool IsMenuShowing() const;
void set_index_in_container(size_t index) { index_in_container_ = index; }
SearchResult* result() const { return result_; }
int index_in_container() const { return index_in_container_.value_or(-1); }
void ExecuteCommand(int command_id, int event_flags) override;
void MenuClosed(ui::SimpleMenuModel* source) override;
TaskResultType GetTaskResultType();
private:
void UpdateIcon();
ui::ColorId GetIconBackgroundColorId() const;
gfx::Size GetIconSize() const;
void UpdateResult();
void OnButtonPressed(const ui::Event& event);
void ShowContextMenuForViewImpl(
views::View* source,
const gfx::Point& point,
ui::mojom::MenuSourceType source_type) override;
void OpenResult(int event_flags);
void RemoveResult();
ui::SimpleMenuModel* BuildMenuModel();
void CloseContextMenu();
void LogMetricsOnResultRemoved();
std::optional<int> index_in_container_;
const raw_ptr<AppListViewDelegate> view_delegate_;
raw_ptr<views::Label> title_ = nullptr;
raw_ptr<views::Label> subtitle_ = nullptr;
raw_ptr<views::ImageView> icon_ = nullptr;
raw_ptr<SearchResult> result_ =
nullptr;
std::unique_ptr<ui::SimpleMenuModel> context_menu_model_;
std::unique_ptr<views::MenuRunner> context_menu_runner_;
base::ScopedObservation<SearchResult, SearchResultObserver>
search_result_observation_{this};
base::WeakPtrFactory<ContinueTaskView> weak_ptr_factory_{this};
};
}
#endif