Skip to content

Update to pyside6 version 6.7.1 #223

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 14 commits into from
Jun 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions .github/workflows/mypy.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,6 @@ jobs:

- name: Install dependencies
run: |
# pyside 6.6.3 has some issue in their .pyi files
pip install PySide6==6.6.2
pip install -r requirements.txt
pip install mypy==1.10.0
mkdir tagstudio/.mypy_cache
Expand Down
7 changes: 4 additions & 3 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
humanfriendly==10.0
opencv_python>=4.8.0.74,<=4.9.0.80
Pillow==10.3.0
PySide6>=6.5.1.1,<=6.6.3.1
PySide6_Addons>=6.5.1.1,<=6.6.3.1
PySide6_Essentials>=6.5.1.1,<=6.6.3.1
PySide6==6.7.1
PySide6_Addons==6.7.1
PySide6_Essentials==6.7.1
typing_extensions>=3.10.0.0,<=4.11.0
ujson>=5.8.0,<=5.9.0
numpy==1.26.4
rawpy==0.21.0
pillow-heif==0.16.0
chardet==5.2.0
16 changes: 16 additions & 0 deletions tagstudio/src/qt/helpers/qbutton_wrapper.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
# Licensed under the GPL-3.0 License.
# Created for TagStudio: https://github.com/CyanVoxel/TagStudio

from PySide6.QtWidgets import QPushButton


class QPushButtonWrapper(QPushButton):
"""
This is a customized implementation of the PySide6 QPushButton that allows to suppress the warning that is triggered
by disconnecting a signal that is not currently connected.
"""

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.is_connected = False
1 change: 1 addition & 0 deletions tagstudio/src/qt/modals/add_field.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ def __init__(self, library: "Library"):
# - OR -
# [Cancel] [Save]
super().__init__()
self.is_connected = False
self.lib = library
self.setWindowTitle(f"Add Field")
self.setWindowModality(Qt.WindowModality.ApplicationModal)
Expand Down
21 changes: 10 additions & 11 deletions tagstudio/src/qt/pagination.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
QLineEdit,
QSizePolicy,
)

from src.qt.helpers.qbutton_wrapper import QPushButtonWrapper

# class NumberEdit(QLineEdit):
# def __init__(self, parent=None) -> None:
Expand Down Expand Up @@ -50,13 +50,13 @@ def __init__(self, parent=None) -> None:
# self.setMinimumHeight(32)

# [<] ----------------------------------
self.prev_button = QPushButton()
self.prev_button = QPushButtonWrapper()
self.prev_button.setText("<")
self.prev_button.setMinimumSize(self.button_size)
self.prev_button.setMaximumSize(self.button_size)

# --- [1] ------------------------------
self.start_button = QPushButton()
self.start_button = QPushButtonWrapper()
self.start_button.setMinimumSize(self.button_size)
self.start_button.setMaximumSize(self.button_size)
# self.start_button.setStyleSheet('background:cyan;')
Expand Down Expand Up @@ -104,14 +104,14 @@ def __init__(self, parent=None) -> None:
self.end_ellipses.setText(". . .")

# ----------------------------- [42] ---
self.end_button = QPushButton()
self.end_button = QPushButtonWrapper()
self.end_button.setMinimumSize(self.button_size)
self.end_button.setMaximumSize(self.button_size)
# self.end_button.setMaximumHeight(self.button_size.height())
# self.end_button.setStyleSheet('background:red;')

# ---------------------------------- [>]
self.next_button = QPushButton()
self.next_button = QPushButtonWrapper()
self.next_button.setText(">")
self.next_button.setMinimumSize(self.button_size)
self.next_button.setMaximumSize(self.button_size)
Expand Down Expand Up @@ -428,24 +428,23 @@ def _goto_page(self, index: int):
# print(f'GOTO PAGE: {index}')
self.update_buttons(self.page_count, index)

def _assign_click(self, button: QPushButton, index):
try:
def _assign_click(self, button: QPushButtonWrapper, index):
if button.is_connected:
button.clicked.disconnect()
except RuntimeError:
pass
button.clicked.connect(lambda checked=False, i=index: self._goto_page(i))
button.is_connected = True

def _populate_buffer_buttons(self):
for i in range(max(self.buffer_page_count * 2, 5)):
button = QPushButton()
button = QPushButtonWrapper()
button.setMinimumSize(self.button_size)
button.setMaximumSize(self.button_size)
button.setHidden(True)
# button.setMaximumHeight(self.button_size.height())
self.start_buffer_layout.addWidget(button)

for i in range(max(self.buffer_page_count * 2, 5)):
button = QPushButton()
button = QPushButtonWrapper()
button.setMinimumSize(self.button_size)
button.setMaximumSize(self.button_size)
button.setHidden(True)
Expand Down
24 changes: 12 additions & 12 deletions tagstudio/src/qt/widgets/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
from PySide6.QtCore import Qt, QEvent
from PySide6.QtGui import QPixmap, QEnterEvent
from PySide6.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QLabel, QPushButton
from src.qt.helpers.qbutton_wrapper import QPushButtonWrapper


class FieldContainer(QWidget):
Expand Down Expand Up @@ -81,7 +82,7 @@ def __init__(self, title: str = "Field", inline: bool = True) -> None:

self.title_layout.addStretch(2)

self.copy_button = QPushButton()
self.copy_button = QPushButtonWrapper()
self.copy_button.setMinimumSize(button_size, button_size)
self.copy_button.setMaximumSize(button_size, button_size)
self.copy_button.setFlat(True)
Expand All @@ -92,7 +93,7 @@ def __init__(self, title: str = "Field", inline: bool = True) -> None:
self.title_layout.addWidget(self.copy_button)
self.copy_button.setHidden(True)

self.edit_button = QPushButton()
self.edit_button = QPushButtonWrapper()
self.edit_button.setMinimumSize(button_size, button_size)
self.edit_button.setMaximumSize(button_size, button_size)
self.edit_button.setFlat(True)
Expand All @@ -101,7 +102,7 @@ def __init__(self, title: str = "Field", inline: bool = True) -> None:
self.title_layout.addWidget(self.edit_button)
self.edit_button.setHidden(True)

self.remove_button = QPushButton()
self.remove_button = QPushButtonWrapper()
self.remove_button.setMinimumSize(button_size, button_size)
self.remove_button.setMaximumSize(button_size, button_size)
self.remove_button.setFlat(True)
Expand All @@ -124,31 +125,30 @@ def __init__(self, title: str = "Field", inline: bool = True) -> None:
# self.set_inner_widget(mode)

def set_copy_callback(self, callback: Optional[MethodType]):
try:
if self.copy_button.is_connected:
self.copy_button.clicked.disconnect()
except RuntimeError:
pass

self.copy_callback = callback
self.copy_button.clicked.connect(callback)
if callback is not None:
self.copy_button.is_connected = True

def set_edit_callback(self, callback: Optional[MethodType]):
try:
if self.edit_button.is_connected:
self.edit_button.clicked.disconnect()
except RuntimeError:
pass

self.edit_callback = callback
self.edit_button.clicked.connect(callback)
if callback is not None:
self.edit_button.is_connected = True

def set_remove_callback(self, callback: Optional[Callable]):
try:
if self.remove_button.is_connected:
self.remove_button.clicked.disconnect()
except RuntimeError:
pass

self.remove_callback = callback
self.remove_button.clicked.connect(callback)
self.remove_button.is_connected = True

def set_inner_widget(self, widget: "FieldWidget"):
# widget.setStyleSheet('background-color:green;')
Expand Down
8 changes: 3 additions & 5 deletions tagstudio/src/qt/widgets/item_thumb.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
# Licensed under the GPL-3.0 License.
# Created for TagStudio: https://github.com/CyanVoxel/TagStudio


import contextlib
import logging
import os
import time
Expand Down Expand Up @@ -394,12 +393,11 @@ def update_size(self, timestamp: float, size: QSize):
def update_clickable(self, clickable: typing.Callable):
"""Updates attributes of a thumbnail element."""
# logging.info(f'[GUI] Updating Click Event for element {id(element)}: {id(clickable) if clickable else None}')
try:
if self.thumb_button.is_connected:
self.thumb_button.clicked.disconnect()
except RuntimeError:
pass
if clickable:
self.thumb_button.clicked.connect(clickable)
self.thumb_button.is_connected = True

def update_badges(self):
if self.mode == ItemType.ENTRY:
Expand Down
40 changes: 19 additions & 21 deletions tagstudio/src/qt/widgets/preview_panel.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
from src.qt.widgets.panel import PanelModal
from src.qt.widgets.text_box_edit import EditTextBox
from src.qt.widgets.text_line_edit import EditTextLine
from src.qt.helpers.qbutton_wrapper import QPushButtonWrapper
from src.qt.widgets.video_player import VideoPlayer


Expand All @@ -61,6 +62,7 @@ class PreviewPanel(QWidget):

def __init__(self, library: Library, driver: "QtDriver"):
super().__init__()
self.is_connected = False
self.lib = library
self.driver: QtDriver = driver
self.initialized = False
Expand All @@ -83,7 +85,7 @@ def __init__(self, library: Library, driver: "QtDriver"):
self.open_file_action = QAction("Open file", self)
self.open_explorer_action = QAction("Open file in explorer", self)

self.preview_img = QPushButton()
self.preview_img = QPushButtonWrapper()
self.preview_img.setMinimumSize(*self.img_button_size)
self.preview_img.setFlat(True)
self.preview_img.setContextMenuPolicy(Qt.ContextMenuPolicy.ActionsContextMenu)
Expand Down Expand Up @@ -218,7 +220,7 @@ def __init__(self, library: Library, driver: "QtDriver"):
self.afb_layout = QVBoxLayout(self.afb_container)
self.afb_layout.setContentsMargins(0, 12, 0, 0)

self.add_field_button = QPushButton()
self.add_field_button = QPushButtonWrapper()
self.add_field_button.setCursor(Qt.CursorShape.PointingHandCursor)
self.add_field_button.setMinimumSize(96, 28)
self.add_field_button.setMaximumSize(96, 28)
Expand Down Expand Up @@ -279,7 +281,9 @@ def clear_layout(layout_item: QVBoxLayout):
row_layout.addWidget(label)
layout.addLayout(row_layout)

def set_button_style(btn: QPushButton, extras: list[str] | None = None):
def set_button_style(
btn: QPushButtonWrapper | QPushButton, extras: list[str] | None = None
):
base_style = [
f"background-color:{Theme.COLOR_BG.value};",
"border-radius:6px;",
Expand Down Expand Up @@ -317,7 +321,6 @@ def open_library_button_clicked(path):

button.clicked.connect(open_library_button_clicked(full_val))
set_button_style(button)

button_remove = QPushButton("➖")
button_remove.setCursor(Qt.CursorShape.PointingHandCursor)
button_remove.setFixedWidth(30)
Expand Down Expand Up @@ -411,16 +414,16 @@ def place_add_field_button(self):
self.afb_container, Qt.AlignmentFlag.AlignHCenter
)

try:
if self.afm.is_connected:
self.afm.done.disconnect()
if self.add_field_button.is_connected:
self.add_field_button.clicked.disconnect()
except RuntimeError:
pass

# self.afm.done.connect(lambda f: (self.lib.add_field_to_entry(self.selected[0][1], f), self.update_widgets()))
self.afm.done.connect(
lambda f: (self.add_field_to_selected(f), self.update_widgets())
)
self.afm.is_connected = True
self.add_field_button.clicked.connect(self.afm.show)

def add_field_to_selected(self, field_id: int):
Expand Down Expand Up @@ -466,10 +469,8 @@ def update_widgets(self):
True,
update_on_ratio_change=True,
)
try:
if self.preview_img.is_connected:
self.preview_img.clicked.disconnect()
except RuntimeError:
pass
for i, c in enumerate(self.containers):
c.setHidden(True)
self.preview_img.show()
Expand Down Expand Up @@ -588,14 +589,12 @@ def update_widgets(self):
f"[PreviewPanel][ERROR] Couldn't Render thumbnail for {filepath} (because of {e})"
)

try:
if self.preview_img.is_connected:
self.preview_img.clicked.disconnect()
except RuntimeError:
pass
self.preview_img.clicked.connect(
lambda checked=False, filepath=filepath: open_file(filepath)
)

self.preview_img.is_connected = True
self.selected = list(self.driver.selected)
for i, f in enumerate(item.fields):
self.write_container(i, f)
Expand Down Expand Up @@ -641,10 +640,8 @@ def update_widgets(self):
True,
update_on_ratio_change=True,
)
try:
if self.preview_img.is_connected:
self.preview_img.clicked.disconnect()
except RuntimeError:
pass

self.common_fields = []
self.mixed_fields = []
Expand Down Expand Up @@ -773,12 +770,12 @@ def set_tags_updated_slot(self, slot: object):
"""
Replacement for tag_callback.
"""
try:
if self.is_connected:
self.tags_updated.disconnect()
except RuntimeError:
pass

logging.info("[UPDATE CONTAINER] Setting tags updated slot")
self.tags_updated.connect(slot)
self.is_connected = True

# def write_container(self, item:Union[Entry, Collation, Tag], index, field):
def write_container(self, index, field, mixed=False):
Expand Down Expand Up @@ -1067,7 +1064,8 @@ def remove_message_box(self, prompt: str, callback: typing.Callable) -> None:
)
# remove_mb.setStandardButtons(QMessageBox.StandardButton.Cancel)
remove_mb.setDefaultButton(cancel_button)
remove_mb.setEscapeButton(cancel_button)
result = remove_mb.exec_()
# logging.info(result)
if result == 1:
if result == 3:
callback()
5 changes: 3 additions & 2 deletions tagstudio/src/qt/widgets/thumb_button.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,11 @@
from PySide6 import QtCore
from PySide6.QtCore import QEvent
from PySide6.QtGui import QEnterEvent, QPainter, QColor, QPen, QPainterPath, QPaintEvent
from PySide6.QtWidgets import QWidget, QPushButton
from PySide6.QtWidgets import QWidget
from src.qt.helpers.qbutton_wrapper import QPushButtonWrapper


class ThumbButton(QPushButton):
class ThumbButton(QPushButtonWrapper):
def __init__(self, parent: QWidget, thumb_size: tuple[int, int]) -> None:
super().__init__(parent)
self.thumb_size: tuple[int, int] = thumb_size
Expand Down