Commit 8bbaf67c authored by jonross's avatar jonross Committed by Commit bot

Turn Message Center Menus Async

Turn the context menu, and the notification settings menu, to use the ASYNC runtype

TEST=manual testing of the menus, message_center_unittests
BUG=557136

Review-Url: https://codereview.chromium.org/2277833003
Cr-Commit-Position: refs/heads/master@{#415433}
parent ffd1c2b2
......@@ -7,6 +7,7 @@
#include "ui/base/models/menu_model.h"
#include "ui/message_center/views/message_center_controller.h"
#include "ui/message_center/views/message_view.h"
#include "ui/views/controls/menu/menu_model_adapter.h"
#include "ui/views/controls/menu/menu_runner.h"
#include "ui/views/widget/widget.h"
......@@ -26,20 +27,30 @@ void MessageViewContextMenuController::ShowContextMenuForView(
ui::MenuSourceType source_type) {
// Assumes that the target view has to be MessageView.
MessageView* message_view = static_cast<MessageView*>(source);
std::unique_ptr<ui::MenuModel> menu_model(controller_->CreateMenuModel(
message_view->notifier_id(), message_view->display_source()));
menu_model_ = controller_->CreateMenuModel(message_view->notifier_id(),
message_view->display_source());
if (!menu_model || menu_model->GetItemCount() == 0)
if (!menu_model_ || menu_model_->GetItemCount() == 0)
return;
views::MenuRunner menu_runner(menu_model.get(),
views::MenuRunner::HAS_MNEMONICS);
menu_model_adapter_.reset(new views::MenuModelAdapter(
menu_model_.get(),
base::Bind(&MessageViewContextMenuController::OnMenuClosed,
base::Unretained(this))));
ignore_result(menu_runner.RunMenuAt(source->GetWidget()->GetTopLevelWidget(),
NULL,
gfx::Rect(point, gfx::Size()),
views::MENU_ANCHOR_TOPRIGHT,
source_type));
menu_runner_.reset(new views::MenuRunner(
menu_model_adapter_->CreateMenu(),
views::MenuRunner::HAS_MNEMONICS | views::MenuRunner::ASYNC));
menu_runner_->RunMenuAt(source->GetWidget()->GetTopLevelWidget(), NULL,
gfx::Rect(point, gfx::Size()),
views::MENU_ANCHOR_TOPRIGHT, source_type);
}
void MessageViewContextMenuController::OnMenuClosed() {
menu_runner_.reset();
menu_model_adapter_.reset();
menu_model_.reset();
}
} // namespace message_center
......@@ -5,10 +5,21 @@
#ifndef UI_MESSAGE_CENTER_VIEWS_MESSAGE_VIEW_CONTEXT_MENU_CONTROLLER_H_
#define UI_MESSAGE_CENTER_VIEWS_MESSAGE_VIEW_CONTEXT_MENU_CONTROLLER_H_
#include <memory>
#include "base/compiler_specific.h"
#include "base/macros.h"
#include "ui/views/context_menu_controller.h"
namespace ui {
class MenuModel;
} // namespace ui
namespace views {
class MenuModelAdapter;
class MenuRunner;
} // namespace views
namespace message_center {
class MessageCenterController;
......@@ -24,8 +35,15 @@ class MessageViewContextMenuController : public views::ContextMenuController {
const gfx::Point& point,
ui::MenuSourceType source_type) override;
// Callback for MenuModelAdapter
void OnMenuClosed();
MessageCenterController* controller_;
std::unique_ptr<ui::MenuModel> menu_model_;
std::unique_ptr<views::MenuModelAdapter> menu_model_adapter_;
std::unique_ptr<views::MenuRunner> menu_runner_;
DISALLOW_COPY_AND_ASSIGN(MessageViewContextMenuController);
};
......
......@@ -36,6 +36,7 @@
#include "ui/views/controls/label.h"
#include "ui/views/controls/link.h"
#include "ui/views/controls/link_listener.h"
#include "ui/views/controls/menu/menu_model_adapter.h"
#include "ui/views/controls/menu/menu_runner.h"
#include "ui/views/controls/scroll_view.h"
#include "ui/views/controls/scrollbar/overlay_scroll_bar.h"
......@@ -683,20 +684,28 @@ void NotifierSettingsView::OnMenuButtonClicked(views::MenuButton* source,
const gfx::Point& point,
const ui::Event* event) {
notifier_group_menu_model_.reset(new NotifierGroupMenuModel(provider_));
notifier_group_menu_model_adapter_.reset(new views::MenuModelAdapter(
notifier_group_menu_model_.get(),
base::Bind(&NotifierSettingsView::OnMenuClosed, base::Unretained(this))));
notifier_group_menu_runner_.reset(new views::MenuRunner(
notifier_group_menu_model_.get(), views::MenuRunner::CONTEXT_MENU));
notifier_group_menu_model_adapter_->CreateMenu(),
views::MenuRunner::CONTEXT_MENU | views::MenuRunner::ASYNC));
gfx::Rect menu_anchor = source->GetBoundsInScreen();
menu_anchor.Inset(
gfx::Insets(0, kMenuWhitespaceOffset, 0, kMenuWhitespaceOffset));
if (views::MenuRunner::MENU_DELETED ==
notifier_group_menu_runner_->RunMenuAt(GetWidget(),
notifier_group_selector_,
menu_anchor,
views::MENU_ANCHOR_BUBBLE_ABOVE,
ui::MENU_SOURCE_MOUSE))
return;
notifier_group_menu_runner_->RunMenuAt(
GetWidget(), notifier_group_selector_, menu_anchor,
views::MENU_ANCHOR_BUBBLE_ABOVE, ui::MENU_SOURCE_MOUSE);
}
void NotifierSettingsView::OnMenuClosed() {
MessageCenterView* center_view = static_cast<MessageCenterView*>(parent());
center_view->OnSettingsChanged();
notifier_group_menu_runner_.reset();
notifier_group_menu_model_adapter_.reset();
notifier_group_menu_model_.reset();
}
} // namespace message_center
......@@ -22,6 +22,7 @@
namespace views {
class Label;
class MenuButton;
class MenuModelAdapter;
class MenuRunner;
}
......@@ -111,6 +112,9 @@ class MESSAGE_CENTER_EXPORT NotifierSettingsView
const gfx::Point& point,
const ui::Event* event) override;
// Callback for views::MenuModelAdapter.
void OnMenuClosed();
views::ImageButton* title_arrow_;
views::Label* title_label_;
views::MenuButton* notifier_group_selector_;
......@@ -118,6 +122,7 @@ class MESSAGE_CENTER_EXPORT NotifierSettingsView
NotifierSettingsProvider* provider_;
std::set<NotifierButton*> buttons_;
std::unique_ptr<NotifierGroupMenuModel> notifier_group_menu_model_;
std::unique_ptr<views::MenuModelAdapter> notifier_group_menu_model_adapter_;
std::unique_ptr<views::MenuRunner> notifier_group_menu_runner_;
DISALLOW_COPY_AND_ASSIGN(NotifierSettingsView);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment