Skip to content

Commit 57ab919

Browse files
refactor: type fixes to folders_to_tags.py, collage_icon.py and item_thumb.py (#959)
* folders_to_tags.py type fixes * collage_icon.py * item_thumb.py * fix test and mypy errors * naming fix Co-authored-by: Jann Stute <[email protected]> --------- Co-authored-by: Jann Stute <[email protected]>
1 parent 4e72227 commit 57ab919

File tree

3 files changed

+38
-31
lines changed

3 files changed

+38
-31
lines changed

src/tagstudio/qt/modals/folders_to_tags.py

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,11 @@ def reverse_tag(library: Library, tag: Tag, items: list[Tag] | None) -> list[Tag
9090
items.reverse()
9191
return items
9292

93-
for subtag_id in tag.parent_ids:
94-
subtag = library.get_tag(subtag_id)
95-
return reverse_tag(library, subtag, items)
93+
parent_tag = None # to avoid subtag unbound error
94+
for parent_tag_id in tag.parent_ids:
95+
parent_tag = library.get_tag(parent_tag_id)
96+
assert parent_tag is not None
97+
return reverse_tag(library, parent_tag, items)
9698

9799

98100
# =========== UI ===========
@@ -132,7 +134,7 @@ def _add_folders_to_tree(items: Sequence[str]) -> BranchData:
132134
if branch:
133135
has_tag = False
134136
for tag in entry.tags:
135-
if tag.name == branch.tag.name:
137+
if branch.tag and tag.name == branch.tag.name:
136138
has_tag = True
137139
break
138140
if not has_tag:
@@ -216,20 +218,19 @@ def __init__(self, library: "Library", driver: "QtDriver"):
216218
self.apply_button.setMinimumWidth(100)
217219
self.apply_button.clicked.connect(self.on_apply)
218220

219-
self.showEvent = self.on_open # type: ignore
220-
221221
self.root_layout.addWidget(self.title_widget)
222222
self.root_layout.addWidget(self.desc_widget)
223223
self.root_layout.addWidget(self.open_close_button_w)
224224
self.root_layout.addWidget(self.scroll_area)
225225
self.root_layout.addWidget(self.apply_button, alignment=Qt.AlignmentFlag.AlignCenter)
226226

227-
def on_apply(self, event):
227+
def on_apply(self):
228228
folders_to_tags(self.library)
229229
self.close()
230230
self.driver.main_window.preview_panel.update_widgets(update_preview=False)
231231

232-
def on_open(self, event):
232+
@override
233+
def showEvent(self, event: QtGui.QShowEvent):
233234
for i in reversed(range(self.scroll_layout.count())):
234235
self.scroll_layout.itemAt(i).widget().setParent(None)
235236

@@ -271,6 +272,7 @@ def __init__(self, data: BranchData, parent_tag: Tag | None = None):
271272

272273
self.label = QLabel()
273274
self.tag_layout.addWidget(self.label)
275+
assert data.tag is not None and parent_tag is not None
274276
self.tag_widget = ModifiedTagWidget(data.tag, parent_tag)
275277
self.tag_widget.bg_button.clicked.connect(lambda: self.hide_show())
276278
self.tag_layout.addWidget(self.tag_widget)
@@ -323,10 +325,7 @@ def __init__(self, tag: Tag, parent_tag: Tag) -> None:
323325

324326
self.bg_button = QPushButton(self)
325327
self.bg_button.setFlat(True)
326-
if parent_tag is not None:
327-
text = f"{tag.name} ({parent_tag.name})".replace("&", "&&")
328-
else:
329-
text = tag.name.replace("&", "&&")
328+
text = f"{tag.name} ({parent_tag.name})".replace("&", "&&")
330329
self.bg_button.setText(text)
331330
self.bg_button.setContextMenuPolicy(Qt.ContextMenuPolicy.ActionsContextMenu)
332331

src/tagstudio/qt/widgets/collage_icon.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,16 @@ def __init__(self, library: Library):
2929

3030
def render(
3131
self,
32-
entry_id,
32+
entry_id: int,
3333
size: tuple[int, int],
34-
data_tint_mode,
35-
data_only_mode,
36-
keep_aspect,
34+
data_tint_mode: bool,
35+
data_only_mode: bool,
36+
keep_aspect: bool,
3737
):
3838
entry = self.lib.get_entry(entry_id)
39-
filepath = self.lib.library_dir / entry.path
39+
lib_dir = self.lib.library_dir
40+
assert lib_dir is not None and entry is not None
41+
filepath = lib_dir / entry.path
4042
color: str = ""
4143

4244
try:
@@ -57,7 +59,7 @@ def render(
5759
ext: str = filepath.suffix.lower()
5860
if MediaCategories.is_ext_in_category(ext, MediaCategories.IMAGE_TYPES):
5961
try:
60-
with Image.open(str(self.lib.library_dir / entry.path)) as pic:
62+
with Image.open(filepath) as pic:
6163
if keep_aspect:
6264
pic.thumbnail(size)
6365
else:

src/tagstudio/qt/widgets/item_thumb.py

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@
88
from enum import Enum
99
from functools import wraps
1010
from pathlib import Path
11-
from typing import TYPE_CHECKING
11+
from typing import TYPE_CHECKING, override
1212
from warnings import catch_warnings
1313

1414
import structlog
1515
from PIL import Image, ImageQt
1616
from PySide6.QtCore import QEvent, QMimeData, QSize, Qt, QUrl
17-
from PySide6.QtGui import QAction, QDrag, QEnterEvent, QPixmap
17+
from PySide6.QtGui import QAction, QDrag, QEnterEvent, QMouseEvent, QPixmap
1818
from PySide6.QtWidgets import (
1919
QBoxLayout,
2020
QCheckBox,
@@ -403,7 +403,7 @@ def set_count(self, count: str) -> None:
403403
self.ext_badge.setHidden(True)
404404
self.count_badge.setHidden(True)
405405

406-
def set_filename_text(self, filename: Path | None):
406+
def set_filename_text(self, filename: Path):
407407
self.set_item_path(filename)
408408
self.file_label.setText(str(filename.name))
409409

@@ -437,22 +437,21 @@ def update_size(self, timestamp: float, size: QSize):
437437
size (QSize): The new thumbnail size to set.
438438
"""
439439
if timestamp > ItemThumb.update_cutoff:
440-
self.thumb_size = size.toTuple() # type: ignore
440+
self.thumb_size = size.width(), size.height()
441441
self.thumb_button.setIconSize(size)
442442
self.thumb_button.setMinimumSize(size)
443443
self.thumb_button.setMaximumSize(size)
444444

445-
def update_clickable(self, clickable: typing.Callable):
445+
def update_clickable(self, clickable: typing.Callable[[], None]):
446446
"""Updates attributes of a thumbnail element."""
447-
if clickable:
448-
with catch_warnings(record=True):
449-
self.thumb_button.clicked.disconnect()
450-
self.thumb_button.clicked.connect(clickable)
447+
with catch_warnings(record=True):
448+
self.thumb_button.clicked.disconnect()
449+
self.thumb_button.clicked.connect(clickable)
451450

452451
def set_item_id(self, item_id: int):
453452
self.item_id = item_id
454453

455-
def set_item_path(self, path: Path | str | None):
454+
def set_item_path(self, path: Path | str):
456455
"""Set the absolute filepath for the item. Used for locating on disk."""
457456
self.opener.set_filepath(path)
458457

@@ -474,11 +473,13 @@ def show_check_badges(self, show: bool):
474473
is_hidden = not (show or self.badge_active[badge_type])
475474
badge.setHidden(is_hidden)
476475

477-
def enterEvent(self, event: QEnterEvent) -> None: # noqa: N802
476+
@override
477+
def enterEvent(self, event: QEnterEvent) -> None: # type: ignore[misc]
478478
self.show_check_badges(show=True)
479479
return super().enterEvent(event)
480480

481-
def leaveEvent(self, event: QEvent) -> None: # noqa: N802
481+
@override
482+
def leaveEvent(self, event: QEvent) -> None: # type: ignore[misc]
482483
self.show_check_badges(show=False)
483484
return super().leaveEvent(event)
484485

@@ -490,6 +491,9 @@ def on_badge_check(self, badge_type: BadgeType):
490491
toggle_value = self.badges[badge_type].isChecked()
491492
self.badge_active[badge_type] = toggle_value
492493
badge_values: dict[BadgeType, bool] = {badge_type: toggle_value}
494+
# TODO: Ensure that self.item_id is always an integer. During tests, it is currently None.
495+
# This issue should be addressed by either fixing the test setup or modifying the
496+
# self.driver.update_badges() method.
493497
self.driver.update_badges(badge_values, self.item_id)
494498

495499
def toggle_item_tag(
@@ -506,7 +510,8 @@ def toggle_item_tag(
506510
else:
507511
pass
508512

509-
def mouseMoveEvent(self, event): # noqa: N802
513+
@override
514+
def mouseMoveEvent(self, event: QMouseEvent) -> None: # type: ignore[misc]
510515
if event.buttons() is not Qt.MouseButton.LeftButton:
511516
return
512517

@@ -521,6 +526,7 @@ def mouseMoveEvent(self, event): # noqa: N802
521526
if not entry:
522527
continue
523528

529+
assert self.lib.library_dir is not None
524530
url = QUrl.fromLocalFile(Path(self.lib.library_dir) / entry.path)
525531
paths.append(url)
526532

0 commit comments

Comments
 (0)