diff --git a/src/gui/browser/file_browser.py b/src/gui/browser/file_browser.py index 6a79c87..836251c 100644 --- a/src/gui/browser/file_browser.py +++ b/src/gui/browser/file_browser.py @@ -879,10 +879,13 @@ def _add_to_blacklist(self, path: str): ) def _sync_path(self, path: str): - """Öffnet das Sync-Panel für den Pfad.""" + """Öffnet das Sync-Panel und legt ein Sync-Paar mit dem Pfad als Quelle an.""" main_win = self.window() if hasattr(main_win, 'show_sync_panel'): main_win.show_sync_panel() + sidebar = getattr(main_win, 'sidebar', None) + if sidebar is not None and hasattr(sidebar, 'sync_panel'): + sidebar.sync_panel.add_pair_for_path(path) # ------------------------------------------------------------------ # # Drag-and-Drop # diff --git a/src/modules/sync/sync_manager.py b/src/modules/sync/sync_manager.py index 03b53d6..28a5dca 100644 --- a/src/modules/sync/sync_manager.py +++ b/src/modules/sync/sync_manager.py @@ -708,7 +708,17 @@ def _on_selection_changed(self): self.preview_btn.setEnabled(has_selection) def _add_pair(self): - dialog = SyncPairDialog(parent=self) + self._add_pair_dialog(SyncPairDialog(parent=self)) + + def add_pair_for_path(self, path: str): + """Öffnet "Neues Sync-Paar" mit dem Ordner von `path` als Quelle.""" + folder = path if os.path.isdir(path) else os.path.dirname(path) + pair = SyncPair(id="", name=os.path.basename(os.path.normpath(folder)), source=folder, target="") + dialog = SyncPairDialog(pair, parent=self) + dialog.setWindowTitle("Neues Sync-Paar") + self._add_pair_dialog(dialog) + + def _add_pair_dialog(self, dialog: "SyncPairDialog"): if dialog.exec() == QDialog.DialogCode.Accepted: pair = dialog.get_sync_pair() self.sync_pairs.append(pair) diff --git a/tests/test_context_menu_actions.py b/tests/test_context_menu_actions.py index 66f36b4..40962b0 100644 --- a/tests/test_context_menu_actions.py +++ b/tests/test_context_menu_actions.py @@ -166,3 +166,35 @@ def test_spec_bundles_translator_and_locales(): spec = (ROOT / "ExplorerPro.spec").read_text(encoding="utf-8") assert "pathex=[str(src_dir), str(project_root)]" in spec assert "(str(project_root / 'locales'), 'locales')" in spec + + +def test_context_menu_sync_prefills_source_folder(tmp_path, monkeypatch): + _ensure_app() + from gui.main_window import MainWindow + from modules.sync import sync_manager + + target = tmp_path / "daten.txt" + target.write_text("x", encoding="utf-8") + seen = {} + + def fake_exec(dialog): + seen["source"] = dialog.source_edit.text() + seen["name"] = dialog.name_edit.text() + seen["title"] = dialog.windowTitle() + return 0 # abgebrochen: nichts speichern + + monkeypatch.setattr(sync_manager.SyncPairDialog, "exec", fake_exec) + win = MainWindow() + _context_actions(win.file_browser, target, monkeypatch)["🔄 Synchronisieren"].trigger() + assert os.path.normpath(seen["source"]) == os.path.normpath(str(tmp_path)) + assert seen["name"] == tmp_path.name + assert seen["title"] == "Neues Sync-Paar" + win.deleteLater() + + +def test_translations_complete_for_all_tier2_languages(): + import json + + data = json.loads((ROOT / "locales" / "translations.json").read_text(encoding="utf-8")) + missing = [k for k, v in data.items() for lang in ("en", "es", "zh", "ja", "ru") if not v.get(lang)] + assert missing == []