diff --git a/rare/components/tabs/store/landing.py b/rare/components/tabs/store/landing.py index 7aa5263d..00af2cf8 100644 --- a/rare/components/tabs/store/landing.py +++ b/rare/components/tabs/store/landing.py @@ -2,8 +2,8 @@ import datetime import logging from typing import List -from PyQt5.QtCore import Qt, pyqtSlot, pyqtSignal -from PyQt5.QtGui import QShowEvent, QHideEvent +from PyQt5.QtCore import Qt, pyqtSlot, pyqtSignal, QObject, QEvent +from PyQt5.QtGui import QShowEvent, QHideEvent, QResizeEvent from PyQt5.QtWidgets import ( QHBoxLayout, QWidget, @@ -63,6 +63,38 @@ class LandingPage(SlidingStackedWidget, SideTabContents): self.slideInWidget(self.details_widget) +class FreeGamesScroll(QScrollArea): + def __init__(self, parent=None): + super(FreeGamesScroll, self).__init__(parent=parent) + self.setObjectName(type(self).__name__) + + def setWidget(self, w): + super().setWidget(w) + w.installEventFilter(self) + + def eventFilter(self, a0: QObject, a1: QEvent) -> bool: + if a0 is self.widget() and a1.type() == QEvent.Resize: + self.__resize(a0) + return a0.event(a1) + return False + + def __resize(self, e: QResizeEvent): + minh = self.horizontalScrollBar().minimum() + maxh = self.horizontalScrollBar().maximum() + # lk: when the scrollbar is not visible, min and max are 0 + if maxh > minh: + height = ( + e.size().height() + + self.rect().height() // 2 + - self.contentsRect().height() // 2 + + self.widget().layout().spacing() + + self.horizontalScrollBar().sizeHint().height() + ) + else: + height = e.size().height() + self.rect().height() - self.contentsRect().height() + self.setMinimumHeight(max(height, self.minimumHeight())) + + class LandingWidget(QWidget, SideTabContents): show_details = pyqtSignal(CatalogOfferModel) @@ -76,10 +108,12 @@ class LandingWidget(QWidget, SideTabContents): self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) self.free_games_now = StoreGroup(self.tr("Free now"), layout=QHBoxLayout, parent=self) - self.free_games_now.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) + self.free_games_now.main_layout.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) + self.free_games_now.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) self.free_games_next = StoreGroup(self.tr("Free next week"), layout=QHBoxLayout, parent=self) - self.free_games_next.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) + self.free_games_next.main_layout.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) + self.free_games_next.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) self.discounts_group = StoreGroup(self.tr("Wishlist discounts"), layout=FlowLayout, parent=self) self.discounts_group.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) @@ -87,10 +121,30 @@ class LandingWidget(QWidget, SideTabContents): self.games_group = StoreGroup(self.tr("Free to play"), FlowLayout, self) self.games_group.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.games_group.loading(False) - self.games_group.setVisible(True) + self.games_group.setVisible(False) - layout.addWidget(self.free_games_now, alignment=Qt.AlignTop) - layout.addWidget(self.free_games_next, alignment=Qt.AlignTop) + free_scroll = FreeGamesScroll(self) + free_container = QWidget(free_scroll) + free_scroll.setWidget(free_container) + free_container_layout = QHBoxLayout(free_container) + + free_scroll.setWidgetResizable(True) + free_scroll.setFrameShape(QScrollArea.NoFrame) + free_scroll.setSizeAdjustPolicy(QScrollArea.AdjustToContents) + free_scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) + + free_container_layout.setContentsMargins(0, 0, 0, 0) + free_container_layout.setAlignment(Qt.AlignLeft | Qt.AlignTop) + free_container_layout.setSizeConstraint(QHBoxLayout.SetFixedSize) + free_container_layout.addWidget(self.free_games_now) + free_container_layout.addWidget(self.free_games_next) + + free_scroll.widget().setAutoFillBackground(False) + free_scroll.viewport().setAutoFillBackground(False) + + # layout.addWidget(self.free_games_now, alignment=Qt.AlignTop) + # layout.addWidget(self.free_games_next, alignment=Qt.AlignTop) + layout.addWidget(free_scroll, alignment=Qt.AlignTop) layout.addWidget(self.discounts_group, alignment=Qt.AlignTop) layout.addWidget(self.games_group, alignment=Qt.AlignTop) layout.addItem(QSpacerItem(0, 0, QSizePolicy.Fixed, QSizePolicy.Expanding)) @@ -113,12 +167,12 @@ class LandingWidget(QWidget, SideTabContents): self.discounts_group.layout().removeWidget(w) w.deleteLater() - for item in wishlist: - if item.offer.price.totalPrice.discount > 0: - w = StoreItemWidget(self.api.cached_manager, item.offer) - w.show_details.connect(self.show_details) - self.discounts_group.layout().addWidget(w) - self.discounts_group.setVisible(bool(wishlist)) + for item in filter(lambda x: bool(x.offer.price.totalPrice.discount), wishlist): + w = StoreItemWidget(self.api.cached_manager, item.offer) + w.show_details.connect(self.show_details) + self.discounts_group.layout().addWidget(w) + have_discounts = any(map(lambda x: bool(x.offer.price.totalPrice.discount), wishlist)) + self.discounts_group.setVisible(have_discounts) self.discounts_group.loading(False) def __update_free_games(self, free_games: List[CatalogOfferModel]): @@ -171,13 +225,15 @@ class LandingWidget(QWidget, SideTabContents): self.free_games_next.loading(False) def show_games(self, data): + if not data: + return + for w in self.games_group.findChildren(StoreItemWidget, options=Qt.FindDirectChildrenOnly): self.games_group.layout().removeWidget(w) w.deleteLater() - if data: - for game in data: - w = StoreItemWidget(self.api.cached_manager, game) - w.show_details.connect(self.show_details) - self.games_group.layout().addWidget(w) + for game in data: + w = StoreItemWidget(self.api.cached_manager, game) + w.show_details.connect(self.show_details) + self.games_group.layout().addWidget(w) self.games_group.loading(False) diff --git a/rare/components/tabs/store/store_api.py b/rare/components/tabs/store/store_api.py index 0f45d8e8..4c8dfdc1 100644 --- a/rare/components/tabs/store/store_api.py +++ b/rare/components/tabs/store/store_api.py @@ -4,7 +4,6 @@ from typing import List, Callable from PyQt5.QtCore import pyqtSignal, QObject from PyQt5.QtWidgets import QApplication -from rare.components.tabs.store.api.debug import DebugDialog from rare.components.tabs.store.constants import ( wishlist_query, search_query, @@ -154,13 +153,9 @@ class StoreAPI(QObject): "query": search_query, "variables": browse_model.to_dict() } - # debug = DebugDialog(payload["variables"], None) - # debug.exec() self.manager.post(graphql_url, lambda data: self.__handle_browse_games(data, handle_func), payload) def __handle_browse_games(self, data, handle_func): - # debug = DebugDialog(data, None) - # debug.exec() self.browse_active = False if data is None: data = {} @@ -204,8 +199,6 @@ class StoreAPI(QObject): @staticmethod def __handle_get_game(data, handle_func): - # debug = DebugDialog(data, None) - # debug.exec() try: product = DieselProduct.from_dict(data) handle_func(product) @@ -229,8 +222,6 @@ class StoreAPI(QObject): self.authed_manager.post(graphql_url, lambda data: self._handle_add_to_wishlist(data, handle_func), payload) def _handle_add_to_wishlist(self, data, handle_func): - # debug = DebugDialog(data, None) - # debug.exec() try: response = ResponseModel.from_dict(data) data = response.data.wishlist.addToWishlist @@ -255,8 +246,6 @@ class StoreAPI(QObject): payload) def _handle_remove_from_wishlist(self, data, handle_func): - # debug = DebugDialog(data, None) - # debug.exec() try: response = ResponseModel.from_dict(data) data = response.data.wishlist.removeFromWishlist diff --git a/rare/components/tabs/store/widgets/details.py b/rare/components/tabs/store/widgets/details.py index 7b83bacf..309856bc 100644 --- a/rare/components/tabs/store/widgets/details.py +++ b/rare/components/tabs/store/widgets/details.py @@ -11,7 +11,6 @@ from PyQt5.QtWidgets import ( QSizePolicy, ) -from rare.components.tabs.store.api.debug import DebugDialog from rare.components.tabs.store.api.models.diesel import DieselProduct, DieselProductDetail, DieselSystemDetail from rare.components.tabs.store.api.models.response import CatalogOfferModel from rare.components.tabs.store.store_api import StoreAPI @@ -72,8 +71,6 @@ class DetailsWidget(QWidget, SideTabContents): self.in_wishlist = False def update_game(self, offer: CatalogOfferModel): - debug = DebugDialog(offer.__dict__, None) - debug.exec() self.ui.title.setText(offer.title) self.title_str = offer.title self.id_str = offer.id diff --git a/rare/components/tabs/store/widgets/items.py b/rare/components/tabs/store/widgets/items.py index d89b47f1..94a022ea 100644 --- a/rare/components/tabs/store/widgets/items.py +++ b/rare/components/tabs/store/widgets/items.py @@ -4,7 +4,6 @@ from PyQt5.QtCore import pyqtSignal, Qt from PyQt5.QtGui import QMouseEvent from PyQt5.QtWidgets import QPushButton -from rare.components.tabs.store.api.debug import DebugDialog from rare.components.tabs.store.api.models.response import CatalogOfferModel from rare.models.image import ImageSize from rare.utils.misc import qta_icon @@ -27,9 +26,6 @@ class ItemWidget(LoadingImageWidget): self.show_details.emit(self.catalog_game) if a0.button() == Qt.RightButton: a0.accept() - print(self.catalog_game.__dict__) - dialog = DebugDialog(self.catalog_game.__dict__, self) - dialog.show() class StoreItemWidget(ItemWidget): diff --git a/rare/components/tabs/store/wishlist.py b/rare/components/tabs/store/wishlist.py index a469a978..04c12868 100644 --- a/rare/components/tabs/store/wishlist.py +++ b/rare/components/tabs/store/wishlist.py @@ -1,3 +1,4 @@ +from enum import IntEnum from typing import List from PyQt5.QtCore import pyqtSignal, Qt, pyqtSlot @@ -44,6 +45,18 @@ class WishlistPage(SlidingStackedWidget, SideTabContents): self.slideInWidget(self.details_widget) +class WishlistOrder(IntEnum): + NAME = 1 + PRICE = 2 + DISCOUNT = 3 + DEVELOPER = 4 + + +class WishlistFilter(IntEnum): + NONE = 0 + DISCOUNT = 1 + + class WishlistWidget(QWidget, SideTabContents): show_details = pyqtSignal(CatalogOfferModel) update_wishlist_signal = pyqtSignal() @@ -55,21 +68,37 @@ class WishlistWidget(QWidget, SideTabContents): self.ui = Ui_Wishlist() self.ui.setupUi(self) self.ui.main_layout.setContentsMargins(0, 0, 3, 0) - self.setEnabled(False) - self.wishlist = [] - self.widgets = [] - self.list_layout = FlowLayout(self.ui.list_container) + self.wishlist_layout = FlowLayout() + self.ui.container_layout.addLayout(self.wishlist_layout, stretch=1) + + sortings = { + WishlistOrder.NAME: self.tr("Name"), + WishlistOrder.PRICE: self.tr("Price"), + WishlistOrder.DISCOUNT: self.tr("Discount"), + WishlistOrder.DEVELOPER: self.tr("Developer"), + } + for data, text in sortings.items(): + self.ui.order_combo.addItem(text, data) + self.ui.order_combo.currentIndexChanged.connect(self.order_wishlist) + + filters = { + WishlistFilter.NONE: self.tr("None"), + WishlistFilter.DISCOUNT: self.tr("Discount"), + } + for data, text in filters.items(): + self.ui.filter_combo.addItem(text, data) + self.ui.filter_combo.currentIndexChanged.connect(self.filter_wishlist) - self.ui.sort_cb.currentIndexChanged.connect(self.sort_wishlist) - self.ui.filter_cb.currentIndexChanged.connect(self.set_filter) - self.ui.reload_button.clicked.connect(self.update_wishlist) self.ui.reload_button.setIcon(qta_icon("fa.refresh", color="white")) + self.ui.reload_button.clicked.connect(self.update_wishlist) - self.ui.reverse.stateChanged.connect( - lambda: self.sort_wishlist(sort=self.ui.sort_cb.currentIndex()) + self.ui.reverse_check.stateChanged.connect( + lambda: self.order_wishlist(self.ui.order_combo.currentIndex()) ) + self.setEnabled(False) + def showEvent(self, a0: QShowEvent) -> None: self.update_wishlist() return super().showEvent(a0) @@ -90,70 +119,68 @@ class WishlistWidget(QWidget, SideTabContents): ) 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) + @pyqtSlot(int) + def filter_wishlist(self, index: int = int(WishlistFilter.NONE)): + list_filter = self.ui.filter_combo.itemData(index, Qt.UserRole) + widgets = self.ui.container.findChildren(WishlistItemWidget, options=Qt.FindDirectChildrenOnly) + for w in widgets: + if list_filter == WishlistFilter.NONE: + w.setVisible(True) + elif list_filter == WishlistFilter.DISCOUNT: + w.setVisible(bool(w.catalog_game.price.totalPrice.discount)) else: w.setVisible(True) - count += 1 + have_visible = any(map(lambda x: x.isVisible(), widgets)) + self.ui.no_games_label.setVisible(not have_visible) - if i == 0: - w.setVisible(True) - - if count == 0: - self.ui.no_games_label.setVisible(True) - else: - self.ui.no_games_label.setVisible(False) - - def sort_wishlist(self, sort=0): - widgets = self.ui.list_container.findChildren(WishlistItemWidget, options=Qt.FindDirectChildrenOnly) + @pyqtSlot(int) + def order_wishlist(self, index: int = int(WishlistOrder.NAME)): + list_order = self.ui.order_combo.itemData(index, Qt.UserRole) + widgets = self.ui.container.findChildren(WishlistItemWidget, options=Qt.FindDirectChildrenOnly) for w in widgets: - self.ui.list_container.layout().removeWidget(w) + self.wishlist_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.totalPrice["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.totalPrice["discountPrice"] / x.catalog_game.price.totalPrice["originalPrice"]) - reverse = not self.ui.reverse.isChecked() + if list_order == WishlistOrder.NAME: + def func(x: WishlistItemWidget): + return x.catalog_game.title + elif list_order == WishlistOrder.PRICE: + def func(x: WishlistItemWidget): + return x.catalog_game.price.totalPrice.discountPrice + elif list_order == WishlistOrder.DEVELOPER: + def func(x: WishlistItemWidget): + return x.catalog_game.seller["name"] + elif list_order == WishlistOrder.DISCOUNT: + def func(x: WishlistItemWidget): + discount = x.catalog_game.price.totalPrice.discountPrice + original = x.catalog_game.price.totalPrice.originalPrice + return 1 - (discount / original) else: - func = lambda x: x.catalog_game.title - reverse = self.ui.reverse.isChecked() + def func(x: WishlistItemWidget): + return x.catalog_game.title + reverse = self.ui.reverse_check.isChecked() widgets = sorted(widgets, key=func, reverse=reverse) for w in widgets: - self.ui.list_container.layout().addWidget(w) + self.wishlist_layout.addWidget(w) - def set_wishlist(self, wishlist: List[WishlistItemModel] = None, sort=0): + def set_wishlist(self, wishlist: List[WishlistItemModel] = None): if wishlist and wishlist[0] == "error": return - if wishlist is not None: - self.wishlist = wishlist + widgets = self.ui.container.findChildren(WishlistItemWidget, options=Qt.FindDirectChildrenOnly) + for w in widgets: + self.wishlist_layout.removeWidget(w) + w.deleteLater() - for i in self.widgets: - i.deleteLater() - - self.widgets.clear() - - if len(wishlist) == 0: - self.ui.no_games_label.setVisible(True) - else: - self.ui.no_games_label.setVisible(False) + self.ui.no_games_label.setVisible(bool(wishlist)) for game in wishlist: - w = WishlistItemWidget(self.api.cached_manager, game.offer, self.ui.list_container) + w = WishlistItemWidget(self.api.cached_manager, game.offer, self.ui.container) w.show_details.connect(self.show_details) w.delete_from_wishlist.connect(self.delete_from_wishlist) - self.widgets.append(w) - self.list_layout.addWidget(w) - self.list_layout.update() + self.wishlist_layout.addWidget(w) + + self.order_wishlist(self.ui.order_combo.currentIndex()) + self.filter_wishlist(self.ui.filter_combo.currentIndex()) + self.setEnabled(True) diff --git a/rare/ui/components/tabs/store/wishlist.py b/rare/ui/components/tabs/store/wishlist.py index 2bea5fa8..ff93d8d5 100644 --- a/rare/ui/components/tabs/store/wishlist.py +++ b/rare/ui/components/tabs/store/wishlist.py @@ -14,40 +14,34 @@ from PyQt5 import QtCore, QtGui, QtWidgets class Ui_Wishlist(object): def setupUi(self, Wishlist): Wishlist.setObjectName("Wishlist") - Wishlist.resize(423, 153) + Wishlist.resize(489, 165) Wishlist.setWindowTitle("Wishlist") self.main_layout = QtWidgets.QVBoxLayout(Wishlist) self.main_layout.setObjectName("main_layout") self.tool_layout = QtWidgets.QHBoxLayout() self.tool_layout.setObjectName("tool_layout") - self.sort_label = QtWidgets.QLabel(Wishlist) + self.order_label = QtWidgets.QLabel(Wishlist) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.sort_label.sizePolicy().hasHeightForWidth()) - self.sort_label.setSizePolicy(sizePolicy) - self.sort_label.setObjectName("sort_label") - self.tool_layout.addWidget(self.sort_label) - self.sort_cb = QtWidgets.QComboBox(Wishlist) - self.sort_cb.setObjectName("sort_cb") - self.sort_cb.addItem("") - self.sort_cb.addItem("") - self.sort_cb.addItem("") - self.sort_cb.addItem("") - self.tool_layout.addWidget(self.sort_cb) - self.reverse = QtWidgets.QCheckBox(Wishlist) - self.reverse.setObjectName("reverse") - self.tool_layout.addWidget(self.reverse) + sizePolicy.setHeightForWidth(self.order_label.sizePolicy().hasHeightForWidth()) + self.order_label.setSizePolicy(sizePolicy) + self.order_label.setObjectName("order_label") + self.tool_layout.addWidget(self.order_label) + self.order_combo = QtWidgets.QComboBox(Wishlist) + self.order_combo.setObjectName("order_combo") + self.tool_layout.addWidget(self.order_combo) + self.reverse_check = QtWidgets.QCheckBox(Wishlist) + self.reverse_check.setObjectName("reverse_check") + self.tool_layout.addWidget(self.reverse_check) spacerItem = QtWidgets.QSpacerItem(0, 0, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.tool_layout.addItem(spacerItem) self.filter_label = QtWidgets.QLabel(Wishlist) self.filter_label.setObjectName("filter_label") self.tool_layout.addWidget(self.filter_label) - self.filter_cb = QtWidgets.QComboBox(Wishlist) - self.filter_cb.setObjectName("filter_cb") - self.filter_cb.addItem("") - self.filter_cb.addItem("") - self.tool_layout.addWidget(self.filter_cb) + self.filter_combo = QtWidgets.QComboBox(Wishlist) + self.filter_combo.setObjectName("filter_combo") + self.tool_layout.addWidget(self.filter_combo) spacerItem1 = QtWidgets.QSpacerItem(0, 0, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.tool_layout.addItem(spacerItem1) self.reload_button = QtWidgets.QPushButton(Wishlist) @@ -60,31 +54,28 @@ class Ui_Wishlist(object): self.reload_button.setObjectName("reload_button") self.tool_layout.addWidget(self.reload_button) self.main_layout.addLayout(self.tool_layout) - self.no_games_label = QtWidgets.QLabel(Wishlist) + self.scrollarea = QtWidgets.QScrollArea(Wishlist) + self.scrollarea.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents) + self.scrollarea.setWidgetResizable(True) + self.scrollarea.setObjectName("scrollarea") + self.container = QtWidgets.QWidget() + self.container.setGeometry(QtCore.QRect(0, 0, 473, 115)) + self.container.setObjectName("container") + self.container_layout = QtWidgets.QVBoxLayout(self.container) + self.container_layout.setObjectName("container_layout") + self.no_games_label = QtWidgets.QLabel(self.container) self.no_games_label.setObjectName("no_games_label") - self.main_layout.addWidget(self.no_games_label) - self.list_scrollarea = QtWidgets.QScrollArea(Wishlist) - self.list_scrollarea.setWidgetResizable(True) - self.list_scrollarea.setObjectName("list_scrollarea") - self.list_container = QtWidgets.QWidget() - self.list_container.setGeometry(QtCore.QRect(0, 0, 407, 83)) - self.list_container.setObjectName("list_container") - self.list_scrollarea.setWidget(self.list_container) - self.main_layout.addWidget(self.list_scrollarea) + self.container_layout.addWidget(self.no_games_label, 0, QtCore.Qt.AlignTop) + self.scrollarea.setWidget(self.container) + self.main_layout.addWidget(self.scrollarea) self.retranslateUi(Wishlist) def retranslateUi(self, Wishlist): _translate = QtCore.QCoreApplication.translate - self.sort_label.setText(_translate("Wishlist", "Sort by")) - self.sort_cb.setItemText(0, _translate("Wishlist", "Name")) - 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")) + self.order_label.setText(_translate("Wishlist", "Sort by")) + self.reverse_check.setText(_translate("Wishlist", "Reverse")) + self.filter_label.setText(_translate("Wishlist", "Filter by")) self.no_games_label.setText(_translate("Wishlist", "No games matching your filter")) diff --git a/rare/ui/components/tabs/store/wishlist.ui b/rare/ui/components/tabs/store/wishlist.ui index 1d2fe6bd..2a9e064e 100644 --- a/rare/ui/components/tabs/store/wishlist.ui +++ b/rare/ui/components/tabs/store/wishlist.ui @@ -6,8 +6,8 @@ 0 0 - 423 - 153 + 489 + 165 @@ -17,7 +17,7 @@ - + 0 @@ -30,38 +30,17 @@ - - - - Name - - - - - Price - - - - - Developer - - - - - Discount - - - + - + Reverse - + Qt::Horizontal @@ -76,26 +55,15 @@ - Filter: + Filter by - - - - None - - - - - Discount - - - + - + Qt::Horizontal @@ -123,26 +91,31 @@ - - - No games matching your filter + + + QAbstractScrollArea::AdjustToContents - - - - true - + 0 0 - 407 - 83 + 473 + 115 + + + + + No games matching your filter + + + +