feat(files): sync Source panel browser with chosen save directory

This commit is contained in:
jack
2026-07-10 14:37:29 -07:00
parent bdc667b2ed
commit e2ce8778e0
5 changed files with 37 additions and 3 deletions
+3 -1
View File
@@ -88,7 +88,9 @@ Rectangle {
id: saveDirDialog id: saveDirDialog
title: "Choose a folder to save Data" title: "Choose a folder to save Data"
onAccepted: { onAccepted: {
deviceController.setSaveDataDir(root.cleanFolderUrl(selectedFolder)) var dir = root.cleanFolderUrl(selectedFolder)
deviceController.setSaveDataDir(dir)
file_browser.setCurrentDirectory(dir)
root._doDetect() root._doDetect()
} }
} }
+8 -2
View File
@@ -122,7 +122,9 @@ ColumnLayout {
id: saveDirDialog id: saveDirDialog
title: "Choose a folder to save." title: "Choose a folder to save."
onAccepted: { onAccepted: {
deviceController.setSaveDataDir(root.cleanFolderUrl(selectedFolder)); var dir = root.cleanFolderUrl(selectedFolder);
deviceController.setSaveDataDir(dir);
file_browser.setCurrentDirectory(dir);
root.parseAndSavePendingRead(); root.parseAndSavePendingRead();
} }
} }
@@ -132,7 +134,11 @@ ColumnLayout {
FolderDialog { FolderDialog {
id: dirOnlyDialog id: dirOnlyDialog
title: "Choose a folder to save Data" title: "Choose a folder to save Data"
onAccepted: deviceController.setSaveDataDir(root.cleanFolderUrl(selectedFolder)) onAccepted: {
var dir = root.cleanFolderUrl(selectedFolder);
deviceController.setSaveDataDir(dir);
file_browser.setCurrentDirectory(dir);
}
} }
// Post-read metadata editor (C# parity: EditCSVMetadataDialog after read). // Post-read metadata editor (C# parity: EditCSVMetadataDialog after read).
+3
View File
@@ -74,6 +74,9 @@ def main() -> int:
device_controller = DeviceController(raw_settings, data_dir) device_controller = DeviceController(raw_settings, data_dir)
engine.rootContext().setContextProperty("deviceController", device_controller) engine.rootContext().setContextProperty("deviceController", device_controller)
# Source panel browses the same folder recordings/reads are saved to.
select_file_dialog_model.setCurrentDirectory(str(device_controller.saveDataDir))
# ===== License Model (About dialog grid, replay trial) ===== # ===== License Model (About dialog grid, replay trial) =====
license_model = LicenseModel(data_dir) license_model = LicenseModel(data_dir)
engine.rootContext().setContextProperty("licenseModel", license_model) engine.rootContext().setContextProperty("licenseModel", license_model)
+10
View File
@@ -37,6 +37,16 @@ class FileBrowser(QObject):
return str(self._current_directory) return str(self._current_directory)
# ===== Directory Selection ===== # ===== Directory Selection =====
@Slot(str)
def setCurrentDirectory(self, path: str) -> None:
"""Point the browser at `path` without opening a native dialog.
Used to keep this directory in sync with DeviceController.saveDataDir
when the user picks a save folder elsewhere in the app.
"""
self._set_current_directory(Path(path))
self._refresh_files(show_empty_message=False)
@Slot() @Slot()
def chooseDirectory(self) -> None: def chooseDirectory(self) -> None:
selected_dir = QFileDialog.getExistingDirectory( selected_dir = QFileDialog.getExistingDirectory(
+13
View File
@@ -28,3 +28,16 @@ def test_recorded_live_file_flagged_as_recording(qapp, tmp_path):
files_by_name = {Path(row["fileName"]).name: row for row in browser.files} files_by_name = {Path(row["fileName"]).name: row for row in browser.files}
assert files_by_name["live_P00001_20260706_143022.csv"]["isRecording"] is True assert files_by_name["live_P00001_20260706_143022.csv"]["isRecording"] is True
assert files_by_name["P00002-20260706_143500.csv"]["isRecording"] is False assert files_by_name["P00002-20260706_143500.csv"]["isRecording"] is False
def test_set_current_directory_updates_dir_and_refreshes(qapp, tmp_path):
"""setCurrentDirectory (no native dialog) is how the Status tab's save-dir
picker keeps the Source panel pointed at the same folder."""
_write_csv(tmp_path / "P00003-20260706_143500.csv")
browser = FileBrowser()
browser.setCurrentDirectory(str(tmp_path))
assert browser.currentDirectory == str(tmp_path)
assert len(browser.files) == 1
assert Path(browser.files[0]["fileName"]).name == "P00003-20260706_143500.csv"