1
0
Fork 0
mirror of synced 2024-05-04 12:42:52 +12:00

Store: Fix various wishlist issues.

* Use horizontal scrollarea for free games. Based on the same idea as
WrapperSettings scrollarea. Both need some adjustments.

* Remove debugging dialogs. Need a better way anyways to debug.
This commit is contained in:
loathingKernel 2024-02-25 15:30:35 +02:00
parent 766557924a
commit fb0d5bbe10
No known key found for this signature in database
GPG key ID: CE0C72D0B53821FD
7 changed files with 213 additions and 184 deletions

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -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):

View file

@ -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)

View file

@ -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"))

View file

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>423</width>
<height>153</height>
<width>489</width>
<height>165</height>
</rect>
</property>
<property name="windowTitle">
@ -17,7 +17,7 @@
<item>
<layout class="QHBoxLayout" name="tool_layout">
<item>
<widget class="QLabel" name="sort_label">
<widget class="QLabel" name="order_label">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch>
@ -30,38 +30,17 @@
</widget>
</item>
<item>
<widget class="QComboBox" name="sort_cb">
<item>
<property name="text">
<string>Name</string>
</property>
</item>
<item>
<property name="text">
<string>Price</string>
</property>
</item>
<item>
<property name="text">
<string>Developer</string>
</property>
</item>
<item>
<property name="text">
<string>Discount</string>
</property>
</item>
</widget>
<widget class="QComboBox" name="order_combo"/>
</item>
<item>
<widget class="QCheckBox" name="reverse">
<widget class="QCheckBox" name="reverse_check">
<property name="text">
<string>Reverse</string>
</property>
</widget>
</item>
<item>
<spacer name="tool_hspacer_1">
<spacer name="hspacer_left">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
@ -76,26 +55,15 @@
<item>
<widget class="QLabel" name="filter_label">
<property name="text">
<string>Filter:</string>
<string>Filter by</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="filter_cb">
<item>
<property name="text">
<string>None</string>
</property>
</item>
<item>
<property name="text">
<string>Discount</string>
</property>
</item>
</widget>
<widget class="QComboBox" name="filter_combo"/>
</item>
<item>
<spacer name="tool_hspacer_2">
<spacer name="hspacer_right">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
@ -123,26 +91,31 @@
</layout>
</item>
<item>
<widget class="QLabel" name="no_games_label">
<property name="text">
<string>No games matching your filter</string>
<widget class="QScrollArea" name="scrollarea">
<property name="sizeAdjustPolicy">
<enum>QAbstractScrollArea::AdjustToContents</enum>
</property>
</widget>
</item>
<item>
<widget class="QScrollArea" name="list_scrollarea">
<property name="widgetResizable">
<bool>true</bool>
</property>
<widget class="QWidget" name="list_container">
<widget class="QWidget" name="container">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>407</width>
<height>83</height>
<width>473</width>
<height>115</height>
</rect>
</property>
<layout class="QVBoxLayout" name="container_layout">
<item alignment="Qt::AlignTop">
<widget class="QLabel" name="no_games_label">
<property name="text">
<string>No games matching your filter</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>