2023-03-29 19:02:13 +00:00
|
|
|
<!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
|
2023-08-10 09:55:52 +00:00
|
|
|
<a href="https://www.electronjs.org/docs/latest/api/dialog/">
|
2023-03-29 19:02:13 +00:00
|
|
|
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>
|
|
|
|
|
2023-08-29 19:52:16 +00:00
|
|
|
<script src="renderer.js"></script>
|
2023-03-29 19:02:13 +00:00
|
|
|
</body>
|
|
|
|
</html>
|