1
0
Fork 0
mirror of synced 2024-06-28 11:11:15 +12:00

Add requirements for shop

This commit is contained in:
Dummerle 2021-06-09 23:12:49 +02:00
parent 6355dd47c1
commit 9d02187d2f
5 changed files with 116 additions and 29 deletions

View file

@ -1,17 +1,19 @@
from PyQt5 import QtGui from PyQt5 import QtGui
from PyQt5.QtCore import pyqtSignal 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): class SearchResults(QScrollArea):
show_info = pyqtSignal(dict) show_info = pyqtSignal(dict)
# TODO nice look
def __init__(self): def __init__(self):
super(SearchResults, self).__init__() super(SearchResults, self).__init__()
self.widget = QWidget() self.widget = QWidget()
self.layout = QVBoxLayout() self.layout = QVBoxLayout()
self.widget.setLayout(self.layout) self.widget.setLayout(self.layout)
self.setWidget(self.widget) self.setWidget(self.widget)
self.setWidgetResizable(True)
def show_results(self, results: list): def show_results(self, results: list):
QVBoxLayout().addWidget(self.widget) QVBoxLayout().addWidget(self.widget)
@ -28,13 +30,14 @@ class SearchResults(QScrollArea):
self.setWidget(self.widget) self.setWidget(self.widget)
class _SearchResultItem(QWidget): class _SearchResultItem(QGroupBox):
res: dict res: dict
show_info = pyqtSignal(dict) show_info = pyqtSignal(dict)
def __init__(self, result: dict): def __init__(self, result: dict):
super(_SearchResultItem, self).__init__() super(_SearchResultItem, self).__init__()
self.layout = QHBoxLayout() self.layout = QHBoxLayout()
self.res = result self.res = result
self.title = QLabel(self.res["title"]) self.title = QLabel(self.res["title"])
self.layout.addWidget(self.title) self.layout.addWidget(self.title)

View file

@ -3,9 +3,12 @@ import logging
import webbrowser import webbrowser
from PyQt5.QtCore import QLocale, QUrl, QJsonDocument, QJsonParseError, Qt 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.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.components.tabs.shop.shop_models import ShopGame
from rare.ui.components.tabs.store.shop_game_info import Ui_shop_info 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 game: ShopGame
data: dict data: dict
# TODO Design; More information(requirements, more images); bundles (eg EA triple) # TODO Design
def __init__(self): def __init__(self):
super(ShopGameInfo, self).__init__() super(ShopGameInfo, self).__init__()
self.setupUi(self) self.setupUi(self)
self.open_store_button.clicked.connect(self.button_clicked) self.open_store_button.clicked.connect(self.button_clicked)
self.image_stack.addWidget(WaitingSpinner())
self.manager = QNetworkAccessManager() self.manager = QNetworkAccessManager()
def update_game(self, data: dict): 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"] slug = data["productSlug"]
if "/home" in slug: if "/home" in slug:
slug = slug.replace("/home", "") slug = slug.replace("/home", "")
@ -40,7 +47,8 @@ class ShopGameInfo(QWidget, Ui_shop_info):
is_bundle = True is_bundle = True
# init API request # 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}" 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) # game = api_utils.get_product(slug, locale)
self.request = self.manager.get(QNetworkRequest(QUrl(url))) 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.price.setText(self.game.price)
self.discount_price.setText(self.game.discount_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 = self.manager.get(QNetworkRequest(QUrl(self.game.image_urls.offer_image_tall)))
self.image_request.finished.connect(self.image_loaded) self.image_request.finished.connect(self.image_loaded)
try: 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: except KeyError:
pass pass
@ -88,6 +117,7 @@ class ShopGameInfo(QWidget, Ui_shop_info):
pixmap = QPixmap() pixmap = QPixmap()
pixmap.loadFromData(data) pixmap.loadFromData(data)
self.image.setPixmap(pixmap.scaled(240, 320, transformMode=Qt.SmoothTransformation)) self.image.setPixmap(pixmap.scaled(240, 320, transformMode=Qt.SmoothTransformation))
self.image_stack.setCurrentIndex(0)
else: else:
logger.error("Load image failed") logger.error("Load image failed")

View file

@ -1,5 +1,3 @@
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 = ""):
@ -26,8 +24,8 @@ class _ImageUrlModel:
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: list = None, publisher: str = "", developer: str = "", langs: list = None, reqs: dict = None, publisher: str = "", developer: str = "",
original_price: str = "", discount_price: str=""): original_price: str = "", discount_price: str = ""):
self.title = title self.title = title
self.image_urls = image_urls self.image_urls = image_urls
self.links = [] self.links = []
@ -64,11 +62,11 @@ class ShopGame:
if item.startswith("link"): if item.startswith("link"):
tmp.links.append(tuple((item.replace("link", ""), links[item]))) 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"]["languages"]
tmp.reqs = [] tmp.reqs = {}
for i, system in enumerate(api_data["data"]["requirements"]["systems"]): 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"]: 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.publisher = api_data["data"]["meta"].get("publisher", "undefined")
tmp.developer = api_data["data"]["meta"].get("developer", "undefined") tmp.developer = api_data["data"]["meta"].get("developer", "undefined")

View file

@ -22,9 +22,18 @@ class Ui_shop_info(object):
self.verticalLayout.addWidget(self.back_button) self.verticalLayout.addWidget(self.back_button)
self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout") 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.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 = QtWidgets.QVBoxLayout()
self.verticalLayout_2.setObjectName("verticalLayout_2") self.verticalLayout_2.setObjectName("verticalLayout_2")
self.title = QtWidgets.QLabel(shop_info) 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 = QtWidgets.QLabel(shop_info)
self.discount_price.setObjectName("discount_price") self.discount_price.setObjectName("discount_price")
self.verticalLayout_2.addWidget(self.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 = QtWidgets.QPushButton(shop_info)
self.open_store_button.setObjectName("open_store_button") self.open_store_button.setObjectName("open_store_button")
self.verticalLayout.addWidget(self.open_store_button) self.verticalLayout_2.addWidget(self.open_store_button)
spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.verticalLayout.addItem(spacerItem1) 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.retranslateUi(shop_info)
self.image_stack.setCurrentIndex(0)
QtCore.QMetaObject.connectSlotsByName(shop_info) QtCore.QMetaObject.connectSlotsByName(shop_info)
def retranslateUi(self, shop_info): def retranslateUi(self, shop_info):
@ -65,6 +82,7 @@ class Ui_shop_info(object):
self.price.setText(_translate("shop_info", "TextLabel")) self.price.setText(_translate("shop_info", "TextLabel"))
self.discount_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.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__": if __name__ == "__main__":

View file

@ -24,10 +24,27 @@
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout"> <layout class="QHBoxLayout" name="horizontalLayout">
<item> <item>
<widget class="QLabel" name="image"> <widget class="QStackedWidget" name="image_stack">
<property name="text"> <property name="currentIndex">
<string>TextLabel</string> <number>0</number>
</property> </property>
<widget class="QWidget" name="page">
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QLabel" name="image">
<property name="minimumSize">
<size>
<width>240</width>
<height>320</height>
</size>
</property>
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget> </widget>
</item> </item>
<item> <item>
@ -69,6 +86,26 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="QPushButton" name="open_store_button">
<property name="text">
<string>Buy Game in Epic Games Store</string>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_2">
<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> </layout>
</item> </item>
<item> <item>
@ -87,10 +124,11 @@
</layout> </layout>
</item> </item>
<item> <item>
<widget class="QPushButton" name="open_store_button"> <widget class="QGroupBox" name="req_group_box">
<property name="text"> <property name="title">
<string>Buy Game in Epic Games Store</string> <string>Requirements</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_2"/>
</widget> </widget>
</item> </item>
<item> <item>