22
33import sys
44from pathlib import Path
5+ from typing import Any
56
67from PyQt6 .QtCore import Qt
78from PyQt6 .QtGui import QColor , QDragEnterEvent , QDropEvent , QPalette
@@ -37,8 +38,10 @@ def __init__(self) -> None:
3738 self .setMinimumSize (1000 , 640 )
3839
3940 # Data
40- self .current_collection = None
41- self .current_report : list [dict ] = []
41+ from bookmark_checker .core .models import BookmarkCollection
42+
43+ self .current_collection : BookmarkCollection | None = None
44+ self .current_report : list [dict [str , Any ]] = []
4245
4346 # Setup UI
4447 self ._setup_ui ()
@@ -102,17 +105,13 @@ def _setup_ui(self) -> None:
102105 self .table .setHorizontalHeaderLabels (
103106 ["Title" , "URL (canonical)" , "Folder" , "Source" , "Count" ]
104107 )
105- self .table .horizontalHeader ().setSectionResizeMode (0 , QHeaderView .ResizeMode .Stretch )
106- self .table .horizontalHeader ().setSectionResizeMode (1 , QHeaderView .ResizeMode .Stretch )
107- self .table .horizontalHeader ().setSectionResizeMode (
108- 2 , QHeaderView .ResizeMode .ResizeToContents
109- )
110- self .table .horizontalHeader ().setSectionResizeMode (
111- 3 , QHeaderView .ResizeMode .ResizeToContents
112- )
113- self .table .horizontalHeader ().setSectionResizeMode (
114- 4 , QHeaderView .ResizeMode .ResizeToContents
115- )
108+ header = self .table .horizontalHeader ()
109+ if header :
110+ header .setSectionResizeMode (0 , QHeaderView .ResizeMode .Stretch )
111+ header .setSectionResizeMode (1 , QHeaderView .ResizeMode .Stretch )
112+ header .setSectionResizeMode (2 , QHeaderView .ResizeMode .ResizeToContents )
113+ header .setSectionResizeMode (3 , QHeaderView .ResizeMode .ResizeToContents )
114+ header .setSectionResizeMode (4 , QHeaderView .ResizeMode .ResizeToContents )
116115 self .table .setSelectionBehavior (QTableWidget .SelectionBehavior .SelectRows )
117116 self .table .setEditTriggers (QTableWidget .EditTrigger .NoEditTriggers )
118117 layout .addWidget (self .table )
@@ -186,15 +185,22 @@ def _setup_style(self) -> None:
186185 """
187186 )
188187
189- def dragEnterEvent (self , event : QDragEnterEvent ) -> None :
188+ def dragEnterEvent (self , event : QDragEnterEvent | None ) -> None :
190189 """Handle drag enter event."""
191- if event .mimeData ().hasUrls ():
190+ if event is None :
191+ return
192+ mime_data = event .mimeData ()
193+ if mime_data and mime_data .hasUrls ():
192194 event .acceptProposedAction ()
193195
194- def dropEvent (self , event : QDropEvent ) -> None :
196+ def dropEvent (self , event : QDropEvent | None ) -> None :
195197 """Handle drop event."""
196- files = [url .toLocalFile () for url in event .mimeData ().urls ()]
197- self ._process_files (files )
198+ if event is None :
199+ return
200+ mime_data = event .mimeData ()
201+ if mime_data :
202+ files = [url .toLocalFile () for url in mime_data .urls ()]
203+ self ._process_files (files )
198204
199205 def _import_files (self ) -> None :
200206 """Open file dialog to import bookmark files."""
@@ -214,8 +220,9 @@ def _process_files(self, files: list[str]) -> None:
214220 self .progress_bar .setRange (0 , 0 ) # Indeterminate
215221
216222 try :
217- self .current_collection = parse_many (files )
218- if len (self .current_collection .bookmarks ) == 0 :
223+ collection = parse_many (files )
224+ self .current_collection = collection
225+ if len (collection .bookmarks ) == 0 :
219226 QMessageBox .warning (
220227 self ,
221228 "No Bookmarks Found" ,
@@ -225,7 +232,7 @@ def _process_files(self, files: list[str]) -> None:
225232 self .btn_merge .setEnabled (False )
226233 else :
227234 self .status_label .setText (
228- f"Loaded { len (self . current_collection .bookmarks )} "
235+ f"Loaded { len (collection .bookmarks )} "
229236 f"bookmarks from { len (files )} file(s)"
230237 )
231238 self .btn_merge .setEnabled (True )
@@ -286,7 +293,7 @@ def _populate_table_from_collection(self) -> None:
286293 self .table .setItem (row , 3 , QTableWidgetItem (bookmark .source_file ))
287294 self .table .setItem (row , 4 , QTableWidgetItem ("1" )) # Count is 1 for raw bookmarks
288295
289- def _populate_table (self , report : list [dict ]) -> None :
296+ def _populate_table (self , report : list [dict [ str , Any ] ]) -> None :
290297 """Populate table with dedupe report."""
291298 self .table .setRowCount (len (report ))
292299
@@ -301,7 +308,8 @@ def _populate_table(self, report: list[dict]) -> None:
301308
302309 def _export_merged (self ) -> None :
303310 """Export merged bookmarks."""
304- if not self .current_collection or not self .current_report :
311+ collection = self .current_collection
312+ if not collection or not self .current_report :
305313 return
306314
307315 output_path , _ = QFileDialog .getSaveFileName (
@@ -322,7 +330,7 @@ def _export_merged(self) -> None:
322330 # Re-merge to get merged collection
323331 similarity = self .similarity_slider .value ()
324332 merged , _ = merge_collections (
325- self . current_collection , similarity_threshold = similarity , enable_fuzzy = True
333+ collection , similarity_threshold = similarity , enable_fuzzy = True
326334 )
327335
328336 # Export HTML
0 commit comments