1+ # SPDX-FileCopyrightText: (c) TagStudio Contributors
2+ # SPDX-License-Identifier: GPL-3.0-only
3+
14import typing
5+ from datetime import datetime as dt
26
37import structlog
48from PySide6 .QtCore import Qt
5-
6- from tagstudio .core .library .alchemy .fields import BaseField , DatetimeField , TextField
9+ from PySide6 .QtWidgets import QListWidgetItem
10+
11+ from tagstudio .core .library .alchemy .fields import (
12+ BaseField ,
13+ BaseFieldTemplate ,
14+ DatetimeField ,
15+ TextField ,
16+ )
717from tagstudio .core .library .alchemy .library import Library
818from tagstudio .core .library .alchemy .models import Entry , Tag
919
@@ -22,7 +32,7 @@ def __init__(self, driver: "QtDriver") -> None:
2232 self .mixed_fields : list = []
2333 self .cached_entries : list [Entry ] = []
2434
25- def add_field_to_selected (self , field_list : list ) -> None :
35+ def add_field_to_selected (self , field_list : list [ QListWidgetItem ] ) -> None :
2636 """Add list of entry fields to one or more selected items.
2737
2838 Uses the current driver selection, NOT the field containers cache.
@@ -33,11 +43,14 @@ def add_field_to_selected(self, field_list: list) -> None:
3343 fields = field_list ,
3444 )
3545 for entry_id in self .__driver .selected :
36- for field_item in field_list :
37- self .__lib .add_field_to_entry (
38- entry_id ,
39- field_id = field_item .data (Qt .ItemDataRole .UserRole ),
46+ for field in field_list :
47+ template : BaseFieldTemplate = field .data (Qt .ItemDataRole .UserRole )
48+ logger .info (
49+ "[FieldListModel][add_field_to_selected] Adding field" ,
50+ name = template .name ,
51+ type = template .class_name ,
4052 )
53+ self .__lib .add_field_to_entries (entry_id , template .to_field ())
4154
4255 def add_tags_to_selected (self , tags : int | list [int ]) -> None :
4356 """Add list of tags to one or more selected items.
@@ -54,13 +67,25 @@ def add_tags_to_selected(self, tags: int | list[int]) -> None:
5467 tags = tags ,
5568 )
5669
57- self .__lib .add_tags_to_entries (
58- self .__driver .selected ,
59- tag_ids = tags ,
60- )
61-
70+ selected = self .__driver .selected
71+ self .__driver .main_window .thumb_layout .add_tags (selected , tags )
72+ self .__lib .add_tags_to_entries (selected , tag_ids = tags )
6273 self .__driver .emit_badge_signals (tags , emit_on_absent = False )
6374
75+ def update_text_field (self , field : TextField , value : str , is_multiline : bool ) -> None :
76+ """Update a text field across selected entries."""
77+ entry_ids : list [int ] = [e .id for e in self .cached_entries ]
78+ assert entry_ids , "No entries selected"
79+
80+ self .__lib .update_text_field (entry_ids , field , value , is_multiline )
81+
82+ def update_datetime_field (self , field : DatetimeField , value : str ) -> None :
83+ """Update a datetime field across selected entries."""
84+ entry_ids : list [int ] = [e .id for e in self .cached_entries ]
85+ assert entry_ids , "No entries selected"
86+
87+ self .__lib .update_datetime_field (entry_ids , field , dt .fromisoformat (value ))
88+
6489 def remove_field (self , field : BaseField ) -> None :
6590 """Remove a field from all selected Entries."""
6691 logger .info (
@@ -72,22 +97,6 @@ def remove_field(self, field: BaseField) -> None:
7297 entry_ids : list [int ] = [entry .id for entry in self .cached_entries ]
7398 self .__lib .remove_entry_field (field , entry_ids )
7499
75- def update_field (self , field : BaseField , content : str ) -> None :
76- """Update a field in all selected Entries, given a field object."""
77- assert isinstance (
78- field ,
79- TextField | DatetimeField ,
80- ), f"instance: { type (field )} "
81-
82- entry_ids : list [int ] = [e .id for e in self .cached_entries ]
83-
84- assert entry_ids , "No entries selected"
85- self .__lib .update_entry_field (
86- entry_ids ,
87- field ,
88- content ,
89- )
90-
91100 def get_tag_categories (self , tags : set [Tag ]) -> dict [Tag | None , set [Tag ]]:
92101 """Get a dictionary of category tags mapped to their respective tags.
93102
0 commit comments