From 495a9a43bcb9f959d547fc65629dea860647d1dd Mon Sep 17 00:00:00 2001 From: Sven Augustin Date: Sat, 4 Feb 2023 18:52:49 +0100 Subject: [PATCH] added eviction, attached it to list changes signal --- grum/dictlist/dictlistwidget.py | 34 +++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/grum/dictlist/dictlistwidget.py b/grum/dictlist/dictlistwidget.py index b1af848..a27f14d 100644 --- a/grum/dictlist/dictlistwidget.py +++ b/grum/dictlist/dictlistwidget.py @@ -14,8 +14,12 @@ class DictListWidget(QListWidget): self.setSelectionMode(QListWidget.ExtendedSelection) self.items = {} self._add_menu() + shortcut(self, "Del", self.delete_selected, context=Qt.WidgetShortcut) + self.nkeep = None + self.model().rowsInserted.connect(self.on_evict) + def _add_menu(self): self.menu = menu = RClickMenu(self) @@ -100,6 +104,7 @@ class DictListWidget(QListWidget): def enable_sort_by_timestamp(self): + # fall back to name for identical timestamps self.set_sort_key(lambda x: (x.timestamps.max(), x.text())) @@ -107,4 +112,33 @@ class DictListWidget(QListWidget): self.set_sort_key(None) + def set_nkeep(self, n): + self.nkeep = n + self.on_evict() + + + def on_evict(self): + if self.nkeep: + self.evict(self.nkeep) + + + def evict(self, nkeep): + items = self.items.values() + + # map order in dict to indices + mapping = enumerate(items) + mapping = {item.text(): index for index, item in mapping} + + def sk(x): + # fall back to insertion order for identical timestamps + return (x.timestamps.max(), mapping[x.text()]) + + items = sorted(items, key=sk, reverse=True) + items_to_evict = items[nkeep:] + + for i in items_to_evict: + self.items.pop(i.key) + self.deleteItem(i) + +