From c07992b98261a77a2326f761812dbda032e632f2 Mon Sep 17 00:00:00 2001 From: Dummerle Date: Sun, 12 Sep 2021 23:28:54 +0200 Subject: [PATCH] Fix some memory leaks and some other errors --- rare/__main__.py | 3 - rare/app.py | 2 +- .../tabs/downloads/dl_queue_widget.py | 7 +- rare/components/tabs/games/game_list.py | 19 +- rare/components/tabs/shop/game_info.py | 10 +- rare/components/tabs/shop/shop_api_core.py | 12 +- rare/components/tabs/shop/shop_widget.py | 10 +- rare/components/tabs/shop/wishlist.py | 21 +- rare/ui/components/tabs/store/wishlist.py | 4 + rare/ui/components/tabs/store/wishlist.ui | 357 +++++++++--------- 10 files changed, 245 insertions(+), 200 deletions(-) diff --git a/rare/__main__.py b/rare/__main__.py index a56092a2..0757fe98 100644 --- a/rare/__main__.py +++ b/rare/__main__.py @@ -3,11 +3,8 @@ import os import pathlib import sys -import traceback from argparse import ArgumentParser -from PyQt5.QtWidgets import QApplication, QMessageBox - from rare import __version__, data_dir from rare.utils import singleton diff --git a/rare/app.py b/rare/app.py index ea87ee12..2468cf86 100644 --- a/rare/app.py +++ b/rare/app.py @@ -178,6 +178,6 @@ def start(args): exit_code = app.exec_() # if not restart # restart app - app.deleteLater() + del app if exit_code != -133742: break diff --git a/rare/components/tabs/downloads/dl_queue_widget.py b/rare/components/tabs/downloads/dl_queue_widget.py index 51c0627d..54aecd7a 100644 --- a/rare/components/tabs/downloads/dl_queue_widget.py +++ b/rare/components/tabs/downloads/dl_queue_widget.py @@ -71,8 +71,9 @@ class DlQueueWidget(QGroupBox): def update_queue(self, dl_queue: list): logger.info("Update Queue " + ", ".join(i.download.game.app_title for i in dl_queue)) self.dl_queue = dl_queue - QWidget().setLayout(self.layout()) - self.setLayout(QVBoxLayout()) + + for item in (self.layout().itemAt(i) for i in range(self.layout().count())): + item.widget().deleteLater() if len(dl_queue) == 0: self.layout().addWidget(QLabel(self.tr("No downloads in queue"))) @@ -88,8 +89,6 @@ class DlQueueWidget(QGroupBox): if index + 1 == len(dl_queue): widget.move_down_buttton.setDisabled(True) - self.setLayout(self.layout()) - def remove(self, app_name): for index, i in enumerate(self.dl_queue): if i.download.game.app_name == app_name: diff --git a/rare/components/tabs/games/game_list.py b/rare/components/tabs/games/game_list.py index ff1b1e7b..b4162332 100644 --- a/rare/components/tabs/games/game_list.py +++ b/rare/components/tabs/games/game_list.py @@ -289,7 +289,10 @@ class GameList(QStackedWidget): # new installed elif self.core.is_installed(widgets[0].game.app_name) and not isinstance(widgets[0], BaseInstalledWidget): - self.widgets.pop(widgets[0].game.app_name) + name = widgets[0].game.app_name + self.widgets[name][0].deleteLater() + self.widgets[name][1].deleteLater() + self.widgets.pop(name) # QWidget().setLayout(self.icon_layout) @@ -304,6 +307,9 @@ class GameList(QStackedWidget): self.list_layout.removeWidget(widgets[1]) self.icon_layout.removeWidget(widgets[0]) + widgets[0].deleteLater() + widgets[1].deleteLater() + self.widgets.pop(app_name) game = self.core.get_game(app_name, True) @@ -331,6 +337,8 @@ class GameList(QStackedWidget): self.icon_layout.removeWidget(self.widgets[app_name][0]) self.list_layout.removeWidget(self.widgets[app_name][1]) + self.widgets[name][0].deleteLater() + self.widgets[name][1].deleteLater() self.widgets.pop(name) igame = self.core.get_installed_game(name) @@ -340,6 +348,9 @@ class GameList(QStackedWidget): self.icon_layout.removeWidget(self.widgets[app_name][0]) self.list_layout.removeWidget(self.widgets[app_name][1]) + self.widgets[name][0].deleteLater() + self.widgets[name][1].deleteLater() + self.widgets.pop(name) game = self.core.get_game(name, True) @@ -379,15 +390,15 @@ class GameList(QStackedWidget): # get Uninstalled games games, self.dlcs = self.core.get_game_and_dlc_list() for game in sorted(games, key=lambda x: x.app_title): - if not game.app_name in installed_names: + if game.app_name not in installed_names: self.uninstalled_names.append(game) for game in self.uninstalled_names: i_widget, list_widget = self.widgets[game.app_name] icon_layout.addWidget(i_widget) list_layout.addWidget(list_widget) - QWidget().setLayout(self.icon_layout) - QWidget().setLayout(self.list_layout) + self.icon_layout.deleteLater() + self.list_layout.deleteLater() self.icon_widget = QWidget() self.list_widget = QWidget() diff --git a/rare/components/tabs/shop/game_info.py b/rare/components/tabs/shop/game_info.py index fa278510..3b9189f1 100644 --- a/rare/components/tabs/shop/game_info.py +++ b/rare/components/tabs/shop/game_info.py @@ -3,7 +3,7 @@ import webbrowser from PyQt5.QtCore import Qt from PyQt5.QtGui import QPixmap, QFont -from PyQt5.QtWidgets import QWidget, QLabel, QPushButton, QHBoxLayout +from PyQt5.QtWidgets import QWidget, QLabel, QPushButton, QHBoxLayout, QSpacerItem, QGroupBox from qtawesome import icon from rare.components.tabs.shop.shop_models import ShopGame @@ -175,9 +175,15 @@ class ShopGameInfo(QWidget, Ui_shop_info): self.tags.setText(", ".join(self.game.tags)) # clear Layout - QWidget().setLayout(self.social_link_gb.layout()) + for widget in (self.social_link_gb.layout().itemAt(i) for i in range(self.social_link_gb.layout().count())): + if not isinstance(widget, QSpacerItem): + widget.widget().deleteLater() + self.social_link_gb.deleteLater() + self.social_link_gb = QGroupBox(self.tr("Social Links")) self.social_link_gb.setLayout(QHBoxLayout()) + self.layout().insertWidget(3, self.social_link_gb) + self.social_link_gb.layout().addStretch(1) link_count = 0 for name, url in self.game.links: diff --git a/rare/components/tabs/shop/shop_api_core.py b/rare/components/tabs/shop/shop_api_core.py index 4a27ac3d..1b031b03 100644 --- a/rare/components/tabs/shop/shop_api_core.py +++ b/rare/components/tabs/shop/shop_api_core.py @@ -60,7 +60,11 @@ class ShopApiCore(QObject): self.manager.post(graphql_url, payload, lambda data: self._handle_search(data, handle_func)) def _handle_search(self, data, handle_func): - handle_func(data["data"]["Catalog"]["searchStore"]["elements"]) + try: + handle_func(data["data"]["Catalog"]["searchStore"]["elements"]) + except KeyError as e: + logger.error(str(e)) + handle_func([]) def browse_games(self, browse_model: BrowseModel, handle_func): if self.browse_active: @@ -77,7 +81,11 @@ class ShopApiCore(QObject): def _handle_browse_games(self, data, handle_func): self.browse_active = False if not self.next_browse_request: - handle_func(data["data"]["Catalog"]["searchStore"]["elements"]) + try: + handle_func(data["data"]["Catalog"]["searchStore"]["elements"]) + except KeyError as e: + logger.error(str(e)) + handle_func([]) else: self.browse_games(*self.next_browse_request) self.next_browse_request = tuple(()) diff --git a/rare/components/tabs/shop/shop_widget.py b/rare/components/tabs/shop/shop_widget.py index 507cfedd..2ec84466 100644 --- a/rare/components/tabs/shop/shop_widget.py +++ b/rare/components/tabs/shop/shop_widget.py @@ -80,9 +80,10 @@ class ShopWidget(QScrollArea, Ui_ShopWidget): self.api_core.get_wishlist(self.add_wishlist_items) def add_wishlist_items(self, wishlist): - QWidget().setLayout(self.discount_widget.layout()) - self.discount_widget.setLayout(FlowLayout()) + for item in (self.discount_widget.layout().itemAt(i) for i in range(self.discount_widget.layout().count())): + item.widget().deleteLater() + discounts = 0 for game in wishlist: if not game: @@ -232,7 +233,12 @@ 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 + QWidget().setLayout(self.game_widget.layout()) + if data: self.game_widget.setLayout(FlowLayout()) diff --git a/rare/components/tabs/shop/wishlist.py b/rare/components/tabs/shop/wishlist.py index 45645205..e1d825b2 100644 --- a/rare/components/tabs/shop/wishlist.py +++ b/rare/components/tabs/shop/wishlist.py @@ -26,6 +26,8 @@ class Wishlist(QStackedWidget, Ui_Wishlist): self.reload_button.clicked.connect(self.update_wishlist) self.reload_button.setIcon(icon("fa.refresh", color="white")) + self.reverse.stateChanged.connect(lambda: self.set_wishlist(sort=self.sort_cb.currentIndex())) + def update_wishlist(self): self.setCurrentIndex(1) self.api_core.get_wishlist(self.set_wishlist) @@ -54,24 +56,26 @@ class Wishlist(QStackedWidget, Ui_Wishlist): else: self.no_games_label.setVisible(False) - def set_wishlist(self, wishlist, sort=0): - self.wishlist = wishlist + def set_wishlist(self, wishlist=None, sort=0): + if wishlist is not None: + self.wishlist = wishlist for i in self.widgets: i.setParent(None) + del i if sort == 0: - sorted_list = sorted(wishlist, key=lambda x: x["offer"]["title"]) + sorted_list = sorted(self.wishlist, key=lambda x: x["offer"]["title"]) elif sort == 1: - sorted_list = sorted(wishlist, key=lambda x: x["offer"]['price']['totalPrice']['fmtPrice']['discountPrice']) + sorted_list = sorted(self.wishlist, key=lambda x: x["offer"]['price']['totalPrice']['fmtPrice']['discountPrice']) elif sort == 2: - sorted_list = sorted(wishlist, key=lambda x: x["offer"]["seller"]["name"]) + sorted_list = sorted(self.wishlist, key=lambda x: x["offer"]["seller"]["name"]) elif sort == 3: - sorted_list = sorted(wishlist, reverse=True, key=lambda x: 1 - ( + sorted_list = sorted(self.wishlist, reverse=True, key=lambda x: 1 - ( x["offer"]["price"]["totalPrice"]["discountPrice"] / x["offer"]["price"]["totalPrice"][ "originalPrice"])) else: - sorted_list = wishlist + sorted_list = self.wishlist self.widgets.clear() if len(sorted_list) == 0: @@ -79,6 +83,9 @@ class Wishlist(QStackedWidget, Ui_Wishlist): else: self.no_games_label.setVisible(False) + if self.reverse.isChecked(): + sorted_list.reverse() + for game in sorted_list: w = WishlistWidget(game["offer"]) self.widgets.append(w) diff --git a/rare/ui/components/tabs/store/wishlist.py b/rare/ui/components/tabs/store/wishlist.py index 72cc6ac7..85963d12 100644 --- a/rare/ui/components/tabs/store/wishlist.py +++ b/rare/ui/components/tabs/store/wishlist.py @@ -50,6 +50,9 @@ class Ui_Wishlist(object): self.sort_cb.addItem("") self.sort_cb.addItem("") self.horizontalLayout.addWidget(self.sort_cb) + self.reverse = QtWidgets.QCheckBox(self.scroll_widget) + self.reverse.setObjectName("reverse") + self.horizontalLayout.addWidget(self.reverse) spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem) self.filter_label = QtWidgets.QLabel(self.scroll_widget) @@ -96,6 +99,7 @@ class Ui_Wishlist(object): self.sort_cb.setItemText(1, _translate("Wishlist", "Price")) self.sort_cb.setItemText(2, _translate("Wishlist", "Developer")) self.sort_cb.setItemText(3, _translate("Wishlist", "Discount")) + self.reverse.setText(_translate("Wishlist", "Reverse")) self.filter_label.setText(_translate("Wishlist", "Filter:")) self.filter_cb.setItemText(0, _translate("Wishlist", "None")) self.filter_cb.setItemText(1, _translate("Wishlist", "Discount")) diff --git a/rare/ui/components/tabs/store/wishlist.ui b/rare/ui/components/tabs/store/wishlist.ui index c84504c0..190d6847 100644 --- a/rare/ui/components/tabs/store/wishlist.ui +++ b/rare/ui/components/tabs/store/wishlist.ui @@ -1,178 +1,185 @@ - Wishlist - - - - 0 - 0 - 736 - 398 - - - - StackedWidget - - - - - - - true - - - - - 0 - 0 - 716 - 378 - - - - - - - - 15 - - - - Wishlist - - - - - - - - - - 0 - 0 - - - - Sort by - - - - - - - - Name - - - - - Price - - - - - Developer - - - - - Discount - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Filter: - - - - - - - - None - - - - - Discount - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - 0 - 0 - - - - - - - - - - - - - - - - No games matching your filter - - - - - - - Qt::Vertical - - - - 379 - 218 - - - - - - - - - - - - - + Wishlist + + + + 0 + 0 + 736 + 398 + + + + StackedWidget + + + + + + + true + + + + + 0 + 0 + 716 + 378 + + + + + + + + 15 + + + + Wishlist + + + + + + + + + + 0 + 0 + + + + Sort by + + + + + + + + Name + + + + + Price + + + + + Developer + + + + + Discount + + + + + + + + Reverse + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Filter: + + + + + + + + None + + + + + Discount + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + + No games matching your filter + + + + + + + Qt::Vertical + + + + 379 + 218 + + + + + + + + + + + + +