Added other games,set type to scrollarea
This commit is contained in:
parent
bd6e195e37
commit
bc6b9e5ae2
6 changed files with 142 additions and 62 deletions
|
@ -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)
|
||||
|
|
|
@ -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"]] = {}
|
||||
|
|
|
@ -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, " \
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -14,6 +14,21 @@
|
|||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QScrollArea" name="scrollArea">
|
||||
<property name="widgetResizable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<widget class="QWidget" name="scrollAreaWidgetContents">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>677</width>
|
||||
<height>342</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_3">
|
||||
<item>
|
||||
<widget class="QLineEdit" name="search">
|
||||
<property name="placeholderText">
|
||||
|
@ -42,7 +57,6 @@
|
|||
<property name="title">
|
||||
<string>Other nice games</string>
|
||||
</property>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_7"/>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
|
@ -60,6 +74,10 @@
|
|||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
|
|
|
@ -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()
|
||||
|
||||
|
|
Loading…
Reference in a new issue