Local save is synchronous (data safe on disk before returning). Network upload (file, DAG, BOM) runs in a background QThread. New files: - silo_upload_queue.py: UploadTask dataclass + UploadWorker(QThread) with coalescing, cancel, shutdown, and Qt signals - silo_status_widget.py: SyncStatusWidget for status bar feedback Modified: - silo_commands.py: _extract_dag_data, _extract_bom_data, _enqueue_upload helpers; Silo_Save and Silo_Commit use async enqueue - silo_origin.py: saveDocument() saves locally then enqueues async upload - InitGui.py: upload queue init at 700ms, shutdown handler via atexit Thread safety: worker never accesses App.Document or Qt widgets; all data pre-extracted on main thread as plain dicts/strings. Queue uses threading.Lock; signals cross thread boundary via Qt.
10 KiB
10 KiB