Implement delete_cur_item for sql completion.

This re-enables bookmark/quickmark deletion for url completions via the new SQL
interface.
This commit is contained in:
Ryan Roden-Corrent 2017-02-14 22:43:33 -05:00
parent fe80878788
commit d89898ef7d
3 changed files with 56 additions and 22 deletions

View File

@ -82,13 +82,14 @@ class SqlCompletionModel(QAbstractItemModel):
""" """
def __init__(self, column_widths=(30, 70, 0), columns_to_filter=None, def __init__(self, column_widths=(30, 70, 0), columns_to_filter=None,
parent=None): delete_cur_item=None, parent=None):
super().__init__(parent) super().__init__(parent)
self.columns_to_filter = columns_to_filter or [0] self.columns_to_filter = columns_to_filter or [0]
self.column_widths = column_widths self.column_widths = column_widths
self._categories = [] self._categories = []
self.srcmodel = self # TODO: dummy for compat with old API self.srcmodel = self # TODO: dummy for compat with old API
self.pattern = '' self.pattern = ''
self.delete_cur_item = delete_cur_item
def new_category(self, name, select='*', where=None, sort_by=None, def new_category(self, name, select='*', where=None, sort_by=None,
sort_order=None, limit=None): sort_order=None, limit=None):
@ -110,10 +111,6 @@ class SqlCompletionModel(QAbstractItemModel):
columns_to_filter=self.columns_to_filter) columns_to_filter=self.columns_to_filter)
self._categories.append(cat) self._categories.append(cat)
def delete_cur_item(self, completion):
"""Delete the selected item."""
raise NotImplementedError
def data(self, index, role=Qt.DisplayRole): def data(self, index, role=Qt.DisplayRole):
"""Return the item data for index. """Return the item data for index.

View File

@ -21,6 +21,39 @@
from qutebrowser.completion.models import sqlmodel from qutebrowser.completion.models import sqlmodel
from qutebrowser.config import config from qutebrowser.config import config
from qutebrowser.utils import qtutils, log, objreg
_URLCOL = 0
_TEXTCOL = 1
def _delete_url(completion):
"""Delete the selected item.
Args:
completion: The Completion object to use.
"""
index = completion.currentIndex()
qtutils.ensure_valid(index)
category = index.parent()
index = category.child(index.row(), _URLCOL)
catname = category.data()
url = index.data()
qtutils.ensure_valid(category)
if catname == 'Bookmarks':
log.completion.debug('Deleting bookmark {}'.format(url))
bookmark_manager = objreg.get('bookmark-manager')
bookmark_manager.delete(url)
else:
assert catname == 'Quickmarks', 'Unknown category {}'.format(catname)
quickmark_manager = objreg.get('quickmark-manager')
sibling = index.sibling(index.row(), _TEXTCOL)
qtutils.ensure_valid(sibling)
name = sibling.data()
log.completion.debug('Deleting quickmark {}'.format(name))
quickmark_manager.delete(name)
def url(): def url():
@ -28,18 +61,16 @@ def url():
Used for the `open` command. Used for the `open` command.
""" """
urlcol = 0
textcol = 1
model = sqlmodel.SqlCompletionModel(column_widths=(40, 50, 10), model = sqlmodel.SqlCompletionModel(column_widths=(40, 50, 10),
columns_to_filter=[urlcol, textcol]) columns_to_filter=[_URLCOL, _TEXTCOL],
delete_cur_item=_delete_url)
limit = config.get('completion', 'web-history-max-items') limit = config.get('completion', 'web-history-max-items')
timefmt = config.get('completion', 'timestamp-format') timefmt = config.get('completion', 'timestamp-format')
select_time = "strftime('{}', atime, 'unixepoch')".format(timefmt) select_time = "strftime('{}', atime, 'unixepoch')".format(timefmt)
model.new_category('Quickmarks', select='url, name')
model.new_category('Bookmarks')
model.new_category('History', model.new_category('History',
limit=limit, limit=limit,
select='url, title, {}'.format(select_time), select='url, title, {}'.format(select_time),
where='not redirect') where='not redirect')
model.new_category('Quickmarks', select='url, name')
model.new_category('Bookmarks')
return model return model

View File

@ -30,6 +30,7 @@ from qutebrowser.browser import history
from qutebrowser.completion.models import miscmodels, urlmodel, configmodel from qutebrowser.completion.models import miscmodels, urlmodel, configmodel
from qutebrowser.config import sections, value from qutebrowser.config import sections, value
from qutebrowser.misc import sql from qutebrowser.misc import sql
from qutebrowser.utils import objreg
def _check_completions(model, expected): def _check_completions(model, expected):
@ -115,7 +116,7 @@ def _patch_config_section_desc(monkeypatch, stubs, symbol):
monkeypatch.setattr(symbol, section_desc) monkeypatch.setattr(symbol, section_desc)
def _mock_view_index(model, category_idx, child_idx, qtbot): def _mock_view_index(model, category_num, child_num, qtbot):
"""Create a tree view from a model and set the current index. """Create a tree view from a model and set the current index.
Args: Args:
@ -126,8 +127,9 @@ def _mock_view_index(model, category_idx, child_idx, qtbot):
view = QTreeView() view = QTreeView()
qtbot.add_widget(view) qtbot.add_widget(view)
view.setModel(model) view.setModel(model)
idx = model.indexFromItem(model.item(category_idx).child(child_idx)) parent = model.index(category_num, 0)
view.setCurrentIndex(idx) child = model.index(child_num, 0, parent=parent)
view.setCurrentIndex(child)
return view return view
@ -138,6 +140,9 @@ def quickmarks(init_sql):
table.insert(['aw', 'https://wiki.archlinux.org']) table.insert(['aw', 'https://wiki.archlinux.org'])
table.insert(['ddg', 'https://duckduckgo.com']) table.insert(['ddg', 'https://duckduckgo.com'])
table.insert(['wiki', 'https://wikipedia.org']) table.insert(['wiki', 'https://wikipedia.org'])
objreg.register('quickmark-manager', table)
yield table
objreg.delete('quickmark-manager')
@pytest.fixture @pytest.fixture
@ -147,6 +152,9 @@ def bookmarks(init_sql):
table.insert(['https://github.com', 'GitHub']) table.insert(['https://github.com', 'GitHub'])
table.insert(['https://python.org', 'Welcome to Python.org']) table.insert(['https://python.org', 'Welcome to Python.org'])
table.insert(['http://qutebrowser.org', 'qutebrowser | qutebrowser']) table.insert(['http://qutebrowser.org', 'qutebrowser | qutebrowser'])
objreg.register('bookmark-manager', table)
yield table
objreg.delete('bookmark-manager')
@pytest.fixture @pytest.fixture
@ -295,7 +303,6 @@ def test_url_completion(qtmodeltester, config_stub, web_history, quickmarks,
}) })
@pytest.mark.skip
def test_url_completion_delete_bookmark(qtmodeltester, config_stub, def test_url_completion_delete_bookmark(qtmodeltester, config_stub,
web_history, quickmarks, bookmarks, web_history, quickmarks, bookmarks,
qtbot): qtbot):
@ -309,12 +316,11 @@ def test_url_completion_delete_bookmark(qtmodeltester, config_stub,
# delete item (1, 0) -> (bookmarks, 'https://github.com' ) # delete item (1, 0) -> (bookmarks, 'https://github.com' )
view = _mock_view_index(model, 1, 0, qtbot) view = _mock_view_index(model, 1, 0, qtbot)
model.delete_cur_item(view) model.delete_cur_item(view)
assert 'https://github.com' not in bookmarks.marks assert 'https://github.com' not in bookmarks
assert 'https://python.org' in bookmarks.marks assert 'https://python.org' in bookmarks
assert 'http://qutebrowser.org' in bookmarks.marks assert 'http://qutebrowser.org' in bookmarks
@pytest.mark.skip
def test_url_completion_delete_quickmark(qtmodeltester, config_stub, def test_url_completion_delete_quickmark(qtmodeltester, config_stub,
web_history, quickmarks, bookmarks, web_history, quickmarks, bookmarks,
qtbot): qtbot):
@ -328,9 +334,9 @@ def test_url_completion_delete_quickmark(qtmodeltester, config_stub,
# delete item (0, 1) -> (quickmarks, 'ddg' ) # delete item (0, 1) -> (quickmarks, 'ddg' )
view = _mock_view_index(model, 0, 1, qtbot) view = _mock_view_index(model, 0, 1, qtbot)
model.delete_cur_item(view) model.delete_cur_item(view)
assert 'aw' in quickmarks.marks assert 'aw' in quickmarks
assert 'ddg' not in quickmarks.marks assert 'ddg' not in quickmarks
assert 'wiki' in quickmarks.marks assert 'wiki' in quickmarks
def test_session_completion(qtmodeltester, session_manager_stub): def test_session_completion(qtmodeltester, session_manager_stub):