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")