33# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
44
55
6- import time
76from enum import Enum
87from functools import wraps
98from pathlib import Path
2120from tagstudio .core .media_types import MediaCategories , MediaType
2221from tagstudio .core .utils .types import unwrap
2322from tagstudio .qt .platform_strings import open_file_str , trash_term
24- from tagstudio .qt .previews .renderer import ThumbRenderer
2523from tagstudio .qt .translations import Translations
2624from tagstudio .qt .utils .file_opener import FileOpenerHelper
2725from tagstudio .qt .views .layouts .flow_layout import FlowWidget
2826from tagstudio .qt .views .thumb_button import ThumbButton
2927
3028if TYPE_CHECKING :
29+ from tagstudio .core .library .alchemy .models import Entry
3130 from tagstudio .qt .ts_qt import QtDriver
3231
3332logger = structlog .get_logger (__name__ )
@@ -66,8 +65,6 @@ def wrapper(self, *args, **kwargs):
6665class ItemThumb (FlowWidget ):
6766 """The thumbnail widget for a library item (Entry, Collation, Tag Group, etc.)."""
6867
69- update_cutoff : float = time .time ()
70-
7168 collation_icon_128 : Image .Image = Image .open (
7269 str (Path (__file__ ).parents [2 ] / "resources/qt/images/collation_icon_128.png" )
7370 )
@@ -119,6 +116,8 @@ def __init__(
119116 self .mode : ItemType | None = mode
120117 self .driver = driver
121118 self .item_id : int = - 1
119+ self .item_path : Path | None = None
120+ self .rendered_path : Path | None = None
122121 self .thumb_size : tuple [int , int ] = thumb_size
123122 self .show_filename_label : bool = show_filename_label
124123 self .label_height = 12
@@ -195,20 +194,11 @@ def __init__(
195194 self .thumb_layout .addWidget (self .bottom_container )
196195
197196 self .thumb_button = ThumbButton (self .thumb_container , thumb_size )
198- self .renderer = ThumbRenderer (driver , self .lib )
199- self .renderer .updated .connect (
200- lambda timestamp , image , size , filename : (
201- self .update_thumb (image , timestamp ),
202- self .update_size (size , timestamp ),
203- self .set_filename_text (filename , timestamp ),
204- self .set_extension (filename , timestamp ),
205- )
206- )
207197 self .thumb_button .setFlat (True )
208198 self .thumb_button .setLayout (self .thumb_layout )
209199 self .thumb_button .setContextMenuPolicy (Qt .ContextMenuPolicy .ActionsContextMenu )
210200
211- self .opener = FileOpenerHelper ("" )
201+ self .opener = FileOpenerHelper (Path () )
212202 open_file_action = QAction (Translations ["file.open_file" ], self )
213203 open_file_action .triggered .connect (self .opener .open_file )
214204 open_explorer_action = QAction (open_file_str (), self )
@@ -219,6 +209,12 @@ def __init__(
219209 self ,
220210 )
221211
212+ def _on_delete ():
213+ if self .item_id != - 1 and self .item_path is not None :
214+ self .driver .delete_files_callback (self .item_path , self .item_id )
215+
216+ self .delete_action .triggered .connect (lambda checked = False : _on_delete ())
217+
222218 self .thumb_button .addAction (open_file_action )
223219 self .thumb_button .addAction (open_explorer_action )
224220 self .thumb_button .addAction (self .delete_action )
@@ -338,7 +334,7 @@ def set_mode(self, mode: ItemType | None) -> None:
338334 self .setAttribute (Qt .WidgetAttribute .WA_TransparentForMouseEvents , on = True )
339335 self .thumb_button .unsetCursor ()
340336 self .thumb_button .setHidden (True )
341- elif mode == ItemType .ENTRY and self . mode != ItemType . ENTRY :
337+ elif mode == ItemType .ENTRY :
342338 self .setAttribute (Qt .WidgetAttribute .WA_TransparentForMouseEvents , on = False )
343339 self .thumb_button .setCursor (Qt .CursorShape .PointingHandCursor )
344340 self .thumb_button .setHidden (False )
@@ -348,7 +344,7 @@ def set_mode(self, mode: ItemType | None) -> None:
348344 self .count_badge .setStyleSheet (ItemThumb .small_text_style )
349345 self .count_badge .setHidden (True )
350346 self .ext_badge .setHidden (True )
351- elif mode == ItemType .COLLATION and self . mode != ItemType . COLLATION :
347+ elif mode == ItemType .COLLATION :
352348 self .setAttribute (Qt .WidgetAttribute .WA_TransparentForMouseEvents , on = False )
353349 self .thumb_button .setCursor (Qt .CursorShape .PointingHandCursor )
354350 self .thumb_button .setHidden (False )
@@ -357,7 +353,7 @@ def set_mode(self, mode: ItemType | None) -> None:
357353 self .count_badge .setStyleSheet (ItemThumb .med_text_style )
358354 self .count_badge .setHidden (False )
359355 self .item_type_badge .setHidden (False )
360- elif mode == ItemType .TAG_GROUP and self . mode != ItemType . TAG_GROUP :
356+ elif mode == ItemType .TAG_GROUP :
361357 self .setAttribute (Qt .WidgetAttribute .WA_TransparentForMouseEvents , on = False )
362358 self .thumb_button .setCursor (Qt .CursorShape .PointingHandCursor )
363359 self .thumb_button .setHidden (False )
@@ -366,15 +362,12 @@ def set_mode(self, mode: ItemType | None) -> None:
366362 self .item_type_badge .setHidden (False )
367363 self .mode = mode
368364
369- def set_extension (self , filename : Path , timestamp : float | None = None ) -> None :
370- if timestamp and timestamp < ItemThumb .update_cutoff :
371- return
372-
365+ def set_extension (self , filename : Path ) -> None :
373366 ext = filename .suffix .lower ()
374367 if ext and ext .startswith ("." ) is False :
375368 ext = "." + ext
376369 media_types : set [MediaType ] = MediaCategories .get_types (ext )
377- if (
370+ if ext and (
378371 not MediaCategories .is_ext_in_category (ext , MediaCategories .IMAGE_TYPES )
379372 or MediaCategories .is_ext_in_category (ext , MediaCategories .IMAGE_RAW_TYPES )
380373 or MediaCategories .is_ext_in_category (ext , MediaCategories .IMAGE_VECTOR_TYPES )
@@ -408,11 +401,7 @@ def set_count(self, count: str) -> None:
408401 self .ext_badge .setHidden (True )
409402 self .count_badge .setHidden (True )
410403
411- def set_filename_text (self , filename : Path , timestamp : float | None = None ):
412- if timestamp and timestamp < ItemThumb .update_cutoff :
413- return
414-
415- self .set_item_path (filename )
404+ def set_filename_text (self , filename : Path ):
416405 self .file_label .setText (str (filename .name ))
417406
418407 def set_filename_visibility (self , set_visible : bool ):
@@ -430,48 +419,44 @@ def set_filename_visibility(self, set_visible: bool):
430419 self .setFixedHeight (self .thumb_size [1 ])
431420 self .show_filename_label = set_visible
432421
433- def update_thumb (self , image : QPixmap | None = None , timestamp : float | None = None ):
422+ def update_thumb (self , image : QPixmap | None = None , file_path : Path | None = None ):
434423 """Update attributes of a thumbnail element."""
435- if timestamp and timestamp < ItemThumb .update_cutoff :
436- return
437-
438424 self .thumb_button .setIcon (image if image else QPixmap ())
425+ self .rendered_path = file_path
439426
440- def update_size (self , size : QSize , timestamp : float | None = None ):
427+ def update_size (self , size : QSize ):
441428 """Updates attributes of a thumbnail element.
442429
443430 Args:
444- timestamp (float | None): The UTC timestamp for when this call was
445- originally dispatched. Used to skip outdated jobs.
446-
447431 size (QSize): The new thumbnail size to set.
448432 """
449- if timestamp and timestamp < ItemThumb .update_cutoff :
450- return
451-
452433 self .thumb_size = size .width (), size .height ()
453434 self .thumb_button .setIconSize (size )
454435 self .thumb_button .setMinimumSize (size )
455436 self .thumb_button .setMaximumSize (size )
456437
438+ def set_item (self , entry : "Entry" ):
439+ self .set_item_id (entry .id )
440+ self .set_item_path (entry .path )
441+
457442 def set_item_id (self , item_id : int ):
458443 self .item_id = item_id
459444
460- def set_item_path (self , path : Path | str ):
445+ def set_item_path (self , path : Path ):
461446 """Set the absolute filepath for the item. Used for locating on disk."""
447+ self .item_path = path
462448 self .opener .set_filepath (path )
463449
464450 def assign_badge (self , badge_type : BadgeType , value : bool ) -> None :
465451 mode = self .mode
466452 # blank mode to avoid recursive badge updates
467- self .mode = None
468453 badge = self .badges [badge_type ]
469454 self .badge_active [badge_type ] = value
470455 if badge .isChecked () != value :
456+ self .mode = None
471457 badge .setChecked (value )
472458 badge .setHidden (not value )
473-
474- self .mode = mode
459+ self .mode = mode
475460
476461 def show_check_badges (self , show : bool ):
477462 if self .mode != ItemType .TAG_GROUP :
0 commit comments