Browse Source

Add a method to set the escape identifier on the touch bar

Samuel Attard 8 years ago
parent
commit
4d6b0fc01b

+ 5 - 0
atom/browser/api/atom_api_window.cc

@@ -853,6 +853,10 @@ void Window::RefreshTouchBarItem(const std::string& item_id) {
   window_->RefreshTouchBarItem(item_id);
 }
 
+void Window::SetEscapeTouchBarItem(const mate::PersistentDictionary item) {
+  window_->SetEscapeTouchBarItem(item);
+}
+
 int32_t Window::ID() const {
   return weak_map_id();
 }
@@ -975,6 +979,7 @@ void Window::BuildPrototype(v8::Isolate* isolate,
       .SetMethod("setVibrancy", &Window::SetVibrancy)
       .SetMethod("_setTouchBarItems", &Window::SetTouchBar)
       .SetMethod("_refreshTouchBarItem", &Window::RefreshTouchBarItem)
+      .SetMethod("_setEscapeTouchBarItem", &Window::SetEscapeTouchBarItem)
 #if defined(OS_WIN)
       .SetMethod("hookWindowMessage", &Window::HookWindowMessage)
       .SetMethod("isWindowMessageHooked", &Window::IsWindowMessageHooked)

+ 1 - 0
atom/browser/api/atom_api_window.h

@@ -208,6 +208,7 @@ class Window : public mate::TrackableObject<Window>,
   void SetVibrancy(mate::Arguments* args);
   void SetTouchBar(const std::vector<mate::PersistentDictionary>& items);
   void RefreshTouchBarItem(const std::string& item_id);
+  void SetEscapeTouchBarItem(const mate::PersistentDictionary item);
 
   v8::Local<v8::Value> WebContents(v8::Isolate* isolate);
 

+ 3 - 0
atom/browser/native_window.cc

@@ -347,6 +347,9 @@ void NativeWindow::SetTouchBar(
 void NativeWindow::RefreshTouchBarItem(const std::string& item_id) {
 }
 
+void NativeWindow::SetEscapeTouchBarItem(const mate::PersistentDictionary item) {
+}
+
 void NativeWindow::FocusOnWebView() {
   web_contents()->GetRenderViewHost()->GetWidget()->Focus();
 }

+ 1 - 0
atom/browser/native_window.h

@@ -174,6 +174,7 @@ class NativeWindow : public base::SupportsUserData,
   virtual void SetTouchBar(
       const std::vector<mate::PersistentDictionary>& items);
   virtual void RefreshTouchBarItem(const std::string& item_id);
+  virtual void SetEscapeTouchBarItem(const mate::PersistentDictionary item);
 
   // Webview APIs.
   virtual void FocusOnWebView();

+ 1 - 0
atom/browser/native_window_mac.h

@@ -103,6 +103,7 @@ class NativeWindowMac : public NativeWindow,
   void SetTouchBar(
       const std::vector<mate::PersistentDictionary>& items) override;
   void RefreshTouchBarItem(const std::string& item_id) override;
+  void SetEscapeTouchBarItem(const mate::PersistentDictionary item) override;
 
   // content::RenderWidgetHost::InputEventObserver:
   void OnInputEvent(const blink::WebInputEvent& event) override;

+ 9 - 0
atom/browser/native_window_mac.mm

@@ -410,6 +410,11 @@ enum {
     return nil;
 }
 
+-(void)setEscapeTouchBarItem:(mate::PersistentDictionary)item {
+  if (self.touchBar && atom_touch_bar_)
+    [atom_touch_bar_ setEscapeTouchBarItem:item forTouchBar:self.touchBar];
+}
+
 // NSWindow overrides.
 
 - (void)swipeWithEvent:(NSEvent *)event {
@@ -1417,6 +1422,10 @@ void NativeWindowMac::RefreshTouchBarItem(const std::string& item_id) {
   [window_ refreshTouchBarItem:item_id];
 }
 
+void NativeWindowMac::SetEscapeTouchBarItem(const mate::PersistentDictionary item) {
+  [window_ setEscapeTouchBarItem:item];
+}
+
 void NativeWindowMac::OnInputEvent(const blink::WebInputEvent& event) {
   switch (event.type) {
     case blink::WebInputEvent::GestureScrollBegin:

+ 2 - 0
atom/browser/ui/cocoa/atom_touch_bar.h

@@ -31,6 +31,8 @@
 - (NSTouchBar*)touchBarFromItemIdentifiers:(NSMutableArray*)items;
 - (NSMutableArray*)identifiersFromSettings:(const std::vector<mate::PersistentDictionary>&)settings;
 - (void)refreshTouchBarItem:(NSTouchBar*)touchBar id:(const std::string&)item_id;
+- (void)addNonDefaultTouchBarItems:(std::vector<mate::PersistentDictionary>)items;
+- (void)setEscapeTouchBarItem:(mate::PersistentDictionary)item forTouchBar:(NSTouchBar*)touchBar;
 
 
 - (NSString*)idFromIdentifier:(NSString*)identifier withPrefix:(NSString*)prefix;

+ 18 - 0
atom/browser/ui/cocoa/atom_touch_bar.mm

@@ -145,7 +145,25 @@ static NSString* const ImageScrubberItemIdentifier = @"scrubber.image.item";
   } else if (item_type == "scrubber") {
     [self updateScrubber:(NSCustomTouchBarItem*)item withSettings:settings];
   }
+}
+
+- (void)addNonDefaultTouchBarItems:(std::vector<mate::PersistentDictionary>)items {
+  [self identifiersFromSettings:items];
+}
 
+- (void)setEscapeTouchBarItem:(mate::PersistentDictionary)item forTouchBar:(NSTouchBar*)touchBar {
+  std::string type;
+  std::string item_id;
+  NSTouchBarItemIdentifier identifier = nil;
+  if (item.Get("type", &type) && item.Get("id", &item_id)) {
+    identifier = [self identifierFromID:item_id type:type];
+  }
+  if (identifier) {
+    [self addNonDefaultTouchBarItems:{ item }];
+    touchBar.escapeKeyReplacementItemIdentifier = identifier;
+  } else {
+    touchBar.escapeKeyReplacementItemIdentifier = nil;
+  }
 }
 
 - (void)buttonAction:(id)sender {

+ 12 - 1
docs/api/touch-bar.md

@@ -6,7 +6,7 @@ Process: [Main](../tutorial/quick-start.md#main-process)
 
 ### `new TouchBar(items)` _Experimental_
 
-* `items` ([TouchBarButton](touch-bar-button.md) | [TouchBarColorPicker](touch-bar-color-picker.md) | [TouchBarGroup](touch-bar-group.md) | [TouchBarLabel](touch-bar-label.md) | [TouchBarPopover](touch-bar-popover.md) | [TouchBarSlider](touch-bar-slider.md) | [TouchBarSpacer](touch-bar-spacer.md))[]
+* `items` ([TouchBarButton](touch-bar-button.md) | [TouchBarColorPicker](touch-bar-color-picker.md) | [TouchBarGroup](touch-bar-group.md) | [TouchBarLabel](touch-bar-label.md) | [TouchBarPopover](touch-bar-popover.md) | [TouchBarScrubber](touch-bar-scrubber.md) | [TouchBarSegmentedControl](touch-bar-segmented-control.md) | [TouchBarSlider](touch-bar-slider.md) | [TouchBarSpacer](touch-bar-spacer.md))[]
 
 Creates a new touch bar with the specified items. Use
 `BrowserWindow.setTouchBar` to add the `TouchBar` to a window.
@@ -14,6 +14,17 @@ Creates a new touch bar with the specified items. Use
 **Note:** The TouchBar API is currently experimental and may change or be
 removed in future Electron releases.
 
+### Instance Methods
+
+The following methods are available on instances of `TouchBar`:
+
+#### `touchBar.replaceEscapeItem([touchBarItem])`
+
+* `touchBarItem` (TouchBarButton | TouchBarColorPicker | TouchBarGroup | TouchBarLabel | TouchBarPopover | TouchBarScrubber | TouchBarSegmentedControl | TouchBarSlider | TouchBarSpacer) - (Optional) The touch bar item to replace the escape button with
+
+Replaces the "esc" button on the touchbar with the given TouchBarItem, if `touchBarItem` is not provided or is falsey the button is reset
+to the "esc" button automatically.
+
 ## Examples
 
 Below is an example of a simple slot machine touch bar game with a button

+ 14 - 0
lib/browser/api/touch-bar.js

@@ -28,6 +28,7 @@ class TouchBar extends EventEmitter {
     }
 
     this.windowListeners = {}
+    this.windows = {}
     this.items = {}
     this.ordereredItems = []
 
@@ -49,6 +50,15 @@ class TouchBar extends EventEmitter {
     })
   }
 
+  replaceEscapeItem(item) {
+    if (!item) item = {}
+    Object.keys(this.windows).forEach((windowID) => {
+      const window = this.windows[windowID]
+      window._setEscapeTouchBarItem(item)
+    })
+    this._escape = item;
+  }
+
   _addToWindow (window) {
     const {id} = window
 
@@ -76,11 +86,15 @@ class TouchBar extends EventEmitter {
       window.removeListener('closed', removeListeners)
       window._touchBar = null
       delete this.windowListeners[id]
+      delete this.windows[id]
     }
     window.once('closed', removeListeners)
     this.windowListeners[id] = removeListeners
+    this.windows[id] = window;
 
     window._setTouchBarItems(this.ordereredItems)
+
+    if (this._escape) window._setEscapeTouchBarItem(this._escape)
   }
 
   _removeFromWindow (window) {