diff options
Diffstat (limited to 'qutebrowser/mainwindow/prompt.py')
-rw-r--r-- | qutebrowser/mainwindow/prompt.py | 99 |
1 files changed, 47 insertions, 52 deletions
diff --git a/qutebrowser/mainwindow/prompt.py b/qutebrowser/mainwindow/prompt.py index 2d2990e88..fce32a29e 100644 --- a/qutebrowser/mainwindow/prompt.py +++ b/qutebrowser/mainwindow/prompt.py @@ -25,13 +25,7 @@ import collections import functools import dataclasses from typing import Deque, MutableSequence, Optional, cast - -from qutebrowser.qt.core import (pyqtSlot, pyqtSignal, Qt, QTimer, QDir, QModelIndex, - QItemSelectionModel, QObject, QEventLoop) -from qutebrowser.qt.widgets import (QWidget, QGridLayout, QVBoxLayout, QLineEdit, - QLabel, QTreeView, QSizePolicy, - QSpacerItem) -from qutebrowser.qt.gui import QFileSystemModel +from qutebrowser.qt import widgets, gui from qutebrowser.browser import downloads from qutebrowser.config import config, configtypes, configexc, stylesheet @@ -39,6 +33,7 @@ from qutebrowser.utils import usertypes, log, utils, qtutils, objreg, message from qutebrowser.keyinput import modeman from qutebrowser.api import cmdutils from qutebrowser.utils import urlmatch +from qutebrowser.qt import core prompt_queue = cast('PromptQueue', None) @@ -63,7 +58,7 @@ class UnsupportedOperationError(Error): """Raised when the prompt class doesn't support the requested operation.""" -class PromptQueue(QObject): +class PromptQueue(core.QObject): """Global manager and queue for upcoming prompts. @@ -97,7 +92,7 @@ class PromptQueue(QObject): shown. """ - show_prompts = pyqtSignal(usertypes.Question) + show_prompts = core.pyqtSignal(usertypes.Question) def __init__(self, parent=None): super().__init__(parent) @@ -113,7 +108,7 @@ class PromptQueue(QObject): def _pop_later(self): """Helper to call self._pop as soon as everything else is done.""" - QTimer.singleShot(0, self._pop) + core.QTimer.singleShot(0, self._pop) def _pop(self): """Pop a question from the queue and ask it, if there are any.""" @@ -146,7 +141,7 @@ class PromptQueue(QObject): else: return False - @pyqtSlot(usertypes.Question, bool) + @core.pyqtSlot(usertypes.Question, bool) def ask_question(self, question, blocking): """Display a prompt for a given question. @@ -196,7 +191,7 @@ class PromptQueue(QObject): question.completed.connect(loop.quit) question.completed.connect(loop.deleteLater) log.prompt.debug("Starting loop.exec() for {}".format(question)) - flags = QEventLoop.ProcessEventsFlag.ExcludeSocketNotifiers + flags = core.QEventLoop.ProcessEventsFlag.ExcludeSocketNotifiers loop.exec(flags) log.prompt.debug("Ending loop.exec() for {}".format(question)) @@ -214,7 +209,7 @@ class PromptQueue(QObject): question.completed.connect(self._pop_later) return None - @pyqtSlot(usertypes.KeyMode) + @core.pyqtSlot(usertypes.KeyMode) def _on_mode_left(self, mode): """Abort question when a prompt mode was left.""" if mode not in [usertypes.KeyMode.prompt, usertypes.KeyMode.yesno]: @@ -232,7 +227,7 @@ class PromptQueue(QObject): self._question = None -class PromptContainer(QWidget): +class PromptContainer(widgets.QWidget): """Container for prompts to be shown above the statusbar. @@ -283,17 +278,17 @@ class PromptContainer(QWidget): background-color: {{ conf.colors.prompts.selected.bg }}; } """ - update_geometry = pyqtSignal() + update_geometry = core.pyqtSignal() def __init__(self, win_id, parent=None): super().__init__(parent) - self._layout = QVBoxLayout(self) + self._layout = widgets.QVBoxLayout(self) self._layout.setContentsMargins(10, 10, 10, 10) self._win_id = win_id self._prompt: Optional[_BasePrompt] = None self.setObjectName('PromptContainer') - self.setAttribute(Qt.WidgetAttribute.WA_StyledBackground, True) + self.setAttribute(core.Qt.WidgetAttribute.WA_StyledBackground, True) stylesheet.set_register(self) message.global_bridge.prompt_done.connect(self._on_prompt_done) @@ -303,7 +298,7 @@ class PromptContainer(QWidget): def __repr__(self): return utils.get_repr(self, win_id=self._win_id) - @pyqtSlot(usertypes.Question) + @core.pyqtSlot(usertypes.Question) def _on_show_prompts(self, question): """Show a prompt for the given question. @@ -349,7 +344,7 @@ class PromptContainer(QWidget): prompt.setFocus() self.update_geometry.emit() - @pyqtSlot() + @core.pyqtSlot() def _on_aborted(self, key_mode): """Leave KEY_MODE whenever a prompt is aborted.""" try: @@ -358,12 +353,12 @@ class PromptContainer(QWidget): # window was deleted: ignore pass - @pyqtSlot(usertypes.KeyMode) + @core.pyqtSlot(usertypes.KeyMode) def _on_prompt_done(self, key_mode): """Leave the prompt mode in this window if a question was answered.""" modeman.leave(self._win_id, key_mode, ':prompt-accept', maybe=True) - @pyqtSlot(usertypes.KeyMode) + @core.pyqtSlot(usertypes.KeyMode) def _on_global_mode_left(self, mode): """Leave prompt/yesno mode in this window if it was left elsewhere. @@ -493,7 +488,7 @@ class PromptContainer(QWidget): self.prompt_accept(folders[0]) -class LineEdit(QLineEdit): +class LineEdit(widgets.QLineEdit): """A line edit used in prompts.""" @@ -504,11 +499,11 @@ class LineEdit(QLineEdit): background-color: transparent; } """) - self.setAttribute(Qt.WidgetAttribute.WA_MacShowFocusRect, False) + self.setAttribute(core.Qt.WidgetAttribute.WA_MacShowFocusRect, False) def keyPressEvent(self, e): """Override keyPressEvent to paste primary selection on Shift + Ins.""" - if e.key() == Qt.Key.Key_Insert and e.modifiers() == Qt.KeyboardModifier.ShiftModifier: + if e.key() == core.Qt.Key.Key_Insert and e.modifiers() == core.Qt.KeyboardModifier.ShiftModifier: try: text = utils.get_clipboard(selection=True, fallback=True) except utils.ClipboardError: # pragma: no cover @@ -523,7 +518,7 @@ class LineEdit(QLineEdit): return utils.get_repr(self) -class _BasePrompt(QWidget): +class _BasePrompt(widgets.QWidget): """Base class for all prompts.""" @@ -532,7 +527,7 @@ class _BasePrompt(QWidget): def __init__(self, question, parent=None): super().__init__(parent) self.question = question - self._vbox = QVBoxLayout(self) + self._vbox = widgets.QVBoxLayout(self) self._vbox.setSpacing(15) self._key_grid = None @@ -543,18 +538,18 @@ class _BasePrompt(QWidget): assert question.title is not None, question title = '<font size="4"><b>{}</b></font>'.format( html.escape(question.title)) - title_label = QLabel(title, self) + title_label = widgets.QLabel(title, self) self._vbox.addWidget(title_label) if question.text is not None: # Not doing any HTML escaping here as the text can be formatted - text_label = QLabel(question.text) + text_label = widgets.QLabel(question.text) text_label.setWordWrap(True) - text_label.setTextInteractionFlags(Qt.TextInteractionFlag.TextSelectableByMouse) + text_label.setTextInteractionFlags(core.Qt.TextInteractionFlag.TextSelectableByMouse) self._vbox.addWidget(text_label) def _init_key_label(self): assert self._key_grid is None, self._key_grid - self._key_grid = QGridLayout() + self._key_grid = widgets.QGridLayout() self._key_grid.setVerticalSpacing(0) all_bindings = config.key_instance.get_reverse_bindings_for( @@ -573,24 +568,24 @@ class _BasePrompt(QWidget): binding = pref if binding is None: binding = bindings[0] - key_label = QLabel('<b>{}</b>'.format(html.escape(binding))) + key_label = widgets.QLabel('<b>{}</b>'.format(html.escape(binding))) else: - key_label = QLabel(f'<b>unbound</b> (<tt>{html.escape(cmd)}</tt>)') + key_label = widgets.QLabel(f'<b>unbound</b> (<tt>{html.escape(cmd)}</tt>)') - text_label = QLabel(text) + text_label = widgets.QLabel(text) labels.append((key_label, text_label)) for i, (key_label, text_label) in enumerate(labels): self._key_grid.addWidget(key_label, i, 0) self._key_grid.addWidget(text_label, i, 1) - spacer = QSpacerItem(0, 0, QSizePolicy.Policy.Expanding) + spacer = widgets.QSpacerItem(0, 0, widgets.QSizePolicy.Policy.Expanding) self._key_grid.addItem(spacer, 0, 2) self._vbox.addLayout(self._key_grid) if not has_bindings: - label = QLabel( + label = widgets.QLabel( "<b>Note:</b> You seem to have unbound all keys for this prompt " f"(<tt>{self.KEY_MODE.name}</tt> key mode)." "<br/>Run <tt>qutebrowser :CMD</tt> with a command from above to " @@ -666,10 +661,10 @@ class FilenamePrompt(_BasePrompt): self._set_fileview_root(question.default) if config.val.prompt.filebrowser: - self.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred) + self.setSizePolicy(widgets.QSizePolicy.Policy.Expanding, widgets.QSizePolicy.Policy.Preferred) self._to_complete = '' - self._root_index = QModelIndex() + self._root_index = core.QModelIndex() def _directories_hide_show_model(self): """Get rid of non-matching directories.""" @@ -680,7 +675,7 @@ class FilenamePrompt(_BasePrompt): hidden = self._to_complete not in filename and filename != '..' self._file_view.setRowHidden(index.row(), index.parent(), hidden) - @pyqtSlot(str) + @core.pyqtSlot(str) def _set_fileview_root(self, path, *, tabbed=False): """Set the root path for the file display.""" separators = os.sep @@ -716,7 +711,7 @@ class FilenamePrompt(_BasePrompt): self._directories_hide_show_model() - @pyqtSlot(QModelIndex) + @core.pyqtSlot(core.QModelIndex) def _insert_path(self, index, *, clicked=True): """Handle an element selection. @@ -724,7 +719,7 @@ class FilenamePrompt(_BasePrompt): index: The QModelIndex of the selected element. clicked: Whether the element was clicked. """ - if index == QModelIndex(): + if index == core.QModelIndex(): path = os.path.join(self._file_model.rootPath(), self._to_complete) else: path = os.path.normpath(self._file_model.filePath(index)) @@ -741,11 +736,11 @@ class FilenamePrompt(_BasePrompt): self._set_fileview_root(path, tabbed=True) if clicked: # Avoid having a ..-subtree highlighted - self._file_view.setCurrentIndex(QModelIndex()) + self._file_view.setCurrentIndex(core.QModelIndex()) def _init_fileview(self): - self._file_view = QTreeView(self) - self._file_model = QFileSystemModel(self) + self._file_view = widgets.QTreeView(self) + self._file_model = gui.QFileSystemModel(self) self._file_view.setModel(self._file_model) self._file_view.clicked.connect(self._insert_path) @@ -759,7 +754,7 @@ class FilenamePrompt(_BasePrompt): for col in range(1, 4): self._file_view.setColumnHidden(col, True) # Nothing selected initially - self._file_view.setCurrentIndex(QModelIndex()) + self._file_view.setCurrentIndex(core.QModelIndex()) # The model needs to be sorted so we get the correct first/last index self._file_model.directoryLoaded.connect( lambda: self._file_model.sort(0)) @@ -809,8 +804,8 @@ class FilenamePrompt(_BasePrompt): selmodel.setCurrentIndex( idx, - QItemSelectionModel.SelectionFlag.ClearAndSelect | - QItemSelectionModel.SelectionFlag.Rows) + core.QItemSelectionModel.SelectionFlag.ClearAndSelect | + core.QItemSelectionModel.SelectionFlag.Rows) self._insert_path(idx, clicked=False) def _do_completion(self, idx, which): @@ -833,7 +828,7 @@ class DownloadFilenamePrompt(FilenamePrompt): def __init__(self, question, parent=None): super().__init__(question, parent) self._file_model.setFilter( - QDir.Filter.AllDirs | QDir.Filter.Drives | QDir.Filter.NoDotAndDotDot) + core.QDir.Filter.AllDirs | core.QDir.Filter.Drives | core.QDir.Filter.NoDotAndDotDot) def accept(self, value=None, save=False): done = super().accept(value, save) @@ -873,14 +868,14 @@ class AuthenticationPrompt(_BasePrompt): super().__init__(question, parent) self._init_texts(question) - user_label = QLabel("Username:", self) + user_label = widgets.QLabel("Username:", self) self._user_lineedit = LineEdit(self) - password_label = QLabel("Password:", self) + password_label = widgets.QLabel("Password:", self) self._password_lineedit = LineEdit(self) - self._password_lineedit.setEchoMode(QLineEdit.EchoMode.Password) + self._password_lineedit.setEchoMode(widgets.QLineEdit.EchoMode.Password) - grid = QGridLayout() + grid = widgets.QGridLayout() grid.addWidget(user_label, 1, 0) grid.addWidget(self._user_lineedit, 1, 1) grid.addWidget(password_label, 2, 0) @@ -1013,4 +1008,4 @@ def init(): global prompt_queue prompt_queue = PromptQueue() message.global_bridge.ask_question.connect( # type: ignore[call-arg] - prompt_queue.ask_question, Qt.ConnectionType.DirectConnection) + prompt_queue.ask_question, core.Qt.ConnectionType.DirectConnection) |