diff --git a/tagstudio/src/qt/ts_qt.py b/tagstudio/src/qt/ts_qt.py
index 8338fa62..58d2e083 100644
--- a/tagstudio/src/qt/ts_qt.py
+++ b/tagstudio/src/qt/ts_qt.py
@@ -12,6 +12,7 @@ import copy
import logging
import math
import os
+import platform
import sys
import time
import typing
@@ -53,6 +54,7 @@ from PySide6.QtWidgets import (
QMenu,
QMenuBar,
QComboBox,
+ QMessageBox,
)
from humanfriendly import format_timespan
@@ -69,7 +71,6 @@ from src.core.constants import (
TAG_FAVORITE,
TAG_ARCHIVED,
)
-from src.core.media_types import MediaCategories, MediaType
from src.core.utils.web import strip_web_protocol
from src.qt.flowlayout import FlowLayout
from src.qt.main_window import Ui_MainWindow
@@ -841,41 +842,38 @@ class QtDriver(QObject):
origin_path(str): The file path associated with the widget making the call.
May or may not be the file targeted, depending on the selection rules.
"""
- _op: Path = Path(origin_path)
- item = None
+ entry = None
+ pending: list[Path] = []
deleted_count: int = 0
filepath: Path = None # Initialize
if len(self.selected) <= 1:
- if self.selected:
- item = self.lib.get_entry(self.selected[0][1])
- filepath = self.lib.library_dir / item.path / item.filename
- # If the file to be deleted is currently being displayed on the Preview Panel,
- # tell the panel to stop any use of the file.
- if origin_path == filepath:
- self.preview_panel.stop_file_use()
- self.main_window.statusbar.showMessage(f'Deleting file "{origin_path}"...')
- self.main_window.statusbar.repaint()
- if delete_file(_op):
- op_item = self.lib.get_entry_id_from_filepath(_op)
- self.lib.remove_entry(op_item)
- self.purge_item_from_navigation(ItemType.ENTRY, op_item)
- deleted_count += 1
+ pending.append(Path(origin_path))
elif len(self.selected) > 1:
for i, item_pair in enumerate(self.selected):
if item_pair[0] == ItemType.ENTRY:
- item = self.lib.get_entry(item_pair[1])
- filepath = self.lib.library_dir / item.path / item.filename
- self.main_window.statusbar.showMessage(
- f'Deleting file "{filepath}"...'
- )
- self.main_window.statusbar.repaint()
- if delete_file(filepath):
- self.purge_item_from_navigation(item.type, item.id)
- self.lib.remove_entry(item.id)
- deleted_count += 1
- self.selected.clear()
+ entry = self.lib.get_entry(item_pair[1])
+ filepath = self.lib.library_dir / entry.path / entry.filename
+ pending.append(filepath)
- self.filter_items()
+ if pending:
+ if self.delete_file_confirmation(len(pending), pending[0]) == 3:
+ for f in pending:
+ if origin_path == f:
+ self.preview_panel.stop_file_use()
+ if delete_file(f):
+ self.main_window.statusbar.showMessage(
+ f'Deleting file "{f}"...'
+ )
+ self.main_window.statusbar.repaint()
+
+ entry_id = self.lib.get_entry_id_from_filepath(f)
+ self.lib.remove_entry(entry_id)
+ self.purge_item_from_navigation(ItemType.ENTRY, entry_id)
+ deleted_count += 1
+ self.selected.clear()
+
+ if deleted_count > 0:
+ self.filter_items()
self.preview_panel.update_widgets()
if len(self.selected) <= 1 and deleted_count == 0:
@@ -896,6 +894,31 @@ class QtDriver(QObject):
self.main_window.statusbar.showMessage(f"Deleted {deleted_count} files!")
self.main_window.statusbar.repaint()
+ def delete_file_confirmation(self, count: int, filename: Path | None = None) -> int:
+ trash_term: str = "Trash"
+ if platform.system() == "Windows":
+ trash_term = "Recycle Bin"
+
+ msg_box = QMessageBox()
+ msg_box.setIcon(QMessageBox.Icon.Warning)
+ msg_box.setTextFormat(Qt.TextFormat.RichText)
+
+ msg_box.setWindowTitle("Delete File" if count == 1 else "Delete Files")
+ if count <= 1:
+ msg_box.setText(
+ f"Are you sure you want to move this file to the {trash_term}?
"
+ "This will remove it from TagStudio AND your file system!
"
+ f"{filename if filename else ''}
"
+ )
+ elif count > 1:
+ msg_box.setText(
+ f"Are you sure you want to move these {count} files to the {trash_term}?
"
+ "This will remove them from TagStudio AND your file system!
"
+ )
+ msg_box.addButton("&No", QMessageBox.ButtonRole.NoRole)
+ msg_box.addButton("&Yes", QMessageBox.ButtonRole.YesRole)
+ return msg_box.exec()
+
def add_new_files_callback(self):
"""Runs when user initiates adding new files to the Library."""
# # if self.lib.files_not_in_library: