1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
|
// Copyright 2011 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_VIEWS_DOWNLOAD_DOWNLOAD_SHELF_CONTEXT_MENU_VIEW_H_
#define CHROME_BROWSER_UI_VIEWS_DOWNLOAD_DOWNLOAD_SHELF_CONTEXT_MENU_VIEW_H_
#include <array>
#include <memory>
#include "base/memory/raw_ptr.h"
#include "base/time/time.h"
#include "chrome/browser/download/download_shelf_context_menu.h"
#include "ui/base/mojom/menu_source_type.mojom-forward.h"
class DownloadItemView;
namespace gfx {
class Rect;
}
namespace views {
class MenuRunner;
class Widget;
} // namespace views
class DownloadBubbleUIController;
class DownloadShelfContextMenuView : public DownloadShelfContextMenu {
public:
// TODO(crbug.com/40756678): Remove dependency on DownloadItemView.
explicit DownloadShelfContextMenuView(DownloadItemView* download_item_view);
explicit DownloadShelfContextMenuView(
base::WeakPtr<DownloadUIModel> download_ui_model);
DownloadShelfContextMenuView(
base::WeakPtr<DownloadUIModel> download_ui_model,
base::WeakPtr<DownloadBubbleUIController> bubble_controller);
DownloadShelfContextMenuView(const DownloadShelfContextMenuView&) = delete;
DownloadShelfContextMenuView& operator=(const DownloadShelfContextMenuView&) =
delete;
~DownloadShelfContextMenuView() override;
base::TimeTicks close_time() const { return close_time_; }
// |rect| is the bounding area for positioning the menu in screen coordinates.
// The menu will be positioned above or below but not overlapping |rect|.
void Run(views::Widget* parent_widget,
const gfx::Rect& rect,
ui::mojom::MenuSourceType source_type,
base::RepeatingClosure on_menu_closed_callback);
void SetOnMenuWillShowCallback(base::OnceClosure on_menu_will_show_callback);
private:
// Callback for MenuRunner.
void OnMenuClosed(base::RepeatingClosure on_menu_closed_callback);
void OnMenuWillShow(ui::SimpleMenuModel* source) override;
void ExecuteCommand(int command_id, int event_flags) override;
// Parent download item view.
// TODO(crbug.com/40756678): Remove dependency on DownloadItemView.
raw_ptr<DownloadItemView> download_item_view_ = nullptr;
// Use this instead of DownloadItemView to submit download for feedback.
base::WeakPtr<DownloadBubbleUIController> bubble_controller_ = nullptr;
base::OnceClosure on_menu_will_show_callback_;
std::unique_ptr<views::MenuRunner> menu_runner_;
// Time the menu was closed.
base::TimeTicks close_time_;
// Determines whether we should record if a DownloadCommand was executed.
std::array<bool, DownloadCommands::kMaxValue + 1>
download_commands_executed_recorded_{false};
};
#endif // CHROME_BROWSER_UI_VIEWS_DOWNLOAD_DOWNLOAD_SHELF_CONTEXT_MENU_VIEW_H_
|