Skip to content

Commit 48dc31c

Browse files
committed
feat(pureref): add support for creating and deleting PureRef files
1 parent bc53775 commit 48dc31c

4 files changed

Lines changed: 111 additions & 6 deletions

File tree

main.py

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2195,8 +2195,19 @@ def show_context_menu(self, pos):
21952195
stats_action.triggered.connect(lambda: self.show_folder_stats(item))
21962196

21972197
menu.addSeparator()
2198-
pureref_action = menu.addAction(tr("context_menu.open_pureref"))
2199-
pureref_action.triggered.connect(lambda: self.open_pureref(item))
2198+
2199+
folder_path = item.data(0, Qt.ItemDataRole.UserRole)
2200+
folder_root = item.data(0, Qt.ItemDataRole.UserRole + 3)
2201+
if folder_path and folder_root:
2202+
folder_full = Path(folder_root) / folder_path
2203+
has_pur = self.pureref_manager.has_pur_file(folder_full)
2204+
pureref_text = tr("context_menu.open_pureref") if has_pur else tr("context_menu.create_pureref")
2205+
pureref_action = menu.addAction(pureref_text)
2206+
pureref_action.triggered.connect(lambda: self.open_pureref(item))
2207+
2208+
delete_pureref_action = menu.addAction(tr("context_menu.delete_pureref"))
2209+
delete_pureref_action.setEnabled(has_pur)
2210+
delete_pureref_action.triggered.connect(lambda: self.delete_pureref(item))
22002211

22012212
menu.addSeparator()
22022213

@@ -2723,6 +2734,42 @@ def open_pureref(self, item):
27232734
msg = tr("pureref.launch_error", error=err_detail)
27242735
QMessageBox.warning(self, tr("error.title"), msg)
27252736

2737+
def delete_pureref(self, item):
2738+
"""Delete PureRef file for the folder."""
2739+
path = item.data(0, Qt.ItemDataRole.UserRole)
2740+
root_path = item.data(0, Qt.ItemDataRole.UserRole + 3)
2741+
2742+
if not path or not root_path:
2743+
return
2744+
2745+
folder = Path(root_path) / path
2746+
2747+
if not self.pureref_manager.has_pur_file(folder):
2748+
return
2749+
2750+
file_size = self.pureref_manager.get_file_size(folder)
2751+
2752+
if file_size > 0:
2753+
reply = QMessageBox.question(
2754+
self,
2755+
tr("dialog.confirm"),
2756+
tr("pureref.confirm_delete_nonempty"),
2757+
QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No,
2758+
QMessageBox.StandardButton.No
2759+
)
2760+
if reply != QMessageBox.StandardButton.Yes:
2761+
return
2762+
2763+
success, error = self.pureref_manager.delete(folder)
2764+
if success:
2765+
self.info_label.setText(tr("pureref.delete_success"))
2766+
QTimer.singleShot(3000, lambda: self.info_label.clear())
2767+
else:
2768+
msg = tr("pureref.delete_error", error=error.split(":", 1)[1] if ":" in error else error)
2769+
QMessageBox.warning(self, tr("error.title"), msg)
2770+
2771+
self.load_courses()
2772+
27262773
def open_video_directory(self, item):
27272774
file_path = item.data(0, Qt.ItemDataRole.UserRole)
27282775
if file_path and Path(file_path).exists():

pureref_manager.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,54 @@ def has_pur_file(self, folder: Path) -> bool:
2727
filename = self.config.get_pureref_filename()
2828
return (folder / filename).exists()
2929

30+
def get_file_size(self, folder: Path) -> int:
31+
"""Get the size of the .pur file in bytes.
32+
33+
Returns:
34+
File size in bytes, or 0 if file doesn't exist.
35+
"""
36+
filename = self.config.get_pureref_filename()
37+
pur_file = folder / filename
38+
if pur_file.exists():
39+
try:
40+
return pur_file.stat().st_size
41+
except Exception as e:
42+
logging.error(f"Error getting PureRef file size: {e}")
43+
return 0
44+
return 0
45+
46+
def delete(self, folder: Path) -> tuple[bool, str]:
47+
"""Delete the .pur file for the given folder.
48+
49+
Returns:
50+
(success, error_message) — success=True if ok,
51+
otherwise error_message contains the reason.
52+
"""
53+
filename = self.config.get_pureref_filename()
54+
pur_file = folder / filename
55+
56+
if not pur_file.exists():
57+
return False, "file_not_found"
58+
59+
# Clean up running process if any
60+
key = folder.resolve()
61+
proc = self._processes.pop(key, None)
62+
if proc is not None and proc.poll() is None:
63+
try:
64+
proc.terminate()
65+
proc.wait(timeout=3)
66+
except Exception as e:
67+
logging.warning(f"Error terminating PureRef process: {e}")
68+
69+
# Delete the file
70+
try:
71+
pur_file.unlink()
72+
logging.info(f"Deleted PureRef file: {pur_file}")
73+
return True, ""
74+
except Exception as e:
75+
logging.error(f"Error deleting PureRef file: {e}")
76+
return False, f"delete_error:{e}"
77+
3078
def is_running(self, folder: Path) -> bool:
3179
"""Check if PureRef is currently running for this folder."""
3280
key = folder.resolve()

resources/translations/en.json

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -403,11 +403,16 @@
403403
"edit_tags": "Edit Tags...",
404404
"tags": "Tags",
405405
"folder_stats": "Course Statistics",
406-
"open_pureref": "Open PureRef"
406+
"open_pureref": "Open PureRef",
407+
"create_pureref": "Create PureRef",
408+
"delete_pureref": "Delete PureRef"
407409
},
408410
"pureref": {
409411
"exe_not_found": "PureRef not found at: {path}",
410-
"launch_error": "Failed to launch PureRef: {error}"
412+
"launch_error": "Failed to launch PureRef: {error}",
413+
"confirm_delete_nonempty": "The PureRef file is not empty. Are you sure you want to delete it?",
414+
"delete_success": "PureRef file deleted successfully",
415+
"delete_error": "Failed to delete PureRef file: {error}"
411416
},
412417
"tags": {
413418
"title": "Manage Tags",

resources/translations/ru.json

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -403,11 +403,16 @@
403403
"edit_tags": "Редактировать теги...",
404404
"tags": "Теги",
405405
"folder_stats": "Статистика курса",
406-
"open_pureref": "Открыть PureRef"
406+
"open_pureref": "Открыть PureRef",
407+
"create_pureref": "Создать PureRef",
408+
"delete_pureref": "Удалить PureRef"
407409
},
408410
"pureref": {
409411
"exe_not_found": "PureRef не найден: {path}",
410-
"launch_error": "Не удалось запустить PureRef: {error}"
412+
"launch_error": "Не удалось запустить PureRef: {error}",
413+
"confirm_delete_nonempty": "Файл PureRef не пустой. Вы уверены, что хотите его удалить?",
414+
"delete_success": "Файл PureRef успешно удалён",
415+
"delete_error": "Не удалось удалить файл PureRef: {error}"
411416
},
412417
"tags": {
413418
"title": "Управление тегами",

0 commit comments

Comments
 (0)