From cc54474e75817802f2acb18a1c1ffc0c52ff0bbc Mon Sep 17 00:00:00 2001 From: Dummerle Date: Wed, 25 Aug 2021 20:25:10 +0200 Subject: [PATCH] Add Wishlist tab in store --- rare/components/tabs/shop/__init__.py | 20 ++- rare/components/tabs/shop/game_widgets.py | 52 ++++++ rare/components/tabs/shop/shop_models.py | 11 +- rare/components/tabs/shop/shop_widget.py | 4 +- rare/components/tabs/shop/wishlist.py | 80 +++++++++ rare/ui/components/tabs/store/wishlist.py | 104 +++++++++++ rare/ui/components/tabs/store/wishlist.ui | 165 ++++++++++++++++++ .../components/tabs/store/wishlist_widget.py | 89 ++++++++++ .../components/tabs/store/wishlist_widget.ui | 110 ++++++++++++ rare/utils/extra_widgets.py | 9 +- 10 files changed, 631 insertions(+), 13 deletions(-) create mode 100644 rare/components/tabs/shop/wishlist.py create mode 100644 rare/ui/components/tabs/store/wishlist.py create mode 100644 rare/ui/components/tabs/store/wishlist.ui create mode 100644 rare/ui/components/tabs/store/wishlist_widget.py create mode 100644 rare/ui/components/tabs/store/wishlist_widget.ui diff --git a/rare/components/tabs/shop/__init__.py b/rare/components/tabs/shop/__init__.py index 2e84af9d..0d1e886d 100644 --- a/rare/components/tabs/shop/__init__.py +++ b/rare/components/tabs/shop/__init__.py @@ -6,6 +6,7 @@ from rare.components.tabs.shop.game_info import ShopGameInfo from rare.components.tabs.shop.search_results import SearchResults from rare.components.tabs.shop.shop_api_core import ShopApiCore from rare.components.tabs.shop.shop_widget import ShopWidget +from rare.components.tabs.shop.wishlist import WishlistWidget, Wishlist class Shop(QStackedWidget): @@ -14,35 +15,42 @@ class Shop(QStackedWidget): def __init__(self, core: LegendaryCore): super(Shop, self).__init__() self.core = core + self.api_core = ShopApiCore(self.core.egs.session.headers["Authorization"]) - self.shop_api = ShopApiCore(self.core.egs.session.headers["Authorization"]) - - self.shop = ShopWidget(cache_dir, core, self.shop_api) + self.shop = ShopWidget(cache_dir, core, self.api_core) + self.wishlist_widget = Wishlist(self.api_core) self.store_tabs = QTabWidget() self.store_tabs.addTab(self.shop, self.tr("Games")) + self.store_tabs.addTab(self.wishlist_widget, self.tr("Wishlist")) # self.store_tabs.addTab(self.browse_games, self.tr("Browse")) self.addWidget(self.store_tabs) - self.search_results = SearchResults(self.shop_api) + self.search_results = SearchResults(self.api_core) self.addWidget(self.search_results) self.search_results.show_info.connect(self.show_game_info) - self.info = ShopGameInfo([i.asset_info.namespace for i in self.core.get_game_list(True)], self.shop_api) + self.info = ShopGameInfo([i.asset_info.namespace for i in self.core.get_game_list(True)], self.api_core) self.addWidget(self.info) self.info.back_button.clicked.connect(lambda: self.setCurrentIndex(0)) self.search_results.back_button.clicked.connect(lambda: self.setCurrentIndex(0)) self.shop.show_info.connect(self.show_search_results) + self.wishlist_widget.show_game_info.connect(self.show_game_info) self.shop.show_game.connect(self.show_game_info) - self.shop_api.update_wishlist.connect(self.shop.update_wishlist) + self.api_core.update_wishlist.connect(self.update_wishlist) + self.wishlist_widget.update_wishlist_signal.connect(self.update_wishlist) + + def update_wishlist(self): + self.shop.update_wishlist() def load(self): if not self.init: self.init = True self.shop.load() + self.wishlist_widget.update_wishlist() def show_game_info(self, data): self.info.update_game(data) diff --git a/rare/components/tabs/shop/game_widgets.py b/rare/components/tabs/shop/game_widgets.py index b2aa32b6..947b4a03 100644 --- a/rare/components/tabs/shop/game_widgets.py +++ b/rare/components/tabs/shop/game_widgets.py @@ -5,7 +5,10 @@ from PyQt5.QtCore import pyqtSignal from PyQt5.QtGui import QFont from PyQt5.QtNetwork import QNetworkAccessManager from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel, QHBoxLayout +from qtawesome import icon +from rare.components.tabs.shop.shop_models import ImageUrlModel +from rare.ui.components.tabs.store.wishlist_widget import Ui_WishlistWidget from rare.utils.extra_widgets import ImageLabel logger = logging.getLogger("GameWidgets") @@ -71,3 +74,52 @@ class GameWidgetDiscount(GameWidget): price_label.setFont(font) h_layout.addWidget(QLabel(discount_price if discount_price != "0" else self.tr("Free"))) h_layout.addWidget(price_label) + + +class WishlistWidget(QWidget, Ui_WishlistWidget): + open_game = pyqtSignal(dict) + delete_from_wishlist = pyqtSignal(dict) + + def __init__(self, game: dict): + super(WishlistWidget, self).__init__() + self.setupUi(self) + self.game = game + self.title_label.setText(game.get("title")) + for attr in game["customAttributes"]: + if attr["key"] == "developerName": + self.developer.setText(attr["value"]) + break + else: + self.developer.setText(game["seller"]["name"]) + original_price = game['price']['totalPrice']['fmtPrice']['originalPrice'] + discount_price = game['price']['totalPrice']['fmtPrice']['discountPrice'] + + self.price.setText(original_price if original_price != "0" else self.tr("Free")) + # if discount + if original_price != discount_price: + self.discount = True + font = QFont() + font.setStrikeOut(True) + self.price.setFont(font) + self.discount_price.setText(discount_price) + else: + self.discount = False + self.discount_price.setVisible(False) + + self.image = ImageLabel() + self.layout().insertWidget(0, self.image) + image_model = ImageUrlModel.from_json(game["keyImages"]) + url = image_model.front_wide + if not url: + url = image_model.offer_image_wide + self.image.update_image(url, game.get("title"), (240, 135)) + self.delete_button.setIcon(icon("mdi.delete", color="white")) + self.delete_button.clicked.connect(lambda: self.delete_from_wishlist.emit(self.game)) + + def mousePressEvent(self, e: QtGui.QMouseEvent) -> None: + # left button + if e.button() == 1: + self.open_game.emit(self.game) + # right + elif e.button() == 2: + pass # self.showMenu(e) diff --git a/rare/components/tabs/shop/shop_models.py b/rare/components/tabs/shop/shop_models.py index 2d6e2b83..c91aaaf5 100644 --- a/rare/components/tabs/shop/shop_models.py +++ b/rare/components/tabs/shop/shop_models.py @@ -5,13 +5,14 @@ from dataclasses import dataclass from rare.utils.utils import get_lang -class _ImageUrlModel: +class ImageUrlModel: def __init__(self, front_tall: str = "", offer_image_tall: str = "", - thumbnail: str = "", front_wide: str = ""): + thumbnail: str = "", front_wide: str = "", offer_image_wide: str = ""): self.front_tall = front_tall self.offer_image_tall = offer_image_tall self.thumbnail = thumbnail self.front_wide = front_wide + self.offer_image_wide = offer_image_wide @classmethod def from_json(cls, json_data: list): @@ -25,12 +26,14 @@ class _ImageUrlModel: tmp.front_wide = item["url"] elif item["type"] == "OfferImageTall": tmp.offer_image_tall = item["url"] + elif item["type"] == "OfferImageWide": + tmp.offer_image_wide = item["url"] return tmp class ShopGame: # TODO: Copyrights etc - def __init__(self, title: str = "", image_urls: _ImageUrlModel = None, social_links: dict = None, + def __init__(self, title: str = "", image_urls: ImageUrlModel = None, social_links: dict = None, langs: list = None, reqs: dict = None, publisher: str = "", developer: str = "", original_price: str = "", discount_price: str = "", tags: list = None, namespace: str = "", offer_id: str = ""): @@ -64,7 +67,7 @@ class ShopGame: api_data = api_data["pages"][0] tmp = cls() tmp.title = search_data.get("title", "Fail") - tmp.image_urls = _ImageUrlModel.from_json(search_data["keyImages"]) + tmp.image_urls = ImageUrlModel.from_json(search_data["keyImages"]) links = api_data["data"]["socialLinks"] tmp.links = [] for item in links: diff --git a/rare/components/tabs/shop/shop_widget.py b/rare/components/tabs/shop/shop_widget.py index 979036f4..581da796 100644 --- a/rare/components/tabs/shop/shop_widget.py +++ b/rare/components/tabs/shop/shop_widget.py @@ -39,7 +39,7 @@ class ShopWidget(QScrollArea, Ui_ShopWidget): self.locale = get_lang() self.update_games_allowed = True - self.free_games_now = QGroupBox(self.tr("Free Games")) + self.free_games_now = QGroupBox(self.tr("Now Free")) self.free_games_now.setLayout(QHBoxLayout()) self.free_widget.layout().addWidget(self.free_games_now) self.coming_free_games = QGroupBox(self.tr("Free Games next week")) @@ -88,6 +88,8 @@ class ShopWidget(QScrollArea, Ui_ShopWidget): self.discount_widget.setLayout(FlowLayout()) discounts = 0 for game in wishlist: + if not game: + continue if game["offer"]["price"]["totalPrice"]["discount"] > 0: w = GameWidgetDiscount(self.path, game["offer"]) w.show_info.connect(self.show_game.emit) diff --git a/rare/components/tabs/shop/wishlist.py b/rare/components/tabs/shop/wishlist.py new file mode 100644 index 00000000..8cd45d3f --- /dev/null +++ b/rare/components/tabs/shop/wishlist.py @@ -0,0 +1,80 @@ +from PyQt5.QtCore import pyqtSignal +from PyQt5.QtWidgets import QStackedWidget, QMessageBox + +from rare.components.tabs.shop import ShopApiCore +from rare.components.tabs.shop.game_widgets import WishlistWidget +from rare.ui.components.tabs.store.wishlist import Ui_Wishlist +from rare.utils.extra_widgets import WaitingSpinner + + +class Wishlist(QStackedWidget, Ui_Wishlist): + show_game_info = pyqtSignal(dict) + update_wishlist_signal = pyqtSignal() + + def __init__(self, api_core: ShopApiCore): + super(Wishlist, self).__init__() + self.api_core = api_core + self.setupUi(self) + self.addWidget(WaitingSpinner()) + # self.setContentsMargins(100, 0, 100, 0) + self.setCurrentIndex(1) + self.wishlist = [] + self.widgets = [] + + self.sort_cb.currentIndexChanged.connect(lambda i: self.set_wishlist(self.wishlist, i)) + self.filter_cb.currentIndexChanged.connect(self.set_filter) + + def update_wishlist(self): + self.setCurrentIndex(1) + self.api_core.get_wishlist(self.set_wishlist) + + def delete_from_wishlist(self, game): + self.api_core.remove_from_wishlist(game["namespace"], game["id"], + lambda success: self.update_wishlist() if success else + QMessageBox.warning(self, "Error", + self.tr("Could not remove game from wishlist"))) + self.update_wishlist_signal.emit() + + def set_filter(self, i): + count = 0 + for w in self.widgets: + if i == 1 and not w.discount: + w.setVisible(False) + else: + w.setVisible(True) + count += 1 + + if i == 0: + w.setVisible(True) + + if count == 0: + self.no_games_label.setVisible(True) + else: + self.no_games_label.setVisible(False) + + def set_wishlist(self, wishlist, sort=0): + self.wishlist = wishlist + + for i in self.widgets: + i.setParent(None) + + if sort == 0: + sorted_list = sorted(wishlist, key=lambda x: x["offer"]["title"]) + elif sort == 1: + sorted_list = sorted(wishlist, key=lambda x: x["offer"]['price']['totalPrice']['fmtPrice']['discountPrice']) + elif sort == 2: + sorted_list = sorted(wishlist, key=lambda x: x["offer"]["seller"]["name"]) + elif sort == 3: + sorted_list = sorted(wishlist, key=lambda x: 1 - ( + x["offer"]["price"]["totalPrice"]["discountPrice"] / x["offer"]["price"]["totalPrice"][ + "originalPrice"])) + else: + sorted_list = wishlist + self.widgets.clear() + for game in sorted_list: + w = WishlistWidget(game["offer"]) + self.widgets.append(w) + self.list_layout.addWidget(w) + w.open_game.connect(self.show_game_info.emit) + w.delete_from_wishlist.connect(self.delete_from_wishlist) + self.setCurrentIndex(0) diff --git a/rare/ui/components/tabs/store/wishlist.py b/rare/ui/components/tabs/store/wishlist.py new file mode 100644 index 00000000..140a9734 --- /dev/null +++ b/rare/ui/components/tabs/store/wishlist.py @@ -0,0 +1,104 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'wishlist.ui' +# +# Created by: PyQt5 UI code generator 5.15.4 +# +# WARNING: Any manual changes made to this file will be lost when pyuic5 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt5 import QtCore, QtGui, QtWidgets + + +class Ui_Wishlist(object): + def setupUi(self, Wishlist): + Wishlist.setObjectName("Wishlist") + Wishlist.resize(736, 398) + self.page = QtWidgets.QWidget() + self.page.setObjectName("page") + self.verticalLayout = QtWidgets.QVBoxLayout(self.page) + self.verticalLayout.setObjectName("verticalLayout") + self.scroll_area = QtWidgets.QScrollArea(self.page) + self.scroll_area.setWidgetResizable(True) + self.scroll_area.setObjectName("scroll_area") + self.scroll_widget = QtWidgets.QWidget() + self.scroll_widget.setGeometry(QtCore.QRect(0, 0, 716, 378)) + self.scroll_widget.setObjectName("scroll_widget") + self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.scroll_widget) + self.verticalLayout_2.setObjectName("verticalLayout_2") + self.title_label = QtWidgets.QLabel(self.scroll_widget) + font = QtGui.QFont() + font.setPointSize(15) + self.title_label.setFont(font) + self.title_label.setObjectName("title_label") + self.verticalLayout_2.addWidget(self.title_label) + self.horizontalLayout = QtWidgets.QHBoxLayout() + self.horizontalLayout.setObjectName("horizontalLayout") + self.sort_label = QtWidgets.QLabel(self.scroll_widget) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.sort_label.sizePolicy().hasHeightForWidth()) + self.sort_label.setSizePolicy(sizePolicy) + self.sort_label.setObjectName("sort_label") + self.horizontalLayout.addWidget(self.sort_label) + self.sort_cb = QtWidgets.QComboBox(self.scroll_widget) + self.sort_cb.setObjectName("sort_cb") + self.sort_cb.addItem("") + self.sort_cb.addItem("") + self.sort_cb.addItem("") + self.sort_cb.addItem("") + self.horizontalLayout.addWidget(self.sort_cb) + spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) + self.horizontalLayout.addItem(spacerItem) + self.filter_label = QtWidgets.QLabel(self.scroll_widget) + self.filter_label.setObjectName("filter_label") + self.horizontalLayout.addWidget(self.filter_label) + self.filter_cb = QtWidgets.QComboBox(self.scroll_widget) + self.filter_cb.setObjectName("filter_cb") + self.filter_cb.addItem("") + self.filter_cb.addItem("") + self.horizontalLayout.addWidget(self.filter_cb) + spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) + self.horizontalLayout.addItem(spacerItem1) + self.verticalLayout_2.addLayout(self.horizontalLayout) + self.list_layout = QtWidgets.QVBoxLayout() + self.list_layout.setObjectName("list_layout") + self.verticalLayout_2.addLayout(self.list_layout) + self.no_games_label = QtWidgets.QLabel(self.scroll_widget) + self.no_games_label.setObjectName("no_games_label") + self.verticalLayout_2.addWidget(self.no_games_label) + spacerItem2 = QtWidgets.QSpacerItem(379, 218, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) + self.verticalLayout_2.addItem(spacerItem2) + self.scroll_area.setWidget(self.scroll_widget) + self.verticalLayout.addWidget(self.scroll_area) + Wishlist.addWidget(self.page) + + self.retranslateUi(Wishlist) + QtCore.QMetaObject.connectSlotsByName(Wishlist) + + def retranslateUi(self, Wishlist): + _translate = QtCore.QCoreApplication.translate + Wishlist.setWindowTitle(_translate("Wishlist", "StackedWidget")) + self.title_label.setText(_translate("Wishlist", "Wishlist")) + self.sort_label.setText(_translate("Wishlist", "Sort by")) + self.sort_cb.setItemText(0, _translate("Wishlist", "Name")) + self.sort_cb.setItemText(1, _translate("Wishlist", "Price")) + self.sort_cb.setItemText(2, _translate("Wishlist", "Developer")) + self.sort_cb.setItemText(3, _translate("Wishlist", "Discount")) + self.filter_label.setText(_translate("Wishlist", "Filter: ")) + self.filter_cb.setItemText(0, _translate("Wishlist", "None")) + self.filter_cb.setItemText(1, _translate("Wishlist", "Discount")) + self.no_games_label.setText(_translate("Wishlist", "No games matching your filter")) + + +if __name__ == "__main__": + import sys + + app = QtWidgets.QApplication(sys.argv) + Wishlist = QtWidgets.QStackedWidget() + ui = Ui_Wishlist() + ui.setupUi(Wishlist) + Wishlist.show() + sys.exit(app.exec_()) diff --git a/rare/ui/components/tabs/store/wishlist.ui b/rare/ui/components/tabs/store/wishlist.ui new file mode 100644 index 00000000..b9bfbd8d --- /dev/null +++ b/rare/ui/components/tabs/store/wishlist.ui @@ -0,0 +1,165 @@ + + + Wishlist + + + + 0 + 0 + 736 + 398 + + + + StackedWidget + + + + + + + true + + + + + 0 + 0 + 716 + 378 + + + + + + + + 15 + + + + Wishlist + + + + + + + + + + 0 + 0 + + + + Sort by + + + + + + + + Name + + + + + Price + + + + + Developer + + + + + Discount + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Filter: + + + + + + + + None + + + + + Discount + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + No games matching your filter + + + + + + + Qt::Vertical + + + + 379 + 218 + + + + + + + + + + + + + + diff --git a/rare/ui/components/tabs/store/wishlist_widget.py b/rare/ui/components/tabs/store/wishlist_widget.py new file mode 100644 index 00000000..1355cdb7 --- /dev/null +++ b/rare/ui/components/tabs/store/wishlist_widget.py @@ -0,0 +1,89 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'wishlist_widget.ui' +# +# Created by: PyQt5 UI code generator 5.15.4 +# +# WARNING: Any manual changes made to this file will be lost when pyuic5 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt5 import QtCore, QtGui, QtWidgets + + +class Ui_WishlistWidget(object): + def setupUi(self, WishlistWidget): + WishlistWidget.setObjectName("WishlistWidget") + WishlistWidget.resize(523, 172) + self.horizontalLayout = QtWidgets.QHBoxLayout(WishlistWidget) + self.horizontalLayout.setObjectName("horizontalLayout") + self.widget = QtWidgets.QWidget(WishlistWidget) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.widget.sizePolicy().hasHeightForWidth()) + self.widget.setSizePolicy(sizePolicy) + self.widget.setObjectName("widget") + self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.widget) + self.verticalLayout_2.setObjectName("verticalLayout_2") + self.title_label = QtWidgets.QLabel(self.widget) + font = QtGui.QFont() + font.setPointSize(16) + self.title_label.setFont(font) + self.title_label.setWordWrap(True) + self.title_label.setObjectName("title_label") + self.verticalLayout_2.addWidget(self.title_label) + self.developer = QtWidgets.QLabel(self.widget) + font = QtGui.QFont() + font.setPointSize(12) + self.developer.setFont(font) + self.developer.setObjectName("developer") + self.verticalLayout_2.addWidget(self.developer) + self.horizontalLayout_2 = QtWidgets.QHBoxLayout() + self.horizontalLayout_2.setObjectName("horizontalLayout_2") + self.discount_price = QtWidgets.QLabel(self.widget) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.discount_price.sizePolicy().hasHeightForWidth()) + self.discount_price.setSizePolicy(sizePolicy) + self.discount_price.setObjectName("discount_price") + self.horizontalLayout_2.addWidget(self.discount_price) + self.price = QtWidgets.QLabel(self.widget) + self.price.setObjectName("price") + self.horizontalLayout_2.addWidget(self.price) + self.verticalLayout_2.addLayout(self.horizontalLayout_2) + spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) + self.verticalLayout_2.addItem(spacerItem) + self.horizontalLayout.addWidget(self.widget) + self.delete_button = QtWidgets.QPushButton(WishlistWidget) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.delete_button.sizePolicy().hasHeightForWidth()) + self.delete_button.setSizePolicy(sizePolicy) + self.delete_button.setText("") + self.delete_button.setObjectName("delete_button") + self.horizontalLayout.addWidget(self.delete_button) + + self.retranslateUi(WishlistWidget) + QtCore.QMetaObject.connectSlotsByName(WishlistWidget) + + def retranslateUi(self, WishlistWidget): + _translate = QtCore.QCoreApplication.translate + WishlistWidget.setWindowTitle(_translate("WishlistWidget", "Form")) + self.title_label.setText(_translate("WishlistWidget", "TextLabel")) + self.developer.setText(_translate("WishlistWidget", "TextLabel")) + self.discount_price.setText(_translate("WishlistWidget", "TextLabel")) + self.price.setText(_translate("WishlistWidget", "TextLabel")) + + +if __name__ == "__main__": + import sys + + app = QtWidgets.QApplication(sys.argv) + WishlistWidget = QtWidgets.QWidget() + ui = Ui_WishlistWidget() + ui.setupUi(WishlistWidget) + WishlistWidget.show() + sys.exit(app.exec_()) diff --git a/rare/ui/components/tabs/store/wishlist_widget.ui b/rare/ui/components/tabs/store/wishlist_widget.ui new file mode 100644 index 00000000..6d9b4446 --- /dev/null +++ b/rare/ui/components/tabs/store/wishlist_widget.ui @@ -0,0 +1,110 @@ + + + WishlistWidget + + + + 0 + 0 + 523 + 172 + + + + Form + + + + + + + 0 + 0 + + + + + + + + 16 + + + + TextLabel + + + true + + + + + + + + 12 + + + + TextLabel + + + + + + + + + + 0 + 0 + + + + TextLabel + + + + + + + TextLabel + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + 0 + 0 + + + + + + + + + + + + diff --git a/rare/utils/extra_widgets.py b/rare/utils/extra_widgets.py index 9ae77837..9cc2c859 100644 --- a/rare/utils/extra_widgets.py +++ b/rare/utils/extra_widgets.py @@ -2,6 +2,7 @@ import io import os from logging import getLogger +import PIL from PIL import Image from PyQt5.QtCore import Qt, QRect, QSize, QPoint, pyqtSignal, QSettings from PyQt5.QtGui import QMovie, QPixmap @@ -287,10 +288,14 @@ class ImageLabel(QLabel): self.setPixmap(QPixmap()) except RuntimeError: return - image: Image.Image = Image.open(io.BytesIO(data)) + try: + image: Image.Image = Image.open(io.BytesIO(data)) + except PIL.UnidentifiedImageError: + print(self.name) + return image = image.resize((self.img_size[0], self.img_size[1])) - if QSettings().value("cache_images", True, bool): + if QSettings().value("cache_images", False, bool): image.save(os.path.join(self.path, self.name), format="png") byte_array = io.BytesIO() image.save(byte_array, format="PNG")