From b6cbd42d8bf46e7bc7b87708679b6f0727c44b92 Mon Sep 17 00:00:00 2001 From: Eugene Pankov Date: Sun, 28 Apr 2019 14:38:21 +0200 Subject: [PATCH] less touchbar flicker, activity icons --- app/assets/activity.png | Bin 0 -> 5065 bytes .../src/services/touchbar.service.ts | 40 +++++++++++++++--- 2 files changed, 33 insertions(+), 7 deletions(-) create mode 100644 app/assets/activity.png diff --git a/app/assets/activity.png b/app/assets/activity.png new file mode 100644 index 0000000000000000000000000000000000000000..adc9b6f8e552bdf85ef0ed2e36dd550757807774 GIT binary patch literal 5065 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 literal 0 HcmV?d00001 diff --git a/terminus-core/src/services/touchbar.service.ts b/terminus-core/src/services/touchbar.service.ts index 83e80c69..706b82d0 100644 --- a/terminus-core/src/services/touchbar.service.ts +++ b/terminus-core/src/services/touchbar.service.ts @@ -10,6 +10,7 @@ import { IToolbarButton, ToolbarButtonProvider } from '../api' @Injectable({ providedIn: 'root' }) export class TouchbarService { private tabsSegmentedControl: TouchBarSegmentedControl + private buttonsSegmentedControl: TouchBarSegmentedControl private tabSegments: SegmentedControlSegment[] = [] private nsImageCache: {[id: string]: Electron.NativeImage} = {} @@ -24,16 +25,31 @@ export class TouchbarService { if (this.hostApp.platform !== Platform.macOS) { return } - app.tabsChanged$.subscribe(() => this.update()) - app.activeTabChange$.subscribe(() => this.update()) + app.tabsChanged$.subscribe(() => this.updateTabs()) + app.activeTabChange$.subscribe(() => this.updateTabs()) + + let activityIconPath = `${electron.app.getAppPath()}/assets/activity.png` + let activityIcon = this.electron.nativeImage.createFromPath(activityIconPath) app.tabOpened$.subscribe(tab => { tab.titleChange$.subscribe(title => { this.tabSegments[app.tabs.indexOf(tab)].label = this.shortenTitle(title) this.tabsSegmentedControl.segments = this.tabSegments }) + tab.activity$.subscribe(hasActivity => { + let showIcon = this.app.activeTab !== tab && hasActivity + this.tabSegments[app.tabs.indexOf(tab)].icon = showIcon ? activityIcon : null + }) }) } + updateTabs () { + this.tabSegments = this.app.tabs.map(tab => ({ + label: this.shortenTitle(tab.title), + })) + this.tabsSegmentedControl.segments = this.tabSegments + this.tabsSegmentedControl.selectedIndex = this.app.tabs.indexOf(this.app.activeTab) + } + update () { if (this.hostApp.platform !== Platform.macOS) { return @@ -47,6 +63,7 @@ export class TouchbarService { this.tabSegments = this.app.tabs.map(tab => ({ label: this.shortenTitle(tab.title), })) + this.tabsSegmentedControl = new this.electron.TouchBar.TouchBarSegmentedControl({ segments: this.tabSegments, selectedIndex: this.app.tabs.indexOf(this.app.activeTab), @@ -54,23 +71,32 @@ export class TouchbarService { this.app.selectTab(this.app.tabs[selectedIndex]) }) }) + + this.buttonsSegmentedControl = new this.electron.TouchBar.TouchBarSegmentedControl({ + segments: buttons.map(button => this.getButton(button)), + mode: 'buttons', + change: (selectedIndex) => this.zone.run(() => { + buttons[selectedIndex].click() + }) + }) + let touchBar = new this.electron.TouchBar({ items: [ this.tabsSegmentedControl, new this.electron.TouchBar.TouchBarSpacer({ size: 'flexible' }), new this.electron.TouchBar.TouchBarSpacer({ size: 'small' }), - ...buttons.map(button => this.getButton(button)) + this.buttonsSegmentedControl, ] }) this.hostApp.setTouchBar(touchBar) } - private getButton (button: IToolbarButton): Electron.TouchBarButton { - return new this.electron.TouchBar.TouchBarButton({ + private getButton (button: IToolbarButton): Electron.SegmentedControlSegment { + return { label: button.touchBarNSImage ? null : this.shortenTitle(button.touchBarTitle || button.title), icon: button.touchBarNSImage ? this.getCachedNSImage(button.touchBarNSImage) : null, - click: () => this.zone.run(() => button.click()), - }) + // click: () => this.zone.run(() => button.click()), + } } private getCachedNSImage (name: string) {