added eviction, attached it to list changes signal
This commit is contained in:
@ -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)
|
||||
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user