diff --git a/rare/components/tabs/shop/search_results.py b/rare/components/tabs/shop/search_results.py
index 2cedd48d..9b2fb361 100644
--- a/rare/components/tabs/shop/search_results.py
+++ b/rare/components/tabs/shop/search_results.py
@@ -1,17 +1,19 @@
from PyQt5 import QtGui
from PyQt5.QtCore import pyqtSignal
-from PyQt5.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QLabel, QScrollArea
+from PyQt5.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QLabel, QScrollArea, QGroupBox
class SearchResults(QScrollArea):
show_info = pyqtSignal(dict)
+ # TODO nice look
def __init__(self):
super(SearchResults, self).__init__()
self.widget = QWidget()
self.layout = QVBoxLayout()
self.widget.setLayout(self.layout)
self.setWidget(self.widget)
+ self.setWidgetResizable(True)
def show_results(self, results: list):
QVBoxLayout().addWidget(self.widget)
@@ -28,13 +30,14 @@ class SearchResults(QScrollArea):
self.setWidget(self.widget)
-class _SearchResultItem(QWidget):
+class _SearchResultItem(QGroupBox):
res: dict
show_info = pyqtSignal(dict)
def __init__(self, result: dict):
super(_SearchResultItem, self).__init__()
self.layout = QHBoxLayout()
+
self.res = result
self.title = QLabel(self.res["title"])
self.layout.addWidget(self.title)
diff --git a/rare/components/tabs/shop/shop_info.py b/rare/components/tabs/shop/shop_info.py
index e76f934f..ab9334ce 100644
--- a/rare/components/tabs/shop/shop_info.py
+++ b/rare/components/tabs/shop/shop_info.py
@@ -3,9 +3,12 @@ import logging
import webbrowser
from PyQt5.QtCore import QLocale, QUrl, QJsonDocument, QJsonParseError, Qt
-from PyQt5.QtGui import QPixmap
+from PyQt5.QtGui import QPixmap, QFont
from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply
-from PyQt5.QtWidgets import QWidget
+from PyQt5.QtWidgets import QWidget, QLabel
+from rare.utils.utils import get_lang
+
+from rare.utils.extra_widgets import WaitingSpinner
from rare.components.tabs.shop.shop_models import ShopGame
from rare.ui.components.tabs.store.shop_game_info import Ui_shop_info
@@ -17,14 +20,18 @@ class ShopGameInfo(QWidget, Ui_shop_info):
game: ShopGame
data: dict
- # TODO Design; More information(requirements, more images); bundles (eg EA triple)
+ # TODO Design
def __init__(self):
super(ShopGameInfo, self).__init__()
self.setupUi(self)
self.open_store_button.clicked.connect(self.button_clicked)
+ self.image_stack.addWidget(WaitingSpinner())
self.manager = QNetworkAccessManager()
def update_game(self, data: dict):
+ self.image_stack.setCurrentIndex(1)
+ for i in reversed(range(self.req_group_box.layout().count())):
+ self.req_group_box.layout().itemAt(i).widget().setParent(None)
slug = data["productSlug"]
if "/home" in slug:
slug = slug.replace("/home", "")
@@ -40,7 +47,8 @@ class ShopGameInfo(QWidget, Ui_shop_info):
is_bundle = True
# init API request
- locale = QLocale.system().name().split("_")[0]
+ locale = get_lang()
+ locale = "en"
url = f"https://store-content.ak.epicgames.com/api/{locale}/content/{'products' if not is_bundle else 'bundles'}/{slug}"
# game = api_utils.get_product(slug, locale)
self.request = self.manager.get(QNetworkRequest(QUrl(url)))
@@ -69,12 +77,33 @@ class ShopGameInfo(QWidget, Ui_shop_info):
self.price.setText(self.game.price)
self.discount_price.setText(self.game.discount_price)
+ # print(self.game.reqs)
+ bold_font = QFont()
+ bold_font.setBold(True)
+ min_label = QLabel(self.tr("Minimum"))
+ min_label.setFont(bold_font)
+ rec_label = QLabel(self.tr("Recommend"))
+ rec_label.setFont(bold_font)
+ self.req_group_box.layout().addWidget(min_label, 0, 1)
+ self.req_group_box.layout().addWidget(rec_label, 0, 2)
+
+ for i, (key, value) in enumerate(self.game.reqs["Windows"].items()):
+ self.req_group_box.layout().addWidget(QLabel(key), i+1, 0)
+ min_label = QLabel(value[0])
+ min_label.setWordWrap(True)
+ self.req_group_box.layout().addWidget(min_label, i+1, 1)
+ rec_label = QLabel(value[1])
+ rec_label.setWordWrap(True)
+ self.req_group_box.layout().addWidget(rec_label, i+1, 2)
self.image_request = self.manager.get(QNetworkRequest(QUrl(self.game.image_urls.offer_image_tall)))
self.image_request.finished.connect(self.image_loaded)
try:
- self.dev.setText(",".join(self.game.developer))
+ if isinstance(self.game.developer, list):
+ self.dev.setText(", ".join(self.game.developer))
+ else:
+ self.dev.setText(self.game.developer)
except KeyError:
pass
@@ -88,6 +117,7 @@ class ShopGameInfo(QWidget, Ui_shop_info):
pixmap = QPixmap()
pixmap.loadFromData(data)
self.image.setPixmap(pixmap.scaled(240, 320, transformMode=Qt.SmoothTransformation))
+ self.image_stack.setCurrentIndex(0)
else:
logger.error("Load image failed")
diff --git a/rare/components/tabs/shop/shop_models.py b/rare/components/tabs/shop/shop_models.py
index b9b9b594..e6942f2d 100644
--- a/rare/components/tabs/shop/shop_models.py
+++ b/rare/components/tabs/shop/shop_models.py
@@ -1,5 +1,3 @@
-
-
class _ImageUrlModel:
def __init__(self, front_tall: str = "", offer_image_tall: str = "",
thumbnail: str = "", front_wide: str = ""):
@@ -26,8 +24,8 @@ class _ImageUrlModel:
class ShopGame:
# TODO: Copyrights etc
def __init__(self, title: str = "", image_urls: _ImageUrlModel = None, social_links: dict = None,
- langs: list = None, reqs: list = None, publisher: str = "", developer: str = "",
- original_price: str = "", discount_price: str=""):
+ langs: list = None, reqs: dict = None, publisher: str = "", developer: str = "",
+ original_price: str = "", discount_price: str = ""):
self.title = title
self.image_urls = image_urls
self.links = []
@@ -64,11 +62,11 @@ class ShopGame:
if item.startswith("link"):
tmp.links.append(tuple((item.replace("link", ""), links[item])))
tmp.available_voice_langs = api_data["data"]["requirements"]["languages"]
- tmp.reqs = []
+ tmp.reqs = {}
for i, system in enumerate(api_data["data"]["requirements"]["systems"]):
- tmp.reqs.append({"name": system["systemType"], "value": []})
+ tmp.reqs[system["systemType"]] = {}
for req in system["details"]:
- tmp.reqs[i]["value"].append(tuple((req["minimum"], req["recommended"])))
+ tmp.reqs[system["systemType"]][req["title"]] = (req["minimum"], req["recommended"])
tmp.publisher = api_data["data"]["meta"].get("publisher", "undefined")
tmp.developer = api_data["data"]["meta"].get("developer", "undefined")
diff --git a/rare/ui/components/tabs/store/shop_game_info.py b/rare/ui/components/tabs/store/shop_game_info.py
index 5fa9bcba..ca03f6b5 100644
--- a/rare/ui/components/tabs/store/shop_game_info.py
+++ b/rare/ui/components/tabs/store/shop_game_info.py
@@ -22,9 +22,18 @@ class Ui_shop_info(object):
self.verticalLayout.addWidget(self.back_button)
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
- self.image = QtWidgets.QLabel(shop_info)
+ self.image_stack = QtWidgets.QStackedWidget(shop_info)
+ self.image_stack.setObjectName("image_stack")
+ self.page = QtWidgets.QWidget()
+ self.page.setObjectName("page")
+ self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.page)
+ self.verticalLayout_3.setObjectName("verticalLayout_3")
+ self.image = QtWidgets.QLabel(self.page)
+ self.image.setMinimumSize(QtCore.QSize(240, 320))
self.image.setObjectName("image")
- self.horizontalLayout.addWidget(self.image)
+ self.verticalLayout_3.addWidget(self.image)
+ self.image_stack.addWidget(self.page)
+ self.horizontalLayout.addWidget(self.image_stack)
self.verticalLayout_2 = QtWidgets.QVBoxLayout()
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.title = QtWidgets.QLabel(shop_info)
@@ -42,17 +51,25 @@ class Ui_shop_info(object):
self.discount_price = QtWidgets.QLabel(shop_info)
self.discount_price.setObjectName("discount_price")
self.verticalLayout_2.addWidget(self.discount_price)
- self.horizontalLayout.addLayout(self.verticalLayout_2)
- spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
- self.horizontalLayout.addItem(spacerItem)
- self.verticalLayout.addLayout(self.horizontalLayout)
self.open_store_button = QtWidgets.QPushButton(shop_info)
self.open_store_button.setObjectName("open_store_button")
- self.verticalLayout.addWidget(self.open_store_button)
- spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
- self.verticalLayout.addItem(spacerItem1)
+ self.verticalLayout_2.addWidget(self.open_store_button)
+ spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+ self.verticalLayout_2.addItem(spacerItem)
+ self.horizontalLayout.addLayout(self.verticalLayout_2)
+ spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+ self.horizontalLayout.addItem(spacerItem1)
+ self.verticalLayout.addLayout(self.horizontalLayout)
+ self.req_group_box = QtWidgets.QGroupBox(shop_info)
+ self.req_group_box.setObjectName("req_group_box")
+ self.gridLayout_2 = QtWidgets.QGridLayout(self.req_group_box)
+ self.gridLayout_2.setObjectName("gridLayout_2")
+ self.verticalLayout.addWidget(self.req_group_box)
+ spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+ self.verticalLayout.addItem(spacerItem2)
self.retranslateUi(shop_info)
+ self.image_stack.setCurrentIndex(0)
QtCore.QMetaObject.connectSlotsByName(shop_info)
def retranslateUi(self, shop_info):
@@ -65,6 +82,7 @@ class Ui_shop_info(object):
self.price.setText(_translate("shop_info", "TextLabel"))
self.discount_price.setText(_translate("shop_info", "TextLabel"))
self.open_store_button.setText(_translate("shop_info", "Buy Game in Epic Games Store"))
+ self.req_group_box.setTitle(_translate("shop_info", "Requirements"))
if __name__ == "__main__":
diff --git a/rare/ui/components/tabs/store/shop_game_info.ui b/rare/ui/components/tabs/store/shop_game_info.ui
index 5ca98cc4..9bdfe083 100644
--- a/rare/ui/components/tabs/store/shop_game_info.ui
+++ b/rare/ui/components/tabs/store/shop_game_info.ui
@@ -24,10 +24,27 @@
-
-
-
-
- TextLabel
+
+
+ 0
+
+
+
-
+
+
+
+ 240
+ 320
+
+
+
+ TextLabel
+
+
+
+
+
-
@@ -69,6 +86,26 @@
+ -
+
+
+ Buy Game in Epic Games Store
+
+
+
+ -
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 40
+
+
+
+
-
@@ -87,10 +124,11 @@
-
-
-
- Buy Game in Epic Games Store
+
+
+ Requirements
+
-