1
0
Fork 0
mirror of synced 2024-06-24 01:00:43 +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.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)

View file

@ -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")

View file

@ -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")

View file

@ -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__":

View file

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