Move some attributes to dedicated Question object

This commit is contained in:
Florian Bruhin 2014-05-19 17:36:31 +02:00
parent 7ca605ade6
commit 97df8fc172
3 changed files with 56 additions and 43 deletions

View File

@ -373,6 +373,7 @@ class QuteBrowser(QApplication):
self.modeman.entered.connect(status.on_mode_entered) self.modeman.entered.connect(status.on_mode_entered)
self.modeman.left.connect(status.on_mode_left) self.modeman.left.connect(status.on_mode_left)
self.modeman.left.connect(status.cmd.on_mode_left) self.modeman.left.connect(status.cmd.on_mode_left)
self.modeman.left.connect(status.prompt.on_mode_left)
# commands # commands
cmd.got_cmd.connect(self.commandmanager.run_safely) cmd.got_cmd.connect(self.commandmanager.run_safely)

View File

@ -17,7 +17,7 @@
"""Prompt shown in the statusbar.""" """Prompt shown in the statusbar."""
from PyQt5.QtCore import pyqtSignal, QEventLoop from PyQt5.QtCore import pyqtSignal, QEventLoop, QObject
from PyQt5.QtWidgets import QLineEdit, QHBoxLayout from PyQt5.QtWidgets import QLineEdit, QHBoxLayout
import qutebrowser.keyinput.modeman as modeman import qutebrowser.keyinput.modeman as modeman
@ -28,20 +28,37 @@ from qutebrowser.utils.usertypes import enum
PromptMode = enum('yesno', 'text', 'user_pwd') PromptMode = enum('yesno', 'text', 'user_pwd')
class Question(QObject):
answered = pyqtSignal()
def __init__(self, parent=None):
super().__init__(parent)
self.mode = None
self.default = None
self.text = None
self._answer = None
@property
def answer(self):
return self._answer
@answer.setter
def answer(self, val):
self._answer = val
self.answered.emit()
class Prompt(TextBase): class Prompt(TextBase):
answered = pyqtSignal([str], [bool], [str, str])
accepted = pyqtSignal() accepted = pyqtSignal()
show_prompt = pyqtSignal()
hide_prompt = pyqtSignal() hide_prompt = pyqtSignal()
def __init__(self, parent=None): def __init__(self, parent=None):
super().__init__(parent) super().__init__(parent)
self.mode = None self.question = None
self.default = None
self.text = None
self.answer = None
self.loop = QEventLoop() self.loop = QEventLoop()
self._hbox = QHBoxLayout(self) self._hbox = QHBoxLayout(self)
@ -65,27 +82,20 @@ class Prompt(TextBase):
def _password_entered(self): def _password_entered(self):
self.accepted.disconnect(self._password_entered) self.accepted.disconnect(self._password_entered)
password = self._input.text() password = self._input.text()
self.answer = (self._user, password) self.question.answer = (self._user, password)
self._txt.setText('')
self._input.clear()
self._input.setEchoMode(QLineEdit.Normal)
self.default = None
self.mode = None
self.text = None
self.answered[str, str].emit(*self.answer)
modeman.leave('prompt', 'prompt accept') modeman.leave('prompt', 'prompt accept')
self.hide_prompt.emit() self.hide_prompt.emit()
def on_return_pressed(self): def on_return_pressed(self):
self.accepted.disconnect(self.on_return_pressed) self.accepted.disconnect(self.on_return_pressed)
self.answer = self._input.text() self.question.answer = self._input.text()
self._txt.setText('')
self.default = None
self.mode = None
self.text = None
# FIXME handle bool correctly
self.answered[str].emit(self.answer)
modeman.leave('prompt', 'prompt accept') modeman.leave('prompt', 'prompt accept')
def on_mode_left(self, mode):
if mode == 'prompt':
self._txt.setText('')
self._input.clear()
self._input.setEchoMode(QLineEdit.Normal)
self.hide_prompt.emit() self.hide_prompt.emit()
@cmdutils.register(instance='mainwindow.status.prompt', hide=True, @cmdutils.register(instance='mainwindow.status.prompt', hide=True,
@ -95,36 +105,38 @@ class Prompt(TextBase):
self.accepted.emit() self.accepted.emit()
def display(self): def display(self):
if self.mode == PromptMode.yesno: q = self.question
if self.default is None: if q.mode == PromptMode.yesno:
if q.default is None:
suffix = " [y/n]" suffix = " [y/n]"
elif self.default: elif q.default:
suffix = " [Y/n]" suffix = " [Y/n]"
else: else:
suffix = " [y/N]" suffix = " [y/N]"
self._txt.setText(self.text + suffix) self._txt.setText(q.text + suffix)
self._input.hide() self._input.hide()
elif self.mode == PromptMode.text: elif q.mode == PromptMode.text:
self._txt.setText(self.text) self._txt.setText(q.text)
if self.default: if q.default:
self._input.setText(self.default) self._input.setText(q.default)
self._input.show() self._input.show()
self.accepted.connect(self.on_return_pressed) self.accepted.connect(self.on_return_pressed)
elif self.mode == PromptMode.user_pwd: elif q.mode == PromptMode.user_pwd:
self._txt.setText(self.text) self._txt.setText(q.text)
if self.default: if q.default:
self._input.setText(self.default) self._input.setText(q.default)
self._input.show() self._input.show()
self.accepted.connect(self._user_entered) self.accepted.connect(self._user_entered)
else: else:
raise ValueError("Invalid prompt mode!") raise ValueError("Invalid prompt mode!")
self._input.setFocus() self._input.setFocus()
self.show_prompt.emit()
def exec_(self): def exec_(self):
self.display() self.display()
self.answered[str, str].connect(self.loop.quit) self.question.answered.connect(self.loop.quit)
self.loop.exec_() self.loop.exec_()
return self.answer return self.question.answer
class _QueryInput(QLineEdit): class _QueryInput(QLineEdit):

View File

@ -32,7 +32,7 @@ from qutebrowser.widgets.statusbar._text import Text
from qutebrowser.widgets.statusbar._keystring import KeyString from qutebrowser.widgets.statusbar._keystring import KeyString
from qutebrowser.widgets.statusbar._percentage import Percentage from qutebrowser.widgets.statusbar._percentage import Percentage
from qutebrowser.widgets.statusbar._url import Url from qutebrowser.widgets.statusbar._url import Url
from qutebrowser.widgets.statusbar._prompt import Prompt, PromptMode from qutebrowser.widgets.statusbar._prompt import Prompt, PromptMode, Question
from qutebrowser.config.style import set_register_stylesheet, get_stylesheet from qutebrowser.config.style import set_register_stylesheet, get_stylesheet
@ -129,6 +129,7 @@ class StatusBar(QWidget):
self.cmd.show_cmd.connect(self._show_cmd_widget) self.cmd.show_cmd.connect(self._show_cmd_widget)
self.cmd.hide_cmd.connect(self._hide_cmd_widget) self.cmd.hide_cmd.connect(self._hide_cmd_widget)
self._hide_cmd_widget() self._hide_cmd_widget()
self.prompt.show_prompt.connect(self._show_prompt_widget)
self.prompt.hide_prompt.connect(self._hide_prompt_widget) self.prompt.hide_prompt.connect(self._hide_prompt_widget)
self._hide_prompt_widget() self._hide_prompt_widget()
@ -318,14 +319,13 @@ class StatusBar(QWidget):
@pyqtSlot('QNetworkReply', 'QAuthenticator') @pyqtSlot('QNetworkReply', 'QAuthenticator')
def on_authentication_required(self, reply, authenticator): def on_authentication_required(self, reply, authenticator):
self._show_prompt_widget() q = Question()
self.prompt.mode = PromptMode.user_pwd q.mode = PromptMode.user_pwd
self.prompt.text = "Username ({}):".format(authenticator.realm()) q.text = "Username ({}):".format(authenticator.realm())
self.prompt.question = q
user, password = self.prompt.exec_() user, password = self.prompt.exec_()
self._hide_prompt_widget()
authenticator.setUser(user) authenticator.setUser(user)
authenticator.setPassword(password) authenticator.setPassword(password)
logging.debug("user: {} / password: {}".format(user, password))
def resizeEvent(self, e): def resizeEvent(self, e):
"""Extend resizeEvent of QWidget to emit a resized signal afterwards. """Extend resizeEvent of QWidget to emit a resized signal afterwards.