Repository navigation
v0.5.0 — CatalogModel role extension
CatalogModel role extension. The Model Manager's per-row state (installed flag, in-flight loading flag, download progress) now flows through proper Qt roles on the catalog model instead of parallel QVariantMap / QVariantList snapshots rebuilt on every event. Same UX, lighter signal traffic on the hot path during model installs, and the foundation for the deferred custom-STT-path catalog work.
Added
loading,progress,downloadable,managedroles onCatalogModelalongsidenameandinstalled. QML delegates bind directly tomodel.loading/model.progress; the previousvoiceAgent.sttProgressMap[model.name]lookups are gone.CatalogStateProviderProtocol decouplesCatalogModelfrom loaders and backends. The window-side_CatalogStateAdapterpulls live state from the loader + service soMainWindowno longer carries duplicate_active_items/ per-item progress dicts.refresh_row(name)andrefresh_progress(name)onCatalogModel. The narrow-role variant emitsdataChangedwith only[ProgressRole], keepinginstalled/loading-driven sibling bindings asleep between sub-second aria2 ticks.is_item_managedandis_item_downloadableonWhisperTranscriberandPiperTtsService.PiperTtsServicealso gains a newknown_voice_names()classmethod that consolidates installed + cached unions as a single source of truth.sttInstalledCount/ttsInstalledCountQ_PROPERTYs onMainWindow. Replaces the QML-sidecountInstalled()JS helper that iteratedsttCatalog/ttsCatalogon everyui_changed.
Changed
ParallelItemLoader._finish_successno longer emits a synthetic terminalitem_progress_changed. That frame existed only to keep the dropped*ProgressMap"busy" predicate honest; therefresh_rowtriggered byitem_loading_changed(name, False)now drives the row back to idle through the adapter.
Removed
MainWindow.downloads_changed/downloads_progress_changedsignals and the matchingsttCatalog,ttsCatalog,sttProgressMap,ttsProgressMap,sttDownloadingList,ttsDownloadingListproperties. Per-row state now flows throughCatalogModel's roles. The*DownloadingListproperties had no remaining QML consumers.