Skip to content

Commit 3ca06c9

Browse files
triatomicclaude
andcommitted
Summarize files added and overwritten after adds
Show an info dialog after add-to-archive operations (single add, folder add, archive merge, and drag-drop) reporting how many files were new versus overwritten. The overwritten file names are listed under the dialog Show Details button so a silent Overwrite default no longer hides what was replaced. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent d15b1c4 commit 3ca06c9

1 file changed

Lines changed: 76 additions & 8 deletions

File tree

src/main.py

Lines changed: 76 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -703,12 +703,16 @@ def merge_archives(self):
703703

704704
files.reverse()
705705
files_added = []
706+
overwritten_names = []
706707
for file in files:
707-
files_added.extend(self._merge_archives(file))
708+
added, overwritten = self._merge_archives(file)
709+
files_added.extend(added)
710+
overwritten_names.extend(overwritten)
708711

709712
self.settings.last_dir = os.path.dirname(files[0])
710713
self.listwidget.add_files(files_added)
711714
self.update_archive_name()
715+
self._show_add_summary(len(files_added) - len(overwritten_names), overwritten_names)
712716

713717
def _merge_archives(self, path):
714718
if self.settings.large_archive:
@@ -719,6 +723,7 @@ def _merge_archives(self, path):
719723

720724
skip_all = False
721725
files_added = []
726+
overwritten_names = []
722727
files = archive.file_list()
723728
length = len(files)
724729
text_box = QMessageBox(
@@ -739,6 +744,7 @@ def _merge_archives(self, path):
739744
f"File: ({index + 1}/{length})<br>Processing: <b>{file}</b>"
740745
)
741746
QApplication.processEvents()
747+
overwrote = False
742748
if self.archive.file_exists(file):
743749
default = (
744750
OverwriteDefault.OVERWRITE
@@ -763,10 +769,13 @@ def _merge_archives(self, path):
763769
skip_all = True
764770

765771
self.archive.remove_file(file)
772+
overwrote = True
766773

767774
self.archive.add_file(file, archive.read_file(file))
768775

769776
files_added.append(file)
777+
if overwrote:
778+
overwritten_names.append(file)
770779

771780
size = self.archive.archive_memory_size()
772781
if size > 524288000:
@@ -789,7 +798,7 @@ def _merge_archives(self, path):
789798
)
790799
text_box.accept()
791800

792-
return files_added
801+
return files_added, overwritten_names
793802

794803
def new(self):
795804
self._new()
@@ -843,7 +852,7 @@ def add_folder(self):
843852
def new_file(self):
844853
self._add_file(None, blank=True)
845854

846-
def _add_file(self, url, *, blank=False, ask_name=True):
855+
def _add_file(self, url, *, blank=False, ask_name=True, show_summary=True):
847856
name = normalize_name(url)
848857
if self.settings.smart_replace_enabled:
849858
files = self.archive.file_list()
@@ -876,9 +885,14 @@ def _add_file(self, url, *, blank=False, ask_name=True):
876885
self.listwidget.add_files([name])
877886
self.refresh_tabs([name])
878887

888+
if show_summary:
889+
new, overwritten = self._classify_add(ret)
890+
self._show_add_summary(new, [name] if overwritten else [])
879891
return ret
880892

881-
def _add_file_with_name(self, url, suggested_name, *, blank=False, ask_name=True):
893+
def _add_file_with_name(
894+
self, url, suggested_name, *, blank=False, ask_name=True, show_summary=True
895+
):
882896
"""Add a file to archive with a pre-suggested name
883897
(e.g., from drag-drop between archives).
884898
"""
@@ -899,12 +913,17 @@ def _add_file_with_name(self, url, suggested_name, *, blank=False, ask_name=True
899913
self.listwidget.add_files([name])
900914
self.refresh_tabs([name])
901915

916+
if show_summary:
917+
new, overwritten = self._classify_add(ret)
918+
self._show_add_summary(new, [name] if overwritten else [])
902919
return ret
903920

904-
def _add_folder(self, url):
921+
def _add_folder(self, url, *, show_summary=True):
905922
skip_all = False
906923
common_dir = os.path.dirname(url)
907924
files_to_add = []
925+
new_count = 0
926+
overwritten_names = []
908927
for root, _, files in os.walk(url):
909928
for f in files:
910929
full_path = os.path.join(root, f)
@@ -916,11 +935,19 @@ def _add_folder(self, url):
916935
if ret != QMessageBox.StandardButton.No:
917936
files_to_add.append(name)
918937

938+
new, overwritten = self._classify_add(ret)
939+
new_count += new
940+
if overwritten:
941+
overwritten_names.append(name)
942+
919943
if ret == QMessageBox.StandardButton.YesToAll:
920944
skip_all = True
921945

922946
self.listwidget.add_files(files_to_add)
923947
self.update_archive_name()
948+
if show_summary:
949+
self._show_add_summary(new_count, overwritten_names)
950+
return new_count, overwritten_names
924951

925952
def add_file_to_archive(self, url, name, blank=False, skip_all=False, undoable=True):
926953
replaced_data = None
@@ -964,6 +991,35 @@ def add_file_to_archive(self, url, name, blank=False, skip_all=False, undoable=T
964991

965992
return ret
966993

994+
@staticmethod
995+
def _classify_add(ret) -> tuple[int, int]:
996+
"""Map an add_file_to_archive return value to (new, overwritten) counts.
997+
998+
``None`` means a new file was added; ``Yes``/``YesToAll`` means an
999+
existing file was overwritten; ``No`` (skipped) and ``False`` (rename
1000+
cancelled) mean nothing was added.
1001+
"""
1002+
if ret is False or ret == QMessageBox.StandardButton.No:
1003+
return 0, 0
1004+
if ret is None:
1005+
return 1, 0
1006+
return 0, 1
1007+
1008+
def _show_add_summary(self, new_count: int, overwritten_names: list[str]) -> None:
1009+
overwritten_count = len(overwritten_names)
1010+
total = new_count + overwritten_count
1011+
if total == 0:
1012+
return
1013+
box = QMessageBox(
1014+
QMessageBox.Icon.Information,
1015+
"Files added",
1016+
f"Added {total} file(s) — {new_count} new, {overwritten_count} overwritten.",
1017+
parent=self,
1018+
)
1019+
if overwritten_names:
1020+
box.setDetailedText("Overwritten files:\n" + "\n".join(overwritten_names))
1021+
box.exec()
1022+
9671023
def is_file_selected(self):
9681024
if not self.listwidget.active_list.is_file_selected():
9691025
QMessageBox.warning(self, "No file selected", "You have not selected a file")
@@ -1337,6 +1393,8 @@ def dropEvent(self, event: QDropEvent):
13371393
original_paths[os.path.normpath(temp)] = original
13381394

13391395
yes_to_all = False
1396+
new_count = 0
1397+
overwritten_names = []
13401398
for url in md.urls():
13411399
local_file = url.toLocalFile()
13421400

@@ -1350,16 +1408,26 @@ def dropEvent(self, event: QDropEvent):
13501408
if os.path.isfile(local_file):
13511409
suggested_name = original_paths.get(os.path.normpath(local_file))
13521410
ret = (
1353-
self._add_file_with_name(local_file, suggested_name, ask_name=False)
1411+
self._add_file_with_name(
1412+
local_file, suggested_name, ask_name=False, show_summary=False
1413+
)
13541414
if suggested_name
1355-
else self._add_file(local_file, ask_name=not yes_to_all)
1415+
else self._add_file(local_file, ask_name=not yes_to_all, show_summary=False)
13561416
)
1417+
new, overwritten = self._classify_add(ret)
1418+
new_count += new
1419+
if overwritten:
1420+
overwritten_names.append(suggested_name or normalize_name(local_file))
13571421
else:
1358-
ret = self._add_folder(local_file)
1422+
new, names = self._add_folder(local_file, show_summary=False)
1423+
new_count += new
1424+
overwritten_names.extend(names)
1425+
ret = None
13591426

13601427
if ret == QMessageBox.StandardButton.YesToAll:
13611428
yes_to_all = True
13621429

1430+
self._show_add_summary(new_count, overwritten_names)
13631431
event.acceptProposedAction()
13641432

13651433

0 commit comments

Comments
 (0)