add an application param for prompt-open-download

This commit is contained in:
Daniel Schadt 2016-08-02 19:40:57 +02:00
parent 716ce701f5
commit fa6c552d7b
4 changed files with 54 additions and 13 deletions

View File

@ -1168,8 +1168,15 @@ Answer no to a yes/no prompt.
[[prompt-open-download]]
=== prompt-open-download
Syntax: +:prompt-open-download ['cmdline']+
Immediately open a download.
==== positional arguments
* +'cmdline'+: The command line string to execute. The default will use the system's application to open the file, depending on
the filetype.
[[prompt-yes]]
=== prompt-yes
Answer yes to a yes/no prompt.

View File

@ -22,6 +22,7 @@
import io
import os
import sys
import shlex
import os.path
import shutil
import functools
@ -40,6 +41,7 @@ from qutebrowser.config import config
from qutebrowser.commands import cmdexc, cmdutils
from qutebrowser.utils import (message, usertypes, log, utils, urlutils,
objreg, standarddir, qtutils)
from qutebrowser.misc import guiprocess
from qutebrowser.browser.webkit import http
from qutebrowser.browser.webkit.network import networkmanager
@ -955,19 +957,39 @@ class DownloadManager(QAbstractListModel):
download.cancel()
return
download.finished.connect(
functools.partial(self._open_download, download))
functools.partial(self._open_download, download,
target.cmdline))
download.autoclose = True
download.set_fileobj(fobj)
else:
log.downloads.error("Unknown download target: {}".format(target))
def _open_download(self, download):
"""Open the given download but only if it was successful."""
if download.successful:
download.open_file()
else:
def _open_download(self, download, cmdline):
"""Open the given download but only if it was successful.
Args:
download: The DownloadItem to use.
cmdline: The command to use, or None for the system's default
program.
"""
if not download.successful:
log.downloads.debug("{} finished but not successful, not opening!"
.format(download))
if cmdline is None:
download.open_file()
return
cmd, *args = shlex.split(cmdline)
filename = download._filename
if filename is None:
filename = getattr(download.fileobj, 'name', None)
if filename is None:
raise ValueError("Download has no filename to open")
args = [filename if arg == '{}' else arg for arg in args]
proc = guiprocess.GUIProcess(self._win_id, what='process')
proc.start_detached(cmd, args)
def raise_no_download(self, count):
"""Raise an exception that the download doesn't exist.

View File

@ -312,13 +312,20 @@ class Prompter(QObject):
self._question.done()
@cmdutils.register(instance='prompter', hide=True, scope='window',
modes=[usertypes.KeyMode.prompt])
def prompt_open_download(self):
"""Immediately open a download."""
modes=[usertypes.KeyMode.prompt], maxsplit=0)
def prompt_open_download(self, cmdline: str=None):
"""Immediately open a download.
Args:
cmdline: The command line string to execute. The default will use
the system's application to open the file, depending on
the filetype. A `{}` is expanded to the temporary file
name.
"""
if self._question.mode != usertypes.PromptMode.download:
# We just ignore this if we don't have a download question.
return
self._question.answer = usertypes.OpenFileDownloadTarget()
self._question.answer = usertypes.OpenFileDownloadTarget(cmdline)
modeman.maybe_leave(self._win_id, usertypes.KeyMode.prompt,
'download open')
self._question.done()

View File

@ -297,11 +297,16 @@ class FileObjDownloadTarget(DownloadTarget):
class OpenFileDownloadTarget(DownloadTarget):
"""Save the download in a temp dir and directly open it."""
"""Save the download in a temp dir and directly open it.
def __init__(self):
Attributes:
cmdline: The command to use as string. A {} is expanded to th
filename. None means use the system's default.
"""
def __init__(self, cmdline=None):
# pylint: disable=super-init-not-called
pass
self.cmdline = cmdline
class Question(QObject):