Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2239)

Unified Diff: ash/mus/context_menu_mus.cc

Issue 1760743002: Add simple mash context menu support. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase; use test items; cleanup. Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ash/mus/context_menu_mus.cc
diff --git a/ash/mus/context_menu_mus.cc b/ash/mus/context_menu_mus.cc
new file mode 100644
index 0000000000000000000000000000000000000000..318a4e8db24c30b592611b1c4bde3fad0aeddca3
--- /dev/null
+++ b/ash/mus/context_menu_mus.cc
@@ -0,0 +1,171 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/mus/context_menu_mus.h"
+
+#include "ash/desktop_background/user_wallpaper_delegate.h"
+#include "ash/root_window_controller.h"
+#include "ash/session/session_state_delegate.h"
+#include "ash/shelf/shelf.h"
+#include "ash/shelf/shelf_types.h"
+#include "ash/shelf/shelf_widget.h"
+#include "ash/shell.h"
+#include "grit/ash_strings.h"
+#include "mojo/common/common_type_converters.h"
+#include "mojo/shell/public/cpp/connector.h"
+
+namespace ash {
+namespace sysui {
+
+ContextMenuMus::ContextMenuMus(ContextMenuMus* root_menu,
+ Shelf* shelf,
+ const ShelfItem* item)
+ : ui::SimpleMenuModel(nullptr),
+ root_menu_(root_menu ? root_menu : this),
+ shelf_(shelf),
+ item_(item),
+ alignment_menu_(shelf) {
+ set_delegate(this);
+}
+
+void ContextMenuMus::InitializeRootMenu(mojo::Connector* connector) {
+ // Only the root menu should add ash items or make a connection to Chrome.
+ DCHECK_EQ(root_menu_, this);
+
+ connector->ConnectToInterface("exe:chrome", &context_menu_);
+ context_menu_->GetItemsAndInfo(
+ item_ ? item_->type : ShelfItemType::TYPE_UNDEFINED,
+ item_ ? item_->id : 0,
+ base::Bind(&ContextMenuMus::GetItemsAndInfoCallback,
+ base::Unretained(this)));
+ context_menu_.WaitForIncomingResponse();
sky 2016/03/18 20:30:57 We shouldn't block here. There are two options for
msw 2016/03/18 22:10:30 Adding a menu without Chrome hooks for now, as dis
+}
+
+ContextMenuMus::~ContextMenuMus() {}
+
+void ContextMenuMus::GetItemsAndInfoCallback(
+ mojo::Array<mash::shelf::mojom::ContextMenuItemPtr> items,
+ bool can_user_modify_shelf_auto_hide_behavior,
+ bool is_guest_session) {
+ AddItems(std::move(items));
+
+ // TODO(msw): |controller| is null; ask the window manager about fullscreen?
+ RootWindowController* controller = RootWindowController::ForWindow(
+ shelf_->shelf_widget()->GetNativeWindow()->GetRootWindow());
+ if (can_user_modify_shelf_auto_hide_behavior &&
+ (!controller || !controller->GetWindowForFullscreenMode())) {
+ AddCheckItemWithStringId(MENU_AUTO_HIDE,
+ IDS_ASH_SHELF_CONTEXT_MENU_AUTO_HIDE);
+ }
+ if (ShelfWidget::ShelfAlignmentAllowed() &&
+ !Shell::GetInstance()->session_state_delegate()->IsScreenLocked()) {
+ AddSubMenuWithStringId(MENU_ALIGNMENT_MENU,
+ IDS_ASH_SHELF_CONTEXT_MENU_POSITION,
+ &alignment_menu_);
+ }
+ if (!is_guest_session)
+ AddItemWithStringId(MENU_CHANGE_WALLPAPER, IDS_AURA_SET_DESKTOP_WALLPAPER);
+}
+
+void ContextMenuMus::AddItems(
+ mojo::Array<mash::shelf::mojom::ContextMenuItemPtr> items) {
+ for (const auto& item : items) {
+ switch (item->type) {
+ case mash::shelf::mojom::ContextMenuItem::Type::ITEM:
+ DCHECK_EQ(item_enabled_.count(item->command_id), 0U);
+ item_enabled_[item->command_id] = item->enabled;
+ AddItem(item->command_id, item->label.To<base::string16>());
+ break;
+ case mash::shelf::mojom::ContextMenuItem::Type::CHECK:
+ DCHECK_EQ(item_enabled_.count(item->command_id), 0U);
+ DCHECK_EQ(item_checked_.count(item->command_id), 0U);
+ item_enabled_[item->command_id] = item->enabled;
+ item_checked_[item->command_id] = item->checked;
+ AddCheckItem(item->command_id, item->label.To<base::string16>());
+ break;
+ case mash::shelf::mojom::ContextMenuItem::Type::RADIO:
+ DCHECK_EQ(item_enabled_.count(item->command_id), 0U);
+ DCHECK_EQ(item_checked_.count(item->command_id), 0U);
+ item_enabled_[item->command_id] = item->enabled;
+ item_checked_[item->command_id] = item->checked;
+ AddRadioItem(item->command_id, item->label.To<base::string16>(),
+ item->radio_group_id);
+ break;
+ case mash::shelf::mojom::ContextMenuItem::Type::SEPARATOR:
+ AddSeparator(ui::NORMAL_SEPARATOR);
+ break;
+ case mash::shelf::mojom::ContextMenuItem::Type::SUBMENU:
+ DCHECK_EQ(item_enabled_.count(item->command_id), 0U);
+ DCHECK_EQ(item_submenu_.count(item->command_id), 0U);
+ item_enabled_[item->command_id] = item->enabled;
+ item_submenu_[item->command_id].reset(
+ new ContextMenuMus(root_menu_, shelf_, item_));
+ item_submenu_[item->command_id]->AddItems(std::move(item->submenu));
+ AddSubMenu(item->command_id, item->label.To<base::string16>(),
+ item_submenu_[item->command_id].get());
+ break;
+ default:
+ NOTREACHED() << "Unknown mus context menu item type.";
+ }
+ }
+}
+
+bool ContextMenuMus::IsCommandIdChecked(int command_id) const {
+ switch (command_id) {
+ case MENU_AUTO_HIDE:
+ return shelf_->GetAutoHideBehavior() == SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS;
+ case MENU_ALIGNMENT_MENU:
+ case MENU_CHANGE_WALLPAPER:
+ return false;
+ default:
+ if (item_checked_.find(command_id) != item_checked_.end())
+ return item_checked_.at(command_id);
+ }
+ NOTREACHED() << "Unknown mus context menu command " << command_id;
+ return false;
+}
+
+bool ContextMenuMus::IsCommandIdEnabled(int command_id) const {
+ switch (command_id) {
+ case MENU_AUTO_HIDE:
+ case MENU_ALIGNMENT_MENU:
+ return true;
+ case MENU_CHANGE_WALLPAPER:
+ return Shell::GetInstance()
+ ->user_wallpaper_delegate()
+ ->CanOpenSetWallpaperPage();
+ default:
+ if (item_enabled_.find(command_id) != item_enabled_.end())
+ return item_enabled_.at(command_id);
+ }
+ NOTREACHED() << "Unknown mus context menu command " << command_id;
+ return false;
+}
+
+bool ContextMenuMus::GetAcceleratorForCommandId(int command_id,
+ ui::Accelerator* accelerator) {
+ return false;
+}
+
+void ContextMenuMus::ExecuteCommand(int command_id, int event_flags) {
+ Shell* shell = Shell::GetInstance();
+ switch (static_cast<MenuItem>(command_id)) {
+ case MENU_AUTO_HIDE:
+ shelf_->SetAutoHideBehavior(shelf_->GetAutoHideBehavior() ==
+ SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS
+ ? SHELF_AUTO_HIDE_BEHAVIOR_NEVER
+ : SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
+ break;
+ case MENU_ALIGNMENT_MENU:
+ break;
+ case MENU_CHANGE_WALLPAPER:
+ shell->user_wallpaper_delegate()->OpenSetWallpaperPage();
+ default:
+ DCHECK_EQ(item_enabled_.count(command_id), 1U);
+ root_menu_->context_menu_->ExecuteCommand(command_id, event_flags);
+ }
+}
+
+} // namespace sysui
+} // namespace ash

Powered by Google App Engine
This is Rietveld 408576698