Merge pull request #771 from feross/dc/file-handler

Pref: default torrent file handler
This commit is contained in:
Feross Aboukhadijeh
2016-08-11 02:27:54 +02:00
committed by GitHub
5 changed files with 77 additions and 22 deletions

View File

@@ -10,7 +10,6 @@ var config = require('../config')
var crashReporter = require('../crash-reporter') var crashReporter = require('../crash-reporter')
var dialog = require('./dialog') var dialog = require('./dialog')
var dock = require('./dock') var dock = require('./dock')
var handlers = require('./handlers')
var ipc = require('./ipc') var ipc = require('./ipc')
var log = require('./log') var log = require('./log')
var menu = require('./menu') var menu = require('./menu')
@@ -111,7 +110,6 @@ function init () {
function delayedInit () { function delayedInit () {
announcement.init() announcement.init()
dock.init() dock.init()
handlers.install()
tray.init() tray.init()
updater.init() updater.init()
userTasks.init() userTasks.init()

View File

@@ -8,6 +8,7 @@ var app = electron.app
var dialog = require('./dialog') var dialog = require('./dialog')
var dock = require('./dock') var dock = require('./dock')
var handlers = require('./handlers')
var log = require('./log') var log = require('./log')
var menu = require('./menu') var menu = require('./menu')
var powerSaveBlocker = require('./power-save-blocker') var powerSaveBlocker = require('./power-save-blocker')
@@ -91,6 +92,14 @@ function init () {
ipc.on('showItemInFolder', (e, ...args) => shell.showItemInFolder(...args)) ipc.on('showItemInFolder', (e, ...args) => shell.showItemInFolder(...args))
ipc.on('moveItemToTrash', (e, ...args) => shell.moveItemToTrash(...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 * Windows: Main
*/ */

View File

@@ -1,5 +1,6 @@
const {dispatch} = require('../lib/dispatcher') const {dispatch} = require('../lib/dispatcher')
const State = require('../lib/state') const State = require('../lib/state')
const ipcRenderer = require('electron').ipcRenderer
// Controls the Preferences screen // Controls the Preferences screen
module.exports = class PrefsController { module.exports = class PrefsController {
@@ -41,6 +42,9 @@ module.exports = class PrefsController {
// All unsaved prefs take effect atomically, and are saved to config.json // All unsaved prefs take effect atomically, and are saved to config.json
save () { save () {
var state = this.state 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.saved.prefs = Object.assign(state.saved.prefs || {}, state.unsaved.prefs)
State.save(state) State.save(state)
} }

View File

@@ -25,6 +25,10 @@ function run (state) {
migrate_0_7_2(state.saved) 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 // Config is now on the new version
state.saved.version = config.APP_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
}
}

View File

@@ -22,7 +22,8 @@ function renderGeneralSection (state) {
description: '', description: '',
icon: 'settings' 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 = [(
<button key='toggle-handlers'
className='btn'
onClick={toggleFileHandlers}>
{buttonText}
</button>
)]
return renderControlGroup(definition, controls)
function toggleFileHandlers () {
var isFileHandler = state.unsaved.prefs.isFileHandler
dispatch('updatePreferences', 'isFileHandler', !isFileHandler)
}
}
// Renders a prefs section. // Renders a prefs section.
// - definition should be {icon, title, description} // - definition should be {icon, title, description}
// - controls should be an array of vdom elements // - 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 // - value should be the current pref, a file or folder path
// - callback takes a new file or folder path // - callback takes a new file or folder path
function renderFileSelector (definition, value, callback) { function renderFileSelector (definition, value, callback) {
return ( var controls = [(
<div key={definition.key} className='control-group'>
<div className='controls'>
<label className='control-label'>
<div className='preference-title'>{definition.label}</div>
<div className='preference-description'>{definition.description}</div>
</label>
<div className='controls'>
<input type='text' className='file-picker-text' <input type='text' className='file-picker-text'
id={definition.property} id={definition.property}
disabled='disabled' disabled='disabled'
value={value} /> value={value} />
), (
<button className='btn' onClick={handleClick}> <button className='btn' onClick={handleClick}>
<i className='icon'>folder_open</i> <i className='icon'>folder_open</i>
</button> </button>
</div> )]
</div> return renderControlGroup(definition, controls)
</div>
)
function handleClick () { function handleClick () {
dialog.showOpenDialog(remote.getCurrentWindow(), definition.options, function (filenames) { dialog.showOpenDialog(remote.getCurrentWindow(), definition.options, function (filenames) {
if (!Array.isArray(filenames)) return if (!Array.isArray(filenames)) return
@@ -100,6 +117,22 @@ function renderFileSelector (definition, value, callback) {
} }
} }
function renderControlGroup (definition, controls) {
return (
<div key={definition.key} className='control-group'>
<div className='controls'>
<label className='control-label'>
<div className='preference-title'>{definition.label}</div>
<div className='preference-description'>{definition.description}</div>
</label>
<div className='controls'>
{controls}
</div>
</div>
</div>
)
}
function setStateValue (property, value) { function setStateValue (property, value) {
dispatch('updatePreferences', property, value) dispatch('updatePreferences', property, value)
} }