diff options
author | Florian Bruhin <me@the-compiler.org> | 2021-07-13 10:25:46 +0200 |
---|---|---|
committer | Florian Bruhin <me@the-compiler.org> | 2021-07-13 10:25:46 +0200 |
commit | 38092895810ed22ed69b9ecc432277d7d9f611dc (patch) | |
tree | b552a2c548faad6b77b8e1d568c1680a5ff310e2 | |
parent | 0001d4fe20a4cdef9dd628fad220e09a03618932 (diff) | |
parent | d638e14b49b3b193202d5576cd0c4d848e178232 (diff) | |
download | qutebrowser-38092895810ed22ed69b9ecc432277d7d9f611dc.tar.gz qutebrowser-38092895810ed22ed69b9ecc432277d7d9f611dc.zip |
Merge remote-tracking branch 'origin/pr/6507'
-rw-r--r-- | qutebrowser/mainwindow/prompt.py | 23 | ||||
-rw-r--r-- | tests/unit/mainwindow/test_prompt.py | 31 |
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.""" |