Make it possible to cancel a message.question
This commit is contained in:
parent
dc0b025055
commit
c91dced99f
@ -88,13 +88,15 @@ def alert(message):
|
||||
instance().question.emit(q, True)
|
||||
|
||||
|
||||
def question(message, mode, handler, default=None):
|
||||
def question(message, mode, handler, cancelled_handler=None, default=None):
|
||||
"""Ask an async question in the statusbar.
|
||||
|
||||
Args:
|
||||
message: The message to display to the user.
|
||||
mode: A PromptMode.
|
||||
handler: The function to get called with the answer as argument.
|
||||
cancelled_handler: The function to get called when the prompt was
|
||||
cancelled by the user, or None.
|
||||
default: The default value to display.
|
||||
"""
|
||||
q = Question()
|
||||
@ -102,6 +104,8 @@ def question(message, mode, handler, default=None):
|
||||
q.mode = mode
|
||||
q.default = default
|
||||
q.answered.connect(lambda: handler(q.answer))
|
||||
if cancelled_handler is not None:
|
||||
q.cancelled.connect(cancelled_handler)
|
||||
instance().question.emit(q, True)
|
||||
|
||||
|
||||
|
@ -255,6 +255,7 @@ class Question(QObject):
|
||||
answered: Emitted when the question has been answered by the user.
|
||||
This is emitted from qutebrowser.widgets.statusbar._prompt so
|
||||
it can be emitted after the mode is left.
|
||||
cancelled: Emitted when the question has been cancelled by the user.
|
||||
answered_yes: Convienience signal emitted when a yesno question was
|
||||
answered with yes.
|
||||
answered_no: Convienience signal emitted when a yesno question was
|
||||
@ -262,6 +263,7 @@ class Question(QObject):
|
||||
"""
|
||||
|
||||
answered = pyqtSignal()
|
||||
cancelled = pyqtSignal()
|
||||
answered_yes = pyqtSignal()
|
||||
answered_no = pyqtSignal()
|
||||
|
||||
|
@ -41,12 +41,10 @@ class Prompt(QWidget):
|
||||
Signals:
|
||||
show_prompt: Emitted when the prompt widget wants to be shown.
|
||||
hide_prompt: Emitted when the prompt widget wants to be hidden.
|
||||
cancelled: Emitted when the prompt was cancelled by the user.
|
||||
"""
|
||||
|
||||
show_prompt = pyqtSignal()
|
||||
hide_prompt = pyqtSignal()
|
||||
cancelled = pyqtSignal()
|
||||
|
||||
def __init__(self, parent=None):
|
||||
super().__init__(parent)
|
||||
@ -65,19 +63,14 @@ class Prompt(QWidget):
|
||||
self._hbox.addWidget(self._input)
|
||||
|
||||
def on_mode_left(self, mode):
|
||||
"""Clear and reset input when the mode was left.
|
||||
|
||||
Emit:
|
||||
cancelled: Emitted when the mode was forcibly left by the user
|
||||
without answering the question.
|
||||
"""
|
||||
"""Clear and reset input when the mode was left."""
|
||||
if mode in ('prompt', 'yesno'):
|
||||
self._txt.setText('')
|
||||
self._input.clear()
|
||||
self._input.setEchoMode(QLineEdit.Normal)
|
||||
self.hide_prompt.emit()
|
||||
if self.question.answer is None:
|
||||
self.cancelled.emit()
|
||||
self.question.cancelled.emit()
|
||||
|
||||
@cmdutils.register(instance='mainwindow.status.prompt', hide=True,
|
||||
modes=['prompt'])
|
||||
@ -206,6 +199,6 @@ class Prompt(QWidget):
|
||||
The answer to the question. No, it's not always 42.
|
||||
"""
|
||||
self.question.answered.connect(self.loop.quit)
|
||||
self.cancelled.connect(self.loop.quit)
|
||||
self.question.cancelled.connect(self.loop.quit)
|
||||
self.loop.exec_()
|
||||
return self.question.answer
|
||||
|
Loading…
Reference in New Issue
Block a user