From fba2f8f46ba9e45591b4dc3c5ffce59033d8acaf Mon Sep 17 00:00:00 2001 From: DrRetro Date: Wed, 24 Apr 2024 11:31:53 -0400 Subject: [PATCH 1/8] Multi-Select Tag Adding --- .vscode/launch.json | 4 ++-- start_win.bat | 2 +- tagstudio/src/qt/ts_qt.py | 22 +++++++++++++--------- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index e9505d33..10f880f3 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -6,12 +6,12 @@ "configurations": [ { "name": "TagStudio", - "type": "python", + "type": "debugpy", "request": "launch", "program": "${workspaceRoot}\\TagStudio\\tagstudio.py", "console": "integratedTerminal", "justMyCode": true, - "args": [] + "args": ["--debug"] } ] } diff --git a/start_win.bat b/start_win.bat index 51a5ddf8..9258657f 100644 --- a/start_win.bat +++ b/start_win.bat @@ -1,2 +1,2 @@ @echo off -.venv\Scripts\python.exe .\TagStudio\tagstudio.py --ui qt %* \ No newline at end of file +.venv\Scripts\python.exe .\TagStudio\tagstudio.py --ui qt %* --debug \ No newline at end of file diff --git a/tagstudio/src/qt/ts_qt.py b/tagstudio/src/qt/ts_qt.py index 45ebd0d8..2d007f46 100644 --- a/tagstudio/src/qt/ts_qt.py +++ b/tagstudio/src/qt/ts_qt.py @@ -395,15 +395,19 @@ class TagBoxWidget(FieldWidget): # self.base_layout.addWidget(TagWidget(self.lib, self.lib.get_tag(tag), True)) # self.tags.append(tag) logging.info(f'[TAG BOX WIDGET] ADD TAG CALLBACK: T:{tag_id} to E:{self.item.id}') - if type(self.item) == Entry: - self.item.add_tag(self.lib, tag_id, field_id=-1, field_index=self.field_index) - logging.info(f'[TAG BOX WIDGET] UPDATED EMITTED: {tag_id}') - self.updated.emit() - # logging.info(f'I want to add tag ID {tag_id} to entry {self.item.filename}') - # self.updated.emit() - # if tag_id not in self.tags: - # self.tags.append(tag_id) - # self.set_tags(self.tags) + logging.info(f'[TAG BOX WIDGET] SELECTED T:{self.driver.selected}') + for x in self.driver.selected: + if x[0] == ItemType.ENTRY: + self.driver.lib.get_entry(x[1]).add_tag(self.driver.lib, tag_id, field_id=-1, field_index=self.field_index) + logging.info(f'[TAG BOX WIDGET] UPDATED EMITTED: {tag_id}') + self.updated.emit() + # logging.info(f'I want to add tag ID {tag_id} to entry {self.item.filename}') + # self.updated.emit() + # if tag_id not in self.tags: + # self.tags.append(tag_id) + # self.set_tags(self.tags) + # elif type((x[0]) == ThumbButton): + def edit_tag_callback(self, tag:Tag): self.lib.update_tag(tag) From 3974c1b031e4b500abb855741075c4ccfaef216e Mon Sep 17 00:00:00 2001 From: DrRetro Date: Wed, 24 Apr 2024 12:09:07 -0400 Subject: [PATCH 2/8] Multi-Select Removing Tags --- tagstudio/src/qt/ts_qt.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/tagstudio/src/qt/ts_qt.py b/tagstudio/src/qt/ts_qt.py index 2d007f46..329cdf55 100644 --- a/tagstudio/src/qt/ts_qt.py +++ b/tagstudio/src/qt/ts_qt.py @@ -360,7 +360,7 @@ class TagBoxWidget(FieldWidget): # ) tw = TagWidget(self.lib, self.lib.get_tag(tag), True, True) tw.on_click.connect(lambda checked=False, q=f'tag_id: {tag}': (self.driver.main_window.searchField.setText(q), self.driver.filter_items(q))) - tw.on_remove.connect(lambda checked=False, t=tag: (self.lib.get_entry(self.item.id).remove_tag(self.lib, t, self.field_index), self.updated.emit())) + tw.on_remove.connect(lambda checked=False, t=tag: (self.remove_tag(t))) tw.on_edit.connect(lambda checked=False, t=tag: (self.edit_tag(t))) self.base_layout.addWidget(tw) self.tags = tags @@ -375,7 +375,8 @@ class TagBoxWidget(FieldWidget): # doesn't move all the way to the left. if self.base_layout.itemAt(0) and not self.base_layout.itemAt(1): self.base_layout.update() - + + def edit_tag(self, tag_id:int): btp = BuildTagPanel(self.lib, tag_id) # btp.on_edit.connect(lambda x: self.edit_tag_callback(x)) @@ -396,6 +397,7 @@ class TagBoxWidget(FieldWidget): # self.tags.append(tag) logging.info(f'[TAG BOX WIDGET] ADD TAG CALLBACK: T:{tag_id} to E:{self.item.id}') logging.info(f'[TAG BOX WIDGET] SELECTED T:{self.driver.selected}') + #Uses selected list from driver to remove tag from all selected files. for x in self.driver.selected: if x[0] == ItemType.ENTRY: self.driver.lib.get_entry(x[1]).add_tag(self.driver.lib, tag_id, field_id=-1, field_index=self.field_index) @@ -413,9 +415,14 @@ class TagBoxWidget(FieldWidget): self.lib.update_tag(tag) - def remove_tag(self): - # NOTE: You'll need to account for the add button at the end. - pass + def remove_tag(self, tag_id): + #Uses selected list from driver to remove tag from all selected files. + logging.info(f'[TAG BOX WIDGET] SELECTED T:{self.driver.selected}') + for x in self.driver.selected: + if x[0] == ItemType.ENTRY: + self.driver.lib.get_entry(x[1]).remove_tag(self.driver.lib, tag_id, field_index=self.field_index) + self.updated.emit() + # def show_add_button(self, value:bool): # self.add_button.setHidden(not value) From def244b7325dff89784dbad6c27d271b6c401998 Mon Sep 17 00:00:00 2001 From: DrRetro Date: Wed, 24 Apr 2024 15:18:22 -0400 Subject: [PATCH 3/8] Fixed bug that occured with adding other fields to one entry. --- tagstudio/src/qt/ts_qt.py | 100 +++++++++++++++++++++++++++++++++++--- 1 file changed, 93 insertions(+), 7 deletions(-) diff --git a/tagstudio/src/qt/ts_qt.py b/tagstudio/src/qt/ts_qt.py index 329cdf55..62a36af0 100644 --- a/tagstudio/src/qt/ts_qt.py +++ b/tagstudio/src/qt/ts_qt.py @@ -397,11 +397,51 @@ class TagBoxWidget(FieldWidget): # self.tags.append(tag) logging.info(f'[TAG BOX WIDGET] ADD TAG CALLBACK: T:{tag_id} to E:{self.item.id}') logging.info(f'[TAG BOX WIDGET] SELECTED T:{self.driver.selected}') - #Uses selected list from driver to remove tag from all selected files. + # TODO: Make this more efficient. + # Iterate through the fields of the item and find the field that + # contains the tags. + correct_field_id = 0 # Initialize the field index + skip = False # Initialize the skip flag + temp_tags = self.tags.copy() # Make a copy of the tags + while correct_field_id < len(self.item.fields): + field = list(self.item.fields)[correct_field_id] + for key in dict(field).keys(): + temp = field[key] + if type(temp) == list: + # Check if the this field's tags list to see if it matches the current field's list + if self.tags == temp: + # Update the correct_field_id if a match is found + correct_field_id = key + skip = True + break + if skip: + break + correct_field_id += 1 for x in self.driver.selected: if x[0] == ItemType.ENTRY: - self.driver.lib.get_entry(x[1]).add_tag(self.driver.lib, tag_id, field_id=-1, field_index=self.field_index) - logging.info(f'[TAG BOX WIDGET] UPDATED EMITTED: {tag_id}') + logging.info(f'[TAG BOX WIDGET] FIELDS:{self.driver.lib.get_entry(x[1]).fields}') + index = 0 # Initialize the index + skip = False # Initialize the skip flag + if not skip: + # Iterate through the fields of the current entry + while index < len(self.driver.lib.get_entry(x[1]).fields): + # Get the current fields + field = list(self.driver.lib.get_entry(x[1]).fields)[index] + for key in dict(field).keys(): + temp = field[key] + if type(temp) == list: + if temp_tags == temp and key == correct_field_id: + skip = True + break + if skip: + break + else: + index += 1 # Increment the index + if not skip and index >= len(self.driver.lib.get_entry(x[1]).fields): + # Add the field to the entry + self.driver.lib.add_field_to_entry(x[1],correct_field_id) + index = 0 + self.driver.lib.get_entry(x[1]).add_tag(self.driver.lib, tag_id, field_id=correct_field_id, field_index=index) self.updated.emit() # logging.info(f'I want to add tag ID {tag_id} to entry {self.item.filename}') # self.updated.emit() @@ -413,14 +453,59 @@ class TagBoxWidget(FieldWidget): def edit_tag_callback(self, tag:Tag): self.lib.update_tag(tag) - - + def remove_tag(self, tag_id): - #Uses selected list from driver to remove tag from all selected files. logging.info(f'[TAG BOX WIDGET] SELECTED T:{self.driver.selected}') + + # Iterate through the fields of the item and find the field that + # contains the tags. + # TODO: Make this more efficient. + correct_field_id = 0 # Initialize the field index + skip = False # Initialize the skip flag + temp_tags = self.tags.copy() # Make a copy of the tags + while correct_field_id < len(self.item.fields): + # Get the current field + field = list(self.item.fields)[correct_field_id] + for key in dict(field).keys(): + temp = field[key] + if type(temp) == list: + # Check if the this field's tags list to see if it matches the current field's list + if self.tags == temp: + # Update the correct_field_id if a match is found + correct_field_id = key + skip = True + break + if skip: + break + correct_field_id += 1 + # Iterate through the selected entries for x in self.driver.selected: + # Check if the current entry is of type Entry if x[0] == ItemType.ENTRY: - self.driver.lib.get_entry(x[1]).remove_tag(self.driver.lib, tag_id, field_index=self.field_index) + index = 0 # Initialize the index + skip = False # Initialize the skip flag + # Check if the skip flag is False + if not skip: + # Iterate through the fields of the current entry + while index < len(self.driver.lib.get_entry(x[1]).fields): + # Get the current fields + field = list(self.driver.lib.get_entry(x[1]).fields)[index] + for key in dict(field).keys(): + temp = field[key] + if type(temp) == list: + if temp_tags == temp and key == correct_field_id: + skip = True + break + if skip: + break + else: + index += 1 # Increment the index + # Check if the skip flag is False and the index is out of bounds + if not skip and index >= len(self.driver.lib.get_entry(x[1]).fields): + # Add the field to the entry + self.driver.lib.add_field_to_entry(x[1],correct_field_id) + index = 0 # Reset the index + self.driver.lib.get_entry(x[1]).remove_tag(self.driver.lib, tag_id, field_index=index) self.updated.emit() # def show_add_button(self, value:bool): @@ -428,6 +513,7 @@ class TagBoxWidget(FieldWidget): class TextWidget(FieldWidget): + def __init__(self, title, text:str) -> None: super().__init__(title) # self.item = item From 9e61d45ea502d8d9deb7cf59245361a3f3232536 Mon Sep 17 00:00:00 2001 From: DrRetro Date: Wed, 24 Apr 2024 18:11:41 -0400 Subject: [PATCH 4/8] Rewrote Multi-Select to use field templates. --- tagstudio/src/qt/ts_qt.py | 114 +++++--------------------------------- 1 file changed, 13 insertions(+), 101 deletions(-) diff --git a/tagstudio/src/qt/ts_qt.py b/tagstudio/src/qt/ts_qt.py index 62a36af0..c5d2f942 100644 --- a/tagstudio/src/qt/ts_qt.py +++ b/tagstudio/src/qt/ts_qt.py @@ -292,7 +292,7 @@ class FieldWidget(QWidget): class TagBoxWidget(FieldWidget): updated = Signal() - + def __init__(self, item, title, field_index, library:Library, tags:list[int], driver:'QtDriver') -> None: super().__init__(title) # QObject.__init__(self) @@ -397,58 +397,17 @@ class TagBoxWidget(FieldWidget): # self.tags.append(tag) logging.info(f'[TAG BOX WIDGET] ADD TAG CALLBACK: T:{tag_id} to E:{self.item.id}') logging.info(f'[TAG BOX WIDGET] SELECTED T:{self.driver.selected}') - # TODO: Make this more efficient. - # Iterate through the fields of the item and find the field that - # contains the tags. - correct_field_id = 0 # Initialize the field index - skip = False # Initialize the skip flag - temp_tags = self.tags.copy() # Make a copy of the tags - while correct_field_id < len(self.item.fields): - field = list(self.item.fields)[correct_field_id] - for key in dict(field).keys(): - temp = field[key] - if type(temp) == list: - # Check if the this field's tags list to see if it matches the current field's list - if self.tags == temp: - # Update the correct_field_id if a match is found - correct_field_id = key - skip = True - break - if skip: - break - correct_field_id += 1 + logging.info(f'[TAG BOX WIDGET] SELECTED T:{self.title}') + id = list(self.lib.filter_field_templates(str(self.title).removesuffix(' (Tag Box)')))[0] for x in self.driver.selected: - if x[0] == ItemType.ENTRY: - logging.info(f'[TAG BOX WIDGET] FIELDS:{self.driver.lib.get_entry(x[1]).fields}') - index = 0 # Initialize the index - skip = False # Initialize the skip flag - if not skip: - # Iterate through the fields of the current entry - while index < len(self.driver.lib.get_entry(x[1]).fields): - # Get the current fields - field = list(self.driver.lib.get_entry(x[1]).fields)[index] - for key in dict(field).keys(): - temp = field[key] - if type(temp) == list: - if temp_tags == temp and key == correct_field_id: - skip = True - break - if skip: - break - else: - index += 1 # Increment the index - if not skip and index >= len(self.driver.lib.get_entry(x[1]).fields): - # Add the field to the entry - self.driver.lib.add_field_to_entry(x[1],correct_field_id) - index = 0 - self.driver.lib.get_entry(x[1]).add_tag(self.driver.lib, tag_id, field_id=correct_field_id, field_index=index) + self.driver.lib.get_entry(x[1]).add_tag(self.driver.lib, tag_id, field_id=id, field_index=-1) self.updated.emit() - # logging.info(f'I want to add tag ID {tag_id} to entry {self.item.filename}') - # self.updated.emit() - # if tag_id not in self.tags: - # self.tags.append(tag_id) - # self.set_tags(self.tags) - # elif type((x[0]) == ThumbButton): + # logging.info(f'I want to add tag ID {tag_id} to entry {self.item.filename}') + # self.updated.emit() + # if tag_id not in self.tags: + # self.tags.append(tag_id) + # self.set_tags(self.tags) + # elif type((x[0]) == ThumbButton): def edit_tag_callback(self, tag:Tag): @@ -456,57 +415,10 @@ class TagBoxWidget(FieldWidget): def remove_tag(self, tag_id): logging.info(f'[TAG BOX WIDGET] SELECTED T:{self.driver.selected}') - - # Iterate through the fields of the item and find the field that - # contains the tags. - # TODO: Make this more efficient. - correct_field_id = 0 # Initialize the field index - skip = False # Initialize the skip flag - temp_tags = self.tags.copy() # Make a copy of the tags - while correct_field_id < len(self.item.fields): - # Get the current field - field = list(self.item.fields)[correct_field_id] - for key in dict(field).keys(): - temp = field[key] - if type(temp) == list: - # Check if the this field's tags list to see if it matches the current field's list - if self.tags == temp: - # Update the correct_field_id if a match is found - correct_field_id = key - skip = True - break - if skip: - break - correct_field_id += 1 - # Iterate through the selected entries + id = list(self.lib.filter_field_templates(str(self.title).removesuffix(' (Tag Box)')))[0] for x in self.driver.selected: - # Check if the current entry is of type Entry - if x[0] == ItemType.ENTRY: - index = 0 # Initialize the index - skip = False # Initialize the skip flag - # Check if the skip flag is False - if not skip: - # Iterate through the fields of the current entry - while index < len(self.driver.lib.get_entry(x[1]).fields): - # Get the current fields - field = list(self.driver.lib.get_entry(x[1]).fields)[index] - for key in dict(field).keys(): - temp = field[key] - if type(temp) == list: - if temp_tags == temp and key == correct_field_id: - skip = True - break - if skip: - break - else: - index += 1 # Increment the index - # Check if the skip flag is False and the index is out of bounds - if not skip and index >= len(self.driver.lib.get_entry(x[1]).fields): - # Add the field to the entry - self.driver.lib.add_field_to_entry(x[1],correct_field_id) - index = 0 # Reset the index - self.driver.lib.get_entry(x[1]).remove_tag(self.driver.lib, tag_id, field_index=index) - self.updated.emit() + self.driver.lib.get_entry(x[1]).remove_tag(self.driver.lib, tag_id, field_id=id, field_index=-1) + self.updated.emit() # def show_add_button(self, value:bool): # self.add_button.setHidden(not value) From b2fbc4b4a2e31fa9eecdedc555bc4cbd11419fde Mon Sep 17 00:00:00 2001 From: DrRetro Date: Thu, 25 Apr 2024 09:34:14 -0400 Subject: [PATCH 5/8] Large Changes to how code gets Field ID. --- tagstudio/src/qt/ts_qt.py | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/tagstudio/src/qt/ts_qt.py b/tagstudio/src/qt/ts_qt.py index c5d2f942..6aeccd4b 100644 --- a/tagstudio/src/qt/ts_qt.py +++ b/tagstudio/src/qt/ts_qt.py @@ -284,12 +284,14 @@ class FieldContainer(QWidget): class FieldWidget(QWidget): + field = dict def __init__(self, title) -> None: super().__init__() # self.item = item self.title = title + class TagBoxWidget(FieldWidget): updated = Signal() @@ -397,11 +399,14 @@ class TagBoxWidget(FieldWidget): # self.tags.append(tag) logging.info(f'[TAG BOX WIDGET] ADD TAG CALLBACK: T:{tag_id} to E:{self.item.id}') logging.info(f'[TAG BOX WIDGET] SELECTED T:{self.driver.selected}') - logging.info(f'[TAG BOX WIDGET] SELECTED T:{self.title}') - id = list(self.lib.filter_field_templates(str(self.title).removesuffix(' (Tag Box)')))[0] + id = list(self.field.keys())[0] for x in self.driver.selected: self.driver.lib.get_entry(x[1]).add_tag(self.driver.lib, tag_id, field_id=id, field_index=-1) self.updated.emit() + self.driver.update_thumbs() + + # if type((x[0]) == ThumbButton): + # # TODO: Remove space from the special search here (tag_id:x) once that system is finalized. # logging.info(f'I want to add tag ID {tag_id} to entry {self.item.filename}') # self.updated.emit() # if tag_id not in self.tags: @@ -415,10 +420,12 @@ class TagBoxWidget(FieldWidget): def remove_tag(self, tag_id): logging.info(f'[TAG BOX WIDGET] SELECTED T:{self.driver.selected}') - id = list(self.lib.filter_field_templates(str(self.title).removesuffix(' (Tag Box)')))[0] + id = list(self.field.keys())[0] for x in self.driver.selected: - self.driver.lib.get_entry(x[1]).remove_tag(self.driver.lib, tag_id, field_id=id, field_index=-1) + index = self.driver.lib.get_field_index_in_entry(self.driver.lib.get_entry(x[1]),id) + self.driver.lib.get_entry(x[1]).remove_tag(self.driver.lib, tag_id,field_index=index[0]) self.updated.emit() + self.driver.update_thumbs() # def show_add_button(self, value:bool): # self.add_button.setHidden(not value) @@ -2320,7 +2327,6 @@ class PreviewPanel(QWidget): container = self.containers[index] # container.inner_layout.removeItem(container.inner_layout.itemAt(1)) # container.setHidden(False) - if self.lib.get_field_attr(field, 'type') == 'tag_box': # logging.info(f'WRITING TAGBOX FOR ITEM {item.id}') container.set_title(self.lib.get_field_attr(field, 'name')) @@ -2342,7 +2348,7 @@ class PreviewPanel(QWidget): inner_container = TagBoxWidget(item, title, index, self.lib, self.lib.get_field_attr(field, 'content'), self.driver) container.set_inner_widget(inner_container) - + inner_container.field = field inner_container.updated.connect(lambda: (self.write_container(index, field), self.tags_updated.emit())) # if type(item) == Entry: # NOTE: Tag Boxes have no Edit Button (But will when you can convert field types) @@ -2949,15 +2955,17 @@ class ItemThumb(FlowWidget): # logging.info(f'Favorite Check: {value}, Mode: {self.mode}') if self.mode == ItemType.ENTRY: self.isFavorite = value - e = self.lib.get_entry(self.item_id) - if value: - self.favorite_badge.setHidden(False) - DEFAULT_META_TAG_FIELD = 8 - e.add_tag(self.lib, 1, DEFAULT_META_TAG_FIELD) - else: - e.remove_tag(self.lib, 1) + DEFAULT_META_TAG_FIELD = 8 + for x in self.panel.driver.selected: + e = self.lib.get_entry(x[1]) + if value: + self.favorite_badge.setHidden(False) + e.add_tag(self.panel.driver.lib, 1, field_id=DEFAULT_META_TAG_FIELD, field_index=-1) + else: + e.remove_tag(self.panel.driver.lib, 1) if self.panel.isOpen: self.panel.update_widgets() + self.panel.driver.update_thumbs() # def on_favorite_uncheck(self): # if self.mode == SearchItemType.ENTRY: From 794401ae5898446b9b02af9c025ca7b155e0838e Mon Sep 17 00:00:00 2001 From: DrRetro Date: Thu, 25 Apr 2024 09:40:12 -0400 Subject: [PATCH 6/8] Archive Button and Favorite Button Now work --- tagstudio/src/qt/ts_qt.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/tagstudio/src/qt/ts_qt.py b/tagstudio/src/qt/ts_qt.py index 6aeccd4b..7ddb03bd 100644 --- a/tagstudio/src/qt/ts_qt.py +++ b/tagstudio/src/qt/ts_qt.py @@ -2936,15 +2936,18 @@ class ItemThumb(FlowWidget): # logging.info(f'Archived Check: {value}, Mode: {self.mode}') if self.mode == ItemType.ENTRY: self.isArchived = value - e = self.lib.get_entry(self.item_id) - if value: - self.archived_badge.setHidden(False) - DEFAULT_META_TAG_FIELD = 8 - e.add_tag(self.lib, 0, DEFAULT_META_TAG_FIELD) - else: - e.remove_tag(self.lib, 0) + DEFAULT_META_TAG_FIELD = 8 + for x in self.panel.driver.selected: + e = self.lib.get_entry(x[1]) + if value: + self.archived_badge.setHidden(False) + e.add_tag(self.panel.driver.lib, 0, field_id=DEFAULT_META_TAG_FIELD, field_index=-1) + else: + e.remove_tag(self.panel.driver.lib, 0) if self.panel.isOpen: self.panel.update_widgets() + self.panel.driver.update_thumbs() + # def on_archived_uncheck(self): # if self.mode == SearchItemType.ENTRY: From 2a46251831dc97df31a8b209138bea7270f715fb Mon Sep 17 00:00:00 2001 From: DrRetro Date: Thu, 25 Apr 2024 09:57:37 -0400 Subject: [PATCH 7/8] Fixed slow down from refreshing all thumbnails for every added and removed tag. --- tagstudio/src/qt/ts_qt.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tagstudio/src/qt/ts_qt.py b/tagstudio/src/qt/ts_qt.py index 5a8122ec..19daa657 100644 --- a/tagstudio/src/qt/ts_qt.py +++ b/tagstudio/src/qt/ts_qt.py @@ -418,7 +418,8 @@ class TagBoxWidget(FieldWidget): for x in self.driver.selected: self.driver.lib.get_entry(x[1]).add_tag(self.driver.lib, tag_id, field_id=id, field_index=-1) self.updated.emit() - self.driver.update_thumbs() + if tag_id == 0 or tag_id == 1: + self.driver.update_thumbs() # if type((x[0]) == ThumbButton): # # TODO: Remove space from the special search here (tag_id:x) once that system is finalized. @@ -440,7 +441,8 @@ class TagBoxWidget(FieldWidget): index = self.driver.lib.get_field_index_in_entry(self.driver.lib.get_entry(x[1]),id) self.driver.lib.get_entry(x[1]).remove_tag(self.driver.lib, tag_id,field_index=index[0]) self.updated.emit() - self.driver.update_thumbs() + if tag_id == 0 or tag_id == 1: + self.driver.update_thumbs() # def show_add_button(self, value:bool): # self.add_button.setHidden(not value) From 201a63e27363b16516aeb74394c7a939ba7a176c Mon Sep 17 00:00:00 2001 From: DrRetro Date: Thu, 25 Apr 2024 20:51:12 -0400 Subject: [PATCH 8/8] Refresh_badges added to QtDriver, and favorite and archived badges checks selection. --- .vscode/launch.json | 4 ++-- tagstudio/src/qt/ts_qt.py | 45 +++++++++++++++++++++++++++++++-------- 2 files changed, 38 insertions(+), 11 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index a6c172fe..8838fbb3 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -6,12 +6,12 @@ "configurations": [ { "name": "TagStudio", - "type": "debugpy", + "type": "python", "request": "launch", "program": "${workspaceRoot}/tagstudio/tag_studio.py", "console": "integratedTerminal", "justMyCode": true, - "args": ["--debug"] + "args": [] } ] } diff --git a/tagstudio/src/qt/ts_qt.py b/tagstudio/src/qt/ts_qt.py index 19daa657..653e9b67 100644 --- a/tagstudio/src/qt/ts_qt.py +++ b/tagstudio/src/qt/ts_qt.py @@ -419,7 +419,7 @@ class TagBoxWidget(FieldWidget): self.driver.lib.get_entry(x[1]).add_tag(self.driver.lib, tag_id, field_id=id, field_index=-1) self.updated.emit() if tag_id == 0 or tag_id == 1: - self.driver.update_thumbs() + self.driver.update_badges() # if type((x[0]) == ThumbButton): # # TODO: Remove space from the special search here (tag_id:x) once that system is finalized. @@ -442,7 +442,7 @@ class TagBoxWidget(FieldWidget): self.driver.lib.get_entry(x[1]).remove_tag(self.driver.lib, tag_id,field_index=index[0]) self.updated.emit() if tag_id == 0 or tag_id == 1: - self.driver.update_thumbs() + self.driver.update_badges() # def show_add_button(self, value:bool): # self.add_button.setHidden(not value) @@ -2954,16 +2954,27 @@ class ItemThumb(FlowWidget): if self.mode == ItemType.ENTRY: self.isArchived = value DEFAULT_META_TAG_FIELD = 8 - for x in self.panel.driver.selected: - e = self.lib.get_entry(x[1]) + temp = (ItemType.ENTRY,self.item_id) + if list(self.panel.driver.selected).count(temp) > 0: # Is the archived badge apart of the selection? + # Yes, then add archived tag to all selected. + for x in self.panel.driver.selected: + e = self.lib.get_entry(x[1]) + if value: + self.archived_badge.setHidden(False) + e.add_tag(self.panel.driver.lib, 0, field_id=DEFAULT_META_TAG_FIELD, field_index=-1) + else: + e.remove_tag(self.panel.driver.lib, 0) + else: + # No, then add archived tag to the entry this badge is on. + e = self.lib.get_entry(self.item_id) if value: - self.archived_badge.setHidden(False) + self.favorite_badge.setHidden(False) e.add_tag(self.panel.driver.lib, 0, field_id=DEFAULT_META_TAG_FIELD, field_index=-1) else: e.remove_tag(self.panel.driver.lib, 0) if self.panel.isOpen: self.panel.update_widgets() - self.panel.driver.update_thumbs() + self.panel.driver.update_badges() # def on_archived_uncheck(self): @@ -2976,8 +2987,19 @@ class ItemThumb(FlowWidget): if self.mode == ItemType.ENTRY: self.isFavorite = value DEFAULT_META_TAG_FIELD = 8 - for x in self.panel.driver.selected: - e = self.lib.get_entry(x[1]) + temp = (ItemType.ENTRY,self.item_id) + if list(self.panel.driver.selected).count(temp) > 0: # Is the favorite badge apart of the selection? + # Yes, then add favorite tag to all selected. + for x in self.panel.driver.selected: + e = self.lib.get_entry(x[1]) + if value: + self.favorite_badge.setHidden(False) + e.add_tag(self.panel.driver.lib, 1, field_id=DEFAULT_META_TAG_FIELD, field_index=-1) + else: + e.remove_tag(self.panel.driver.lib, 1) + else: + # No, then add favorite tag to the entry this badge is on. + e = self.lib.get_entry(self.item_id) if value: self.favorite_badge.setHidden(False) e.add_tag(self.panel.driver.lib, 1, field_id=DEFAULT_META_TAG_FIELD, field_index=-1) @@ -2985,7 +3007,8 @@ class ItemThumb(FlowWidget): e.remove_tag(self.panel.driver.lib, 1) if self.panel.isOpen: self.panel.update_widgets() - self.panel.driver.update_thumbs() + self.panel.driver.update_badges() + # def on_favorite_uncheck(self): # if self.mode == SearchItemType.ENTRY: @@ -4357,6 +4380,10 @@ class QtDriver(QObject): # logging.info( # f'[MAIN] Elements thumbs updated in {(end_time - start_time):.3f} seconds') + def update_badges(self): + for i, item_thumb in enumerate(self.item_thumbs, start=0): + item_thumb.update_badges() + def expand_collation(self, collation_entries: list[tuple[int, int]]): self.nav_forward([(ItemType.ENTRY, x[0]) for x in collation_entries])