docs: Adds Dialogs Fiddle example (#20473)
This commit is contained in:
parent
2bbf32a18b
commit
b060cbf4ec
12 changed files with 773 additions and 0 deletions
81
docs/fiddles/native-ui/dialogs/error-dialog/index.html
Normal file
81
docs/fiddles/native-ui/dialogs/error-dialog/index.html
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<title>Error Dialog</title>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div>
|
||||||
|
<h1>Use system dialogs</h1>
|
||||||
|
|
||||||
|
<h3>
|
||||||
|
The <code>dialog</code> module in Electron allows you to use native
|
||||||
|
system dialogs for opening files or directories, saving a file or
|
||||||
|
displaying informational messages.
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
This is a main process module because this process is more efficient
|
||||||
|
with native utilities and it allows the call to happen without
|
||||||
|
interrupting the visible elements in your page's renderer process.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Open the
|
||||||
|
<a href="http://electron.atom.io/docs/api/dialog/">
|
||||||
|
full API documentation (opens in new window)
|
||||||
|
</a>
|
||||||
|
in your browser.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<div>
|
||||||
|
<h2>Error Dialog</h2>
|
||||||
|
<div>
|
||||||
|
<div>
|
||||||
|
<button id="error-dialog">View Demo</button>
|
||||||
|
</div>
|
||||||
|
<p>
|
||||||
|
In this demo, the <code>ipc</code> module is used to send a message
|
||||||
|
from the renderer process instructing the main process to launch the
|
||||||
|
error dialog.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
You can use an error dialog before the app's
|
||||||
|
<code>ready</code> event, which is useful for showing errors upon
|
||||||
|
startup.
|
||||||
|
</p>
|
||||||
|
<h5>Renderer Process</h5>
|
||||||
|
<pre>
|
||||||
|
<code>
|
||||||
|
const {ipcRenderer} = require('electron')
|
||||||
|
|
||||||
|
const errorBtn = document.getElementById('error-dialog')
|
||||||
|
|
||||||
|
errorBtn.addEventListener('click', (event) => {
|
||||||
|
ipcRenderer.send('open-error-dialog')
|
||||||
|
})
|
||||||
|
</code></pre>
|
||||||
|
<h5>Main Process</h5>
|
||||||
|
<pre>
|
||||||
|
<code>
|
||||||
|
const {ipcMain, dialog} = require('electron')
|
||||||
|
|
||||||
|
ipcMain.on('open-error-dialog', (event) => {
|
||||||
|
dialog.showErrorBox('An Error Message', 'Demonstrating an error message.')
|
||||||
|
})
|
||||||
|
</code>
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// You can also require other files to run in this process
|
||||||
|
require("./renderer.js");
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
95
docs/fiddles/native-ui/dialogs/error-dialog/main.js
Normal file
95
docs/fiddles/native-ui/dialogs/error-dialog/main.js
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
// Modules to control application life and create native browser window
|
||||||
|
const { app, BrowserWindow, ipcMain, dialog } = require('electron')
|
||||||
|
|
||||||
|
// Keep a global reference of the window object, if you don't, the window will
|
||||||
|
// be closed automatically when the JavaScript object is garbage collected.
|
||||||
|
let mainWindow
|
||||||
|
|
||||||
|
function createWindow () {
|
||||||
|
// Create the browser window.
|
||||||
|
mainWindow = new BrowserWindow({
|
||||||
|
width: 800,
|
||||||
|
height: 600,
|
||||||
|
webPreferences: {
|
||||||
|
nodeIntegration: true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// and load the index.html of the app.
|
||||||
|
mainWindow.loadFile('index.html')
|
||||||
|
|
||||||
|
// Open the DevTools.
|
||||||
|
// mainWindow.webContents.openDevTools()
|
||||||
|
|
||||||
|
// Emitted when the window is closed.
|
||||||
|
mainWindow.on('closed', function () {
|
||||||
|
// Dereference the window object, usually you would store windows
|
||||||
|
// in an array if your app supports multi windows, this is the time
|
||||||
|
// when you should delete the corresponding element.
|
||||||
|
mainWindow = null
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// This method will be called when Electron has finished
|
||||||
|
// initialization and is ready to create browser windows.
|
||||||
|
// Some APIs can only be used after this event occurs.
|
||||||
|
app.on('ready', createWindow)
|
||||||
|
|
||||||
|
// Quit when all windows are closed.
|
||||||
|
app.on('window-all-closed', function () {
|
||||||
|
// On OS X it is common for applications and their menu bar
|
||||||
|
// to stay active until the user quits explicitly with Cmd + Q
|
||||||
|
if (process.platform !== 'darwin') {
|
||||||
|
app.quit()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
app.on('activate', function () {
|
||||||
|
// On OS X it's common to re-create a window in the app when the
|
||||||
|
// dock icon is clicked and there are no other windows open.
|
||||||
|
if (mainWindow === null) {
|
||||||
|
createWindow()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
ipcMain.on('open-error-dialog', event => {
|
||||||
|
dialog.showErrorBox('An Error Message', 'Demonstrating an error message.')
|
||||||
|
})
|
||||||
|
|
||||||
|
ipcMain.on('open-information-dialog', event => {
|
||||||
|
const options = {
|
||||||
|
type: 'info',
|
||||||
|
title: 'Information',
|
||||||
|
message: "This is an information dialog. Isn't it nice?",
|
||||||
|
buttons: ['Yes', 'No']
|
||||||
|
}
|
||||||
|
dialog.showMessageBox(options, index => {
|
||||||
|
event.sender.send('information-dialog-selection', index)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
ipcMain.on('open-file-dialog', event => {
|
||||||
|
dialog.showOpenDialog(
|
||||||
|
{
|
||||||
|
properties: ['openFile', 'openDirectory']
|
||||||
|
},
|
||||||
|
files => {
|
||||||
|
if (files) {
|
||||||
|
event.sender.send('selected-directory', files)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
ipcMain.on('save-dialog', event => {
|
||||||
|
const options = {
|
||||||
|
title: 'Save an Image',
|
||||||
|
filters: [{ name: 'Images', extensions: ['jpg', 'png', 'gif'] }]
|
||||||
|
}
|
||||||
|
dialog.showSaveDialog(options, filename => {
|
||||||
|
event.sender.send('saved-file', filename)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
// In this file you can include the rest of your app's specific main process
|
||||||
|
// code. You can also put them in separate files and require them here.
|
18
docs/fiddles/native-ui/dialogs/error-dialog/renderer.js
Normal file
18
docs/fiddles/native-ui/dialogs/error-dialog/renderer.js
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
const { ipcRenderer, shell } = require('electron')
|
||||||
|
|
||||||
|
const links = document.querySelectorAll('a[href]')
|
||||||
|
const errorBtn = document.getElementById('error-dialog')
|
||||||
|
|
||||||
|
errorBtn.addEventListener('click', event => {
|
||||||
|
ipcRenderer.send('open-error-dialog')
|
||||||
|
})
|
||||||
|
|
||||||
|
Array.prototype.forEach.call(links, (link) => {
|
||||||
|
const url = link.getAttribute('href')
|
||||||
|
if (url.indexOf('http') === 0) {
|
||||||
|
link.addEventListener('click', (e) => {
|
||||||
|
e.preventDefault()
|
||||||
|
shell.openExternal(url)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
104
docs/fiddles/native-ui/dialogs/information-dialog/index.html
Normal file
104
docs/fiddles/native-ui/dialogs/information-dialog/index.html
Normal file
|
@ -0,0 +1,104 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<title>Information Dialog</title>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div class="section-wrapper">
|
||||||
|
<h1>Use system dialogs</h1>
|
||||||
|
|
||||||
|
<h3>
|
||||||
|
The <code>dialog</code> module in Electron allows you to use native
|
||||||
|
system dialogs for opening files or directories, saving a file or
|
||||||
|
displaying informational messages.
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
This is a main process module because this process is more efficient
|
||||||
|
with native utilities and it allows the call to happen without
|
||||||
|
interrupting the visible elements in your page's renderer process.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Open the
|
||||||
|
<a href="http://electron.atom.io/docs/api/dialog/">
|
||||||
|
full API documentation (opens in new window)
|
||||||
|
</a>
|
||||||
|
in your browser.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<div>
|
||||||
|
<h2>Information Dialog</h2>
|
||||||
|
<div>
|
||||||
|
<div>
|
||||||
|
<button id="information-dialog">
|
||||||
|
View Demo
|
||||||
|
</button>
|
||||||
|
<span id="info-selection"></span>
|
||||||
|
</div>
|
||||||
|
<p>
|
||||||
|
In this demo, the <code>ipc</code> module is used to send a message
|
||||||
|
from the renderer process instructing the main process to launch the
|
||||||
|
information dialog. Options may be provided for responses which can
|
||||||
|
then be relayed back to the renderer process.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Note: The <code>title</code> property is not displayed in macOS.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
An information dialog can contain an icon, your choice of buttons,
|
||||||
|
title and message.
|
||||||
|
</p>
|
||||||
|
<h5>Renderer Process</h5>
|
||||||
|
<pre>
|
||||||
|
<code>
|
||||||
|
const {ipcRenderer} = require('electron')
|
||||||
|
|
||||||
|
const informationBtn = document.getElementById('information-dialog')
|
||||||
|
|
||||||
|
informationBtn.addEventListener('click', (event) => {
|
||||||
|
ipcRenderer.send('open-information-dialog')
|
||||||
|
})
|
||||||
|
|
||||||
|
ipcRenderer.on('information-dialog-selection', (event, index) => {
|
||||||
|
let message = 'You selected '
|
||||||
|
if (index === 0) message += 'yes.'
|
||||||
|
else message += 'no.'
|
||||||
|
document.getElementById('info-selection').innerHTML = message
|
||||||
|
})
|
||||||
|
</code>
|
||||||
|
</pre>
|
||||||
|
<h5>Main Process</h5>
|
||||||
|
<pre>
|
||||||
|
<code>
|
||||||
|
const {ipcMain, dialog} = require('electron')
|
||||||
|
|
||||||
|
ipcMain.on('open-information-dialog', (event) => {
|
||||||
|
const options = {
|
||||||
|
type: 'info',
|
||||||
|
title: 'Information',
|
||||||
|
message: "This is an information dialog. Isn't it nice?",
|
||||||
|
buttons: ['Yes', 'No']
|
||||||
|
}
|
||||||
|
dialog.showMessageBox(options, (index) => {
|
||||||
|
event.sender.send('information-dialog-selection', index)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
</code>
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// You can also require other files to run in this process
|
||||||
|
require("./renderer.js");
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
70
docs/fiddles/native-ui/dialogs/information-dialog/main.js
Normal file
70
docs/fiddles/native-ui/dialogs/information-dialog/main.js
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
// Modules to control application life and create native browser window
|
||||||
|
const { app, BrowserWindow, ipcMain, dialog } = require('electron')
|
||||||
|
|
||||||
|
// Keep a global reference of the window object, if you don't, the window will
|
||||||
|
// be closed automatically when the JavaScript object is garbage collected.
|
||||||
|
let mainWindow
|
||||||
|
|
||||||
|
function createWindow () {
|
||||||
|
// Create the browser window.
|
||||||
|
mainWindow = new BrowserWindow({
|
||||||
|
width: 800,
|
||||||
|
height: 600,
|
||||||
|
webPreferences: {
|
||||||
|
nodeIntegration: true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// and load the index.html of the app.
|
||||||
|
mainWindow.loadFile('index.html')
|
||||||
|
|
||||||
|
// Open the DevTools.
|
||||||
|
// mainWindow.webContents.openDevTools()
|
||||||
|
|
||||||
|
// Emitted when the window is closed.
|
||||||
|
mainWindow.on('closed', function () {
|
||||||
|
// Dereference the window object, usually you would store windows
|
||||||
|
// in an array if your app supports multi windows, this is the time
|
||||||
|
// when you should delete the corresponding element.
|
||||||
|
mainWindow = null
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// This method will be called when Electron has finished
|
||||||
|
// initialization and is ready to create browser windows.
|
||||||
|
// Some APIs can only be used after this event occurs.
|
||||||
|
app.on('ready', createWindow)
|
||||||
|
|
||||||
|
// Quit when all windows are closed.
|
||||||
|
app.on('window-all-closed', function () {
|
||||||
|
// On OS X it is common for applications and their menu bar
|
||||||
|
// to stay active until the user quits explicitly with Cmd + Q
|
||||||
|
if (process.platform !== 'darwin') {
|
||||||
|
app.quit()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
app.on('activate', function () {
|
||||||
|
// On OS X it's common to re-create a window in the app when the
|
||||||
|
// dock icon is clicked and there are no other windows open.
|
||||||
|
if (mainWindow === null) {
|
||||||
|
createWindow()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
ipcMain.on('open-information-dialog', event => {
|
||||||
|
const options = {
|
||||||
|
type: 'info',
|
||||||
|
title: 'Information',
|
||||||
|
message: "This is an information dialog. Isn't it nice?",
|
||||||
|
buttons: ['Yes', 'No']
|
||||||
|
}
|
||||||
|
dialog.showMessageBox(options, index => {
|
||||||
|
event.sender.send('information-dialog-selection', index)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
// In this file you can include the rest of your app's specific main process
|
||||||
|
// code. You can also put them in separate files and require them here.
|
|
@ -0,0 +1,25 @@
|
||||||
|
const { ipcRenderer, shell } = require('electron')
|
||||||
|
|
||||||
|
const informationBtn = document.getElementById('information-dialog')
|
||||||
|
const links = document.querySelectorAll('a[href]')
|
||||||
|
|
||||||
|
informationBtn.addEventListener('click', event => {
|
||||||
|
ipcRenderer.send('open-information-dialog')
|
||||||
|
})
|
||||||
|
|
||||||
|
ipcRenderer.on('information-dialog-selection', (event, index) => {
|
||||||
|
let message = 'You selected '
|
||||||
|
if (index === 0) message += 'yes.'
|
||||||
|
else message += 'no.'
|
||||||
|
document.getElementById('info-selection').innerHTML = message
|
||||||
|
})
|
||||||
|
|
||||||
|
Array.prototype.forEach.call(links, (link) => {
|
||||||
|
const url = link.getAttribute('href')
|
||||||
|
if (url.indexOf('http') === 0) {
|
||||||
|
link.addEventListener('click', (e) => {
|
||||||
|
e.preventDefault()
|
||||||
|
shell.openExternal(url)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
108
docs/fiddles/native-ui/dialogs/open-file-or-directory/index.html
Normal file
108
docs/fiddles/native-ui/dialogs/open-file-or-directory/index.html
Normal file
|
@ -0,0 +1,108 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<title>Open File or Directory</title>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div class="section-wrapper">
|
||||||
|
<h1>Use system dialogs</h1>
|
||||||
|
|
||||||
|
<h3>
|
||||||
|
The <code>dialog</code> module in Electron allows you to use native
|
||||||
|
system dialogs for opening files or directories, saving a file or
|
||||||
|
displaying informational messages.
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
This is a main process module because this process is more efficient
|
||||||
|
with native utilities and it allows the call to happen without
|
||||||
|
interrupting the visible elements in your page's renderer process.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Open the
|
||||||
|
<a href="http://electron.atom.io/docs/api/dialog/">
|
||||||
|
full API documentation (opens in new window)
|
||||||
|
</a>
|
||||||
|
in your browser.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<div>
|
||||||
|
<h2>Open a File or Directory</h2>
|
||||||
|
<div>
|
||||||
|
<div>
|
||||||
|
<button id="select-directory">View Demo</button>
|
||||||
|
<span id="selected-file"></span>
|
||||||
|
</div>
|
||||||
|
<p>
|
||||||
|
In this demo, the <code>ipc</code> module is used to send a message
|
||||||
|
from the renderer process instructing the main process to launch the
|
||||||
|
open file (or directory) dialog. If a file is selected, the main
|
||||||
|
process can send that information back to the renderer process.
|
||||||
|
</p>
|
||||||
|
<h5>Renderer Process</h5>
|
||||||
|
<pre>
|
||||||
|
<code>
|
||||||
|
const {ipcRenderer} = require('electron')
|
||||||
|
|
||||||
|
const selectDirBtn = document.getElementById('select-directory')
|
||||||
|
|
||||||
|
selectDirBtn.addEventListener('click', (event) => {
|
||||||
|
ipcRenderer.send('open-file-dialog')
|
||||||
|
})
|
||||||
|
|
||||||
|
ipcRenderer.on('selected-directory', (event, path) => {
|
||||||
|
document.getElementById('selected-file').innerHTML = `You selected: ${path}`
|
||||||
|
})
|
||||||
|
</code>
|
||||||
|
</pre>
|
||||||
|
<h5>Main Process</h5>
|
||||||
|
<pre>
|
||||||
|
<code>
|
||||||
|
const {ipcMain, dialog} = require('electron')
|
||||||
|
|
||||||
|
ipcMain.on('open-file-dialog', (event) => {
|
||||||
|
dialog.showOpenDialog({
|
||||||
|
properties: ['openFile', 'openDirectory']
|
||||||
|
}, (files) => {
|
||||||
|
if (files) {
|
||||||
|
event.sender.send('selected-directory', files)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
</code>
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<h2>ProTip</h2>
|
||||||
|
<strong>The sheet-style dialog on macOS.</strong>
|
||||||
|
<p>
|
||||||
|
On macOS you can choose between a "sheet" dialog or a default
|
||||||
|
dialog. The sheet version descends from the top of the window. To
|
||||||
|
use sheet version, pass the <code>window</code> as the first
|
||||||
|
argument in the dialog method.
|
||||||
|
</p>
|
||||||
|
<pre><code class="language-js">const ipc = require('electron').ipcMain
|
||||||
|
const dialog = require('electron').dialog
|
||||||
|
const BrowserWindow = require('electron').BrowserWindow
|
||||||
|
|
||||||
|
|
||||||
|
ipc.on('open-file-dialog-sheet', function (event) {
|
||||||
|
const window = BrowserWindow.fromWebContents(event.sender)
|
||||||
|
const files = dialog.showOpenDialog(window, { properties: [ 'openFile' ]})
|
||||||
|
})</code></pre>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// You can also require other files to run in this process
|
||||||
|
require("./renderer.js");
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,70 @@
|
||||||
|
// Modules to control application life and create native browser window
|
||||||
|
const { app, BrowserWindow, ipcMain, dialog } = require('electron')
|
||||||
|
|
||||||
|
// Keep a global reference of the window object, if you don't, the window will
|
||||||
|
// be closed automatically when the JavaScript object is garbage collected.
|
||||||
|
let mainWindow
|
||||||
|
|
||||||
|
function createWindow () {
|
||||||
|
// Create the browser window.
|
||||||
|
mainWindow = new BrowserWindow({
|
||||||
|
width: 800,
|
||||||
|
height: 600,
|
||||||
|
webPreferences: {
|
||||||
|
nodeIntegration: true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// and load the index.html of the app.
|
||||||
|
mainWindow.loadFile('index.html')
|
||||||
|
|
||||||
|
// Open the DevTools.
|
||||||
|
// mainWindow.webContents.openDevTools()
|
||||||
|
|
||||||
|
// Emitted when the window is closed.
|
||||||
|
mainWindow.on('closed', function () {
|
||||||
|
// Dereference the window object, usually you would store windows
|
||||||
|
// in an array if your app supports multi windows, this is the time
|
||||||
|
// when you should delete the corresponding element.
|
||||||
|
mainWindow = null
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// This method will be called when Electron has finished
|
||||||
|
// initialization and is ready to create browser windows.
|
||||||
|
// Some APIs can only be used after this event occurs.
|
||||||
|
app.on('ready', createWindow)
|
||||||
|
|
||||||
|
// Quit when all windows are closed.
|
||||||
|
app.on('window-all-closed', function () {
|
||||||
|
// On OS X it is common for applications and their menu bar
|
||||||
|
// to stay active until the user quits explicitly with Cmd + Q
|
||||||
|
if (process.platform !== 'darwin') {
|
||||||
|
app.quit()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
app.on('activate', function () {
|
||||||
|
// On OS X it's common to re-create a window in the app when the
|
||||||
|
// dock icon is clicked and there are no other windows open.
|
||||||
|
if (mainWindow === null) {
|
||||||
|
createWindow()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
ipcMain.on('open-file-dialog', event => {
|
||||||
|
dialog.showOpenDialog(
|
||||||
|
{
|
||||||
|
properties: ['openFile', 'openDirectory']
|
||||||
|
},
|
||||||
|
files => {
|
||||||
|
if (files) {
|
||||||
|
event.sender.send('selected-directory', files)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
// In this file you can include the rest of your app's specific main process
|
||||||
|
// code. You can also put them in separate files and require them here.
|
|
@ -0,0 +1,22 @@
|
||||||
|
const { ipcRenderer, shell } = require('electron')
|
||||||
|
|
||||||
|
const selectDirBtn = document.getElementById('select-directory')
|
||||||
|
const links = document.querySelectorAll('a[href]')
|
||||||
|
|
||||||
|
selectDirBtn.addEventListener('click', event => {
|
||||||
|
ipcRenderer.send('open-file-dialog')
|
||||||
|
})
|
||||||
|
|
||||||
|
ipcRenderer.on('selected-directory', (event, path) => {
|
||||||
|
document.getElementById('selected-file').innerHTML = `You selected: ${path}`
|
||||||
|
})
|
||||||
|
|
||||||
|
Array.prototype.forEach.call(links, (link) => {
|
||||||
|
const url = link.getAttribute('href')
|
||||||
|
if (url.indexOf('http') === 0) {
|
||||||
|
link.addEventListener('click', (e) => {
|
||||||
|
e.preventDefault()
|
||||||
|
shell.openExternal(url)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
91
docs/fiddles/native-ui/dialogs/save-dialog/index.html
Normal file
91
docs/fiddles/native-ui/dialogs/save-dialog/index.html
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<title>Save Dialog</title>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div>
|
||||||
|
<h1>Use system dialogs</h1>
|
||||||
|
|
||||||
|
<h3>
|
||||||
|
The <code>dialog</code> module in Electron allows you to use native
|
||||||
|
system dialogs for opening files or directories, saving a file or
|
||||||
|
displaying informational messages.
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
This is a main process module because this process is more efficient
|
||||||
|
with native utilities and it allows the call to happen without
|
||||||
|
interrupting the visible elements in your page's renderer process.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Open the
|
||||||
|
<a href="http://electron.atom.io/docs/api/dialog/">
|
||||||
|
full API documentation (opens in new window)
|
||||||
|
</a>
|
||||||
|
in your browser.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<div>
|
||||||
|
<h2>Save Dialog</h2>
|
||||||
|
<div>
|
||||||
|
<div>
|
||||||
|
<button button id="save-dialog">View Demo</button>
|
||||||
|
<span id="file-saved"></span>
|
||||||
|
</div>
|
||||||
|
<p>
|
||||||
|
In this demo, the <code>ipc</code> module is used to send a message
|
||||||
|
from the renderer process instructing the main process to launch the
|
||||||
|
save dialog. It returns the path selected by the user which can be
|
||||||
|
relayed back to the renderer process.
|
||||||
|
</p>
|
||||||
|
<h5>Renderer Process</h5>
|
||||||
|
<pre>
|
||||||
|
<code>
|
||||||
|
const {ipcRenderer} = require('electron')
|
||||||
|
|
||||||
|
const saveBtn = document.getElementById('save-dialog')
|
||||||
|
|
||||||
|
saveBtn.addEventListener('click', (event) => {
|
||||||
|
ipcRenderer.send('save-dialog')
|
||||||
|
})
|
||||||
|
|
||||||
|
ipcRenderer.on('saved-file', (event, path) => {
|
||||||
|
if (!path) path = 'No path'
|
||||||
|
document.getElementById('file-saved').innerHTML = `Path selected: ${path}`
|
||||||
|
})
|
||||||
|
</code>
|
||||||
|
</pre>
|
||||||
|
<h5>Main Process</h5>
|
||||||
|
<pre>
|
||||||
|
<code>
|
||||||
|
const {ipcMain, dialog} = require('electron')
|
||||||
|
|
||||||
|
ipcMain.on('save-dialog', (event) => {
|
||||||
|
const options = {
|
||||||
|
title: 'Save an Image',
|
||||||
|
filters: [
|
||||||
|
{ name: 'Images', extensions: ['jpg', 'png', 'gif'] }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
dialog.showSaveDialog(options, (filename) => {
|
||||||
|
event.sender.send('saved-file', filename)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
</code>
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// You can also require other files to run in this process
|
||||||
|
require("./renderer.js");
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
66
docs/fiddles/native-ui/dialogs/save-dialog/main.js
Normal file
66
docs/fiddles/native-ui/dialogs/save-dialog/main.js
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
// Modules to control application life and create native browser window
|
||||||
|
const { app, BrowserWindow, ipcMain, dialog } = require('electron')
|
||||||
|
|
||||||
|
// Keep a global reference of the window object, if you don't, the window will
|
||||||
|
// be closed automatically when the JavaScript object is garbage collected.
|
||||||
|
let mainWindow
|
||||||
|
|
||||||
|
function createWindow () {
|
||||||
|
// Create the browser window.
|
||||||
|
mainWindow = new BrowserWindow({
|
||||||
|
width: 800,
|
||||||
|
height: 600,
|
||||||
|
webPreferences: {
|
||||||
|
nodeIntegration: true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// and load the index.html of the app.
|
||||||
|
mainWindow.loadFile('index.html')
|
||||||
|
|
||||||
|
// Open the DevTools.
|
||||||
|
// mainWindow.webContents.openDevTools()
|
||||||
|
|
||||||
|
// Emitted when the window is closed.
|
||||||
|
mainWindow.on('closed', function () {
|
||||||
|
// Dereference the window object, usually you would store windows
|
||||||
|
// in an array if your app supports multi windows, this is the time
|
||||||
|
// when you should delete the corresponding element.
|
||||||
|
mainWindow = null
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// This method will be called when Electron has finished
|
||||||
|
// initialization and is ready to create browser windows.
|
||||||
|
// Some APIs can only be used after this event occurs.
|
||||||
|
app.on('ready', createWindow)
|
||||||
|
|
||||||
|
// Quit when all windows are closed.
|
||||||
|
app.on('window-all-closed', function () {
|
||||||
|
// On OS X it is common for applications and their menu bar
|
||||||
|
// to stay active until the user quits explicitly with Cmd + Q
|
||||||
|
if (process.platform !== 'darwin') {
|
||||||
|
app.quit()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
app.on('activate', function () {
|
||||||
|
// On OS X it's common to re-create a window in the app when the
|
||||||
|
// dock icon is clicked and there are no other windows open.
|
||||||
|
if (mainWindow === null) {
|
||||||
|
createWindow()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
ipcMain.on('save-dialog', event => {
|
||||||
|
const options = {
|
||||||
|
title: 'Save an Image',
|
||||||
|
filters: [{ name: 'Images', extensions: ['jpg', 'png', 'gif'] }]
|
||||||
|
}
|
||||||
|
dialog.showSaveDialog(options, filename => {
|
||||||
|
event.sender.send('saved-file', filename)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
// In this file you can include the rest of your app's specific main process
|
||||||
|
// code. You can also put them in separate files and require them here.
|
23
docs/fiddles/native-ui/dialogs/save-dialog/renderer.js
Normal file
23
docs/fiddles/native-ui/dialogs/save-dialog/renderer.js
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
const { ipcRenderer, shell } = require('electron')
|
||||||
|
|
||||||
|
const saveBtn = document.getElementById('save-dialog')
|
||||||
|
const links = document.querySelectorAll('a[href]')
|
||||||
|
|
||||||
|
saveBtn.addEventListener('click', event => {
|
||||||
|
ipcRenderer.send('save-dialog')
|
||||||
|
})
|
||||||
|
|
||||||
|
ipcRenderer.on('saved-file', (event, path) => {
|
||||||
|
if (!path) path = 'No path'
|
||||||
|
document.getElementById('file-saved').innerHTML = `Path selected: ${path}`
|
||||||
|
})
|
||||||
|
|
||||||
|
Array.prototype.forEach.call(links, (link) => {
|
||||||
|
const url = link.getAttribute('href')
|
||||||
|
if (url.indexOf('http') === 0) {
|
||||||
|
link.addEventListener('click', (e) => {
|
||||||
|
e.preventDefault()
|
||||||
|
shell.openExternal(url)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
Loading…
Add table
Add a link
Reference in a new issue