Skip to content

Commit c3f8854

Browse files
committed
Persist custom processor folder in settings
Remember the processor folder across sessions and use it when initializing the main window. The folder is now saved when browsing, during refresh (after resolving a valid directory), and on close. Processor refresh messaging was updated to show whether processors came from the selected folder or the built-in package. Settings store gained processor-folder get/set helpers that validate and normalize paths, with safe fallback to defaults when paths are missing or invalid.
1 parent 0a12128 commit c3f8854

2 files changed

Lines changed: 52 additions & 7 deletions

File tree

dlclivegui/gui/main_window.py

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -445,7 +445,7 @@ def _build_dlc_group(self) -> QGroupBox:
445445
# Processor selection
446446
processor_path_layout = QHBoxLayout()
447447
self.processor_folder_edit = QLineEdit()
448-
self.processor_folder_edit.setText(default_processors_dir())
448+
self.processor_folder_edit.setText(self._settings_store.get_processor_folder(default=default_processors_dir()))
449449
processor_path_layout.addWidget(self.processor_folder_edit)
450450

451451
self.browse_processor_folder_button = QPushButton("Browse...")
@@ -1081,10 +1081,11 @@ def _action_browse_directory(self) -> None:
10811081

10821082
def _action_browse_processor_folder(self) -> None:
10831083
"""Browse for processor folder."""
1084-
current_path = self.processor_folder_edit.text() or default_processors_dir()
1084+
current_path = self.processor_folder_edit.text().strip() or default_processors_dir()
10851085
directory = QFileDialog.getExistingDirectory(self, "Select processor folder", current_path)
10861086
if directory:
10871087
self.processor_folder_edit.setText(directory)
1088+
self._settings_store.set_processor_folder(directory)
10881089
self._refresh_processors()
10891090

10901091
def _action_open_recording_folder(self) -> None:
@@ -1138,10 +1139,17 @@ def _refresh_processors(self) -> None:
11381139
self.processor_combo.addItem("No Processor", None)
11391140

11401141
selected_folder = self.processor_folder_edit.text().strip()
1141-
if Path(selected_folder).exists():
1142-
self._scanned_processors = scan_processor_folder(selected_folder)
1142+
selected_path = Path(selected_folder).expanduser() if selected_folder else None
1143+
1144+
if selected_path is not None and selected_path.is_dir():
1145+
resolved_folder = str(selected_path.resolve())
1146+
self._settings_store.set_processor_folder(resolved_folder)
1147+
self._scanned_processors = scan_processor_folder(resolved_folder)
1148+
source_text = resolved_folder
11431149
else:
11441150
self._scanned_processors = scan_processor_package("dlclivegui.processors")
1151+
source_text = "package dlclivegui.processors"
1152+
11451153
self._processor_keys = list(self._scanned_processors.keys())
11461154

11471155
for key in self._processor_keys:
@@ -1150,9 +1158,7 @@ def _refresh_processors(self) -> None:
11501158
self.processor_combo.addItem(display_name, key)
11511159

11521160
self.processor_combo.update_shrink_width()
1153-
self.statusBar().showMessage(
1154-
f"Found {len(self._processor_keys)} processor(s) in package dlclivegui.processors", 3000
1155-
)
1161+
self.statusBar().showMessage(f"Found {len(self._processor_keys)} processor(s) in {source_text}", 3000)
11561162

11571163
# ------------------------------------------------------------------
11581164
# Recording path preview and session name persistence
@@ -2157,6 +2163,9 @@ def closeEvent(self, event: QCloseEvent) -> None: # pragma: no cover - GUI beha
21572163

21582164
# Remember model path on exit
21592165
self._model_path_store.save_if_valid(self.model_path_edit.text().strip())
2166+
# Remember processor folder on exit
2167+
if hasattr(self, "processor_folder_edit"):
2168+
self._settings_store.set_processor_folder(self.processor_folder_edit.text().strip())
21602169

21612170
# Close the window
21622171
super().closeEvent(event)

dlclivegui/utils/settings_store.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,42 @@ def get_fast_encoding(self, default: bool = False) -> bool:
5757
return value
5858
return str(value).strip().lower() in {"1", "true", "yes", "on"}
5959

60+
def get_processor_folder(self, default: str = "") -> str:
61+
"""
62+
Return the persisted processor folder if it still exists and is a directory.
63+
Otherwise return default.
64+
"""
65+
value = self._s.value("dlc/processor_folder", default)
66+
value = str(value).strip() if value is not None else ""
67+
68+
if not value:
69+
return default
70+
71+
try:
72+
path = Path(value).expanduser()
73+
if path.is_dir():
74+
return str(path.resolve())
75+
except Exception:
76+
logger.debug("Persisted processor folder is invalid: %s", value, exc_info=True)
77+
78+
return default
79+
80+
def set_processor_folder(self, folder: str) -> None:
81+
"""
82+
Persist processor folder only if it exists and is a directory.
83+
Invalid folders are ignored.
84+
"""
85+
folder = str(folder).strip() if folder is not None else ""
86+
if not folder:
87+
return
88+
89+
try:
90+
path = Path(folder).expanduser()
91+
if path.is_dir():
92+
self._s.setValue("dlc/processor_folder", str(path.resolve()))
93+
except Exception:
94+
logger.debug("Failed to persist processor folder: %s", folder, exc_info=True)
95+
6096
def set_fast_encoding(self, enabled: bool) -> None:
6197
self._s.setValue("recording/fast_encoding", bool(enabled))
6298

0 commit comments

Comments
 (0)