From 291d4b76780c1a609eb647677f6e13447a072403 Mon Sep 17 00:00:00 2001 From: Travis Abendshien <46939827+CyanVoxel@users.noreply.github.com> Date: Tue, 18 Aug 2026 14:38:08 -0700 Subject: [PATCH] build: bump pyside version to 6.11.2 --- pyproject.toml | 2 +- src/tagstudio/previews/renderers/audio.py | 2 +- .../qt/controllers/autofill_line_edit.py | 2 +- .../qt/controllers/field_suggest_box.py | 4 +- .../field_template_search_panel.py | 4 +- src/tagstudio/qt/controllers/progress_bar.py | 8 ++-- src/tagstudio/qt/controllers/search_panel.py | 2 +- src/tagstudio/qt/controllers/suggest_box.py | 11 ++++-- .../qt/controllers/tag_search_panel.py | 4 +- .../qt/controllers/tag_suggest_box.py | 4 +- .../qt/controllers/underlined_widget.py | 3 +- src/tagstudio/qt/mixed/build_tag.py | 4 +- src/tagstudio/qt/mixed/color_box.py | 2 +- src/tagstudio/qt/mixed/field_widget.py | 11 ++++-- src/tagstudio/qt/mixed/file_attributes.py | 6 +-- src/tagstudio/qt/mixed/folders_to_tags.py | 1 + src/tagstudio/qt/mixed/migration_modal.py | 37 ++++++++----------- src/tagstudio/qt/mixed/paged_panel.py | 5 ++- src/tagstudio/qt/mixed/pagination.py | 1 + src/tagstudio/qt/mixed/tag_color_manager.py | 4 +- src/tagstudio/qt/views/layouts/flow_layout.py | 6 ++- .../qt/views/layouts/thumb_grid_layout.py | 2 +- tests/qt/test_build_tag_panel.py | 1 + 23 files changed, 72 insertions(+), 54 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index d6d575e7..a0ec9bb5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,7 +27,7 @@ dependencies = [ "py7zr~=1.1.3", "pydantic~=2.10", "pydub~=0.25", - "PySide6==6.8.0.*", + "PySide6==6.11.2", "rarfile==4.2", "rawpy~=0.27", "Send2Trash>=1.8,<3", diff --git a/src/tagstudio/previews/renderers/audio.py b/src/tagstudio/previews/renderers/audio.py index 262e484c..6b981a7e 100644 --- a/src/tagstudio/previews/renderers/audio.py +++ b/src/tagstudio/previews/renderers/audio.py @@ -52,7 +52,7 @@ def audio_album_thumb(filepath: Path, ext: str) -> Image.Image | None: image = artwork except ( FileNotFoundError, - id3.ID3NoHeaderError, # pyright: ignore[reportPrivateImportUsage] + id3.ID3NoHeaderError, mp4.MP4MetadataError, mp4.MP4StreamInfoError, MutagenError, diff --git a/src/tagstudio/qt/controllers/autofill_line_edit.py b/src/tagstudio/qt/controllers/autofill_line_edit.py index dfc5a451..1e481258 100644 --- a/src/tagstudio/qt/controllers/autofill_line_edit.py +++ b/src/tagstudio/qt/controllers/autofill_line_edit.py @@ -77,4 +77,4 @@ class AutofillLineEdit(QLineEdit): # Filter out icon action(s) if action.text(): menu.addAction(action) - menu.exec(self.mapToGlobal(pos)) # pyright: ignore[reportArgumentType] + menu.exec(self.mapToGlobal(pos)) diff --git a/src/tagstudio/qt/controllers/field_suggest_box.py b/src/tagstudio/qt/controllers/field_suggest_box.py index 199de7f3..e1d3efcc 100644 --- a/src/tagstudio/qt/controllers/field_suggest_box.py +++ b/src/tagstudio/qt/controllers/field_suggest_box.py @@ -11,6 +11,7 @@ from PySide6.QtWidgets import QWidget from tagstudio.core.library.alchemy.fields import BaseFieldTemplate from tagstudio.core.library.alchemy.library import Library +from tagstudio.core.utils.types import unwrap from tagstudio.i18n.translations import Translations from tagstudio.qt.app_settings import AppSettings from tagstudio.qt.controllers.edit_field_template_modal import EditFieldTemplateModal @@ -155,6 +156,7 @@ class FieldSuggestBox(SuggestBox[BaseFieldTemplate]): widget.setHidden(True) self.layout().content_layout.addWidget(widget) - widget_: QWidget = self.layout().content_layout.itemAt(index).widget() + item = unwrap(self.layout().content_layout.itemAt(index)) + widget_: QWidget = unwrap(item.widget()) assert isinstance(widget_, UnderlinedWidget) return widget_ diff --git a/src/tagstudio/qt/controllers/field_template_search_panel.py b/src/tagstudio/qt/controllers/field_template_search_panel.py index d131b3f4..f1b4c919 100644 --- a/src/tagstudio/qt/controllers/field_template_search_panel.py +++ b/src/tagstudio/qt/controllers/field_template_search_panel.py @@ -11,6 +11,7 @@ from PySide6.QtWidgets import QMessageBox, QWidget from tagstudio.core.library.alchemy.fields import BaseFieldTemplate from tagstudio.core.library.alchemy.library import Library +from tagstudio.core.utils.types import unwrap from tagstudio.i18n.translations import Translations from tagstudio.qt.controllers.edit_field_template_modal import EditFieldTemplateModal from tagstudio.qt.controllers.field_template_widget import FieldTemplateWidget @@ -173,6 +174,7 @@ class FieldTemplateSearchPanel(SearchPanel[BaseFieldTemplate]): pad_field_template_widget.setHidden(True) self.layout().scroll_layout.addWidget(pad_field_template_widget) - field_template_widget: QWidget = self.layout().scroll_layout.itemAt(index).widget() + item = unwrap(self.layout().scroll_layout.itemAt(index)) + field_template_widget: QWidget = unwrap(item.widget()) assert isinstance(field_template_widget, FieldTemplateWidget) return field_template_widget diff --git a/src/tagstudio/qt/controllers/progress_bar.py b/src/tagstudio/qt/controllers/progress_bar.py index 98b5fc7b..dd2618f7 100644 --- a/src/tagstudio/qt/controllers/progress_bar.py +++ b/src/tagstudio/qt/controllers/progress_bar.py @@ -27,10 +27,10 @@ class ProgressWidget(QWidget): super().__init__() self.root = QVBoxLayout(self) self.pb = QProgressDialog( - labelText=label_text, - minimum=minimum, - cancelButtonText=cancel_button_text, # pyright: ignore[reportArgumentType] - maximum=maximum, + label_text, + cancel_button_text or "", + minimum, + maximum, ) self.root.addWidget(self.pb) self.setFixedSize(432, 112) diff --git a/src/tagstudio/qt/controllers/search_panel.py b/src/tagstudio/qt/controllers/search_panel.py index 0a34b4dc..96f92257 100644 --- a/src/tagstudio/qt/controllers/search_panel.py +++ b/src/tagstudio/qt/controllers/search_panel.py @@ -166,7 +166,7 @@ class SearchPanel[T](ModalContent): if not query: self.layout().search_field.setFocus() parent: QWidget | None = self.parentWidget() - if parent is not None: # pyright: ignore[reportUnnecessaryComparison] + if parent is not None: parent.hide() return diff --git a/src/tagstudio/qt/controllers/suggest_box.py b/src/tagstudio/qt/controllers/suggest_box.py index b8c33160..9627aa04 100644 --- a/src/tagstudio/qt/controllers/suggest_box.py +++ b/src/tagstudio/qt/controllers/suggest_box.py @@ -11,6 +11,7 @@ from PySide6.QtGui import QAction, QPixmap, QShowEvent, Qt from PySide6.QtWidgets import QGraphicsOpacityEffect, QWidget from tagstudio.core.library.alchemy.library import Library +from tagstudio.core.utils.types import unwrap from tagstudio.i18n.translations import Translations from tagstudio.qt.app_settings import AppSettings from tagstudio.qt.controllers.autofill_line_edit import QtCore, QtGui @@ -110,7 +111,7 @@ class SuggestBox[T](QWidget): def _on_shift_held(self, held: bool) -> None: self._is_shift_held = held for i in range(0, self.layout().content_layout.count()): - underlined_widget = self.layout().content_layout.itemAt(i).widget() + underlined_widget = self.layout().content_layout.itemAt(i).widget() # pyright: ignore assert isinstance(underlined_widget, UnderlinedWidget) if held and i == self._selection_index: @@ -128,7 +129,7 @@ class SuggestBox[T](QWidget): # Initialize the widget count (non-hidden) widget_count = 0 for i in range(0, self.layout().content_layout.count()): - widget = self.layout().content_layout.itemAt(i).widget() + widget = unwrap(self.layout().content_layout.itemAt(i).widget()) # pyright: ignore if not widget.isHidden(): widget_count += 1 @@ -149,7 +150,7 @@ class SuggestBox[T](QWidget): # Draw the correct underline for the selected widget for i in range(0, widget_count): - underlined_widget = self.layout().content_layout.itemAt(i).widget() + underlined_widget = self.layout().content_layout.itemAt(i).widget() # pyright: ignore assert isinstance(underlined_widget, UnderlinedWidget) if i == self._selection_index: underlined_widget.toggle_underline(is_hidden=False) @@ -216,7 +217,9 @@ class SuggestBox[T](QWidget): self._selection_index = 0 if self.layout().content_layout.count() > 0: self.layout().scroll_area.ensureWidgetVisible( - self.layout().content_layout.itemAt(0).widget(), xmargin=16, ymargin=0 + self.layout().content_layout.itemAt(0).widget(), # pyright: ignore + xmargin=16, + ymargin=0, ) # Get results for the search query diff --git a/src/tagstudio/qt/controllers/tag_search_panel.py b/src/tagstudio/qt/controllers/tag_search_panel.py index 1f469fa8..7771747b 100644 --- a/src/tagstudio/qt/controllers/tag_search_panel.py +++ b/src/tagstudio/qt/controllers/tag_search_panel.py @@ -12,6 +12,7 @@ from PySide6.QtWidgets import QMessageBox, QWidget from tagstudio.core.constants import RESERVED_TAG_END, RESERVED_TAG_START from tagstudio.core.library.alchemy.library import Library from tagstudio.core.library.alchemy.models import Tag +from tagstudio.core.utils.types import unwrap from tagstudio.i18n.translations import Translations from tagstudio.qt.controllers.modal import Modal from tagstudio.qt.controllers.modal_content import ModalContent @@ -207,6 +208,7 @@ class TagSearchPanel(SearchPanel[Tag]): pad_tag_widget.setHidden(True) self.layout().scroll_layout.addWidget(pad_tag_widget) - tag_widget: QWidget = self.layout().scroll_layout.itemAt(index).widget() + item = unwrap(self.layout().scroll_layout.itemAt(index)) + tag_widget: QWidget = unwrap(item.widget()) assert isinstance(tag_widget, TagWidget) return tag_widget diff --git a/src/tagstudio/qt/controllers/tag_suggest_box.py b/src/tagstudio/qt/controllers/tag_suggest_box.py index d7735ba7..04789cd7 100644 --- a/src/tagstudio/qt/controllers/tag_suggest_box.py +++ b/src/tagstudio/qt/controllers/tag_suggest_box.py @@ -12,6 +12,7 @@ from PySide6.QtWidgets import QGraphicsOpacityEffect, QWidget from tagstudio.core.library.alchemy.library import Library from tagstudio.core.library.alchemy.models import Tag +from tagstudio.core.utils.types import unwrap from tagstudio.i18n.translations import Translations from tagstudio.qt.app_settings import AppSettings from tagstudio.qt.controllers.modal import Modal @@ -191,6 +192,7 @@ class TagSuggestBox(SuggestBox[Tag]): widget.setHidden(True) self.layout().content_layout.addWidget(widget) - widget_: QWidget = self.layout().content_layout.itemAt(index).widget() + item = unwrap(self.layout().content_layout.itemAt(index)) + widget_: QWidget = unwrap(item.widget()) assert isinstance(widget_, UnderlinedWidget) return widget_ diff --git a/src/tagstudio/qt/controllers/underlined_widget.py b/src/tagstudio/qt/controllers/underlined_widget.py index 8c041f3b..92875845 100644 --- a/src/tagstudio/qt/controllers/underlined_widget.py +++ b/src/tagstudio/qt/controllers/underlined_widget.py @@ -6,6 +6,7 @@ from typing import override from PySide6.QtWidgets import QWidget +from tagstudio.core.utils.types import unwrap from tagstudio.qt.views.underlined_widget_view import UnderlinedWidgetView @@ -21,7 +22,7 @@ class UnderlinedWidget(QWidget): @property def widget(self) -> QWidget: - return self.layout().itemAt(0).widget() + return unwrap(unwrap(self.layout().itemAt(0)).widget()) @override def layout(self) -> UnderlinedWidgetView: diff --git a/src/tagstudio/qt/mixed/build_tag.py b/src/tagstudio/qt/mixed/build_tag.py index 3ce3e111..84472093 100644 --- a/src/tagstudio/qt/mixed/build_tag.py +++ b/src/tagstudio/qt/mixed/build_tag.py @@ -359,7 +359,7 @@ class BuildTagPanel(ModalContent): def set_categories(self, added_parent_id: int | None = None, removed_parent: bool = False): while self.category_scroll_layout.itemAt(0): - self.category_scroll_layout.takeAt(0).widget().deleteLater() + self.category_scroll_layout.takeAt(0).widget().deleteLater() # pyright: ignore[reportOptionalMemberAccess] c = QWidget() layout = QVBoxLayout(c) @@ -480,7 +480,7 @@ class BuildTagPanel(ModalContent): def set_parent_tags(self): while self.parent_tags_scroll_layout.itemAt(0): - self.parent_tags_scroll_layout.takeAt(0).widget().deleteLater() + self.parent_tags_scroll_layout.takeAt(0).widget().deleteLater() # pyright: ignore[reportOptionalMemberAccess] c = QWidget() layout = QVBoxLayout(c) diff --git a/src/tagstudio/qt/mixed/color_box.py b/src/tagstudio/qt/mixed/color_box.py index 71b83b3f..03e0e64e 100644 --- a/src/tagstudio/qt/mixed/color_box.py +++ b/src/tagstudio/qt/mixed/color_box.py @@ -60,7 +60,7 @@ class ColorBoxWidget(FieldWidget): color_widgets: list[TagColorLabel] = [] while self.base_layout.itemAt(0): - unwrap(self.base_layout.takeAt(0)).widget().deleteLater() + unwrap(self.base_layout.takeAt(0)).widget().deleteLater() # pyright: ignore[reportOptionalMemberAccess] for color in colors_: color_widget = TagColorLabel( diff --git a/src/tagstudio/qt/mixed/field_widget.py b/src/tagstudio/qt/mixed/field_widget.py index aceb4e7f..4b699678 100644 --- a/src/tagstudio/qt/mixed/field_widget.py +++ b/src/tagstudio/qt/mixed/field_widget.py @@ -12,6 +12,7 @@ from PySide6.QtCore import QEvent, QSize, Qt from PySide6.QtGui import QEnterEvent, QPixmap, QResizeEvent from PySide6.QtWidgets import QHBoxLayout, QLabel, QPushButton, QVBoxLayout, QWidget +from tagstudio.core.utils.types import unwrap from tagstudio.qt.resource_manager import ResourceManager from tagstudio.qt.views.styles.color_overlay import auto_theme_overlay from tagstudio.qt.views.styles.stylesheets import container_style, header @@ -137,16 +138,18 @@ class FieldContainer(QWidget): self.remove_button.clicked.connect(callback) def set_inner_widget(self, widget: FieldWidget) -> None: - if self.field_layout.itemAt(0): - old: QWidget = self.field_layout.itemAt(0).widget() + item = self.field_layout.itemAt(0) + if item: + old: QWidget = unwrap(item.widget()) self.field_layout.removeWidget(old) old.deleteLater() self.field_layout.addWidget(widget) def get_inner_widget(self) -> QWidget | None: - if self.field_layout.itemAt(0): - return self.field_layout.itemAt(0).widget() + item = self.field_layout.itemAt(0) + if item: + return item.widget() return None def set_title(self, title: str) -> None: diff --git a/src/tagstudio/qt/mixed/file_attributes.py b/src/tagstudio/qt/mixed/file_attributes.py index e37dfba0..43071a39 100644 --- a/src/tagstudio/qt/mixed/file_attributes.py +++ b/src/tagstudio/qt/mixed/file_attributes.py @@ -130,7 +130,7 @@ class FileAttributes(QWidget): stats = FileAttributeData() if not filepath: - self.layout().setSpacing(0) + self.layout().setSpacing(0) # pyright: ignore[reportOptionalMemberAccess] self.file_label.setAlignment(Qt.AlignmentFlag.AlignCenter) self.file_label.setText(f"{Translations['preview.no_selection']}") self.file_label.set_file_path(Path()) @@ -147,7 +147,7 @@ class FileAttributes(QWidget): elif self.driver.settings.show_filepath == ShowFilepathOption.SHOW_FILENAMES_ONLY: display_path = Path(filepath.name) - self.layout().setSpacing(6) + self.layout().setSpacing(6) # pyright: ignore[reportOptionalMemberAccess] self.file_label.setAlignment(Qt.AlignmentFlag.AlignLeft) self.file_label.set_file_path(filepath) self.dimensions_label.setHidden(False) @@ -234,7 +234,7 @@ class FileAttributes(QWidget): def update_multi_selection(self, count: int): """Format attributes for multiple selected items.""" - self.layout().setSpacing(0) + self.layout().setSpacing(0) # pyright: ignore[reportOptionalMemberAccess] self.file_label.setAlignment(Qt.AlignmentFlag.AlignCenter) self.file_label.setText(Translations.format("preview.multiple_selection", count=count)) self.file_label.setCursor(Qt.CursorShape.ArrowCursor) diff --git a/src/tagstudio/qt/mixed/folders_to_tags.py b/src/tagstudio/qt/mixed/folders_to_tags.py index b3dd8b3c..97760caa 100644 --- a/src/tagstudio/qt/mixed/folders_to_tags.py +++ b/src/tagstudio/qt/mixed/folders_to_tags.py @@ -1,6 +1,7 @@ # SPDX-FileCopyrightText: (c) TagStudio Contributors # SPDX-License-Identifier: GPL-3.0-only +# pyright: reportOptionalMemberAccess=false import math from collections.abc import Sequence diff --git a/src/tagstudio/qt/mixed/migration_modal.py b/src/tagstudio/qt/mixed/migration_modal.py index 43edc894..37aab223 100644 --- a/src/tagstudio/qt/mixed/migration_modal.py +++ b/src/tagstudio/qt/mixed/migration_modal.py @@ -98,8 +98,8 @@ class JsonMigrationModal(QObject): body_label = QLabel(Translations["json_migration.info.description"]) body_label.setWordWrap(True) body_label.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) - body_wrapper.layout().addWidget(body_label) - body_wrapper.layout().setContentsMargins(0, 36, 0, 0) + body_wrapper.layout().addWidget(body_label) # pyright: ignore[reportOptionalMemberAccess] + body_wrapper.layout().setContentsMargins(0, 36, 0, 0) # pyright: ignore[reportOptionalMemberAccess] cancel_button = QPushButton(Translations["generic.cancel"]) next_button = QPushButton(Translations["generic.continue"]) @@ -287,9 +287,9 @@ class JsonMigrationModal(QObject): body_container_layout.addStretch(1) body_container_layout.addWidget(new_lib_container) body_container_layout.addStretch(2) - self.body_wrapper_01.layout().addWidget(body_container) - self.body_wrapper_01.layout().addWidget(desc_label) - self.body_wrapper_01.layout().setSpacing(12) + self.body_wrapper_01.layout().addWidget(body_container) # pyright: ignore[reportOptionalMemberAccess] + self.body_wrapper_01.layout().addWidget(desc_label) # pyright: ignore[reportOptionalMemberAccess] + self.body_wrapper_01.layout().setSpacing(12) # pyright: ignore[reportOptionalMemberAccess] back_button = QPushButton(Translations["generic.navigation.back"]) start_button = QPushButton(Translations["json_migration.start_and_preview"]) @@ -352,14 +352,9 @@ class JsonMigrationModal(QObject): def migration_progress(self, skip_ui: bool = False): """Initialize the progress bar and iterator for the library migration.""" - pb = QProgressDialog( - labelText="", - cancelButtonText="", - minimum=0, - maximum=0, - ) - pb.setCancelButton(None) # pyright: ignore[reportArgumentType] - self.body_wrapper_01.layout().addWidget(pb) + pb = QProgressDialog("", "", 0, 0) + pb.setCancelButton(None) + self.body_wrapper_01.layout().addWidget(pb) # pyright: ignore[reportOptionalMemberAccess] try: iterator = FunctionIterator(self.migration_iterator) @@ -480,26 +475,26 @@ class JsonMigrationModal(QObject): def update_json_entry_count(self, value: int): self.old_entry_count = value - label: QLabel = self.old_content_layout.itemAtPosition(self.entries_row, 1).widget() # pyright: ignore[reportAssignmentType] + label: QLabel = self.old_content_layout.itemAtPosition(self.entries_row, 1).widget() # pyright: ignore label.setText(self.color_value_default(value)) def update_json_tag_count(self, value: int): self.old_tag_count = value - label: QLabel = self.old_content_layout.itemAtPosition(self.tags_row, 1).widget() # pyright: ignore[reportAssignmentType] + label: QLabel = self.old_content_layout.itemAtPosition(self.tags_row, 1).widget() # pyright: ignore label.setText(self.color_value_default(value)) def update_sql_value(self, row: int, value: int | bool, old_value: int | bool): - label: QLabel = self.new_content_layout.itemAtPosition(row, 1).widget() # pyright: ignore[reportAssignmentType] - warning_icon: QLabel = self.new_content_layout.itemAtPosition(row, 2).widget() # pyright: ignore[reportAssignmentType] + label: QLabel = self.new_content_layout.itemAtPosition(row, 1).widget() # pyright: ignore + warning_icon: QLabel = self.new_content_layout.itemAtPosition(row, 2).widget() # pyright: ignore label.setText(self.color_value_conditional(old_value, value)) warning_icon.setText("" if old_value == value else self.warning) def update_parity_value(self, row: int, value: bool): result: str = self.match_text if value else self.differ_text - old_label: QLabel = self.old_content_layout.itemAtPosition(row, 1).widget() # pyright: ignore[reportAssignmentType] - new_label: QLabel = self.new_content_layout.itemAtPosition(row, 1).widget() # pyright: ignore[reportAssignmentType] - old_warning_icon: QLabel = self.old_content_layout.itemAtPosition(row, 2).widget() # pyright: ignore[reportAssignmentType] - new_warning_icon: QLabel = self.new_content_layout.itemAtPosition(row, 2).widget() # pyright: ignore[reportAssignmentType] + old_label: QLabel = self.old_content_layout.itemAtPosition(row, 1).widget() # pyright: ignore + new_label: QLabel = self.new_content_layout.itemAtPosition(row, 1).widget() # pyright: ignore + old_warning_icon: QLabel = self.old_content_layout.itemAtPosition(row, 2).widget() # pyright: ignore + new_warning_icon: QLabel = self.new_content_layout.itemAtPosition(row, 2).widget() # pyright: ignore old_label.setText(self.color_value_conditional(self.match_text, result)) new_label.setText(self.color_value_conditional(self.match_text, result)) old_warning_icon.setText("" if value else self.warning) diff --git a/src/tagstudio/qt/mixed/paged_panel.py b/src/tagstudio/qt/mixed/paged_panel.py index 8c55cb62..4d356463 100644 --- a/src/tagstudio/qt/mixed/paged_panel.py +++ b/src/tagstudio/qt/mixed/paged_panel.py @@ -1,7 +1,7 @@ # SPDX-FileCopyrightText: (c) TagStudio Contributors # SPDX-License-Identifier: GPL-3.0-only - +# pyright: reportOptionalMemberAccess=false from typing import override import structlog @@ -9,6 +9,7 @@ from PySide6 import QtCore, QtGui from PySide6.QtCore import Qt from PySide6.QtWidgets import QHBoxLayout, QLabel, QVBoxLayout, QWidget +from tagstudio.core.utils.types import unwrap from tagstudio.qt.mixed.paged_panel_state import PagedPanelState from tagstudio.qt.views.styles.stylesheets import header @@ -96,7 +97,7 @@ class PagedPanel(QWidget): # Update Body Widget if self.body_layout.itemAt(0): self.body_layout.itemAt(0).widget().setHidden(True) - self.body_layout.removeWidget(self.body_layout.itemAt(0).widget()) + self.body_layout.removeWidget(unwrap(self.body_layout.itemAt(0).widget())) self.body_layout.addWidget(frame.body_wrapper) self.body_layout.itemAt(0).widget().setHidden(False) diff --git a/src/tagstudio/qt/mixed/pagination.py b/src/tagstudio/qt/mixed/pagination.py index b10be79d..78cf7316 100644 --- a/src/tagstudio/qt/mixed/pagination.py +++ b/src/tagstudio/qt/mixed/pagination.py @@ -1,6 +1,7 @@ # SPDX-FileCopyrightText: (c) TagStudio Contributors # SPDX-License-Identifier: GPL-3.0-only +# pyright: reportOptionalMemberAccess=false from typing import cast, override from warnings import catch_warnings diff --git a/src/tagstudio/qt/mixed/tag_color_manager.py b/src/tagstudio/qt/mixed/tag_color_manager.py index f0c1a15f..5723616a 100644 --- a/src/tagstudio/qt/mixed/tag_color_manager.py +++ b/src/tagstudio/qt/mixed/tag_color_manager.py @@ -23,6 +23,7 @@ from PySide6.QtWidgets import ( from tagstudio.core.constants import RESERVED_NAMESPACE_PREFIX from tagstudio.core.enums import Theme +from tagstudio.core.utils.types import unwrap from tagstudio.i18n.translations import Translations from tagstudio.qt.controllers.modal import Modal from tagstudio.qt.mixed.build_namespace import BuildNamespacePanel @@ -166,7 +167,8 @@ class TagColorManager(QWidget): def reset(self): while self.scroll_layout.count(): - widget = self.scroll_layout.itemAt(0).widget() + item = unwrap(self.scroll_layout.itemAt(0)) + widget = unwrap(item.widget()) self.scroll_layout.removeWidget(widget) widget.deleteLater() self.is_initialized = False diff --git a/src/tagstudio/qt/views/layouts/flow_layout.py b/src/tagstudio/qt/views/layouts/flow_layout.py index af14a7b2..646998d4 100644 --- a/src/tagstudio/qt/views/layouts/flow_layout.py +++ b/src/tagstudio/qt/views/layouts/flow_layout.py @@ -3,6 +3,8 @@ # SPDX-FileCopyrightText: (C) TagStudio Contributors # SPDX-License-Identifier: GPL-3.0-only +# pyright: reportOptionalMemberAccess=false + """PySide6 port of the widgets/layouts/flowlayout example from Qt v6.x.""" @@ -44,14 +46,14 @@ class FlowLayout(QLayout): return len(self._item_list) @override - def itemAt(self, index: int) -> QLayoutItem | None: # pyright: ignore[reportIncompatibleMethodOverride] + def itemAt(self, index: int) -> QLayoutItem | None: if 0 <= index < len(self._item_list): return self._item_list[index] return None @override - def takeAt(self, index: int) -> QLayoutItem | None: # pyright: ignore[reportIncompatibleMethodOverride] + def takeAt(self, index: int) -> QLayoutItem | None: if 0 <= index < len(self._item_list): return self._item_list.pop(index) diff --git a/src/tagstudio/qt/views/layouts/thumb_grid_layout.py b/src/tagstudio/qt/views/layouts/thumb_grid_layout.py index a3b44b4c..a7c3e8dc 100644 --- a/src/tagstudio/qt/views/layouts/thumb_grid_layout.py +++ b/src/tagstudio/qt/views/layouts/thumb_grid_layout.py @@ -198,7 +198,7 @@ class ThumbGridLayout(QLayout): return per_row, width_offset, height_offset = self._size(rect.right()) - view_height = self.parentWidget().parentWidget().height() + view_height = self.parentWidget().parentWidget().height() # pyright: ignore[reportOptionalMemberAccess] offset = self.scroll_area.verticalScrollBar().value() if self._scroll_to is not None: try: diff --git a/tests/qt/test_build_tag_panel.py b/tests/qt/test_build_tag_panel.py index 825b1682..3b79815e 100644 --- a/tests/qt/test_build_tag_panel.py +++ b/tests/qt/test_build_tag_panel.py @@ -2,6 +2,7 @@ # SPDX-License-Identifier: GPL-3.0-only # pyright: reportPrivateUsage = false +# pyright: reportOptionalMemberAccess=false from collections.abc import Callable from typing import cast