c83f836faf
* docs: add references to app.whenReady() in isReady * refactor: prefer app.whenReady() In the docs, specs, and lib, replace instances of `app.once('ready')` (seen occasionally) and `app.on('ready')` (extremely common) with `app.whenReady()`. It's better to encourage users to use whenReady(): 1. it handles the edge case of registering for 'ready' after it's fired 2. it avoids the minor wart of leaving an active listener alive for an event that wll never fire again
190 lines
5.7 KiB
Markdown
190 lines
5.7 KiB
Markdown
## Class: TouchBar
|
||
|
||
> Create TouchBar layouts for native macOS applications
|
||
|
||
Process: [Main](../tutorial/application-architecture.md#main-and-renderer-processes)
|
||
|
||
### `new TouchBar(options)` _Experimental_
|
||
|
||
* `options` Object
|
||
* `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))[] (optional)
|
||
* `escapeItem` ([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) | null) (optional)
|
||
|
||
Creates a new touch bar with the specified items. Use
|
||
`BrowserWindow.setTouchBar` to add the `TouchBar` to a window.
|
||
|
||
**Note:** The TouchBar API is currently experimental and may change or be
|
||
removed in future Electron releases.
|
||
|
||
**Tip:** If you don't have a MacBook with Touch Bar, you can use
|
||
[Touch Bar Simulator](https://github.com/sindresorhus/touch-bar-simulator)
|
||
to test Touch Bar usage in your app.
|
||
|
||
### Static Properties
|
||
|
||
#### `TouchBarButton`
|
||
|
||
A [`typeof TouchBarButton`](./touch-bar-button.md) reference to the `TouchBarButton` class.
|
||
|
||
#### `TouchBarColorPicker`
|
||
|
||
A [`typeof TouchBarColorPicker`](./touch-bar-color-picker.md) reference to the `TouchBarColorPicker` class.
|
||
|
||
#### `TouchBarGroup`
|
||
|
||
A [`typeof TouchBarGroup`](./touch-bar-group.md) reference to the `TouchBarGroup` class.
|
||
|
||
#### `TouchBarLabel`
|
||
|
||
A [`typeof TouchBarLabel`](./touch-bar-label.md) reference to the `TouchBarLabel` class.
|
||
|
||
#### `TouchBarPopover`
|
||
|
||
A [`typeof TouchBarPopover`](./touch-bar-popover.md) reference to the `TouchBarPopover` class.
|
||
|
||
#### `TouchBarScrubber`
|
||
|
||
A [`typeof TouchBarScrubber`](./touch-bar-scrubber.md) reference to the `TouchBarScrubber` class.
|
||
|
||
#### `TouchBarSegmentedControl`
|
||
|
||
A [`typeof TouchBarSegmentedControl`](./touch-bar-segmented-control.md) reference to the `TouchBarSegmentedControl` class.
|
||
|
||
#### `TouchBarSlider`
|
||
|
||
A [`typeof TouchBarSlider`](./touch-bar-slider.md) reference to the `TouchBarSlider` class.
|
||
|
||
#### `TouchBarSpacer`
|
||
|
||
A [`typeof TouchBarSpacer`](./touch-bar-spacer.md) reference to the `TouchBarSpacer` class.
|
||
|
||
### Instance Properties
|
||
|
||
The following properties are available on instances of `TouchBar`:
|
||
|
||
#### `touchBar.escapeItem`
|
||
|
||
A `TouchBarItem` that will replace the "esc" button on the touch bar when set.
|
||
Setting to `null` restores the default "esc" button. Changing this value
|
||
immediately updates the escape item in the touch bar.
|
||
|
||
## Examples
|
||
|
||
Below is an example of a simple slot machine touch bar game with a button
|
||
and some labels.
|
||
|
||
```javascript
|
||
const { app, BrowserWindow, TouchBar } = require('electron')
|
||
|
||
const { TouchBarLabel, TouchBarButton, TouchBarSpacer } = TouchBar
|
||
|
||
let spinning = false
|
||
|
||
// Reel labels
|
||
const reel1 = new TouchBarLabel()
|
||
const reel2 = new TouchBarLabel()
|
||
const reel3 = new TouchBarLabel()
|
||
|
||
// Spin result label
|
||
const result = new TouchBarLabel()
|
||
|
||
// Spin button
|
||
const spin = new TouchBarButton({
|
||
label: '🎰 Spin',
|
||
backgroundColor: '#7851A9',
|
||
click: () => {
|
||
// Ignore clicks if already spinning
|
||
if (spinning) {
|
||
return
|
||
}
|
||
|
||
spinning = true
|
||
result.label = ''
|
||
|
||
let timeout = 10
|
||
const spinLength = 4 * 1000 // 4 seconds
|
||
const startTime = Date.now()
|
||
|
||
const spinReels = () => {
|
||
updateReels()
|
||
|
||
if ((Date.now() - startTime) >= spinLength) {
|
||
finishSpin()
|
||
} else {
|
||
// Slow down a bit on each spin
|
||
timeout *= 1.1
|
||
setTimeout(spinReels, timeout)
|
||
}
|
||
}
|
||
|
||
spinReels()
|
||
}
|
||
})
|
||
|
||
const getRandomValue = () => {
|
||
const values = ['🍒', '💎', '7️⃣', '🍊', '🔔', '⭐', '🍇', '🍀']
|
||
return values[Math.floor(Math.random() * values.length)]
|
||
}
|
||
|
||
const updateReels = () => {
|
||
reel1.label = getRandomValue()
|
||
reel2.label = getRandomValue()
|
||
reel3.label = getRandomValue()
|
||
}
|
||
|
||
const finishSpin = () => {
|
||
const uniqueValues = new Set([reel1.label, reel2.label, reel3.label]).size
|
||
if (uniqueValues === 1) {
|
||
// All 3 values are the same
|
||
result.label = '💰 Jackpot!'
|
||
result.textColor = '#FDFF00'
|
||
} else if (uniqueValues === 2) {
|
||
// 2 values are the same
|
||
result.label = '😍 Winner!'
|
||
result.textColor = '#FDFF00'
|
||
} else {
|
||
// No values are the same
|
||
result.label = '🙁 Spin Again'
|
||
result.textColor = null
|
||
}
|
||
spinning = false
|
||
}
|
||
|
||
const touchBar = new TouchBar({
|
||
items: [
|
||
spin,
|
||
new TouchBarSpacer({ size: 'large' }),
|
||
reel1,
|
||
new TouchBarSpacer({ size: 'small' }),
|
||
reel2,
|
||
new TouchBarSpacer({ size: 'small' }),
|
||
reel3,
|
||
new TouchBarSpacer({ size: 'large' }),
|
||
result
|
||
]
|
||
})
|
||
|
||
let window
|
||
|
||
app.whenReady().then(() => {
|
||
window = new BrowserWindow({
|
||
frame: false,
|
||
titleBarStyle: 'hiddenInset',
|
||
width: 200,
|
||
height: 200,
|
||
backgroundColor: '#000'
|
||
})
|
||
window.loadURL('about:blank')
|
||
window.setTouchBar(touchBar)
|
||
})
|
||
```
|
||
|
||
### Running the above example
|
||
|
||
To run the example above, you'll need to (assuming you've got a terminal open in the directory you want to run the example):
|
||
|
||
1. Save the above file to your computer as `touchbar.js`
|
||
2. Install Electron via `npm install electron`
|
||
3. Run the example inside Electron: `./node_modules/.bin/electron touchbar.js`
|
||
|
||
You should then see a new Electron window and the app running in your touch bar (or touch bar emulator).
|