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 +