Skip to content

Commit b7b414c

Browse files
committed
Add delete menu option in tag_box and tag_database
1 parent a10478b commit b7b414c

File tree

5 files changed

+67
-18
lines changed

5 files changed

+67
-18
lines changed

tagstudio/src/qt/modals/build_tag.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ def set_subtags(self):
185185
l.setContentsMargins(0,0,0,0)
186186
l.setSpacing(3)
187187
for tag_id in self.tag.subtag_ids:
188-
tw = TagWidget(self.lib, self.lib.get_tag(tag_id), False, True)
188+
tw = TagWidget(self.lib, self.lib.get_tag(tag_id), False, True, False)
189189
tw.on_remove.connect(lambda checked=False, t=tag_id: self.remove_subtag_callback(t))
190190
l.addWidget(tw)
191191
self.scroll_layout.addWidget(c)

tagstudio/src/qt/modals/tag_database.py

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55

66
from PySide6.QtCore import Signal, Qt, QSize
7-
from PySide6.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QLineEdit, QScrollArea, QFrame
7+
from PySide6.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QLineEdit, QScrollArea, QFrame, QMessageBox, QApplication
88

99
from src.core.library import Library
1010
from src.qt.widgets import PanelWidget, PanelModal, TagWidget
@@ -92,8 +92,9 @@ def update_tags(self, query:str):
9292
l = QHBoxLayout(c)
9393
l.setContentsMargins(0,0,0,0)
9494
l.setSpacing(3)
95-
tw = TagWidget(self.lib, self.lib.get_tag(tag_id), True, False)
95+
tw = TagWidget(self.lib, self.lib.get_tag(tag_id), True, False, True)
9696
tw.on_edit.connect(lambda checked=False, t=self.lib.get_tag(tag_id): (self.edit_tag(t.id)))
97+
tw.on_delete.connect(lambda checked=False, t=self.lib.get_tag(tag_id): (self.delete_tag(t.id)))
9798
l.addWidget(tw)
9899
self.scroll_layout.addWidget(c)
99100
else:
@@ -106,8 +107,9 @@ def update_tags(self, query:str):
106107
l = QHBoxLayout(c)
107108
l.setContentsMargins(0,0,0,0)
108109
l.setSpacing(3)
109-
tw = TagWidget(self.lib, tag, True, False)
110+
tw = TagWidget(self.lib, tag, True, False, True)
110111
tw.on_edit.connect(lambda checked=False, t=tag: (self.edit_tag(t.id)))
112+
tw.on_delete.connect(lambda checked=False, t=tag: (self.delete_tag(t.id)))
111113
l.addWidget(tw)
112114
self.scroll_layout.addWidget(c)
113115

@@ -128,6 +130,23 @@ def edit_tag(self, tag_id:int):
128130
# panel.tag_updated.connect(lambda tag: self.lib.update_tag(tag))
129131
self.edit_modal.show()
130132

133+
def delete_tag(self, tag_id:int):
134+
def show_delete_prompt() -> bool:
135+
result = QMessageBox.question(self, "Delete Tag", f"Are you sure you want to delete Tag {tag.name}?",
136+
QMessageBox.Yes | QMessageBox.No)
137+
138+
return result == QMessageBox.Yes
139+
140+
tag = self.lib.get_tag(tag_id)
141+
shift_held = Qt.KeyboardModifier.ShiftModifier in QApplication.keyboardModifiers()
142+
143+
if shift_held or show_delete_prompt():
144+
self.lib.remove_tag(tag_id)
145+
self.update_tags(self.search_field.text())
146+
147+
if not shift_held:
148+
QMessageBox.information(self, "Delete Tag", "Tag deleted.")
149+
131150
def edit_tag_callback(self, btp:BuildTagPanel):
132151
self.lib.update_tag(btp.build_tag())
133152
self.update_tags(self.search_field.text())

tagstudio/src/qt/modals/tag_search.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ def update_tags(self, query:str):
102102
l = QHBoxLayout(c)
103103
l.setContentsMargins(0,0,0,0)
104104
l.setSpacing(3)
105-
tw = TagWidget(self.lib, self.lib.get_tag(tag_id), False, False)
105+
tw = TagWidget(self.lib, self.lib.get_tag(tag_id), False, False, False)
106106
ab = QPushButton()
107107
ab.setMinimumSize(23, 23)
108108
ab.setMaximumSize(23, 23)

tagstudio/src/qt/widgets/tag.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,9 @@ class TagWidget(QWidget):
2929
on_remove = Signal()
3030
on_click = Signal()
3131
on_edit = Signal()
32+
on_delete = Signal()
3233

33-
def __init__(self, library:Library, tag:Tag, has_edit:bool, has_remove:bool, on_remove_callback:FunctionType=None, on_click_callback:FunctionType=None, on_edit_callback:FunctionType=None) -> None:
34+
def __init__(self, library:Library, tag:Tag, has_edit:bool, has_remove:bool, has_delete:bool, on_remove_callback:FunctionType=None, on_click_callback:FunctionType=None, on_edit_callback:FunctionType=None) -> None:
3435
super().__init__()
3536
self.lib = library
3637
self.tag = tag
@@ -66,6 +67,11 @@ def __init__(self, library:Library, tag:Tag, has_edit:bool, has_remove:bool, on_
6667
self.bg_button.addAction(search_for_tag_action)
6768
add_to_search_action = QAction('Add to Search', self)
6869
self.bg_button.addAction(add_to_search_action)
70+
71+
if has_delete:
72+
delete_action = QAction('Delete Tag', self)
73+
delete_action.triggered.connect(self.on_delete.emit)
74+
self.bg_button.addAction(delete_action)
6975

7076
self.inner_layout = QHBoxLayout()
7177
self.inner_layout.setObjectName('innerLayout')

tagstudio/src/qt/widgets/tag_box.py

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import typing
99

1010
from PySide6.QtCore import Signal, Qt
11-
from PySide6.QtWidgets import QPushButton
11+
from PySide6.QtWidgets import QPushButton, QMessageBox, QApplication
1212

1313
from src.core.library import Library, Tag
1414
from src.qt.flowlayout import FlowLayout
@@ -71,36 +71,42 @@ def __init__(self, item, title, field_index, library:Library, tags:list[int], dr
7171

7272
def set_item(self, item):
7373
self.item = item
74-
75-
def set_tags(self, tags:list[int]):
76-
logging.info(f'[TAG BOX WIDGET] SET TAGS: T:{tags} for E:{self.item.id}')
74+
75+
def update_tags(self):
7776
is_recycled = False
77+
7878
if self.base_layout.itemAt(0):
7979
# logging.info(type(self.base_layout.itemAt(0).widget()))
80+
is_recycled = True
8081
while self.base_layout.itemAt(0) and self.base_layout.itemAt(1):
8182
# logging.info(f"I'm deleting { self.base_layout.itemAt(0).widget()}")
8283
self.base_layout.takeAt(0).widget().deleteLater()
83-
is_recycled = True
84-
for tag in tags:
84+
85+
for tag_id in self.tags:
8586
# TODO: Remove space from the special search here (tag_id:x) once that system is finalized.
8687
# tw = TagWidget(self.lib, self.lib.get_tag(tag), True, True,
8788
# on_remove_callback=lambda checked=False, t=tag: (self.lib.get_entry(self.item.id).remove_tag(self.lib, t, self.field_index), self.updated.emit()),
8889
# on_click_callback=lambda checked=False, q=f'tag_id: {tag}': (self.driver.main_window.searchField.setText(q), self.driver.filter_items(q)),
8990
# on_edit_callback=lambda checked=False, t=tag: (self.edit_tag(t))
9091
# )
91-
tw = TagWidget(self.lib, self.lib.get_tag(tag), True, True)
92-
tw.on_click.connect(lambda checked=False, q=f'tag_id: {tag}': (self.driver.main_window.searchField.setText(q), self.driver.filter_items(q)))
93-
tw.on_remove.connect(lambda checked=False, t=tag: (self.remove_tag(t)))
94-
tw.on_edit.connect(lambda checked=False, t=tag: (self.edit_tag(t)))
92+
tw = TagWidget(self.lib, self.lib.get_tag(tag_id), True, True, True)
93+
tw.on_click.connect(lambda checked=False, q=f'tag_id: {tag_id}': (self.driver.main_window.searchField.setText(q), self.driver.filter_items(q)))
94+
tw.on_remove.connect(lambda checked=False, t=tag_id: (self.remove_tag(t)))
95+
tw.on_edit.connect(lambda checked=False, t=tag_id: (self.edit_tag(t)))
96+
tw.on_delete.connect(lambda checked=False, t=tag_id: (self.delete_tag(t)))
9597
self.base_layout.addWidget(tw)
96-
self.tags = tags
97-
98+
9899
# Move or add the '+' button.
99100
if is_recycled:
100101
self.base_layout.addWidget(self.base_layout.takeAt(0).widget())
101102
else:
102103
self.base_layout.addWidget(self.add_button)
103104

105+
def set_tags(self, tags:list[int]):
106+
logging.info(f'[TAG BOX WIDGET] SET TAGS: T:{tags} for E:{self.item.id}')
107+
self.tags = tags
108+
self.update_tags()
109+
104110
# Handles an edge case where there are no more tags and the '+' button
105111
# doesn't move all the way to the left.
106112
if self.base_layout.itemAt(0) and not self.base_layout.itemAt(1):
@@ -120,6 +126,24 @@ def edit_tag(self, tag_id:int):
120126
self.edit_modal.saved.connect(lambda: self.lib.update_tag(btp.build_tag()))
121127
# panel.tag_updated.connect(lambda tag: self.lib.update_tag(tag))
122128
self.edit_modal.show()
129+
130+
131+
def delete_tag(self, tag_id:int):
132+
def show_delete_prompt() -> bool:
133+
result = QMessageBox.question(self, "Delete Tag", f"Are you sure you want to delete Tag {tag.name}?",
134+
QMessageBox.Yes | QMessageBox.No)
135+
136+
return result == QMessageBox.Yes
137+
138+
tag = self.lib.get_tag(tag_id)
139+
shift_held = Qt.KeyboardModifier.ShiftModifier in QApplication.keyboardModifiers()
140+
141+
if shift_held or show_delete_prompt():
142+
self.lib.remove_tag(tag_id)
143+
self.update_tags()
144+
145+
if not shift_held:
146+
QMessageBox.information(self, "Delete Tag", "Tag deleted.")
123147

124148

125149
def add_tag_callback(self, tag_id):

0 commit comments

Comments
 (0)