Merge pull request #27 from cwillisf/native-save-dialog

Override browser save dialog with a native save dialog
This commit is contained in:
Chris Willis-Ford 2019-01-10 20:27:28 -08:00 committed by GitHub
commit 94822649f8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 121 additions and 0 deletions

102
src/main/FileFilters.js Normal file
View file

@ -0,0 +1,102 @@
const saveFilters = {
JPEG: {
name: 'JPEG Image',
extensions: ['jpg', 'jpeg']
},
MP3: {
name: 'MP3 Sound',
extensions: ['mp3']
},
PNG: {
name: 'PNG Image',
extensions: ['png']
},
SB: {
name: 'Scratch 1 Project',
extensions: ['sb']
},
SB2: {
name: 'Scratch 2 Project',
extensions: ['sb2']
},
SB3: {
name: 'Scratch 3 Project',
extensions: ['sb3']
},
Sprite2: {
name: 'Scratch 2 Sprite',
extensions: ['sprite2']
},
Sprite3: {
name: 'Scratch 3 Sprite',
extensions: ['sprite3']
},
SVG: {
name: 'SVG Image',
extensions: ['svg']
},
WAV: {
name: 'WAV Sound',
extensions: ['wav']
}
};
const loadFilters = {
...saveFilters,
AllBitmaps: {
name: 'All Bitmaps',
extensions: [
...saveFilters.JPEG.extensions,
...saveFilters.PNG.extensions
]
},
AllImages: {
name: 'All Images',
extensions: [
...saveFilters.JPEG.extensions,
...saveFilters.PNG.extensions,
...saveFilters.SVG.extensions
]
},
AllProjects: {
name: 'All Scratch Projects',
extensions: [
...saveFilters.SB3.extensions,
...saveFilters.SB2.extensions,
...saveFilters.SB.extensions
]
},
AllSounds: {
name: 'All Sounds',
extensions: [
...saveFilters.MP3.extensions,
...saveFilters.WAV.extensions
]
},
AllSprites: {
name: 'All Sprites',
extensions: [
...saveFilters.Sprite3.extensions,
...saveFilters.Sprite2.extensions
]
}
};
const filtersByExtension = Object.values(saveFilters).reduce((result, filter) => {
for (const extension of filter.extensions) {
result[extension] = filter;
}
return result;
}, {});
const getFilterForExtension = extNameNoDot =>
filtersByExtension[extNameNoDot] || {
name: `${extNameNoDot.toUpperCase()} Files`,
extensions: [extNameNoDot]
};
export {
saveFilters,
loadFilters,
getFilterForExtension
};

View file

@ -1,6 +1,7 @@
import {BrowserWindow, Menu, app, dialog} from 'electron';
import * as path from 'path';
import {format as formatUrl} from 'url';
import {getFilterForExtension} from './FileFilters';
import telemetry from './ScratchDesktopTelemetry';
import MacOSMenu from './MacOSMenu';
@ -54,6 +55,24 @@ const createMainWindow = () => {
}));
}
webContents.session.on('will-download', (ev, item) => {
const itemPath = item.getFilename();
const baseName = path.basename(itemPath);
const extName = path.extname(baseName);
if (extName) {
const extNameNoDot = extName.replace(/^\./, '');
const options = {
filters: [getFilterForExtension(extNameNoDot)]
};
const userChosenPath = dialog.showSaveDialog(window, options);
if (userChosenPath) {
item.setSavePath(userChosenPath);
} else {
item.cancel();
}
}
});
webContents.on('will-prevent-unload', ev => {
const choice = dialog.showMessageBox(window, {
type: 'question',