def add_source()

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)