summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Bruhin <me@the-compiler.org>2021-07-13 10:25:46 +0200
committerFlorian Bruhin <me@the-compiler.org>2021-07-13 10:25:46 +0200
commit38092895810ed22ed69b9ecc432277d7d9f611dc (patch)
treeb552a2c548faad6b77b8e1d568c1680a5ff310e2
parent0001d4fe20a4cdef9dd628fad220e09a03618932 (diff)
parentd638e14b49b3b193202d5576cd0c4d848e178232 (diff)
downloadqutebrowser-38092895810ed22ed69b9ecc432277d7d9f611dc.tar.gz
qutebrowser-38092895810ed22ed69b9ecc432277d7d9f611dc.zip
Merge remote-tracking branch 'origin/pr/6507'
-rw-r--r--qutebrowser/mainwindow/prompt.py23
-rw-r--r--tests/unit/mainwindow/test_prompt.py31
2 files changed, 46 insertions, 8 deletions
diff --git a/qutebrowser/mainwindow/prompt.py b/qutebrowser/mainwindow/prompt.py
index c3550d92f..7ac9f7522 100644
--- a/qutebrowser/mainwindow/prompt.py
+++ b/qutebrowser/mainwindow/prompt.py
@@ -24,8 +24,8 @@ import html
import collections
import functools
import dataclasses
-from typing import Deque, MutableSequence, Optional, cast
+from typing import Deque, MutableSequence, Optional, cast
from PyQt5.QtCore import (pyqtSlot, pyqtSignal, Qt, QTimer, QDir, QModelIndex,
QItemSelectionModel, QObject, QEventLoop)
from PyQt5.QtWidgets import (QWidget, QGridLayout, QVBoxLayout, QLineEdit,
@@ -631,6 +631,16 @@ class FilenamePrompt(_BasePrompt):
self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred)
self._to_complete = ''
+ self._root_index = QModelIndex()
+
+ def _directories_hide_show_model(self):
+ """Get rid of non-matching directories."""
+ num_rows = self._file_model.rowCount(self._root_index)
+ for row in range(num_rows):
+ index = self._file_model.index(row, 0, self._root_index)
+ filename = index.data()
+ hidden = self._to_complete not in filename and filename != '..'
+ self._file_view.setRowHidden(index.row(), index.parent(), hidden)
@pyqtSlot(str)
def _set_fileview_root(self, path, *, tabbed=False):
@@ -663,8 +673,10 @@ class FilenamePrompt(_BasePrompt):
log.prompt.exception("Failed to get directory information")
return
- root = self._file_model.setRootPath(path)
- self._file_view.setRootIndex(root)
+ self._root_index = self._file_model.setRootPath(path)
+ self._file_view.setRootIndex(self._root_index)
+
+ self._directories_hide_show_model()
@pyqtSlot(QModelIndex)
def _insert_path(self, index, *, clicked=True):
@@ -764,15 +776,12 @@ class FilenamePrompt(_BasePrompt):
self._insert_path(idx, clicked=False)
def _do_completion(self, idx, which):
- filename = self._file_model.fileName(idx)
- while not filename.startswith(self._to_complete) and idx.isValid():
+ while idx.isValid() and self._file_view.isIndexHidden(idx):
if which == 'prev':
idx = self._file_view.indexAbove(idx)
else:
assert which == 'next', which
idx = self._file_view.indexBelow(idx)
- filename = self._file_model.fileName(idx)
-
return idx
def _allowed_commands(self):
diff --git a/tests/unit/mainwindow/test_prompt.py b/tests/unit/mainwindow/test_prompt.py
index 668cd0710..055e5b665 100644
--- a/tests/unit/mainwindow/test_prompt.py
+++ b/tests/unit/mainwindow/test_prompt.py
@@ -80,8 +80,11 @@ class TestFileCompletion:
with qtbot.wait_signal(prompt._file_model.directoryLoaded):
for _ in range(3):
qtbot.keyPress(prompt._lineedit, Qt.Key_Backspace)
+ prompt._set_fileview_root(prompt._lineedit.text())
- # foo should get completed from f
+ # '..' and 'foo' should get completed from 'f'
+ prompt.item_focus('next')
+ assert prompt._lineedit.text() == str(tmp_path)
prompt.item_focus('next')
assert prompt._lineedit.text() == str(testdir / 'foo')
@@ -94,6 +97,32 @@ class TestFileCompletion:
prompt.item_focus('next')
assert prompt._lineedit.text() == str(testdir / 'bar')
+ @pytest.mark.parametrize("keys, expected", [
+ ([], ['..', 'bar', 'bat', 'foo']),
+ ([Qt.Key_F], ['..', 'foo']),
+ ([Qt.Key_A], ['..', 'bar', 'bat']),
+ ])
+ def test_filtering_path(self, qtbot, tmp_path, get_prompt, keys, expected):
+ testdir = tmp_path / 'test'
+
+ for directory in ['bar', 'foo', 'bat']:
+ (testdir / directory).mkdir(parents=True)
+
+ prompt = get_prompt(str(testdir) + os.sep)
+ for key in keys:
+ qtbot.keyPress(prompt._lineedit, key)
+ prompt._set_fileview_root(prompt._lineedit.text())
+
+ num_rows = prompt._file_model.rowCount(prompt._file_view.rootIndex())
+ visible = []
+ for row in range(num_rows):
+ parent = prompt._file_model.index(
+ os.path.dirname(prompt._lineedit.text()))
+ index = prompt._file_model.index(row, 0, parent)
+ if not prompt._file_view.isRowHidden(index.row(), index.parent()):
+ visible.append(index.data())
+ assert visible == expected
+
@pytest.mark.linux
def test_root_path(self, get_prompt):
"""With / as path, show root contents."""