diff --git a/src/pygui/ISC/HomePage.qml b/src/pygui/ISC/HomePage.qml index a32bd59..a207d29 100644 --- a/src/pygui/ISC/HomePage.qml +++ b/src/pygui/ISC/HomePage.qml @@ -88,7 +88,9 @@ Rectangle { id: saveDirDialog title: "Choose a folder to save Data" onAccepted: { - deviceController.setSaveDataDir(root.cleanFolderUrl(selectedFolder)) + var dir = root.cleanFolderUrl(selectedFolder) + deviceController.setSaveDataDir(dir) + file_browser.setCurrentDirectory(dir) root._doDetect() } } diff --git a/src/pygui/ISC/Tabs/StatusTab.qml b/src/pygui/ISC/Tabs/StatusTab.qml index 4865cf8..e680178 100644 --- a/src/pygui/ISC/Tabs/StatusTab.qml +++ b/src/pygui/ISC/Tabs/StatusTab.qml @@ -122,7 +122,9 @@ ColumnLayout { id: saveDirDialog title: "Choose a folder to save." onAccepted: { - deviceController.setSaveDataDir(root.cleanFolderUrl(selectedFolder)); + var dir = root.cleanFolderUrl(selectedFolder); + deviceController.setSaveDataDir(dir); + file_browser.setCurrentDirectory(dir); root.parseAndSavePendingRead(); } } @@ -132,7 +134,11 @@ ColumnLayout { FolderDialog { id: dirOnlyDialog 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). diff --git a/src/pygui/__main__.py b/src/pygui/__main__.py index 3154251..c24c9ee 100644 --- a/src/pygui/__main__.py +++ b/src/pygui/__main__.py @@ -74,6 +74,9 @@ def main() -> int: device_controller = DeviceController(raw_settings, data_dir) 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 = LicenseModel(data_dir) engine.rootContext().setContextProperty("licenseModel", license_model) diff --git a/src/pygui/backend/data/file_browser.py b/src/pygui/backend/data/file_browser.py index c38dbb7..f438e7e 100644 --- a/src/pygui/backend/data/file_browser.py +++ b/src/pygui/backend/data/file_browser.py @@ -37,6 +37,16 @@ class FileBrowser(QObject): return str(self._current_directory) # ===== 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() def chooseDirectory(self) -> None: selected_dir = QFileDialog.getExistingDirectory( diff --git a/tests/test_file_browser.py b/tests/test_file_browser.py index 463d163..f8c3875 100644 --- a/tests/test_file_browser.py +++ b/tests/test_file_browser.py @@ -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} assert files_by_name["live_P00001_20260706_143022.csv"]["isRecording"] is True 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"