diff --git a/bcc.py b/bcc.py index 6d91287..dbd6110 100644 --- a/bcc.py +++ b/bcc.py @@ -57,6 +57,10 @@ from PySide6.QtWidgets import ( import bcc_core as core +# A full ~/.claude.json with history can be huge; parsing happens on the UI +# thread during drag-and-drop import, so skip anything larger than this. +MAX_DROP_IMPORT_BYTES = 5 * 1024 * 1024 # 5 MB + # --- One-line rebrand: change this to recolor the whole app --------------- # ACCENT = "#f97316" # warm orange ACCENT_DIM = "#c2570b" @@ -2402,29 +2406,44 @@ class MainWindow(QMainWindow): e.acceptProposedAction() def dropEvent(self, e): + total_added, total_replaced, files_imported = 0, 0, 0 + undo_pushed = False for u in e.mimeData().urls(): path = u.toLocalFile() if not path.endswith(".json"): continue - text = Path(path).read_text(encoding="utf-8") + p = Path(path) + if p.stat().st_size > MAX_DROP_IMPORT_BYTES: + QMessageBox.warning( + self, + "File too large", + f"{p.name}:\nFile exceeds the 5 MB import limit and was skipped.", + ) + continue + text = p.read_text(encoding="utf-8") try: servers = core.parse_pasted_json(text) except Exception as ex: - QMessageBox.warning(self, "Couldn't import", f"{Path(path).name}:\n{ex}") + QMessageBox.warning(self, "Couldn't import", f"{p.name}:\n{ex}") continue - self._push_undo() + if not undo_pushed: + self._push_undo() + undo_pushed = True added, replaced = 0, 0 for name, data in servers.items(): a, r = self._import_server(name, data) added += int(a) replaced += int(r) + total_added += added + total_replaced += replaced + files_imported += 1 + if files_imported: self._refresh_tables(select_index=len(self.servers) - 1) self._mark_dirty() self.status.setText( - f"Imported {added} added, {replaced} replaced from {Path(path).name}. " - "Review and Save." + f"Imported {total_added} added, {total_replaced} replaced from " + f"{files_imported} file(s). Review and Save." ) - break def closeEvent(self, e): if self.dirty and not self._confirm_discard():