diff --git a/src/main/index.js b/src/main/index.js index 63a67b95..b422a2dc 100644 --- a/src/main/index.js +++ b/src/main/index.js @@ -10,7 +10,6 @@ var config = require('../config') var crashReporter = require('../crash-reporter') var dialog = require('./dialog') var dock = require('./dock') -var handlers = require('./handlers') var ipc = require('./ipc') var log = require('./log') var menu = require('./menu') @@ -111,7 +110,6 @@ function init () { function delayedInit () { announcement.init() dock.init() - handlers.install() tray.init() updater.init() userTasks.init() diff --git a/src/main/ipc.js b/src/main/ipc.js index eb4ba876..84f6d61b 100644 --- a/src/main/ipc.js +++ b/src/main/ipc.js @@ -8,6 +8,7 @@ var app = electron.app var dialog = require('./dialog') var dock = require('./dock') +var handlers = require('./handlers') var log = require('./log') var menu = require('./menu') var powerSaveBlocker = require('./power-save-blocker') @@ -91,6 +92,14 @@ function init () { ipc.on('showItemInFolder', (e, ...args) => shell.showItemInFolder(...args)) ipc.on('moveItemToTrash', (e, ...args) => shell.moveItemToTrash(...args)) + /** + * File handlers + */ + ipc.on('setDefaultFileHandler', (e, flag) => { + if (flag) handlers.install() + else handlers.uninstall() + }) + /** * Windows: Main */ diff --git a/src/renderer/controllers/prefs-controller.js b/src/renderer/controllers/prefs-controller.js index 9ba400bf..0c19d2d1 100644 --- a/src/renderer/controllers/prefs-controller.js +++ b/src/renderer/controllers/prefs-controller.js @@ -1,5 +1,6 @@ const {dispatch} = require('../lib/dispatcher') const State = require('../lib/state') +const ipcRenderer = require('electron').ipcRenderer // Controls the Preferences screen module.exports = class PrefsController { @@ -41,6 +42,9 @@ module.exports = class PrefsController { // All unsaved prefs take effect atomically, and are saved to config.json save () { var state = this.state + if (state.unsaved.prefs.isFileHandler !== state.saved.prefs.isFileHandler) { + ipcRenderer.send('setDefaultFileHandler', state.unsaved.prefs.isFileHandler) + } state.saved.prefs = Object.assign(state.saved.prefs || {}, state.unsaved.prefs) State.save(state) } diff --git a/src/renderer/lib/migrations.js b/src/renderer/lib/migrations.js index 7c1aa8a6..b284f4c6 100644 --- a/src/renderer/lib/migrations.js +++ b/src/renderer/lib/migrations.js @@ -25,6 +25,10 @@ function run (state) { migrate_0_7_2(state.saved) } + if (semver.lt(version, '0.11.0')) { + migrate_0_11_0(state.saved) + } + // Config is now on the new version state.saved.version = config.APP_VERSION } @@ -93,3 +97,10 @@ function migrate_0_7_2 (saved) { } } } + +function migrate_0_11_0 (saved) { + if (saved.prefs.isFileHandler === undefined) { + // The app used to make itself the default torrent file handler automatically + saved.prefs.isFileHandler = true + } +} diff --git a/src/renderer/views/preferences.js b/src/renderer/views/preferences.js index 3caaac93..1518514a 100644 --- a/src/renderer/views/preferences.js +++ b/src/renderer/views/preferences.js @@ -22,7 +22,8 @@ function renderGeneralSection (state) { description: '', icon: 'settings' }, [ - renderDownloadDirSelector(state) + renderDownloadDirSelector(state), + renderFileHandlers(state) ]) } @@ -43,6 +44,29 @@ function renderDownloadDirSelector (state) { }) } +function renderFileHandlers (state) { + var definition = { + key: 'file-handlers', + label: 'Handle Torrent Files' + } + var buttonText = state.unsaved.prefs.isFileHandler + ? 'Remove default app for torrent files' + : 'Make WebTorrent the default app for torrent files' + var controls = [( + + )] + return renderControlGroup(definition, controls) + + function toggleFileHandlers () { + var isFileHandler = state.unsaved.prefs.isFileHandler + dispatch('updatePreferences', 'isFileHandler', !isFileHandler) + } +} + // Renders a prefs section. // - definition should be {icon, title, description} // - controls should be an array of vdom elements @@ -73,25 +97,18 @@ function renderSection (definition, controls) { // - value should be the current pref, a file or folder path // - callback takes a new file or folder path function renderFileSelector (definition, value, callback) { - return ( -
-
- -
- - -
-
-
- ) + var controls = [( + + ), ( + + )] + return renderControlGroup(definition, controls) + function handleClick () { dialog.showOpenDialog(remote.getCurrentWindow(), definition.options, function (filenames) { if (!Array.isArray(filenames)) return @@ -100,6 +117,22 @@ function renderFileSelector (definition, value, callback) { } } +function renderControlGroup (definition, controls) { + return ( +
+
+ +
+ {controls} +
+
+
+ ) +} + function setStateValue (property, value) { dispatch('updatePreferences', property, value) }