in client/securedrop_client/gui/widgets.py [0:0]
def add_source(self, sources: list[Source], slice_size: int = 1) -> None:
"""
Add a slice of sources, and if necessary, reschedule the addition of
more sources.
"""
def schedule_source_management(slice_size: int = slice_size) -> None:
if not sources:
self.adjust_preview.emit(self.width() - self.INITIAL_UPDATE_SCROLLBAR_WIDTH)
return
# Process the remaining "slice_size" number of sources.
sources_slice = sources[:slice_size]
for source in sources_slice:
try:
source_uuid = source.uuid
source_widget = SourceWidget(
self.controller, source, 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[source_uuid] = source_item
except sqlalchemy.exc.InvalidRequestError as e:
logger.debug(e)
# Re-sort SourceList to make sure the most recently-updated sources appear at the top
self.sortItems(Qt.DescendingOrder)
# ATTENTION! 32 is an arbitrary number arrived at via
# experimentation. It adds plenty of sources, but doesn't block
# for a noticable amount of time.
new_slice_size = min(self.NUM_SOURCES_TO_ADD_AT_A_TIME, slice_size * 2)
# Call add_source again for the remaining sources.
self.add_source(sources[slice_size:], new_slice_size)
# Schedule the closure defined above in the next iteration of the
# Qt event loop (thus unblocking the UI).
QTimer.singleShot(1, schedule_source_management)