diff --git a/src/main/FileFilters.js b/src/main/FileFilters.js new file mode 100644 index 0000000..1d3cde8 --- /dev/null +++ b/src/main/FileFilters.js @@ -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 +}; diff --git a/src/main/index.js b/src/main/index.js index 4e9f415..a00c2c7 100644 --- a/src/main/index.js +++ b/src/main/index.js @@ -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',