1
0
Fork 0
mirror of synced 2024-06-02 10:44:40 +12:00
Rare/rare/components/tabs/store/wishlist.py

160 lines
5.7 KiB
Python
Raw Normal View History

from typing import List
2023-09-24 06:24:28 +13:00
from PyQt5.QtCore import pyqtSignal, Qt, pyqtSlot
from PyQt5.QtGui import QShowEvent
from PyQt5.QtWidgets import QMessageBox, QWidget, QScrollArea, QFrame, QSizePolicy
2021-08-26 06:25:10 +12:00
from rare.ui.components.tabs.store.wishlist import Ui_Wishlist
from rare.utils.misc import icon
from rare.widgets.flow_layout import FlowLayout
2023-09-24 06:24:28 +13:00
from rare.widgets.side_tab import SideTabContents
from rare.widgets.sliding_stack import SlidingStackedWidget
from .api.models.response import WishlistItemModel, CatalogOfferModel
2023-09-24 06:24:28 +13:00
from .store_api import StoreAPI
from .widgets.details import DetailsWidget
from .widgets.items import WishlistItemWidget
class WishlistPage(SlidingStackedWidget, SideTabContents):
def __init__(self, api: StoreAPI, parent=None):
super(WishlistPage, self).__init__(parent=parent)
self.implements_scrollarea = True
self.wishlist_widget = WishlistWidget(api, parent=self)
self.wishlist_widget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
self.wishlist_widget.set_title.connect(self.set_title)
self.wishlist_widget.show_details.connect(self.show_details)
2021-08-26 06:25:10 +12:00
2023-09-24 06:24:28 +13:00
self.details_widget = DetailsWidget([], api, parent=self)
self.details_widget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
self.details_widget.set_title.connect(self.set_title)
self.details_widget.back_clicked.connect(self.show_main)
2021-08-26 06:25:10 +12:00
2023-09-24 06:24:28 +13:00
self.setDirection(Qt.Horizontal)
self.addWidget(self.wishlist_widget)
self.addWidget(self.details_widget)
2023-09-24 06:24:28 +13:00
@pyqtSlot()
def show_main(self):
self.slideInWidget(self.wishlist_widget)
@pyqtSlot(object)
def show_details(self, game: CatalogOfferModel):
self.details_widget.update_game(game)
self.slideInWidget(self.details_widget)
2023-09-24 06:24:28 +13:00
class WishlistWidget(QWidget, SideTabContents):
show_details = pyqtSignal(CatalogOfferModel)
2021-08-26 06:25:10 +12:00
update_wishlist_signal = pyqtSignal()
2023-09-24 06:24:28 +13:00
def __init__(self, api: StoreAPI, parent=None):
super(WishlistWidget, self).__init__(parent=parent)
self.implements_scrollarea = True
2023-09-24 06:24:28 +13:00
self.api = api
2023-03-31 06:09:27 +13:00
self.ui = Ui_Wishlist()
self.ui.setupUi(self)
2023-09-24 06:24:28 +13:00
self.ui.main_layout.setContentsMargins(0, 0, 3, 0)
self.setEnabled(False)
2021-08-26 06:25:10 +12:00
self.wishlist = []
self.widgets = []
self.list_layout = FlowLayout(self.ui.list_container)
self.ui.sort_cb.currentIndexChanged.connect(self.sort_wishlist)
2023-03-31 06:09:27 +13:00
self.ui.filter_cb.currentIndexChanged.connect(self.set_filter)
self.ui.reload_button.clicked.connect(self.update_wishlist)
self.ui.reload_button.setIcon(icon("fa.refresh", color="white"))
2021-08-26 06:25:10 +12:00
2023-03-31 06:09:27 +13:00
self.ui.reverse.stateChanged.connect(
lambda: self.sort_wishlist(sort=self.ui.sort_cb.currentIndex())
2021-12-24 22:09:50 +13:00
)
2023-09-24 06:24:28 +13:00
def showEvent(self, a0: QShowEvent) -> None:
self.update_wishlist()
return super().showEvent(a0)
2021-08-26 06:25:10 +12:00
def update_wishlist(self):
self.setEnabled(False)
2023-09-24 06:24:28 +13:00
self.api.get_wishlist(self.set_wishlist)
2021-08-26 06:25:10 +12:00
def delete_from_wishlist(self, game: CatalogOfferModel):
2023-09-24 06:24:28 +13:00
self.api.remove_from_wishlist(
game.namespace,
game.id,
2021-12-24 22:09:50 +13:00
lambda success: self.update_wishlist()
if success
else QMessageBox.warning(
self, "Error", self.tr("Could not remove game from wishlist")
),
)
2021-08-26 06:25:10 +12:00
self.update_wishlist_signal.emit()
def set_filter(self, i):
count = 0
for w in self.widgets:
if i == 1 and not w.discount:
w.setVisible(False)
else:
w.setVisible(True)
count += 1
if i == 0:
w.setVisible(True)
if count == 0:
2023-03-31 06:09:27 +13:00
self.ui.no_games_label.setVisible(True)
2021-08-26 06:25:10 +12:00
else:
2023-03-31 06:09:27 +13:00
self.ui.no_games_label.setVisible(False)
2021-08-26 06:25:10 +12:00
def sort_wishlist(self, sort=0):
2023-09-24 06:24:28 +13:00
widgets = self.ui.list_container.findChildren(WishlistItemWidget, options=Qt.FindDirectChildrenOnly)
for w in widgets:
self.ui.list_container.layout().removeWidget(w)
if sort == 0:
func = lambda x: x.catalog_game.title
reverse = self.ui.reverse.isChecked()
elif sort == 1:
func = lambda x: x.catalog_game.price.total_price["fmtPrice"]["discountPrice"]
reverse = self.ui.reverse.isChecked()
elif sort == 2:
func = lambda x: x.catalog_game.seller["name"]
reverse = self.ui.reverse.isChecked()
elif sort == 3:
func = lambda x: 1 - (x.catalog_game.price.total_price["discountPrice"] / x.catalog_game.price.total_price["originalPrice"])
reverse = not self.ui.reverse.isChecked()
else:
func = lambda x: x.catalog_game.title
reverse = self.ui.reverse.isChecked()
widgets = sorted(widgets, key=func, reverse=reverse)
for w in widgets:
self.ui.list_container.layout().addWidget(w)
def set_wishlist(self, wishlist: List[WishlistItemModel] = None, sort=0):
if wishlist and wishlist[0] == "error":
return
if wishlist is not None:
self.wishlist = wishlist
2021-08-26 06:25:10 +12:00
for i in self.widgets:
i.deleteLater()
2021-08-26 06:25:10 +12:00
self.widgets.clear()
2021-08-26 08:08:24 +12:00
if len(wishlist) == 0:
2023-03-31 06:09:27 +13:00
self.ui.no_games_label.setVisible(True)
2021-08-26 08:08:24 +12:00
else:
2023-03-31 06:09:27 +13:00
self.ui.no_games_label.setVisible(False)
2021-08-26 08:08:24 +12:00
for game in wishlist:
2023-09-24 06:24:28 +13:00
w = WishlistItemWidget(self.api.cached_manager, game.offer, self.ui.list_container)
w.show_details.connect(self.show_details)
2021-08-26 06:25:10 +12:00
w.delete_from_wishlist.connect(self.delete_from_wishlist)
self.widgets.append(w)
self.list_layout.addWidget(w)
self.list_layout.update()
self.setEnabled(True)