From c91dced99fb30726b3ce4ba5a365246304e61384 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 12 Jun 2014 17:49:36 +0200 Subject: [PATCH] Make it possible to cancel a message.question --- qutebrowser/utils/message.py | 6 +++++- qutebrowser/utils/usertypes.py | 2 ++ qutebrowser/widgets/statusbar/prompt.py | 13 +++---------- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/qutebrowser/utils/message.py b/qutebrowser/utils/message.py index f3d3ee786..a9a1f519b 100644 --- a/qutebrowser/utils/message.py +++ b/qutebrowser/utils/message.py @@ -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) diff --git a/qutebrowser/utils/usertypes.py b/qutebrowser/utils/usertypes.py index 56090db50..f90947641 100644 --- a/qutebrowser/utils/usertypes.py +++ b/qutebrowser/utils/usertypes.py @@ -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() diff --git a/qutebrowser/widgets/statusbar/prompt.py b/qutebrowser/widgets/statusbar/prompt.py index 3da89e94e..5ee9ff1a0 100644 --- a/qutebrowser/widgets/statusbar/prompt.py +++ b/qutebrowser/widgets/statusbar/prompt.py @@ -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