summaryrefslogtreecommitdiff
path: root/qutebrowser/mainwindow/prompt.py
diff options
context:
space:
mode:
Diffstat (limited to 'qutebrowser/mainwindow/prompt.py')
-rw-r--r--qutebrowser/mainwindow/prompt.py99
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)