From 4d48b9e7c1cdface563b24f3df42ece6c4ee4f6d Mon Sep 17 00:00:00 2001
From: DC
Date: Wed, 10 Aug 2016 00:53:27 -0700
Subject: [PATCH] Fix screen stacking bug
You can no longer open a whole stack of Prefs windows, or Create Torrent windows
Simplifies and fixes behavior when dropping files onto the app or the dock icon. Before, you could use drag-drop to create stacks of Create Torrent windows. Now, you can only create torrents from the home screen.
Fixes #665
---
src/main/ipc.js | 5 +-
src/main/menu.js | 76 +++++++++----------
src/main/tray.js | 10 +--
src/main/windows/main.js | 8 +-
src/renderer/controllers/prefs-controller.js | 9 ++-
.../controllers/torrent-list-controller.js | 9 ++-
src/renderer/main.js | 37 ++++-----
.../views/create-torrent-error-page.js | 2 +-
src/renderer/views/create-torrent.js | 2 +-
src/renderer/views/preferences.js | 16 ++--
src/renderer/views/torrent-list.js | 1 +
src/renderer/views/update-available-modal.js | 8 +-
12 files changed, 91 insertions(+), 92 deletions(-)
diff --git a/src/main/ipc.js b/src/main/ipc.js
index 84f6d61b..c5b5db87 100644
--- a/src/main/ipc.js
+++ b/src/main/ipc.js
@@ -61,14 +61,14 @@ function init () {
*/
ipc.on('onPlayerOpen', function () {
- menu.onPlayerOpen()
+ menu.setPlayerOpen(true)
powerSaveBlocker.enable()
shortcuts.enable()
thumbar.enable()
})
ipc.on('onPlayerClose', function () {
- menu.onPlayerClose()
+ menu.setPlayerOpen(false)
powerSaveBlocker.disable()
shortcuts.disable()
thumbar.disable()
@@ -112,6 +112,7 @@ function init () {
ipc.on('setTitle', (e, ...args) => main.setTitle(...args))
ipc.on('show', () => main.show())
ipc.on('toggleFullScreen', (e, ...args) => main.toggleFullScreen(...args))
+ ipc.on('setAllowNav', (e, ...args) => menu.setAllowNav(...args))
/**
* VLC
diff --git a/src/main/menu.js b/src/main/menu.js
index d68a6dfc..9bad2926 100644
--- a/src/main/menu.js
+++ b/src/main/menu.js
@@ -1,11 +1,10 @@
module.exports = {
init,
- onPlayerClose,
- onPlayerOpen,
+ setPlayerOpen,
+ setWindowFocus,
+ setAllowNav,
onToggleAlwaysOnTop,
- onToggleFullScreen,
- onWindowBlur,
- onWindowFocus
+ onToggleFullScreen
}
var electron = require('electron')
@@ -24,26 +23,28 @@ function init () {
electron.Menu.setApplicationMenu(menu)
}
-function onPlayerClose () {
- getMenuItem('Play/Pause').enabled = false
- getMenuItem('Increase Volume').enabled = false
- getMenuItem('Decrease Volume').enabled = false
- getMenuItem('Step Forward').enabled = false
- getMenuItem('Step Backward').enabled = false
- getMenuItem('Increase Speed').enabled = false
- getMenuItem('Decrease Speed').enabled = false
- getMenuItem('Add Subtitles File...').enabled = false
+function setPlayerOpen (flag) {
+ getMenuItem('Play/Pause').enabled = flag
+ getMenuItem('Increase Volume').enabled = flag
+ getMenuItem('Decrease Volume').enabled = flag
+ getMenuItem('Step Forward').enabled = flag
+ getMenuItem('Step Backward').enabled = flag
+ getMenuItem('Increase Speed').enabled = flag
+ getMenuItem('Decrease Speed').enabled = flag
+ getMenuItem('Add Subtitles File...').enabled = flag
}
-function onPlayerOpen () {
- getMenuItem('Play/Pause').enabled = true
- getMenuItem('Increase Volume').enabled = true
- getMenuItem('Decrease Volume').enabled = true
- getMenuItem('Step Forward').enabled = true
- getMenuItem('Step Backward').enabled = true
- getMenuItem('Increase Speed').enabled = true
- getMenuItem('Decrease Speed').enabled = true
- getMenuItem('Add Subtitles File...').enabled = true
+function setWindowFocus (flag) {
+ getMenuItem('Full Screen').enabled = flag
+ getMenuItem('Float on Top').enabled = flag
+}
+
+// Disallow opening more screens on top of the current one.
+function setAllowNav (flag) {
+ getMenuItem('Preferences').enabled = flag
+ getMenuItem('Create New Torrent...').enabled = flag
+ var item = getMenuItem('Create New Torrent from File...')
+ if (item) item.enabled = flag
}
function onToggleAlwaysOnTop (flag) {
@@ -54,16 +55,6 @@ function onToggleFullScreen (flag) {
getMenuItem('Full Screen').checked = flag
}
-function onWindowBlur () {
- getMenuItem('Full Screen').enabled = false
- getMenuItem('Float on Top').enabled = false
-}
-
-function onWindowFocus () {
- getMenuItem('Full Screen').enabled = true
- getMenuItem('Float on Top').enabled = true
-}
-
function getMenuItem (label) {
for (var i = 0; i < menu.items.length; i++) {
var menuItem = menu.items[i].submenu.items.find(function (item) {
@@ -130,14 +121,6 @@ function getMenuTemplate () {
},
{
role: 'selectall'
- },
- {
- type: 'separator'
- },
- {
- label: 'Preferences',
- accelerator: 'CmdOrCtrl+,',
- click: () => windows.main.dispatch('preferences')
}
]
},
@@ -350,6 +333,17 @@ function getMenuTemplate () {
click: () => dialog.openSeedFile()
})
+ // Edit menu (Windows, Linux)
+ template[1].submenu.push(
+ {
+ type: 'separator'
+ },
+ {
+ label: 'Preferences',
+ accelerator: 'CmdOrCtrl+,',
+ click: () => windows.main.dispatch('preferences')
+ })
+
// Help menu (Windows, Linux)
template[4].submenu.push(
{
diff --git a/src/main/tray.js b/src/main/tray.js
index 22a55b69..7816ff4b 100644
--- a/src/main/tray.js
+++ b/src/main/tray.js
@@ -1,8 +1,7 @@
module.exports = {
hasTray,
init,
- onWindowBlur,
- onWindowFocus
+ setWindowFocus
}
var electron = require('electron')
@@ -31,12 +30,7 @@ function hasTray () {
return !!tray
}
-function onWindowBlur () {
- if (!tray) return
- updateTrayMenu()
-}
-
-function onWindowFocus () {
+function setWindowFocus (flag) {
if (!tray) return
updateTrayMenu()
}
diff --git a/src/main/windows/main.js b/src/main/windows/main.js
index df5d2cf4..d60959b6 100644
--- a/src/main/windows/main.js
+++ b/src/main/windows/main.js
@@ -206,13 +206,13 @@ function toggleFullScreen (flag) {
}
function onWindowBlur () {
- menu.onWindowBlur()
- tray.onWindowBlur()
+ menu.setWindowFocus(false)
+ tray.setWindowFocus(false)
}
function onWindowFocus () {
- menu.onWindowFocus()
- tray.onWindowFocus()
+ menu.setWindowFocus(true)
+ tray.setWindowFocus(true)
}
function getIconPath () {
diff --git a/src/renderer/controllers/prefs-controller.js b/src/renderer/controllers/prefs-controller.js
index 0c19d2d1..d220c2b1 100644
--- a/src/renderer/controllers/prefs-controller.js
+++ b/src/renderer/controllers/prefs-controller.js
@@ -1,4 +1,3 @@
-const {dispatch} = require('../lib/dispatcher')
const State = require('../lib/state')
const ipcRenderer = require('electron').ipcRenderer
@@ -16,11 +15,15 @@ module.exports = class PrefsController {
url: 'preferences',
setup: function (cb) {
// initialize preferences
- dispatch('setTitle', 'Preferences')
+ state.window.title = 'Preferences'
state.unsaved = Object.assign(state.unsaved || {}, {prefs: state.saved.prefs || {}})
+ ipcRenderer.send('setAllowNav', false)
cb()
},
- destroy: () => this.save()
+ destroy: () => {
+ ipcRenderer.send('setAllowNav', true)
+ this.save()
+ }
})
}
diff --git a/src/renderer/controllers/torrent-list-controller.js b/src/renderer/controllers/torrent-list-controller.js
index 802ad8b9..5d5a8987 100644
--- a/src/renderer/controllers/torrent-list-controller.js
+++ b/src/renderer/controllers/torrent-list-controller.js
@@ -40,6 +40,11 @@ module.exports = class TorrentListController {
// Shows the Create Torrent page with options to seed a given file or folder
showCreateTorrent (files) {
+ // You can only create torrents from the home screen.
+ if (this.state.location.url() !== 'home') {
+ return dispatch('error', 'Please go back to the torrent list before creating a new torrent.')
+ }
+
// Files will either be an array of file objects, which we can send directly
// to the create-torrent screen
if (files.length === 0 || typeof files[0] !== 'string') {
@@ -67,9 +72,7 @@ module.exports = class TorrentListController {
var state = this.state
var torrentKey = state.nextTorrentKey++
ipcRenderer.send('wt-create-torrent', torrentKey, options)
- state.location.backToFirst(function () {
- state.location.clearForward('create-torrent')
- })
+ state.location.cancel()
}
// Starts downloading and/or seeding a given torrentSummary.
diff --git a/src/renderer/main.js b/src/renderer/main.js
index 2fc32c3e..181a7e63 100644
--- a/src/renderer/main.js
+++ b/src/renderer/main.js
@@ -223,6 +223,7 @@ const dispatchHandlers = {
'escapeBack': escapeBack,
'back': () => state.location.back(),
'forward': () => state.location.forward(),
+ 'cancel': () => state.location.cancel(),
// Controlling the window
'setDimensions': setDimensions,
@@ -360,25 +361,25 @@ function setDimensions (dimensions) {
function onOpen (files) {
if (!Array.isArray(files)) files = [ files ]
- if (state.modal) {
+ var url = state.location.url()
+ var allTorrents = files.every(TorrentPlayer.isTorrent)
+ var allSubtitles = files.every(controllers.subtitles.isSubtitle)
+
+ if (allTorrents) {
+ // Drop torrents onto the app: go to home screen, add torrents, no matter what
+ dispatch('backToList')
+ // All .torrent files? Add them.
+ files.forEach((file) => controllers.torrentList.addTorrent(file))
+ } else if (url === 'player' && allSubtitles) {
+ // Drop subtitles onto a playing video: add subtitles
+ controllers.subtitles.addSubtitles(files, true)
+ } else if (url === 'home') {
+ // Drop files onto home screen: show Create Torrent
state.modal = null
- }
-
- var subtitles = files.filter(controllers.subtitles.isSubtitle)
-
- if (state.location.url() === 'home' || subtitles.length === 0) {
- if (files.every(TorrentPlayer.isTorrent)) {
- if (state.location.url() !== 'home') {
- dispatch('backToList')
- }
- // All .torrent files? Add them.
- files.forEach((file) => controllers.torrentList.addTorrent(file))
- } else {
- // Show the Create Torrent screen. Let's seed those files.
- controllers.torrentList.showCreateTorrent(files)
- }
- } else if (state.location.url() === 'player') {
- controllers.subtitles.addSubtitles(subtitles, true)
+ controllers.torrentList.showCreateTorrent(files)
+ } else {
+ // Drop files onto any other screen: show error
+ return onError('Please go back to the torrent list before creating a new torrent.')
}
update()
diff --git a/src/renderer/views/create-torrent-error-page.js b/src/renderer/views/create-torrent-error-page.js
index b59a360f..3eff6db2 100644
--- a/src/renderer/views/create-torrent-error-page.js
+++ b/src/renderer/views/create-torrent-error-page.js
@@ -16,7 +16,7 @@ module.exports = class CreateTorrentErrorPage extends React.Component {
-
diff --git a/src/renderer/views/create-torrent.js b/src/renderer/views/create-torrent.js
index 7fe4a308..8407aa3c 100644
--- a/src/renderer/views/create-torrent.js
+++ b/src/renderer/views/create-torrent.js
@@ -89,7 +89,7 @@ module.exports = class CreateTorrentPage extends React.Component {
- Cancel
+ Cancel
Create Torrent
diff --git a/src/renderer/views/preferences.js b/src/renderer/views/preferences.js
index 1518514a..a751e0d8 100644
--- a/src/renderer/views/preferences.js
+++ b/src/renderer/views/preferences.js
@@ -40,7 +40,7 @@ function renderDownloadDirSelector (state) {
},
state.unsaved.prefs.downloadPath,
function (filePath) {
- setStateValue('downloadPath', filePath)
+ dispatch('updatePreferences', 'downloadPath', filePath)
})
}
@@ -98,12 +98,18 @@ function renderSection (definition, controls) {
// - callback takes a new file or folder path
function renderFileSelector (definition, value, callback) {
var controls = [(
-
), (
-
+
folder_open
)]
@@ -132,7 +138,3 @@ function renderControlGroup (definition, controls) {
)
}
-
-function setStateValue (property, value) {
- dispatch('updatePreferences', property, value)
-}
diff --git a/src/renderer/views/torrent-list.js b/src/renderer/views/torrent-list.js
index 0c9aa403..4b85d2dd 100644
--- a/src/renderer/views/torrent-list.js
+++ b/src/renderer/views/torrent-list.js
@@ -44,6 +44,7 @@ module.exports = class TorrentList extends React.Component {
if (torrentSummary.playStatus) classes.push(torrentSummary.playStatus)
if (isSelected) classes.push('selected')
if (!infoHash) classes.push('disabled')
+ if (torrentSummary.torrrentKey) console.error('Missing torrentKey', torrentSummary)
return (
A new version of WebTorrent is available: v{state.modal.version}
We have an auto-updater for Windows and Mac. We don't have one for Linux yet, so you'll have to download the new version manually.
- Skip This Release
- Show Download Page
+ Skip This Release
+ Show Download Page
)
- function handleOK () {
+ function handleShow () {
electron.shell.openExternal('https://github.com/feross/webtorrent-desktop/releases')
dispatch('exitModal')
}
- function handleCancel () {
+ function handleSkip () {
dispatch('skipVersion', state.modal.version)
dispatch('exitModal')
}