Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion src/gui/browser/file_browser.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 #
Expand Down
12 changes: 11 additions & 1 deletion src/modules/sync/sync_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
32 changes: 32 additions & 0 deletions tests/test_context_menu_actions.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 == []
Loading