From bc6b9e5ae2363acefa9935f882e891237fb44b0c Mon Sep 17 00:00:00 2001 From: Dummerle Date: Fri, 11 Jun 2021 13:37:09 +0200 Subject: [PATCH] Added other games,set type to scrollarea --- rare/components/tabs/shop/search_results.py | 7 +- rare/components/tabs/shop/shop_models.py | 2 +- rare/components/tabs/shop/shop_widget.py | 69 +++++++++++++-- rare/ui/components/tabs/store/store.py | 26 ++++-- rare/ui/components/tabs/store/store.ui | 98 ++++++++++++--------- rare/utils/extra_widgets.py | 2 +- 6 files changed, 142 insertions(+), 62 deletions(-) diff --git a/rare/components/tabs/shop/search_results.py b/rare/components/tabs/shop/search_results.py index f9c035e8..87ea7f85 100644 --- a/rare/components/tabs/shop/search_results.py +++ b/rare/components/tabs/shop/search_results.py @@ -67,12 +67,13 @@ class _SearchResultItem(QGroupBox): price = result['price']['totalPrice']['fmtPrice']['originalPrice'] discount_price = result['price']['totalPrice']['fmtPrice']['discountPrice'] price_layout = QHBoxLayout() - price = QLabel(price) - price_layout.addWidget(price) + price_label = QLabel(price) + price_layout.addWidget(price_label) + if price != discount_price: font = QFont() font.setStrikeOut(True) - price.setFont(font) + price_label.setFont(font) price_layout.addWidget(QLabel(discount_price)) # self.discount_price = QLabel(f"{self.tr('Discount price: ')}{discount_price}") self.layout.addLayout(price_layout) diff --git a/rare/components/tabs/shop/shop_models.py b/rare/components/tabs/shop/shop_models.py index f5f7b485..23e367fb 100644 --- a/rare/components/tabs/shop/shop_models.py +++ b/rare/components/tabs/shop/shop_models.py @@ -60,7 +60,7 @@ class ShopGame: for item in links: if item.startswith("link"): tmp.links.append(tuple((item.replace("link", ""), links[item]))) - tmp.available_voice_langs = api_data["data"]["requirements"]["languages"] + tmp.available_voice_langs = api_data["data"]["requirements"].get("languages", "Failed") tmp.reqs = {} for i, system in enumerate(api_data["data"]["requirements"]["systems"]): tmp.reqs[system["systemType"]] = {} diff --git a/rare/components/tabs/shop/shop_widget.py b/rare/components/tabs/shop/shop_widget.py index d63efe54..8bd37eb6 100644 --- a/rare/components/tabs/shop/shop_widget.py +++ b/rare/components/tabs/shop/shop_widget.py @@ -10,7 +10,7 @@ from PyQt5.QtCore import Qt, pyqtSignal, QUrl, QJsonDocument, QJsonParseError, \ QStringListModel from PyQt5.QtGui import QPixmap from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply -from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel, QCompleter, QGroupBox, QHBoxLayout +from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel, QCompleter, QGroupBox, QHBoxLayout, QScrollArea from rare.ui.components.tabs.store.store import Ui_ShopWidget from rare.utils.extra_widgets import WaitingSpinner, ImageLabel, FlowLayout @@ -18,13 +18,14 @@ from rare.utils.utils import get_lang # noinspection PyAttributeOutsideInit,PyBroadException -class ShopWidget(QWidget, Ui_ShopWidget): +class ShopWidget(QScrollArea, Ui_ShopWidget): show_info = pyqtSignal(list) show_game = pyqtSignal(dict) free_game_widgets = [] def __init__(self): super(ShopWidget, self).__init__() + self.setWidgetResizable(True) self.setupUi(self) self.manager = QNetworkAccessManager() self.free_games_widget = QWidget() @@ -44,6 +45,8 @@ class ShopWidget(QWidget, Ui_ShopWidget): self.search.returnPressed.connect(self.show_search_result) self.data = [] + self.games_groupbox.setLayout(FlowLayout()) + def load(self): if p := os.getenv("XDG_CACHE_HOME"): self.path = p @@ -55,7 +58,12 @@ class ShopWidget(QWidget, Ui_ShopWidget): self.free_game_request = self.manager.get(QNetworkRequest(QUrl(url))) self.free_game_request.finished.connect(self.add_free_games) - # free_games = api_utils.get_free_games() + game_list = ["Satisfactory", "Among Us", "Star Wars Jedi Fallen Order", "Watch Dogs", "Subnautica Below Zero"] + # TODO read from api + for game in game_list: + w = GameWidget.from_request(game, self.path) + self.games_groupbox.layout().addWidget(w) + w.show_info.connect(self.show_game.emit) def add_free_games(self): if self.free_game_request: @@ -111,14 +119,14 @@ class ShopWidget(QWidget, Ui_ShopWidget): coming_free_games.append(game) for free_game in free_games_now: - w = GameWidget(free_game, self.path) + w = GameWidget(self.path, free_game) w.show_info.connect(self.show_game.emit) self.free_games_now.layout().addWidget(w) self.free_game_widgets.append(w) self.free_games_now.layout().addStretch(1) for free_game in coming_free_games: - w = GameWidget(free_game, self.path) + w = GameWidget(self.path, free_game) if free_game["title"] != "Mystery Game": w.show_info.connect(self.show_game.emit) self.coming_free_games.layout().addWidget(w) @@ -188,8 +196,14 @@ class ShopWidget(QWidget, Ui_ShopWidget): class GameWidget(QWidget): show_info = pyqtSignal(dict) - def __init__(self, json_info, path: str): + def __init__(self, path, json_info=None): super(GameWidget, self).__init__() + if json_info: + self.init_ui(json_info, path) + self.path = path + + def init_ui(self, json_info, path): + self.path = path self.layout = QVBoxLayout() self.image = ImageLabel() self.json_info = json_info @@ -203,7 +217,7 @@ class GameWidget(QWidget): self.slug = json_info["productSlug"] self.title = json_info["title"] - if not os.path.exists(p := os.path.join(path, f"{json_info['title']}.png")): + if not os.path.exists(p := os.path.join(self.path, f"{json_info['title']}.png")): for img in json_info["keyImages"]: if json_info["title"] != "Mystery Game": if img["type"] == "DieselStoreFrontWide": @@ -220,17 +234,56 @@ class GameWidget(QWidget): else: print("No image found") width = 300 - self.image.setPixmap(QPixmap(os.path.join(path, f"{json_info['title']}.png")) + self.image.setPixmap(QPixmap(os.path.join(self.path, f"{json_info['title']}.png")) .scaled(width, int(width * 9 / 16), transformMode=Qt.SmoothTransformation)) self.layout.addWidget(self.image) self.title_label = QLabel(json_info["title"]) + self.title_label.setWordWrap(True) self.layout.addWidget(self.title_label) self.setLayout(self.layout) def mousePressEvent(self, a0: QtGui.QMouseEvent) -> None: self.show_info.emit(self.json_info) + @classmethod + def from_request(cls, name, path): + c = cls(path) + c.manager = QNetworkAccessManager() + c.request = c.manager.get(QNetworkRequest()) + + locale = get_lang() + payload = json.dumps({ + "query": query, + "variables": {"category": "games/edition/base|bundles/games|editors|software/edition/base", "count": 1, + "country": "DE", "keywords": name, "locale": locale, "sortDir": "DESC", + "allowCountries": locale.upper(), + "start": 0, "tag": "", "withMapping": False, "withPrice": True} + }).encode() + request = QNetworkRequest(QUrl("https://www.epicgames.com/graphql")) + request.setHeader(QNetworkRequest.ContentTypeHeader, "application/json") + c.search_request = c.manager.post(request, payload) + c.search_request.finished.connect(lambda: c.handle_response(path)) + return c + + def handle_response(self, path): + if self.search_request: + if self.search_request.error() == QNetworkReply.NoError: + error = QJsonParseError() + json_data = QJsonDocument.fromJson(self.search_request.readAll().data(), error) + if QJsonParseError.NoError == error.error: + data = json.loads(json_data.toJson().data().decode())["data"]["Catalog"]["searchStore"][ + "elements"][0] + self.init_ui(data, path) + else: + logging.error(error.errorString()) + return + + else: + return + else: + return + query = "query searchStoreQuery($allowCountries: String, $category: String, $count: Int, $country: String!, " \ "$keywords: String, $locale: String, $namespace: String, $withMapping: Boolean = false, $itemNs: String, " \ diff --git a/rare/ui/components/tabs/store/store.py b/rare/ui/components/tabs/store/store.py index ccbf9aa0..6193e3a9 100644 --- a/rare/ui/components/tabs/store/store.py +++ b/rare/ui/components/tabs/store/store.py @@ -17,24 +17,32 @@ class Ui_ShopWidget(object): ShopWidget.resize(697, 362) self.verticalLayout = QtWidgets.QVBoxLayout(ShopWidget) self.verticalLayout.setObjectName("verticalLayout") - self.search = QtWidgets.QLineEdit(ShopWidget) + self.scrollArea = QtWidgets.QScrollArea(ShopWidget) + self.scrollArea.setWidgetResizable(True) + self.scrollArea.setObjectName("scrollArea") + self.scrollAreaWidgetContents = QtWidgets.QWidget() + self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 677, 342)) + self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents") + self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.scrollAreaWidgetContents) + self.verticalLayout_3.setObjectName("verticalLayout_3") + self.search = QtWidgets.QLineEdit(self.scrollAreaWidgetContents) self.search.setObjectName("search") - self.verticalLayout.addWidget(self.search) - self.free_game_group_box = QtWidgets.QGroupBox(ShopWidget) + self.verticalLayout_3.addWidget(self.search) + self.free_game_group_box = QtWidgets.QGroupBox(self.scrollAreaWidgetContents) self.free_game_group_box.setObjectName("free_game_group_box") self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.free_game_group_box) self.verticalLayout_2.setObjectName("verticalLayout_2") self.free_games_stack = QtWidgets.QStackedWidget(self.free_game_group_box) self.free_games_stack.setObjectName("free_games_stack") self.verticalLayout_2.addWidget(self.free_games_stack) - self.verticalLayout.addWidget(self.free_game_group_box) - self.games_groupbox = QtWidgets.QGroupBox(ShopWidget) + self.verticalLayout_3.addWidget(self.free_game_group_box) + self.games_groupbox = QtWidgets.QGroupBox(self.scrollAreaWidgetContents) self.games_groupbox.setObjectName("games_groupbox") - self.horizontalLayout_7 = QtWidgets.QHBoxLayout(self.games_groupbox) - self.horizontalLayout_7.setObjectName("horizontalLayout_7") - self.verticalLayout.addWidget(self.games_groupbox) + self.verticalLayout_3.addWidget(self.games_groupbox) spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) - self.verticalLayout.addItem(spacerItem) + self.verticalLayout_3.addItem(spacerItem) + self.scrollArea.setWidget(self.scrollAreaWidgetContents) + self.verticalLayout.addWidget(self.scrollArea) self.retranslateUi(ShopWidget) self.free_games_stack.setCurrentIndex(-1) diff --git a/rare/ui/components/tabs/store/store.ui b/rare/ui/components/tabs/store/store.ui index 587130de..2c0beb2b 100644 --- a/rare/ui/components/tabs/store/store.ui +++ b/rare/ui/components/tabs/store/store.ui @@ -15,49 +15,67 @@ - - - Search Games + + + true + + + + 0 + 0 + 677 + 342 + + + + + + + Search Games + + + + + + + Free Games + + + + + + -1 + + + + + + + + + + Other nice games + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + - - - - Free Games - - - - - - -1 - - - - - - - - - - Other nice games - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - diff --git a/rare/utils/extra_widgets.py b/rare/utils/extra_widgets.py index c47b7fb3..fa2abde5 100644 --- a/rare/utils/extra_widgets.py +++ b/rare/utils/extra_widgets.py @@ -259,7 +259,7 @@ class ImageLabel(QLabel): super(ImageLabel, self).__init__() path = os.path.expanduser("~/.cache/rare/cache") if p := os.environ.get("XDG_CACHE_HOME"): - path = p + path = os.path.join(p, "rare", "cache") self.path = path self.manager = QNetworkAccessManager()