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

Unified Diff: chrome/browser/ui/cocoa/browser_window_touch_bar.mm

Issue 2695493002: [Mac] Touch Bar support for default browser window state (Closed)
Patch Set: Tests are back~ Created 3 years, 10 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: chrome/browser/ui/cocoa/browser_window_touch_bar.mm
diff --git a/chrome/browser/ui/cocoa/browser_window_touch_bar.mm b/chrome/browser/ui/cocoa/browser_window_touch_bar.mm
new file mode 100644
index 0000000000000000000000000000000000000000..57a98f40b200cd7b3eadab43474990ab5153014c
--- /dev/null
+++ b/chrome/browser/ui/cocoa/browser_window_touch_bar.mm
@@ -0,0 +1,220 @@
+// Copyright 2017 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.
+
+#import "chrome/browser/ui/cocoa/browser_window_touch_bar.h"
+
+#include "base/mac/mac_util.h"
+#import "base/mac/scoped_nsobject.h"
+#import "base/mac/sdk_forward_declarations.h"
+#include "base/strings/sys_string_conversions.h"
+#include "chrome/app/chrome_command_ids.h"
+#include "chrome/app/vector_icons/vector_icons.h"
+#include "chrome/browser/command_updater.h"
+#include "chrome/browser/search_engines/template_url_service_factory.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_command_controller.h"
+#include "chrome/common/chrome_features.h"
+#include "chrome/grit/generated_resources.h"
+#include "components/search_engines/util.h"
+#include "components/toolbar/vector_icons.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/gfx/color_palette.h"
+#include "ui/gfx/color_utils.h"
+#include "ui/gfx/image/image.h"
+#include "ui/gfx/image/image_skia_util_mac.h"
+#include "ui/gfx/paint_vector_icon.h"
+#include "ui/gfx/vector_icons_public.h"
+#include "ui/vector_icons/vector_icons.h"
+
+namespace {
+
+// The touch bar's identifier.
+const NSTouchBarCustomizationIdentifier kBrowserWindowTouchBarId =
+ @"BrowserWindowTouchBarId";
+
+// Touch bar items identifiers.
+const NSTouchBarItemIdentifier kBackForwardTouchId = @"BackForwardTouchId";
+const NSTouchBarItemIdentifier kReloadOrStopTouchId = @"ReloadOrStopTouchId";
+const NSTouchBarItemIdentifier kSearchTouchId = @"SearchTouchId";
+const NSTouchBarItemIdentifier kNewTabTouchId = @"NewTabTouchId";
+const NSTouchBarItemIdentifier kStarTouchId = @"StarTouchId";
+
+// The button indexes in the back and forward segment control.
+const int kBackSegmentIndex = 0;
+const int kForwardSegmentIndex = 1;
+
+// Touch bar icon colors values.
+const SkColor kTouchBarDefaultIconColor = SK_ColorWHITE;
+const SkColor kTouchBarStarIconColor = gfx::kGoogleBlue500;
+
+// The size of the touch bar icons.
+const int kTouchBarIconSize = 16;
+
+// The width of the search button in the touch bar.
+const int kTouchBarSearchButtonWidth = 280;
+
+// Creates an NSImage from the given VectorIcon.
+NSImage* CreateNSImageFromId(const gfx::VectorIcon* icon,
+ SkColor color = kTouchBarDefaultIconColor) {
+ return NSImageFromImageSkiaWithColorSpace(
+ gfx::CreateVectorIcon(*icon, kTouchBarIconSize, color),
+ base::mac::GetSRGBColorSpace());
+}
+
+// Creates a NSButton for the touch bar.
+NSButton* CreateTouchBarButton(const gfx::VectorIcon* icon,
+ BrowserWindowTouchBar* owner,
+ int command,
+ SkColor color = kTouchBarDefaultIconColor) {
+ NSButton* button = [NSButton buttonWithImage:CreateNSImageFromId(icon, color)
+ target:owner
+ action:@selector(executeCommand:)];
+ button.tag = command;
+ return button;
+}
+
+} // namespace
+
+@interface BrowserWindowTouchBar () {
+ // Used to execute commands such as navigating back and forward.
+ CommandUpdater* commandUpdater_; // Weak, owned by Browser.
+
+ // The browser associated with the touch bar.
+ Browser* browser_; // Weak.
+}
+
+// Creates and return the back and forward segmented buttons.
+- (NSView*)backOrForwardTouchBarView;
+
+// Creates and returns the search button.
+- (NSView*)searchTouchBarView;
+@end
+
+@implementation BrowserWindowTouchBar
+
+@synthesize isPageLoading = isPageLoading_;
+@synthesize isStarred = isStarred_;
+
+- (instancetype)initWithBrowser:(Browser*)browser {
+ if ((self = [self init])) {
+ DCHECK(browser);
+ commandUpdater_ = browser->command_controller()->command_updater();
+ browser_ = browser;
+ }
+
+ return self;
+}
+
+- (NSTouchBar*)makeTouchBar {
+ if (!base::FeatureList::IsEnabled(features::kBrowserTouchBar))
+ return nil;
+
+ base::scoped_nsobject<NSTouchBar> touchBar(
+ [[NSClassFromString(@"NSTouchBar") alloc] init]);
+ NSArray* touchBarItemIdentifiers = @[
+ kBackForwardTouchId, kReloadOrStopTouchId, kSearchTouchId, kNewTabTouchId,
+ kStarTouchId
+ ];
+ [touchBar setCustomizationIdentifier:kBrowserWindowTouchBarId];
+ [touchBar setDefaultItemIdentifiers:touchBarItemIdentifiers];
+ [touchBar setCustomizationAllowedItemIdentifiers:touchBarItemIdentifiers];
+ [touchBar setDelegate:self];
+
+ return touchBar.autorelease();
+}
+
+- (NSTouchBarItem*)touchBar:(NSTouchBar*)touchBar
+ makeItemForIdentifier:(NSTouchBarItemIdentifier)identifier {
+ if (!touchBar)
+ return nil;
+
+ base::scoped_nsobject<NSCustomTouchBarItem> touchBarItem([[NSClassFromString(
+ @"NSCustomTouchBarItem") alloc] initWithIdentifier:identifier]);
+ if ([identifier isEqualTo:kBackForwardTouchId]) {
+ [touchBarItem setView:[self backOrForwardTouchBarView]];
+ } else if ([identifier isEqualTo:kReloadOrStopTouchId]) {
+ const gfx::VectorIcon* icon =
+ isPageLoading_ ? &kNavigateStopIcon : &kNavigateReloadIcon;
+ int command_id = isPageLoading_ ? IDC_STOP : IDC_RELOAD;
+ [touchBarItem setView:CreateTouchBarButton(icon, self, command_id)];
+ } else if ([identifier isEqualTo:kNewTabTouchId]) {
+ [touchBarItem
+ setView:CreateTouchBarButton(&kNewTabIcon, self, IDC_NEW_TAB)];
+ } else if ([identifier isEqualTo:kStarTouchId]) {
+ const gfx::VectorIcon* icon =
+ isStarred_ ? &toolbar::kStarActiveIcon : &toolbar::kStarIcon;
+ SkColor iconColor =
+ isStarred_ ? kTouchBarStarIconColor : kTouchBarDefaultIconColor;
+ [touchBarItem
+ setView:CreateTouchBarButton(icon, self, IDC_BOOKMARK_PAGE, iconColor)];
+ } else if ([identifier isEqualTo:kSearchTouchId]) {
+ [touchBarItem setView:[self searchTouchBarView]];
+ }
+
+ return touchBarItem.autorelease();
+}
+
+- (NSView*)backOrForwardTouchBarView {
+ NSArray* images = @[
+ CreateNSImageFromId(&ui::kBackArrowIcon),
+ CreateNSImageFromId(&ui::kForwardArrowIcon)
+ ];
+
+ NSSegmentedControl* control = [NSSegmentedControl
+ segmentedControlWithImages:images
+ trackingMode:NSSegmentSwitchTrackingMomentary
+ target:self
+ action:@selector(backOrForward:)];
+ control.segmentStyle = NSSegmentStyleSeparated;
+ [control setEnabled:commandUpdater_->IsCommandEnabled(IDC_BACK)
+ forSegment:kBackSegmentIndex];
+ [control setEnabled:commandUpdater_->IsCommandEnabled(IDC_FORWARD)
+ forSegment:kForwardSegmentIndex];
+ return control;
+}
+
+- (NSView*)searchTouchBarView {
+ TemplateURLService* templateUrlService =
+ TemplateURLServiceFactory::GetForProfile(browser_->profile());
+ const TemplateURL* default_provider =
+ templateUrlService->GetDefaultSearchProvider();
+ BOOL isGoogle =
+ default_provider->GetEngineType(
+ templateUrlService->search_terms_data()) == SEARCH_ENGINE_GOOGLE;
+
+ base::string16 title = l10n_util::GetStringUTF16(IDS_TOUCH_BAR_SEARCH);
+
+ gfx::VectorIconId iconId = isGoogle ? gfx::VectorIconId::G_SEARCH
+ : gfx::VectorIconId::OMNIBOX_SEARCH;
+ NSImage* image = NSImageFromImageSkiaWithColorSpace(
+ gfx::CreateVectorIcon(iconId, kTouchBarIconSize,
+ kTouchBarDefaultIconColor),
+ base::mac::GetSRGBColorSpace());
+
+ NSButton* searchButton =
+ [NSButton buttonWithTitle:base::SysUTF16ToNSString(title)
+ image:image
+ target:self
+ action:@selector(executeCommand:)];
+ searchButton.imageHugsTitle = YES;
+ searchButton.tag = IDC_FOCUS_LOCATION;
+ [searchButton.widthAnchor
+ constraintEqualToConstant:kTouchBarSearchButtonWidth]
+ .active = YES;
+ return searchButton;
+}
+
+- (void)backOrForward:(id)sender {
+ NSSegmentedControl* control = sender;
+ if ([control selectedSegment] == kBackSegmentIndex)
+ commandUpdater_->ExecuteCommand(IDC_BACK);
+ else
+ commandUpdater_->ExecuteCommand(IDC_FORWARD);
+}
+
+- (void)executeCommand:(id)sender {
+ commandUpdater_->ExecuteCommand([sender tag]);
+}
+
+@end

Powered by Google App Engine
This is Rietveld 408576698