Add Wishlist tab in store
This commit is contained in:
parent
8fbf0bcacf
commit
cc54474e75
10 changed files with 631 additions and 13 deletions
|
@ -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.search_results import SearchResults
|
||||||
from rare.components.tabs.shop.shop_api_core import ShopApiCore
|
from rare.components.tabs.shop.shop_api_core import ShopApiCore
|
||||||
from rare.components.tabs.shop.shop_widget import ShopWidget
|
from rare.components.tabs.shop.shop_widget import ShopWidget
|
||||||
|
from rare.components.tabs.shop.wishlist import WishlistWidget, Wishlist
|
||||||
|
|
||||||
|
|
||||||
class Shop(QStackedWidget):
|
class Shop(QStackedWidget):
|
||||||
|
@ -14,35 +15,42 @@ class Shop(QStackedWidget):
|
||||||
def __init__(self, core: LegendaryCore):
|
def __init__(self, core: LegendaryCore):
|
||||||
super(Shop, self).__init__()
|
super(Shop, self).__init__()
|
||||||
self.core = core
|
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.api_core)
|
||||||
|
self.wishlist_widget = Wishlist(self.api_core)
|
||||||
self.shop = ShopWidget(cache_dir, core, self.shop_api)
|
|
||||||
|
|
||||||
self.store_tabs = QTabWidget()
|
self.store_tabs = QTabWidget()
|
||||||
self.store_tabs.addTab(self.shop, self.tr("Games"))
|
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.store_tabs.addTab(self.browse_games, self.tr("Browse"))
|
||||||
|
|
||||||
self.addWidget(self.store_tabs)
|
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.addWidget(self.search_results)
|
||||||
self.search_results.show_info.connect(self.show_game_info)
|
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.addWidget(self.info)
|
||||||
self.info.back_button.clicked.connect(lambda: self.setCurrentIndex(0))
|
self.info.back_button.clicked.connect(lambda: self.setCurrentIndex(0))
|
||||||
|
|
||||||
self.search_results.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.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.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):
|
def load(self):
|
||||||
if not self.init:
|
if not self.init:
|
||||||
self.init = True
|
self.init = True
|
||||||
self.shop.load()
|
self.shop.load()
|
||||||
|
self.wishlist_widget.update_wishlist()
|
||||||
|
|
||||||
def show_game_info(self, data):
|
def show_game_info(self, data):
|
||||||
self.info.update_game(data)
|
self.info.update_game(data)
|
||||||
|
|
|
@ -5,7 +5,10 @@ from PyQt5.QtCore import pyqtSignal
|
||||||
from PyQt5.QtGui import QFont
|
from PyQt5.QtGui import QFont
|
||||||
from PyQt5.QtNetwork import QNetworkAccessManager
|
from PyQt5.QtNetwork import QNetworkAccessManager
|
||||||
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel, QHBoxLayout
|
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
|
from rare.utils.extra_widgets import ImageLabel
|
||||||
|
|
||||||
logger = logging.getLogger("GameWidgets")
|
logger = logging.getLogger("GameWidgets")
|
||||||
|
@ -71,3 +74,52 @@ class GameWidgetDiscount(GameWidget):
|
||||||
price_label.setFont(font)
|
price_label.setFont(font)
|
||||||
h_layout.addWidget(QLabel(discount_price if discount_price != "0" else self.tr("Free")))
|
h_layout.addWidget(QLabel(discount_price if discount_price != "0" else self.tr("Free")))
|
||||||
h_layout.addWidget(price_label)
|
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)
|
||||||
|
|
|
@ -5,13 +5,14 @@ from dataclasses import dataclass
|
||||||
from rare.utils.utils import get_lang
|
from rare.utils.utils import get_lang
|
||||||
|
|
||||||
|
|
||||||
class _ImageUrlModel:
|
class ImageUrlModel:
|
||||||
def __init__(self, front_tall: str = "", offer_image_tall: str = "",
|
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.front_tall = front_tall
|
||||||
self.offer_image_tall = offer_image_tall
|
self.offer_image_tall = offer_image_tall
|
||||||
self.thumbnail = thumbnail
|
self.thumbnail = thumbnail
|
||||||
self.front_wide = front_wide
|
self.front_wide = front_wide
|
||||||
|
self.offer_image_wide = offer_image_wide
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_json(cls, json_data: list):
|
def from_json(cls, json_data: list):
|
||||||
|
@ -25,12 +26,14 @@ class _ImageUrlModel:
|
||||||
tmp.front_wide = item["url"]
|
tmp.front_wide = item["url"]
|
||||||
elif item["type"] == "OfferImageTall":
|
elif item["type"] == "OfferImageTall":
|
||||||
tmp.offer_image_tall = item["url"]
|
tmp.offer_image_tall = item["url"]
|
||||||
|
elif item["type"] == "OfferImageWide":
|
||||||
|
tmp.offer_image_wide = item["url"]
|
||||||
return tmp
|
return tmp
|
||||||
|
|
||||||
|
|
||||||
class ShopGame:
|
class ShopGame:
|
||||||
# TODO: Copyrights etc
|
# 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 = "",
|
langs: list = None, reqs: dict = None, publisher: str = "", developer: str = "",
|
||||||
original_price: str = "", discount_price: str = "", tags: list = None, namespace: str = "",
|
original_price: str = "", discount_price: str = "", tags: list = None, namespace: str = "",
|
||||||
offer_id: str = ""):
|
offer_id: str = ""):
|
||||||
|
@ -64,7 +67,7 @@ class ShopGame:
|
||||||
api_data = api_data["pages"][0]
|
api_data = api_data["pages"][0]
|
||||||
tmp = cls()
|
tmp = cls()
|
||||||
tmp.title = search_data.get("title", "Fail")
|
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"]
|
links = api_data["data"]["socialLinks"]
|
||||||
tmp.links = []
|
tmp.links = []
|
||||||
for item in links:
|
for item in links:
|
||||||
|
|
|
@ -39,7 +39,7 @@ class ShopWidget(QScrollArea, Ui_ShopWidget):
|
||||||
self.locale = get_lang()
|
self.locale = get_lang()
|
||||||
self.update_games_allowed = True
|
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_games_now.setLayout(QHBoxLayout())
|
||||||
self.free_widget.layout().addWidget(self.free_games_now)
|
self.free_widget.layout().addWidget(self.free_games_now)
|
||||||
self.coming_free_games = QGroupBox(self.tr("Free Games next week"))
|
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())
|
self.discount_widget.setLayout(FlowLayout())
|
||||||
discounts = 0
|
discounts = 0
|
||||||
for game in wishlist:
|
for game in wishlist:
|
||||||
|
if not game:
|
||||||
|
continue
|
||||||
if game["offer"]["price"]["totalPrice"]["discount"] > 0:
|
if game["offer"]["price"]["totalPrice"]["discount"] > 0:
|
||||||
w = GameWidgetDiscount(self.path, game["offer"])
|
w = GameWidgetDiscount(self.path, game["offer"])
|
||||||
w.show_info.connect(self.show_game.emit)
|
w.show_info.connect(self.show_game.emit)
|
||||||
|
|
80
rare/components/tabs/shop/wishlist.py
Normal file
80
rare/components/tabs/shop/wishlist.py
Normal file
|
@ -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)
|
104
rare/ui/components/tabs/store/wishlist.py
Normal file
104
rare/ui/components/tabs/store/wishlist.py
Normal file
|
@ -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_())
|
165
rare/ui/components/tabs/store/wishlist.ui
Normal file
165
rare/ui/components/tabs/store/wishlist.ui
Normal file
|
@ -0,0 +1,165 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>Wishlist</class>
|
||||||
|
<widget class="QStackedWidget" name="Wishlist">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>736</width>
|
||||||
|
<height>398</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>StackedWidget</string>
|
||||||
|
</property>
|
||||||
|
<widget class="QWidget" name="page">
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QScrollArea" name="scroll_area">
|
||||||
|
<property name="widgetResizable">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<widget class="QWidget" name="scroll_widget">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>716</width>
|
||||||
|
<height>378</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="title_label">
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<pointsize>15</pointsize>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Wishlist</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="sort_label">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Sort by</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QComboBox" name="sort_cb">
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Name</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Price</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Developer</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Discount</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="horizontalSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="filter_label">
|
||||||
|
<property name="text">
|
||||||
|
<string>Filter:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QComboBox" name="filter_cb">
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>None</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Discount</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="horizontalSpacer_2">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QVBoxLayout" name="list_layout"/>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="no_games_label">
|
||||||
|
<property name="text">
|
||||||
|
<string>No games matching your filter</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="verticalSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>379</width>
|
||||||
|
<height>218</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
89
rare/ui/components/tabs/store/wishlist_widget.py
Normal file
89
rare/ui/components/tabs/store/wishlist_widget.py
Normal file
|
@ -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_())
|
110
rare/ui/components/tabs/store/wishlist_widget.ui
Normal file
110
rare/ui/components/tabs/store/wishlist_widget.ui
Normal file
|
@ -0,0 +1,110 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>WishlistWidget</class>
|
||||||
|
<widget class="QWidget" name="WishlistWidget">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>523</width>
|
||||||
|
<height>172</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Form</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QWidget" name="widget" native="true">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="title_label">
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<pointsize>16</pointsize>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>TextLabel</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="developer">
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<pointsize>12</pointsize>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>TextLabel</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="discount_price">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>TextLabel</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="price">
|
||||||
|
<property name="text">
|
||||||
|
<string>TextLabel</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="verticalSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="delete_button">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Maximum" vsizetype="Maximum">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
|
@ -2,6 +2,7 @@ import io
|
||||||
import os
|
import os
|
||||||
from logging import getLogger
|
from logging import getLogger
|
||||||
|
|
||||||
|
import PIL
|
||||||
from PIL import Image
|
from PIL import Image
|
||||||
from PyQt5.QtCore import Qt, QRect, QSize, QPoint, pyqtSignal, QSettings
|
from PyQt5.QtCore import Qt, QRect, QSize, QPoint, pyqtSignal, QSettings
|
||||||
from PyQt5.QtGui import QMovie, QPixmap
|
from PyQt5.QtGui import QMovie, QPixmap
|
||||||
|
@ -287,10 +288,14 @@ class ImageLabel(QLabel):
|
||||||
self.setPixmap(QPixmap())
|
self.setPixmap(QPixmap())
|
||||||
except RuntimeError:
|
except RuntimeError:
|
||||||
return
|
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]))
|
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")
|
image.save(os.path.join(self.path, self.name), format="png")
|
||||||
byte_array = io.BytesIO()
|
byte_array = io.BytesIO()
|
||||||
image.save(byte_array, format="PNG")
|
image.save(byte_array, format="PNG")
|
||||||
|
|
Loading…
Reference in a new issue