Add requirements for shop
This commit is contained in:
parent
6355dd47c1
commit
9d02187d2f
|
@ -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)
|
||||
|
|
|
@ -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")
|
||||
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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__":
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Reference in a new issue