build: bump pyside version to 6.11.2

This commit is contained in:
Travis Abendshien
2026-08-18 14:38:08 -07:00
parent 8ec26dea3c
commit 291d4b7678
23 changed files with 72 additions and 54 deletions
+1 -1
View File
@@ -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",
+1 -1
View File
@@ -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,
@@ -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))
@@ -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_
@@ -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
+4 -4
View File
@@ -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)
+1 -1
View File
@@ -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
+7 -4
View File
@@ -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
@@ -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
@@ -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_
@@ -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:
+2 -2
View File
@@ -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)
+1 -1
View File
@@ -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(
+7 -4
View File
@@ -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:
+3 -3
View File
@@ -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"<i>{Translations['preview.no_selection']}</i>")
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)
@@ -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
+16 -21
View File
@@ -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)
+3 -2
View File
@@ -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)
+1
View File
@@ -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
+3 -1
View File
@@ -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
@@ -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)
@@ -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:
+1
View File
@@ -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