in client/securedrop_client/gui/widgets.py [0:0]
def update_sources(self, sources: list[Source]) -> list[str]:
"""
Update the list with the passed in list of sources.
"""
sources_to_update = []
sources_to_add = {}
for source in sources:
try:
if source.uuid in self.source_items:
sources_to_update.append(source.uuid)
else:
sources_to_add[source.uuid] = source
except sqlalchemy.exc.InvalidRequestError as e:
logger.debug(e)
continue
# Delete widgets for sources not in the supplied sourcelist
deleted_uuids = []
sources_to_delete = [
self.source_items[uuid] for uuid in self.source_items if uuid not in sources_to_update
]
for source_item in sources_to_delete:
if source_item.isSelected():
self.setCurrentItem(None)
source_widget = self.itemWidget(source_item)
self.takeItem(self.row(source_item))
assert isinstance(source_widget, SourceWidget)
if source_widget.source_uuid in self.source_items:
del self.source_items[source_widget.source_uuid]
deleted_uuids.append(source_widget.source_uuid)
source_widget.deleteLater()
# Update the remaining widgets
for i in range(self.count()):
source_widget = self.itemWidget(self.item(i))
if not source_widget:
continue
assert isinstance(source_widget, SourceWidget)
source_widget.reload()
# Add widgets for new sources
for uuid in sources_to_add:
source_widget = SourceWidget(
self.controller, sources_to_add[uuid], self.source_selected, self.adjust_preview
)
source_item = SourceListWidgetItem(self)
source_item.setSizeHint(source_widget.sizeHint())
self.insertItem(0, source_item)
self.setItemWidget(source_item, source_widget)
self.source_items[uuid] = source_item
self.adjust_preview.emit(self.width() - self.INITIAL_UPDATE_SCROLLBAR_WIDTH)
# Re-sort SourceList to make sure the most recently-updated sources appear at the top
self.sortItems(Qt.DescendingOrder)
# Return uuids of source widgets that were deleted so we can later delete the corresponding
# conversation widgets
return deleted_uuids