From 4c9ef8acd868db84a5935c6fad2a9be040d6a69f Mon Sep 17 00:00:00 2001 From: Dummerle <44114474+Dummerle@users.noreply.github.com> Date: Sun, 21 Nov 2021 22:44:45 +0100 Subject: [PATCH] Many fixes: - store: updated epic api + many other fixes - installing widget has now no border - disable startmenu and desktop link on unsupported os --- rare/components/main_window.py | 4 +- rare/components/tabs/__init__.py | 4 +- .../game_widgets/base_installed_widget.py | 15 +++---- .../game_widgets/installing_game_widget.py | 7 ++-- rare/components/tabs/settings/rare.py | 29 ++++++++------ rare/components/tabs/shop/game_widgets.py | 4 ++ rare/components/tabs/shop/shop_api_core.py | 17 +++++--- rare/components/tabs/shop/shop_models.py | 39 +++++++++++-------- rare/components/tabs/shop/shop_widget.py | 17 ++++---- rare/ui/components/tabs/settings/rare.py | 18 ++++----- rare/ui/components/tabs/settings/rare.ui | 4 +- 11 files changed, 91 insertions(+), 67 deletions(-) diff --git a/rare/components/main_window.py b/rare/components/main_window.py index 2e5e820c..ec191d62 100644 --- a/rare/components/main_window.py +++ b/rare/components/main_window.py @@ -1,7 +1,7 @@ import os from logging import getLogger -from PyQt5.QtCore import Qt, QSettings, QTimer, QSize, QRect +from PyQt5.QtCore import Qt, QSettings, QTimer, QSize from PyQt5.QtGui import QCloseEvent, QCursor from PyQt5.QtWidgets import QMainWindow, QMessageBox, QApplication @@ -51,7 +51,7 @@ class MainWindow(QMainWindow): if not shared.args.offline: self.rpc = DiscordRPC() - self.tab_widget.delete_presence.connect(self.rpc.set_discord_rpc) + if shared.args.subparser == "launch": if shared.args.app_name in [i.app_name for i in self.tab_widget.games_tab.installed]: logger.info("Launching " + self.core.get_installed_game(shared.args.app_name).title) diff --git a/rare/components/tabs/__init__.py b/rare/components/tabs/__init__.py index cd1e22b2..17556e49 100644 --- a/rare/components/tabs/__init__.py +++ b/rare/components/tabs/__init__.py @@ -1,4 +1,4 @@ -from PyQt5.QtCore import QSize, pyqtSignal +from PyQt5.QtCore import QSize from PyQt5.QtWidgets import QMenu, QTabWidget, QWidget, QWidgetAction, QShortcut from qtawesome import icon @@ -13,8 +13,6 @@ from rare.components.tabs.tab_utils import MainTabBar, TabButtonWidget class TabWidget(QTabWidget): - delete_presence = pyqtSignal() - def __init__(self, parent): super(TabWidget, self).__init__(parent=parent) disabled_tab = 3 if not shared.args.offline else 1 diff --git a/rare/components/tabs/games/game_widgets/base_installed_widget.py b/rare/components/tabs/games/game_widgets/base_installed_widget.py index 45e6311e..0e4f3809 100644 --- a/rare/components/tabs/games/game_widgets/base_installed_widget.py +++ b/rare/components/tabs/games/game_widgets/base_installed_widget.py @@ -88,13 +88,14 @@ class BaseInstalledWidget(QGroupBox): start_menu_file = os.path.expandvars("%appdata%/Microsoft/Windows/Start Menu") else: start_menu_file = "" - if os.path.exists(start_menu_file): - self.create_start_menu = QAction(self.tr("Remove start menu link")) - else: - self.create_start_menu = QAction(self.tr("Create start menu link")) - if not self.is_origin: - self.create_start_menu.triggered.connect(lambda: self.create_desktop_link("start_menu")) - self.addAction(self.create_start_menu) + if platform.system() in ["Windows", "Linux"]: + if os.path.exists(start_menu_file): + self.create_start_menu = QAction(self.tr("Remove start menu link")) + else: + self.create_start_menu = QAction(self.tr("Create start menu link")) + if not self.is_origin: + self.create_start_menu.triggered.connect(lambda: self.create_desktop_link("start_menu")) + self.addAction(self.create_start_menu) reload_image = QAction(self.tr("Reload Image"), self) reload_image.triggered.connect(self.reload_image) diff --git a/rare/components/tabs/games/game_widgets/installing_game_widget.py b/rare/components/tabs/games/game_widgets/installing_game_widget.py index d3451f80..13f27112 100644 --- a/rare/components/tabs/games/game_widgets/installing_game_widget.py +++ b/rare/components/tabs/games/game_widgets/installing_game_widget.py @@ -1,22 +1,23 @@ from PyQt5.QtCore import Qt, QRect from PyQt5.QtGui import QPaintEvent, QPainter, QPixmap, QPen, QFont, QColor -from PyQt5.QtWidgets import QGroupBox, QVBoxLayout, QLabel, QHBoxLayout, QWidget +from PyQt5.QtWidgets import QVBoxLayout, QLabel, QHBoxLayout, QWidget from legendary.models.game import Game from rare.utils.utils import get_pixmap, get_uninstalled_pixmap, optimal_text_background, text_color_for_background -class InstallingGameWidget(QGroupBox): +class InstallingGameWidget(QWidget): def __init__(self): super(InstallingGameWidget, self).__init__() self.setObjectName("game_widget_icon") - + self.setProperty("noBorder", 1) self.setLayout(QVBoxLayout()) self.pixmap = QPixmap() w = 200 # self.pixmap = self.pixmap.scaled(w, int(w * 4 / 3), transformMode=Qt.SmoothTransformation) self.image_widget = PaintWidget() + self.setContentsMargins(4, 4, 4, 4) self.image_widget.setFixedSize(w, int(w * 4 / 3)) self.layout().addWidget(self.image_widget) diff --git a/rare/components/tabs/settings/rare.py b/rare/components/tabs/settings/rare.py index 7720c58f..c7ae01e2 100644 --- a/rare/components/tabs/settings/rare.py +++ b/rare/components/tabs/settings/rare.py @@ -11,7 +11,7 @@ from rare import cache_dir, shared from rare.components.tabs.settings.rpc import RPCSettings from rare.ui.components.tabs.settings.rare import Ui_RareSettings from rare.utils import utils -from rare.utils.utils import get_translations, get_color_schemes, set_color_pallete, get_style_sheets, set_style_sheet +from rare.utils.utils import get_translations, get_color_schemes, set_color_pallete, get_style_sheets, set_style_sheet logger = getLogger("RareSettings") @@ -109,13 +109,20 @@ class RareSettings(QWidget, Ui_RareSettings): self.desktop_file = "" self.start_menu_link = "" - if os.path.exists(self.desktop_file): - self.desktop_link.setText(self.tr("Remove desktop link")) - if os.path.exists(self.start_menu_link): - self.startmenu_link.setText(self.tr("Remove start menu link")) + if self.desktop_file: + if os.path.exists(self.desktop_file): + self.desktop_link_btn.setText(self.tr("Remove desktop link")) + else: + self.desktop_link.setDisabled(True) - self.desktop_link.clicked.connect(self.create_desktop_link) - self.startmenu_link.clicked.connect(self.create_start_menu_link) + if self.start_menu_link: + if os.path.exists(self.start_menu_link): + self.startmenu_link_btn.setText(self.tr("Remove start menu link")) + else: + self.startmenu_link_btn.setDisabled(True) + + self.desktop_link_btn.clicked.connect(self.create_desktop_link) + self.startmenu_link_btn.clicked.connect(self.create_start_menu_link) self.log_dir_open_button.clicked.connect(self.open_dir) self.log_dir_clean_button.clicked.connect(self.clean_logdir) @@ -139,10 +146,10 @@ class RareSettings(QWidget, Ui_RareSettings): try: if not os.path.exists(self.start_menu_link): utils.create_rare_desktop_link("start_menu") - self.startmenu_link.setText(self.tr("Remove start menu link")) + self.startmenu_link_btn.setText(self.tr("Remove start menu link")) else: os.remove(self.start_menu_link) - self.startmenu_link.setText(self.tr("Create start menu link")) + self.startmenu_link_btn.setText(self.tr("Create start menu link")) except PermissionError as e: logger.error(str(e)) QMessageBox.warning(self, "Error", "Permission error, cannot remove " + str(self.start_menu_link)) @@ -151,10 +158,10 @@ class RareSettings(QWidget, Ui_RareSettings): try: if not os.path.exists(self.desktop_file): utils.create_rare_desktop_link("desktop") - self.desktop_link.setText(self.tr("Remove Desktop link")) + self.desktop_link_btn.setText(self.tr("Remove Desktop link")) else: os.remove(self.desktop_file) - self.desktop_link.setText(self.tr("Create desktop link")) + self.desktop_link_btn.setText(self.tr("Create desktop link")) except PermissionError as e: logger.warning(self, "Error", "Permission error, cannot remove " + str(self.desktop_file)) diff --git a/rare/components/tabs/shop/game_widgets.py b/rare/components/tabs/shop/game_widgets.py index 167fce44..8c26f896 100644 --- a/rare/components/tabs/shop/game_widgets.py +++ b/rare/components/tabs/shop/game_widgets.py @@ -52,6 +52,8 @@ class GameWidget(QWidget): mini_layout.addWidget(QLabel(discount_price if discount_price != "0" else self.tr("Free"))) mini_layout.addWidget(price_label) else: + if price == "0": + price_label.setText(self.tr("Free")) mini_layout.addWidget(price_label) for c in r'<>?":|\/*': @@ -72,6 +74,8 @@ class GameWidget(QWidget): self.setLayout(self.layout) + self.setFixedSize(self.width + 10, self.width * 9 // 16 + 50) + def mousePressEvent(self, a0: QtGui.QMouseEvent) -> None: self.show_info.emit(self.json_info) diff --git a/rare/components/tabs/shop/shop_api_core.py b/rare/components/tabs/shop/shop_api_core.py index e0e481bc..d6c1142d 100644 --- a/rare/components/tabs/shop/shop_api_core.py +++ b/rare/components/tabs/shop/shop_api_core.py @@ -1,8 +1,9 @@ +import urllib.parse from logging import getLogger from PyQt5.QtCore import pyqtSignal, QObject -from rare.components.tabs.shop.constants import wishlist_query, search_query, game_query, add_to_wishlist_query, \ +from rare.components.tabs.shop.constants import wishlist_query, search_query, add_to_wishlist_query, \ remove_from_wishlist_query from rare.components.tabs.shop.shop_models import BrowseModel from rare.utils.qt_requests import QtRequestManager @@ -90,12 +91,16 @@ class ShopApiCore(QObject): self.next_browse_request = (browse_model, handle_func) return self.browse_active = True - payload = { - "variables": browse_model.__dict__, - "query": game_query - } + url = "https://www.epicgames.com/graphql?operationName=searchStoreQuery&variables=" + args = urllib.parse.quote_plus(str(browse_model.__dict__)) - self.auth_manager.post(graphql_url, payload, lambda data: self._handle_browse_games(data, handle_func)) + for old, new in [("%27", "%22"), ("+", ""), ("%3A", ":"), ("%2C", ","), ("%5B", "["), ("%5D", "]"), + ("True", "true")]: + args = args.replace(old, new) + + url = url + args + "&extensions=%7B%22persistedQuery%22:%7B%22version%22:1,%22sha256Hash%22:%220304d711e653a2914f3213a6d9163cc17153c60aef0ef52279731b02779231d2%22%7D%7D" + + self.auth_manager.get(url, lambda data: self._handle_browse_games(data, handle_func)) def _handle_browse_games(self, data, handle_func): self.browse_active = False diff --git a/rare/components/tabs/shop/shop_models.py b/rare/components/tabs/shop/shop_models.py index 3ab4ea78..c78e28e3 100644 --- a/rare/components/tabs/shop/shop_models.py +++ b/rare/components/tabs/shop/shop_models.py @@ -1,5 +1,4 @@ import datetime -import random from dataclasses import dataclass @@ -117,31 +116,37 @@ class BrowseModel: tag: str = "" withMapping: bool = True withPrice: bool = True - date: str = f"[,{datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%dT%X')}.{str(random.randint(0, 999)).zfill(3)}Z]" + date: str = f"[,{datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%dT%X')}.999Z]" price: str = "" onSale: bool = False @property def __dict__(self): - payload = {"category": self.category, - "count": self.count, - "country": self.country_code, - "keywords": self.keywords, - "locale": self.language_code + "-" + self.country_code, - "sortDir": self.sortDir, - "allowCountries": self.country_code, - "start": self.start, - "tag": self.tag, - "withMapping": self.withMapping, - "withPrice": self.withPrice, - "releaseDate": self.date, - "effectiveDate": self.date, - } - + payload = { + "allowCountries": self.country_code, + "category": self.category, + "count": self.count, + "country": self.country_code, + "keywords": self.keywords, + "locale": self.language_code, + "priceRange": self.price, + "releaseDate": self.date, + "sortBy": "releaseDate", + "sortDir": self.sortDir, + "start": self.start, + "tag": self.tag, + "withPrice": self.withPrice, + } if self.price == "free": payload["freeGame"] = True + payload.pop("priceRange") elif self.price.startswith(""): payload["priceRange"] = self.price.replace("", "") if self.onSale: payload["onSale"] = True + + if self.price: + payload["effectiveDate"] = self.date + else: + payload.pop("priceRange") return payload diff --git a/rare/components/tabs/shop/shop_widget.py b/rare/components/tabs/shop/shop_widget.py index 6e905c30..caadb21e 100644 --- a/rare/components/tabs/shop/shop_widget.py +++ b/rare/components/tabs/shop/shop_widget.py @@ -6,12 +6,12 @@ from PyQt5.QtCore import pyqtSignal from PyQt5.QtWidgets import QGroupBox, QScrollArea, QCheckBox, QVBoxLayout, QLabel, QPushButton, QHBoxLayout from legendary.core import LegendaryCore -from rare.components.tabs.shop import ShopApiCore -from rare.components.tabs.shop.constants import Constants -from rare.components.tabs.shop.game_widgets import GameWidget -from rare.components.tabs.shop.shop_models import BrowseModel from rare.ui.components.tabs.store.store import Ui_ShopWidget from rare.utils.extra_widgets import WaitingSpinner, FlowLayout, ButtonLineEdit +from . import ShopApiCore +from .constants import Constants +from .game_widgets import GameWidget +from .shop_models import BrowseModel logger = logging.getLogger("Shop") @@ -221,6 +221,8 @@ class ShopWidget(QScrollArea, Ui_ShopWidget): self.update_games_allowed = True self.prepare_request("") + self.on_discount.setChecked(False) + def prepare_request(self, price: str = None, added_tag: int = 0, removed_tag: int = 0, added_type: str = "", removed_type: str = ""): if not self.update_games_allowed: @@ -258,9 +260,8 @@ class ShopWidget(QScrollArea, Ui_ShopWidget): self.api_core.browse_games(browse_model, self.show_games) def show_games(self, data): - for child in self.game_widget.layout().children(): - child.deleteLater() - del child + for item in (self.game_widget.layout().itemAt(i) for i in range(self.game_widget.layout().count())): + item.widget().deleteLater() if data: for game in data: @@ -276,6 +277,8 @@ class ShopWidget(QScrollArea, Ui_ShopWidget): self.game_widget.setLayout(layout) self.game_stack.setCurrentIndex(0) + self.game_widget.layout().update() + class CheckBox(QCheckBox): activated = pyqtSignal(str) diff --git a/rare/ui/components/tabs/settings/rare.py b/rare/ui/components/tabs/settings/rare.py index 6b77cdf0..530658bd 100644 --- a/rare/ui/components/tabs/settings/rare.py +++ b/rare/ui/components/tabs/settings/rare.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'rare/ui/components/tabs/settings/rare.ui' # -# Created by: PyQt5 UI code generator 5.15.4 +# Created by: PyQt5 UI code generator 5.15.6 # # WARNING: Any manual changes made to this file will be lost when pyuic5 is # run again. Do not edit this file unless you know what you are doing. @@ -134,12 +134,12 @@ class Ui_RareSettings(object): self.groupBox.setObjectName("groupBox") self.shortcuts_layout = QtWidgets.QVBoxLayout(self.groupBox) self.shortcuts_layout.setObjectName("shortcuts_layout") - self.desktop_link = QtWidgets.QPushButton(self.groupBox) - self.desktop_link.setObjectName("desktop_link") - self.shortcuts_layout.addWidget(self.desktop_link) - self.startmenu_link = QtWidgets.QPushButton(self.groupBox) - self.startmenu_link.setObjectName("startmenu_link") - self.shortcuts_layout.addWidget(self.startmenu_link) + self.desktop_link_btn = QtWidgets.QPushButton(self.groupBox) + self.desktop_link_btn.setObjectName("desktop_link_btn") + self.shortcuts_layout.addWidget(self.desktop_link_btn) + self.startmenu_link_btn = QtWidgets.QPushButton(self.groupBox) + self.startmenu_link_btn.setObjectName("startmenu_link_btn") + self.shortcuts_layout.addWidget(self.startmenu_link_btn) self.right_layout.addWidget(self.groupBox) spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.right_layout.addItem(spacerItem2) @@ -169,8 +169,8 @@ class Ui_RareSettings(object): self.log_dir_open_button.setText(_translate("RareSettings", "Open Log directory")) self.log_dir_clean_button.setText(_translate("RareSettings", "Clean Log directory")) self.groupBox.setTitle(_translate("RareSettings", "Shortcuts")) - self.desktop_link.setText(_translate("RareSettings", "Create Desktop link")) - self.startmenu_link.setText(_translate("RareSettings", "Create start menu link")) + self.desktop_link_btn.setText(_translate("RareSettings", "Create Desktop link")) + self.startmenu_link_btn.setText(_translate("RareSettings", "Create start menu link")) if __name__ == "__main__": diff --git a/rare/ui/components/tabs/settings/rare.ui b/rare/ui/components/tabs/settings/rare.ui index 36cd8814..f64a7f89 100644 --- a/rare/ui/components/tabs/settings/rare.ui +++ b/rare/ui/components/tabs/settings/rare.ui @@ -247,14 +247,14 @@ - + Create Desktop link - + Create start menu link