1
0
Fork 0
mirror of synced 2024-06-26 10:11:19 +12:00

Merge Browse and free games in one tab

This commit is contained in:
Dummerle 2021-08-25 00:01:53 +02:00
parent a63a46ded5
commit 8fbf0bcacf
17 changed files with 713 additions and 500 deletions

View file

@ -7,9 +7,8 @@ from PyQt5.QtWidgets import QGroupBox, QMessageBox, QAction
from custom_legendary.core import LegendaryCore from custom_legendary.core import LegendaryCore
from custom_legendary.models.game import InstalledGame from custom_legendary.models.game import InstalledGame
from rare import cache_dir
from rare.components.dialogs.uninstall_dialog import UninstallDialog from rare.components.dialogs.uninstall_dialog import UninstallDialog
from rare.components.extra.Console import ConsoleWindow from rare.components.extra.console import ConsoleWindow
from rare.utils import legendary_utils from rare.utils import legendary_utils
from rare.utils.utils import create_desktop_link from rare.utils.utils import create_desktop_link

View file

@ -37,7 +37,7 @@ class RareSettings(QWidget, Ui_RareSettings):
(self.notification, "notification", True), (self.notification, "notification", True),
(self.save_size, "save_size", False), (self.save_size, "save_size", False),
(self.log_games, "show_console", False), (self.log_games, "show_console", False),
(self.image_cache, "cache_images", True) # (self.image_cache, "cache_images", True)
] ]
self.settings = QSettings() self.settings = QSettings()

View file

@ -2,7 +2,6 @@ from PyQt5.QtWidgets import QStackedWidget, QTabWidget
from custom_legendary.core import LegendaryCore from custom_legendary.core import LegendaryCore
from rare import cache_dir from rare import cache_dir
from rare.components.tabs.shop.browse_games import BrowseGames
from rare.components.tabs.shop.game_info import ShopGameInfo from rare.components.tabs.shop.game_info import ShopGameInfo
from rare.components.tabs.shop.search_results import SearchResults from rare.components.tabs.shop.search_results import SearchResults
from rare.components.tabs.shop.shop_api_core import ShopApiCore from rare.components.tabs.shop.shop_api_core import ShopApiCore
@ -19,12 +18,10 @@ class Shop(QStackedWidget):
self.shop_api = ShopApiCore(self.core.egs.session.headers["Authorization"]) self.shop_api = ShopApiCore(self.core.egs.session.headers["Authorization"])
self.shop = ShopWidget(cache_dir, core, self.shop_api) self.shop = ShopWidget(cache_dir, core, self.shop_api)
self.browse_games = BrowseGames(cache_dir, self.shop_api)
self.store_tabs = QTabWidget() self.store_tabs = QTabWidget()
self.store_tabs.addTab(self.shop, self.tr("Games")) self.store_tabs.addTab(self.shop, self.tr("Games"))
self.store_tabs.addTab(self.browse_games, self.tr("Browse")) # self.store_tabs.addTab(self.browse_games, self.tr("Browse"))
self.store_tabs.tabBarClicked.connect(lambda x: self.browse_games.load() if x == 1 else None)
self.addWidget(self.store_tabs) self.addWidget(self.store_tabs)
@ -40,11 +37,7 @@ class Shop(QStackedWidget):
self.shop.show_info.connect(self.show_search_results) self.shop.show_info.connect(self.show_search_results)
self.shop.show_game.connect(self.show_game_info) self.shop.show_game.connect(self.show_game_info)
self.browse_games.show_game.connect(self.show_game_info) self.shop_api.update_wishlist.connect(self.shop.update_wishlist)
self.shop_api.update_wishlist.connect(self.update_wishlist)
def update_wishlist(self):
self.shop.update_wishlist()
def load(self): def load(self):
if not self.init: if not self.init:

View file

@ -1,130 +0,0 @@
import datetime
import logging
import random
from PyQt5.QtCore import pyqtSignal
from PyQt5.QtWidgets import QWidget, QCheckBox, QVBoxLayout, QLabel
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.browse_games import Ui_browse_games
from rare.utils.extra_widgets import FlowLayout, WaitingSpinner
from rare.utils.utils import get_lang
logger = logging.getLogger("BrowseGames")
class BrowseGames(QWidget, Ui_browse_games):
show_game = pyqtSignal(dict)
init = False
price = ""
tags = []
types = []
def __init__(self, path, api_core):
super(BrowseGames, self).__init__()
self.setupUi(self)
self.api_core = api_core
self.path = path
self.games_widget = QWidget()
self.games_widget.setLayout(FlowLayout())
self.games.setWidget(self.games_widget)
self.stack.addWidget(WaitingSpinner())
self.clear_price.toggled.connect(lambda: self.prepare_request("") if self.clear_price.isChecked() else None)
self.free_button.toggled.connect(lambda: self.prepare_request("free") if self.free_button.isChecked() else None)
self.under10.toggled.connect(
lambda: self.prepare_request("<price>[0, 1000)") if self.under10.isChecked() else None)
self.under20.toggled.connect(
lambda: self.prepare_request("<price>[0, 2000)") if self.under20.isChecked() else None)
self.under30.toggled.connect(
lambda: self.prepare_request("<price>[0, 3000)") if self.under30.isChecked() else None)
self.above.toggled.connect(lambda: self.prepare_request("<price>[1499,]") if self.above.isChecked() else None)
self.on_discount.toggled.connect(lambda: self.prepare_request("sale") if self.on_discount.isChecked() else None)
constants = Constants()
for groupbox, variables in [(self.genre_gb, constants.categories),
(self.platform_gb, constants.platforms),
(self.others_gb, constants.others)]:
for text, tag in variables:
checkbox = CheckBox(text, tag)
checkbox.activated.connect(lambda x: self.prepare_request(added_tag=x))
checkbox.deactivated.connect(lambda x: self.prepare_request(removed_tag=x))
groupbox.layout().addWidget(checkbox)
for text, tag in constants.types:
checkbox = CheckBox(text, tag)
checkbox.activated.connect(lambda x: self.prepare_request(added_type=x))
checkbox.deactivated.connect(lambda x: self.prepare_request(removed_type=x))
self.type_gb.layout().addWidget(checkbox)
def load(self):
if not self.init:
self.prepare_request()
self.init = True
def prepare_request(self, price: str = None, added_tag: int = 0, removed_tag: int = 0,
added_type: str = "", removed_type: str = ""):
if price is not None:
self.price = price
if added_tag != 0:
self.tags.append(added_tag)
if removed_tag != 0 and removed_tag in self.tags:
self.tags.remove(removed_tag)
if added_type:
self.types.append(added_type)
if removed_type and removed_type in self.types:
self.types.remove(removed_type)
locale = get_lang()
self.stack.setCurrentIndex(2)
date = f"[,{datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%dT%X')}.{str(random.randint(0, 999)).zfill(3)}Z]"
browse_model = BrowseModel(locale=locale, date=date, count=30, price=self.price)
browse_model.tag = "|".join(self.tags)
if self.types:
browse_model.category = "|".join(self.types)
self.api_core.browse_games(browse_model, self.show_games)
def show_games(self, data):
QWidget().setLayout(self.games_widget.layout())
if data:
self.games_widget.setLayout(FlowLayout())
for game in data:
w = GameWidget(self.path, game, 275)
self.games_widget.layout().addWidget(w)
w.show_info.connect(self.show_game.emit)
else:
self.games_widget.setLayout(QVBoxLayout())
self.games_widget.layout().addWidget(
QLabel(self.tr("Could not get games matching the filter")))
self.games_widget.layout().addStretch(1)
self.stack.setCurrentIndex(0)
class CheckBox(QCheckBox):
activated = pyqtSignal(str)
deactivated = pyqtSignal(str)
def __init__(self, text, tag):
super(CheckBox, self).__init__(text)
self.tag = tag
self.toggled.connect(self.handle_toggle)
def handle_toggle(self):
if self.isChecked():
self.activated.emit(self.tag)
else:
self.deactivated.emit(self.tag)

View file

@ -107,3 +107,4 @@ search_query = "query searchStoreQuery($allowCountries: String, $category: Strin
wishlist_query = "\n query wishlistQuery($country:String!, $locale:String) {\n Wishlist {\n wishlistItems {\n elements {\n id\n order\n created\n offerId\n updated\n namespace\n \n offer {\n productSlug\n urlSlug\n title\n id\n namespace\n offerType\n expiryDate\n status\n isCodeRedemptionOnly\n description\n effectiveDate\n keyImages {\n type\n url\n }\n seller {\n id\n name\n }\n productSlug\n urlSlug\n items {\n id\n namespace\n }\n customAttributes {\n key\n value\n }\n catalogNs {\n mappings(pageType: \"productHome\") {\n pageSlug\n pageType\n }\n }\n offerMappings {\n pageSlug\n pageType\n }\n categories {\n path\n }\n price(country: $country) {\n totalPrice {\n discountPrice\n originalPrice\n voucherDiscount\n discount\n fmtPrice(locale: $locale) {\n originalPrice\n discountPrice\n intermediatePrice\n }\n currencyCode\n currencyInfo {\n decimals\n symbol\n }\n }\n lineOffers {\n appliedRules {\n id\n endDate\n }\n }\n }\n }\n\n }\n }\n }\n }\n" wishlist_query = "\n query wishlistQuery($country:String!, $locale:String) {\n Wishlist {\n wishlistItems {\n elements {\n id\n order\n created\n offerId\n updated\n namespace\n \n offer {\n productSlug\n urlSlug\n title\n id\n namespace\n offerType\n expiryDate\n status\n isCodeRedemptionOnly\n description\n effectiveDate\n keyImages {\n type\n url\n }\n seller {\n id\n name\n }\n productSlug\n urlSlug\n items {\n id\n namespace\n }\n customAttributes {\n key\n value\n }\n catalogNs {\n mappings(pageType: \"productHome\") {\n pageSlug\n pageType\n }\n }\n offerMappings {\n pageSlug\n pageType\n }\n categories {\n path\n }\n price(country: $country) {\n totalPrice {\n discountPrice\n originalPrice\n voucherDiscount\n discount\n fmtPrice(locale: $locale) {\n originalPrice\n discountPrice\n intermediatePrice\n }\n currencyCode\n currencyInfo {\n decimals\n symbol\n }\n }\n lineOffers {\n appliedRules {\n id\n endDate\n }\n }\n }\n }\n\n }\n }\n }\n }\n"
add_to_wishlist_query = "\n mutation removeFromWishlistMutation($namespace: String!, $offerId: String!, $operation: RemoveOperation!) {\n Wishlist {\n removeFromWishlist(namespace: $namespace, offerId: $offerId, operation: $operation) {\n success\n }\n }\n }\n" add_to_wishlist_query = "\n mutation removeFromWishlistMutation($namespace: String!, $offerId: String!, $operation: RemoveOperation!) {\n Wishlist {\n removeFromWishlist(namespace: $namespace, offerId: $offerId, operation: $operation) {\n success\n }\n }\n }\n"
remove_from_wishlist_query = "\n mutation removeFromWishlistMutation($namespace: String!, $offerId: String!, $operation: RemoveOperation!) {\n Wishlist {\n removeFromWishlist(namespace: $namespace, offerId: $offerId, operation: $operation) {\n success\n }\n }\n }\n" remove_from_wishlist_query = "\n mutation removeFromWishlistMutation($namespace: String!, $offerId: String!, $operation: RemoveOperation!) {\n Wishlist {\n removeFromWishlist(namespace: $namespace, offerId: $offerId, operation: $operation) {\n success\n }\n }\n }\n"
coupon_query = "\n query getCoupons($currencyCountry: String!, $identityId: String!, $locale: String) {\n CodeRedemption {\n coupons(currencyCountry: $currencyCountry, identityId: $identityId, includeSalesEventInfo: true) {\n code\n codeStatus\n codeType\n consumptionMetadata {\n amountDisplay {\n amount\n currency\n placement\n symbol\n }\n minSalesPriceDisplay {\n amount\n currency\n placement\n symbol\n }\n }\n endDate\n namespace\n salesEvent(locale: $locale) {\n eventName\n eventSlug\n voucherImages {\n type\n url\n }\n voucherLink\n }\n startDate\n }\n }\n }\n"

View file

@ -77,9 +77,9 @@ class ShopGameInfo(QWidget, Ui_shop_info):
def add_to_wishlist(self): def add_to_wishlist(self):
if not self.in_wishlist: if not self.in_wishlist:
return return
self.api_core.add_to_wishlist(self.game.namespace, self.game.offer_id, # self.api_core.add_to_wishlist(self.game.namespace, self.game.offer_id,
lambda success: self.wishlist_button.setText(self.tr("Remove from wishlist")) # lambda success: self.wishlist_button.setText(self.tr("Remove from wishlist"))
if success else self.wishlist_button.setText("Something goes wrong")) # if success else self.wishlist_button.setText("Something goes wrong"))
else: else:
self.api_core.remove_from_wishlist(self.game.namespace, self.game.offer_id, self.api_core.remove_from_wishlist(self.game.namespace, self.game.offer_id,
lambda success: self.wishlist_button.setVisible(False) lambda success: self.wishlist_button.setVisible(False)

View file

@ -53,17 +53,6 @@ class GameWidget(QWidget):
def mousePressEvent(self, a0: QtGui.QMouseEvent) -> None: def mousePressEvent(self, a0: QtGui.QMouseEvent) -> None:
self.show_info.emit(self.json_info) self.show_info.emit(self.json_info)
@classmethod
def from_request(cls, name, path, shop_api):
c = cls(path)
shop_api.search_game(name, c.handle_response)
return c
def handle_response(self, data):
data = data["data"]["Catalog"]["searchStore"]["elements"][0]
self.init_ui(data)
class GameWidgetDiscount(GameWidget): class GameWidgetDiscount(GameWidget):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):

View file

@ -40,7 +40,6 @@ class SearchResults(QStackedWidget):
self.api_core.search_game(text, self.show_results) self.api_core.search_game(text, self.show_results)
def show_results(self, results: dict): def show_results(self, results: dict):
results = results["data"]["Catalog"]["searchStore"]["elements"]
QVBoxLayout().addWidget(self.widget) QVBoxLayout().addWidget(self.widget)
self.widget = QWidget() self.widget = QWidget()
self.layout = FlowLayout() self.layout = FlowLayout()

View file

@ -60,7 +60,7 @@ class ShopApiCore(QObject):
self.manager.post(graphql_url, payload, lambda data: self._handle_search(data, handle_func)) self.manager.post(graphql_url, payload, lambda data: self._handle_search(data, handle_func))
def _handle_search(self, data, handle_func): def _handle_search(self, data, handle_func):
handle_func(data) handle_func(data["data"]["Catalog"]["searchStore"]["elements"])
def browse_games(self, browse_model: BrowseModel, handle_func): def browse_games(self, browse_model: BrowseModel, handle_func):
if self.browse_active: if self.browse_active:

View file

@ -1,14 +1,15 @@
import datetime import datetime
import logging import logging
import random
from PyQt5.QtCore import Qt, pyqtSignal, QStringListModel from PyQt5.QtCore import Qt, pyqtSignal
from PyQt5.QtNetwork import QNetworkAccessManager from PyQt5.QtWidgets import QWidget, QCompleter, QGroupBox, QHBoxLayout, QScrollArea, QCheckBox, QVBoxLayout, QLabel
from PyQt5.QtWidgets import QWidget, QCompleter, QGroupBox, QHBoxLayout, QScrollArea
from custom_legendary.core import LegendaryCore from custom_legendary.core import LegendaryCore
from rare.components.tabs.shop import ShopApiCore from rare.components.tabs.shop import ShopApiCore
from rare.components.tabs.shop.constants import search_query from rare.components.tabs.shop.constants import Constants
from rare.components.tabs.shop.game_widgets import GameWidget, GameWidgetDiscount from rare.components.tabs.shop.game_widgets import GameWidget, GameWidgetDiscount
from rare.components.tabs.shop.shop_models import BrowseModel
from rare.ui.components.tabs.store.store import Ui_ShopWidget from rare.ui.components.tabs.store.store import Ui_ShopWidget
from rare.utils.extra_widgets import WaitingSpinner, FlowLayout, ButtonLineEdit from rare.utils.extra_widgets import WaitingSpinner, FlowLayout, ButtonLineEdit
from rare.utils.utils import get_lang from rare.utils.utils import get_lang
@ -31,26 +32,35 @@ class ShopWidget(QScrollArea, Ui_ShopWidget):
self.setupUi(self) self.setupUi(self)
self.path = path self.path = path
self.core = core self.core = core
self.shop_api = shop_api self.api_core = shop_api
self.manager = QNetworkAccessManager() self.price = ""
self.free_games_widget = QWidget() self.tags = []
self.free_games_widget.setLayout(FlowLayout()) self.types = []
self.locale = get_lang()
self.update_games_allowed = True
self.free_games_now = QGroupBox(self.tr("Free Games")) self.free_games_now = QGroupBox(self.tr("Free Games"))
self.free_games_now.setLayout(QHBoxLayout()) self.free_games_now.setLayout(QHBoxLayout())
self.free_games_widget.layout().addWidget(self.free_games_now) self.free_widget.layout().addWidget(self.free_games_now)
self.coming_free_games = QGroupBox(self.tr("Free Games next week")) self.coming_free_games = QGroupBox(self.tr("Free Games next week"))
self.coming_free_games.setLayout(QHBoxLayout()) self.coming_free_games.setLayout(QHBoxLayout())
self.free_games_widget.layout().addWidget(self.coming_free_games) self.free_game_group_box.layout().addWidget(self.coming_free_games)
self.free_games_stack.addWidget(WaitingSpinner()) self.free_stack.addWidget(WaitingSpinner())
self.free_games_stack.addWidget(self.free_games_widget) self.free_stack.setCurrentIndex(1)
self.discount_widget.setLayout(FlowLayout())
self.discount_stack.addWidget(WaitingSpinner())
self.discount_stack.setCurrentIndex(1)
self.game_widget.setLayout(FlowLayout())
self.game_stack.addWidget(WaitingSpinner())
self.game_stack.setCurrentIndex(1)
self.completer = QCompleter() self.completer = QCompleter()
self.completer.setCaseSensitivity(Qt.CaseInsensitive) self.completer.setCaseSensitivity(Qt.CaseInsensitive)
self.data = []
self.search_bar = ButtonLineEdit("fa.search", placeholder_text=self.tr("Search Games")) self.search_bar = ButtonLineEdit("fa.search", placeholder_text=self.tr("Search Games"))
self.scrollAreaWidgetContents.layout().insertWidget(0, self.search_bar) self.layout().insertWidget(0, self.search_bar)
# self.search_bar.textChanged.connect(self.search_games) # self.search_bar.textChanged.connect(self.search_games)
@ -58,46 +68,32 @@ class ShopWidget(QScrollArea, Ui_ShopWidget):
self.search_bar.returnPressed.connect(self.show_search_results) self.search_bar.returnPressed.connect(self.show_search_results)
self.search_bar.buttonClicked.connect(self.show_search_results) self.search_bar.buttonClicked.connect(self.show_search_results)
self.init_filter()
# self.search_bar.textChanged.connect(self.load_completer) # self.search_bar.textChanged.connect(self.load_completer)
self.wishlist_gb.setLayout(FlowLayout())
self.wishlist_gb.setVisible(False)
self.locale = get_lang()
def load_completer(self, text):
if text != "":
payload = {
"query": search_query,
"variables": {"category": "games/edition/base|bundles/games|editors|software/edition/base",
"count": 20,
"country": self.locale.upper(), "keywords": text, "locale": self.locale,
"sortDir": "DESC",
"allowCountries": self.locale.upper(),
"start": 0, "tag": "", "withMapping": False, "withPrice": True}
}
self.search_request_manager.post("https://www.epicgames.com/graphql", payload)
def load(self): def load(self):
# load free games # load free games
self.shop_api.get_free_games(self.add_free_games) self.api_core.get_free_games(self.add_free_games)
# load wishlist # load wishlist
self.shop_api.get_wishlist(self.add_wishlist_items) self.api_core.get_wishlist(self.add_wishlist_items)
self.prepare_request()
def update_wishlist(self): def update_wishlist(self):
self.shop_api.get_wishlist(self.add_wishlist_items) self.api_core.get_wishlist(self.add_wishlist_items)
def add_wishlist_items(self, wishlist): def add_wishlist_items(self, wishlist):
QWidget().setLayout(self.wishlist_gb.layout()) QWidget().setLayout(self.discount_widget.layout())
self.wishlist_gb.setLayout(FlowLayout()) self.discount_widget.setLayout(FlowLayout())
discounts = 0 discounts = 0
for game in wishlist: for game in wishlist:
if game["offer"]["price"]["totalPrice"]["discount"] > 0: if game["offer"]["price"]["totalPrice"]["discount"] > 0:
w = GameWidgetDiscount(self.path, game["offer"]) w = GameWidgetDiscount(self.path, game["offer"])
w.show_info.connect(self.show_game.emit) w.show_info.connect(self.show_game.emit)
self.wishlist_gb.layout().addWidget(w) self.discount_widget.layout().addWidget(w)
discounts += 1 discounts += 1
self.wishlist_gb.setVisible(discounts > 0) self.discounts_gb.setVisible(discounts > 0)
def add_free_games(self, free_games): def add_free_games(self, free_games):
date = datetime.datetime.now() date = datetime.datetime.now()
@ -108,7 +104,7 @@ class ShopWidget(QScrollArea, Ui_ShopWidget):
coming_free_games.append(game) coming_free_games.append(game)
continue continue
try: try:
# parse datetime # parse datetime to check if game is next week or now
try: try:
end_date = datetime.datetime.strptime( end_date = datetime.datetime.strptime(
game["promotions"]["upcomingPromotionalOffers"][0]["promotionalOffers"][0]["endDate"], game["promotions"]["upcomingPromotionalOffers"][0]["promotionalOffers"][0]["endDate"],
@ -131,6 +127,7 @@ class ShopWidget(QScrollArea, Ui_ShopWidget):
'%Y-%m-%dT%H:%M:%S.%fZ') '%Y-%m-%dT%H:%M:%S.%fZ')
except Exception as e: except Exception as e:
print(e) print(e)
logger.warning(str(e))
continue continue
except TypeError: except TypeError:
@ -140,30 +137,133 @@ class ShopWidget(QScrollArea, Ui_ShopWidget):
free_games_now.append(game) free_games_now.append(game)
elif start_date > date: elif start_date > date:
coming_free_games.append(game) coming_free_games.append(game)
# free games now
for free_game in free_games_now: for free_game in free_games_now:
w = GameWidget(self.path, free_game) w = GameWidgetDiscount(self.path, free_game)
w.show_info.connect(self.show_game.emit) w.show_info.connect(self.show_game.emit)
self.free_games_now.layout().addWidget(w) self.free_games_now.layout().addWidget(w)
self.free_game_widgets.append(w) self.free_game_widgets.append(w)
self.free_games_now.layout().addStretch(1) self.free_games_now.layout().addStretch(1)
# free games next week
for free_game in coming_free_games: for free_game in coming_free_games:
w = GameWidget(self.path, free_game) w = GameWidget(self.path, free_game)
if free_game["title"] != "Mystery Game": if free_game["title"] != "Mystery Game":
w.show_info.connect(self.show_game.emit) w.show_info.connect(self.show_game.emit)
self.coming_free_games.layout().addWidget(w) self.coming_free_games.layout().addWidget(w)
self.free_game_widgets.append(w)
self.coming_free_games.layout().addStretch(1)
# self.coming_free_games.setFixedWidth(int(40 + len(coming_free_games) * 300)) # self.coming_free_games.setFixedWidth(int(40 + len(coming_free_games) * 300))
self.free_games_stack.setCurrentIndex(1) self.free_stack.setCurrentIndex(0)
def set_completer(self, search_data):
search_data = search_data["data"]["Catalog"]["searchStore"]["elements"]
titles = [i.get("title") for i in search_data]
model = QStringListModel()
model.setStringList(titles)
self.completer.setModel(model)
def show_search_results(self): def show_search_results(self):
self.show_info.emit(self.search_bar.text()) self.show_info.emit(self.search_bar.text())
def init_filter(self):
self.none_price.toggled.connect(lambda: self.prepare_request("") if self.none_price.isChecked() else None)
self.free_button.toggled.connect(lambda: self.prepare_request("free") if self.free_button.isChecked() else None)
self.under10.toggled.connect(
lambda: self.prepare_request("<price>[0, 1000)") if self.under10.isChecked() else None)
self.under20.toggled.connect(
lambda: self.prepare_request("<price>[0, 2000)") if self.under20.isChecked() else None)
self.under30.toggled.connect(
lambda: self.prepare_request("<price>[0, 3000)") if self.under30.isChecked() else None)
self.above.toggled.connect(lambda: self.prepare_request("<price>[1499,]") if self.above.isChecked() else None)
self.on_discount.toggled.connect(lambda: self.prepare_request("sale") if self.on_discount.isChecked() else None)
constants = Constants()
self.checkboxes = []
for groupbox, variables in [(self.genre_gb, constants.categories),
(self.platform_gb, constants.platforms),
(self.others_gb, constants.others),
(self.type_gb, constants.types)]:
for text, tag in variables:
checkbox = CheckBox(text, tag)
checkbox.activated.connect(lambda x: self.prepare_request(added_tag=x))
checkbox.deactivated.connect(lambda x: self.prepare_request(removed_tag=x))
groupbox.layout().addWidget(checkbox)
self.checkboxes.append(checkbox)
self.reset_button.clicked.connect(self.reset_filters)
def reset_filters(self):
self.update_games_allowed = False
for cb in self.checkboxes:
cb.setChecked(False)
self.none_price.setChecked(True)
self.tags = []
self.types = []
self.update_games_allowed = True
self.prepare_request("")
def prepare_request(self, price: str = "", added_tag: int = 0, removed_tag: int = 0,
added_type: str = "", removed_type: str = ""):
if not self.update_games_allowed:
return
self.price = price
if added_tag != 0:
self.tags.append(added_tag)
if removed_tag != 0 and removed_tag in self.tags:
self.tags.remove(removed_tag)
if added_type:
self.types.append(added_type)
if removed_type and removed_type in self.types:
self.types.remove(removed_type)
if (self.types or self.price) or self.tags:
self.free_game_group_box.setVisible(False)
self.discounts_gb.setVisible(False)
else:
self.free_game_group_box.setVisible(True)
if len(self.discounts_gb.layout().children()) > 0:
self.discounts_gb.setVisible(True)
locale = get_lang()
self.game_stack.setCurrentIndex(1)
date = f"[,{datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%dT%X')}.{str(random.randint(0, 999)).zfill(3)}Z]"
browse_model = BrowseModel(locale=locale, date=date, count=20, price=self.price)
browse_model.tag = "|".join(self.tags)
if self.types:
browse_model.category = "|".join(self.types)
self.api_core.browse_games(browse_model, self.show_games)
def show_games(self, data):
QWidget().setLayout(self.game_widget.layout())
if data:
self.game_widget.setLayout(FlowLayout())
for game in data:
w = GameWidget(self.path, game, 275)
self.game_widget.layout().addWidget(w)
w.show_info.connect(self.show_game.emit)
else:
self.game_widget.setLayout(QVBoxLayout())
self.game_widget.layout().addWidget(
QLabel(self.tr("Could not get games matching the filter")))
self.game_widget.layout().addStretch(1)
self.game_stack.setCurrentIndex(0)
class CheckBox(QCheckBox):
activated = pyqtSignal(str)
deactivated = pyqtSignal(str)
def __init__(self, text, tag):
super(CheckBox, self).__init__(text)
self.tag = tag
self.toggled.connect(self.handle_toggle)
def handle_toggle(self):
if self.isChecked():
self.activated.emit(self.tag)
else:
self.deactivated.emit(self.tag)

View file

@ -14,93 +14,12 @@ from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_RareSettings(object): class Ui_RareSettings(object):
def setupUi(self, RareSettings): def setupUi(self, RareSettings):
RareSettings.setObjectName("RareSettings") RareSettings.setObjectName("RareSettings")
RareSettings.resize(694, 532) RareSettings.resize(544, 532)
self.rare_layout = QtWidgets.QGridLayout(RareSettings) self.rare_layout = QtWidgets.QGridLayout(RareSettings)
self.rare_layout.setObjectName("rare_layout") self.rare_layout.setObjectName("rare_layout")
self.settings_group = QtWidgets.QGroupBox(RareSettings) self.rpc_layout = QtWidgets.QVBoxLayout()
self.settings_group.setObjectName("settings_group") self.rpc_layout.setObjectName("rpc_layout")
self.behavior_layout = QtWidgets.QGridLayout(self.settings_group) self.rare_layout.addLayout(self.rpc_layout, 1, 1, 1, 1)
self.behavior_layout.setObjectName("behavior_layout")
self.confirm_start = QtWidgets.QCheckBox(self.settings_group)
self.confirm_start.setObjectName("confirm_start")
self.behavior_layout.addWidget(self.confirm_start, 2, 0, 1, 1)
self.notification = QtWidgets.QCheckBox(self.settings_group)
self.notification.setObjectName("notification")
self.behavior_layout.addWidget(self.notification, 4, 0, 1, 1)
self.auto_update = QtWidgets.QCheckBox(self.settings_group)
self.auto_update.setObjectName("auto_update")
self.behavior_layout.addWidget(self.auto_update, 1, 0, 1, 1)
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.behavior_layout.addItem(spacerItem, 2, 1, 2, 1)
self.auto_update = QtWidgets.QCheckBox(self.settings_group)
self.auto_update.setObjectName("auto_update")
self.behavior_layout.addWidget(self.auto_update, 1, 0, 1, 1)
self.save_size = QtWidgets.QCheckBox(self.settings_group)
self.save_size.setObjectName("save_size")
self.behavior_layout.addWidget(self.save_size, 5, 0, 1, 1)
self.auto_sync_cloud = QtWidgets.QCheckBox(self.settings_group)
self.auto_sync_cloud.setObjectName("auto_sync_cloud")
self.behavior_layout.addWidget(self.auto_sync_cloud, 3, 0, 1, 1)
self.notification = QtWidgets.QCheckBox(self.settings_group)
self.notification.setObjectName("notification")
self.behavior_layout.addWidget(self.notification, 4, 0, 1, 1)
self.sys_tray = QtWidgets.QCheckBox(self.settings_group)
self.sys_tray.setObjectName("sys_tray")
self.behavior_layout.addWidget(self.sys_tray, 0, 0, 1, 1)
self.log_games = QtWidgets.QCheckBox(self.settings_group)
self.log_games.setObjectName("log_games")
self.behavior_layout.addWidget(self.log_games, 6, 0, 1, 1)
self.confirm_start = QtWidgets.QCheckBox(self.settings_group)
self.confirm_start.setObjectName("confirm_start")
self.behavior_layout.addWidget(self.confirm_start, 2, 0, 1, 1)
self.sys_tray = QtWidgets.QCheckBox(self.settings_group)
self.sys_tray.setObjectName("sys_tray")
self.behavior_layout.addWidget(self.sys_tray, 0, 0, 1, 1)
self.image_cache = QtWidgets.QCheckBox(self.settings_group)
self.image_cache.setObjectName("image_cache")
self.behavior_layout.addWidget(self.image_cache, 6, 0, 1, 1)
self.rare_layout.addWidget(self.settings_group, 2, 0, 1, 1, QtCore.Qt.AlignTop)
self.interface_group = QtWidgets.QGroupBox(RareSettings)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.interface_group.sizePolicy().hasHeightForWidth())
self.interface_group.setSizePolicy(sizePolicy)
self.interface_group.setObjectName("interface_group")
self.interface_layout = QtWidgets.QGridLayout(self.interface_group)
self.interface_layout.setObjectName("interface_layout")
self.style_label = QtWidgets.QLabel(self.interface_group)
self.style_label.setObjectName("style_label")
self.interface_layout.addWidget(self.style_label, 2, 0, 1, 1, QtCore.Qt.AlignRight)
spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.interface_layout.addItem(spacerItem1, 1, 2, 1, 1)
self.lang_select = QtWidgets.QComboBox(self.interface_group)
self.lang_select.setObjectName("lang_select")
self.interface_layout.addWidget(self.lang_select, 0, 1, 1, 1)
self.color_select = QtWidgets.QComboBox(self.interface_group)
self.color_select.setObjectName("color_select")
self.color_select.addItem("")
self.interface_layout.addWidget(self.color_select, 1, 1, 1, 1)
self.style_select = QtWidgets.QComboBox(self.interface_group)
self.style_select.setObjectName("style_select")
self.style_select.addItem("")
self.interface_layout.addWidget(self.style_select, 2, 1, 1, 1)
self.lang_label = QtWidgets.QLabel(self.interface_group)
self.lang_label.setObjectName("lang_label")
self.interface_layout.addWidget(self.lang_label, 0, 0, 1, 1, QtCore.Qt.AlignRight)
self.color_label = QtWidgets.QLabel(self.interface_group)
self.color_label.setObjectName("color_label")
self.interface_layout.addWidget(self.color_label, 1, 0, 1, 1, QtCore.Qt.AlignRight)
self.interface_info = QtWidgets.QLabel(self.interface_group)
font = QtGui.QFont()
font.setItalic(True)
self.interface_info.setFont(font)
self.interface_info.setWordWrap(True)
self.interface_info.setObjectName("interface_info")
self.interface_layout.addWidget(self.interface_info, 3, 0, 1, 3)
self.rare_layout.addWidget(self.interface_group, 1, 0, 1, 1, QtCore.Qt.AlignTop)
self.groupBox = QtWidgets.QGroupBox(RareSettings) self.groupBox = QtWidgets.QGroupBox(RareSettings)
self.groupBox.setObjectName("groupBox") self.groupBox.setObjectName("groupBox")
self.verticalLayout = QtWidgets.QVBoxLayout(self.groupBox) self.verticalLayout = QtWidgets.QVBoxLayout(self.groupBox)
@ -112,11 +31,34 @@ class Ui_RareSettings(object):
self.startmenu_link.setObjectName("startmenu_link") self.startmenu_link.setObjectName("startmenu_link")
self.verticalLayout.addWidget(self.startmenu_link) self.verticalLayout.addWidget(self.startmenu_link)
self.rare_layout.addWidget(self.groupBox, 2, 1, 1, 1, QtCore.Qt.AlignTop) self.rare_layout.addWidget(self.groupBox, 2, 1, 1, 1, QtCore.Qt.AlignTop)
self.rpc_layout = QtWidgets.QVBoxLayout() self.settings_group = QtWidgets.QGroupBox(RareSettings)
self.rpc_layout.setObjectName("rpc_layout") self.settings_group.setObjectName("settings_group")
self.rare_layout.addLayout(self.rpc_layout, 1, 1, 1, 1) self.behavior_layout = QtWidgets.QGridLayout(self.settings_group)
spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.behavior_layout.setObjectName("behavior_layout")
self.rare_layout.addItem(spacerItem2, 3, 0, 1, 2) self.confirm_start = QtWidgets.QCheckBox(self.settings_group)
self.confirm_start.setObjectName("confirm_start")
self.behavior_layout.addWidget(self.confirm_start, 2, 0, 1, 1)
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.behavior_layout.addItem(spacerItem, 2, 1, 2, 1)
self.auto_sync_cloud = QtWidgets.QCheckBox(self.settings_group)
self.auto_sync_cloud.setObjectName("auto_sync_cloud")
self.behavior_layout.addWidget(self.auto_sync_cloud, 3, 0, 1, 1)
self.sys_tray = QtWidgets.QCheckBox(self.settings_group)
self.sys_tray.setObjectName("sys_tray")
self.behavior_layout.addWidget(self.sys_tray, 0, 0, 1, 1)
self.save_size = QtWidgets.QCheckBox(self.settings_group)
self.save_size.setObjectName("save_size")
self.behavior_layout.addWidget(self.save_size, 5, 0, 1, 1)
self.notification = QtWidgets.QCheckBox(self.settings_group)
self.notification.setObjectName("notification")
self.behavior_layout.addWidget(self.notification, 4, 0, 1, 1)
self.auto_update = QtWidgets.QCheckBox(self.settings_group)
self.auto_update.setObjectName("auto_update")
self.behavior_layout.addWidget(self.auto_update, 1, 0, 1, 1)
self.log_games = QtWidgets.QCheckBox(self.settings_group)
self.log_games.setObjectName("log_games")
self.behavior_layout.addWidget(self.log_games, 6, 0, 1, 1)
self.rare_layout.addWidget(self.settings_group, 2, 0, 1, 1, QtCore.Qt.AlignTop)
self.log_dir_group = QtWidgets.QGroupBox(RareSettings) self.log_dir_group = QtWidgets.QGroupBox(RareSettings)
self.log_dir_group.setObjectName("log_dir_group") self.log_dir_group.setObjectName("log_dir_group")
self.log_dir_layout = QtWidgets.QVBoxLayout(self.log_dir_group) self.log_dir_layout = QtWidgets.QVBoxLayout(self.log_dir_group)
@ -132,16 +74,50 @@ class Ui_RareSettings(object):
self.log_dir_size_label.setWordWrap(True) self.log_dir_size_label.setWordWrap(True)
self.log_dir_size_label.setObjectName("log_dir_size_label") self.log_dir_size_label.setObjectName("log_dir_size_label")
self.log_dir_layout.addWidget(self.log_dir_size_label) self.log_dir_layout.addWidget(self.log_dir_size_label)
self.rare_layout.addWidget(self.log_dir_group, 0, 1, 1, 1) self.rare_layout.addWidget(self.log_dir_group, 0, 1, 1, 1, QtCore.Qt.AlignTop)
self.interface_group = QtWidgets.QGroupBox(RareSettings)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.interface_group.sizePolicy().hasHeightForWidth())
self.interface_group.setSizePolicy(sizePolicy)
self.interface_group.setObjectName("interface_group")
self.interface_layout = QtWidgets.QGridLayout(self.interface_group)
self.interface_layout.setObjectName("interface_layout")
self.color_select = QtWidgets.QComboBox(self.interface_group)
self.color_select.setObjectName("color_select")
self.color_select.addItem("")
self.interface_layout.addWidget(self.color_select, 1, 1, 1, 1)
self.style_label = QtWidgets.QLabel(self.interface_group)
self.style_label.setObjectName("style_label")
self.interface_layout.addWidget(self.style_label, 2, 0, 1, 1, QtCore.Qt.AlignRight)
self.style_select = QtWidgets.QComboBox(self.interface_group)
self.style_select.setObjectName("style_select")
self.style_select.addItem("")
self.interface_layout.addWidget(self.style_select, 2, 1, 1, 1)
spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.interface_layout.addItem(spacerItem1, 1, 2, 1, 1)
self.interface_info = QtWidgets.QLabel(self.interface_group)
font = QtGui.QFont()
font.setItalic(True)
self.interface_info.setFont(font)
self.interface_info.setWordWrap(True)
self.interface_info.setObjectName("interface_info")
self.interface_layout.addWidget(self.interface_info, 3, 0, 1, 3)
self.lang_label = QtWidgets.QLabel(self.interface_group)
self.lang_label.setObjectName("lang_label")
self.interface_layout.addWidget(self.lang_label, 0, 0, 1, 1, QtCore.Qt.AlignRight)
self.lang_select = QtWidgets.QComboBox(self.interface_group)
self.lang_select.setObjectName("lang_select")
self.interface_layout.addWidget(self.lang_select, 0, 1, 1, 1)
self.color_label = QtWidgets.QLabel(self.interface_group)
self.color_label.setObjectName("color_label")
self.interface_layout.addWidget(self.color_label, 1, 0, 1, 1, QtCore.Qt.AlignRight)
self.rare_layout.addWidget(self.interface_group, 1, 0, 1, 1, QtCore.Qt.AlignTop)
self.img_dir_group = QtWidgets.QGroupBox(RareSettings) self.img_dir_group = QtWidgets.QGroupBox(RareSettings)
self.img_dir_group.setObjectName("img_dir_group") self.img_dir_group.setObjectName("img_dir_group")
self.img_dir_layout = QtWidgets.QVBoxLayout(self.img_dir_group) self.img_dir_layout = QtWidgets.QVBoxLayout(self.img_dir_group)
self.img_dir_layout.setObjectName("img_dir_layout") self.img_dir_layout.setObjectName("img_dir_layout")
self.rare_layout.addWidget(self.img_dir_group, 0, 0, 1, 1)
self.label = QtWidgets.QLabel(self.img_dir_group)
self.label.setWordWrap(True)
self.label.setObjectName("label")
self.img_dir_layout.addWidget(self.label)
self.rare_layout.addWidget(self.img_dir_group, 0, 0, 1, 1, QtCore.Qt.AlignTop) self.rare_layout.addWidget(self.img_dir_group, 0, 0, 1, 1, QtCore.Qt.AlignTop)
spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.rare_layout.addItem(spacerItem2, 3, 0, 1, 2) self.rare_layout.addItem(spacerItem2, 3, 0, 1, 2)
@ -152,40 +128,28 @@ class Ui_RareSettings(object):
def retranslateUi(self, RareSettings): def retranslateUi(self, RareSettings):
_translate = QtCore.QCoreApplication.translate _translate = QtCore.QCoreApplication.translate
RareSettings.setWindowTitle(_translate("RareSettings", "RareSettings")) RareSettings.setWindowTitle(_translate("RareSettings", "RareSettings"))
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.settings_group.setTitle(_translate("RareSettings", "Behavior")) self.settings_group.setTitle(_translate("RareSettings", "Behavior"))
self.confirm_start.setText(_translate("RareSettings", "Confirm game launch")) self.confirm_start.setText(_translate("RareSettings", "Confirm game launch"))
self.auto_update.setText(_translate("RareSettings", "Update games on application startup"))
self.save_size.setText(_translate("RareSettings", "Restore window size on application startup"))
self.auto_sync_cloud.setText(_translate("RareSettings", "Automatically sync with cloud")) self.auto_sync_cloud.setText(_translate("RareSettings", "Automatically sync with cloud"))
self.notification.setText(_translate("RareSettings", "Show notification on download completion"))
self.sys_tray.setText(_translate("RareSettings", "Exit to System tray")) self.sys_tray.setText(_translate("RareSettings", "Exit to System tray"))
self.log_games.setText(_translate("RareSettings", "Show console for game debug")) self.save_size.setText(_translate("RareSettings", "Restore window size on application startup"))
self.notification.setText(_translate("RareSettings", "Show notification on download completion")) self.notification.setText(_translate("RareSettings", "Show notification on download completion"))
self.auto_update.setText(_translate("RareSettings", "Update games on application startup")) self.auto_update.setText(_translate("RareSettings", "Update games on application startup"))
self.save_size.setText(_translate("RareSettings", "Restore window size on application startup")) self.log_games.setText(_translate("RareSettings", "Open console for game output"))
self.auto_sync_cloud.setText(_translate("RareSettings", "Automatically sync with cloud"))
self.confirm_start.setText(_translate("RareSettings", "Confirm game launch"))
self.sys_tray.setText(_translate("RareSettings", "Exit to System tray"))
self.image_cache.setText(_translate("RareSettings", "Cache images in store"))
self.log_dir_group.setTitle(_translate("RareSettings", "Logs")) self.log_dir_group.setTitle(_translate("RareSettings", "Logs"))
self.log_dir_open_button.setText(_translate("RareSettings", "Open Log directory")) self.log_dir_open_button.setText(_translate("RareSettings", "Open Log directory"))
self.log_dir_clean_button.setText(_translate("RareSettings", "Clean Log directory")) self.log_dir_clean_button.setText(_translate("RareSettings", "Clean Log directory"))
self.interface_group.setTitle(_translate("RareSettings", "Interface")) self.interface_group.setTitle(_translate("RareSettings", "Interface"))
self.style_label.setText(_translate("RareSettings", "Style Sheet"))
self.color_select.setItemText(0, _translate("RareSettings", "None")) self.color_select.setItemText(0, _translate("RareSettings", "None"))
self.style_label.setText(_translate("RareSettings", "Style Sheet"))
self.style_select.setItemText(0, _translate("RareSettings", "None")) self.style_select.setItemText(0, _translate("RareSettings", "None"))
self.interface_info.setText(_translate("RareSettings", "Restart Rare to apply."))
self.lang_label.setText(_translate("RareSettings", "Language")) self.lang_label.setText(_translate("RareSettings", "Language"))
self.color_label.setText(_translate("RareSettings", "Color Scheme")) self.color_label.setText(_translate("RareSettings", "Color Scheme"))
self.interface_info.setText(_translate("RareSettings", "Restart Rare to apply."))
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.log_dir_group.setTitle(_translate("RareSettings", "Logs"))
self.log_dir_open_button.setText(_translate("RareSettings", "Open Log directory"))
self.log_dir_clean_button.setText(_translate("RareSettings", "Clean Log directory"))
self.img_dir_group.setTitle(_translate("RareSettings", "Image Cache Directory")) self.img_dir_group.setTitle(_translate("RareSettings", "Image Cache Directory"))
self.label.setText(_translate("RareSettings",
"To change image directory, edit XDG_DATA_HOME variable. To change cache directory edit XDG_CACHE_HOME variable"))
if __name__ == "__main__": if __name__ == "__main__":

View file

@ -2,16 +2,24 @@
<ui version="4.0"> <ui version="4.0">
<class>RareSettings</class> <class>RareSettings</class>
<widget class="QWidget" name="RareSettings"> <widget class="QWidget" name="RareSettings">
<property name="windowTitle"> <property name="geometry">
<string>RareSettings</string> <rect>
</property> <x>0</x>
<layout class="QGridLayout" name="rare_layout"> <y>0</y>
<item row="1" column="1"> <width>544</width>
<layout class="QVBoxLayout" name="rpc_layout"/> <height>532</height>
</item> </rect>
<item row="2" column="1" alignment="Qt::AlignTop"> </property>
<widget class="QGroupBox" name="groupBox"> <property name="windowTitle">
<property name="title"> <string>RareSettings</string>
</property>
<layout class="QGridLayout" name="rare_layout">
<item row="1" column="1">
<layout class="QVBoxLayout" name="rpc_layout"/>
</item>
<item row="2" column="1" alignment="Qt::AlignTop">
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Shortcuts</string> <string>Shortcuts</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
@ -37,63 +45,70 @@
<property name="title"> <property name="title">
<string>Behavior</string> <string>Behavior</string>
</property> </property>
<layout class="QGridLayout" name="behavior_layout"> <layout class="QGridLayout" name="behavior_layout">
<item row="2" column="1" rowspan="2"> <item row="2" column="0">
<spacer name="settings_hspacer"> <widget class="QCheckBox" name="confirm_start">
<property name="orientation"> <property name="text">
<enum>Qt::Horizontal</enum> <string>Confirm game launch</string>
</property> </property>
<property name="sizeHint" stdset="0"> </widget>
<size> </item>
<width>40</width> <item row="2" column="1" rowspan="2">
<height>20</height> <spacer name="settings_hspacer">
</size> <property name="orientation">
</property> <enum>Qt::Horizontal</enum>
</spacer> </property>
</item> <property name="sizeHint" stdset="0">
<item row="5" column="0"> <size>
<widget class="QCheckBox" name="save_size"> <width>40</width>
<property name="text"> <height>20</height>
<string>Restore window size on application startup</string> </size>
</property> </property>
</widget> </spacer>
</item> </item>
<item row="4" column="0"> <item row="3" column="0">
<widget class="QCheckBox" name="notification"> <widget class="QCheckBox" name="auto_sync_cloud">
<property name="text"> <property name="text">
<string>Show notification on download completion</string> <string>Automatically sync with cloud</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" column="0"> <item row="0" column="0">
<widget class="QCheckBox" name="auto_sync_cloud"> <widget class="QCheckBox" name="sys_tray">
<property name="text"> <property name="text">
<string>Automatically sync with cloud</string> <string>Exit to System tray</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="0"> <item row="5" column="0">
<widget class="QCheckBox" name="confirm_start"> <widget class="QCheckBox" name="save_size">
<property name="text"> <property name="text">
<string>Confirm game launch</string> <string>Restore window size on application startup</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="0"> <item row="4" column="0">
<widget class="QCheckBox" name="auto_update"> <widget class="QCheckBox" name="notification">
<property name="text"> <property name="text">
<string>Update games on application startup</string> <string>Show notification on download completion</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="0"> <item row="1" column="0">
<widget class="QCheckBox" name="sys_tray"> <widget class="QCheckBox" name="auto_update">
<property name="text"> <property name="text">
<string>Exit to System tray</string> <string>Update games on application startup</string>
</property> </property>
</widget> </widget>
</item> </item>
</layout> <item row="6" column="0">
<widget class="QCheckBox" name="log_games">
<property name="text">
<string>Open console for game output</string>
</property>
</widget>
</item>
</layout>
</widget> </widget>
</item> </item>
<item row="0" column="1" alignment="Qt::AlignTop"> <item row="0" column="1" alignment="Qt::AlignTop">

View file

@ -8,7 +8,7 @@
# run again. Do not edit this file unless you know what you are doing. # run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtWidgets from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_shop_info(object): class Ui_shop_info(object):
@ -28,11 +28,17 @@ class Ui_shop_info(object):
self.verticalLayout_2 = QtWidgets.QVBoxLayout() self.verticalLayout_2 = QtWidgets.QVBoxLayout()
self.verticalLayout_2.setObjectName("verticalLayout_2") self.verticalLayout_2.setObjectName("verticalLayout_2")
self.title = QtWidgets.QLabel(shop_info) self.title = QtWidgets.QLabel(shop_info)
self.title.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) font = QtGui.QFont()
font.setPointSize(18)
self.title.setFont(font)
self.title.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse | QtCore.Qt.TextSelectableByMouse)
self.title.setObjectName("title") self.title.setObjectName("title")
self.verticalLayout_2.addWidget(self.title) self.verticalLayout_2.addWidget(self.title)
self.dev = QtWidgets.QLabel(shop_info) self.dev = QtWidgets.QLabel(shop_info)
self.dev.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) font = QtGui.QFont()
font.setPointSize(14)
self.dev.setFont(font)
self.dev.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse | QtCore.Qt.TextSelectableByMouse)
self.dev.setObjectName("dev") self.dev.setObjectName("dev")
self.verticalLayout_2.addWidget(self.dev) self.verticalLayout_2.addWidget(self.dev)
self.owned_label = QtWidgets.QLabel(shop_info) self.owned_label = QtWidgets.QLabel(shop_info)

View file

@ -34,23 +34,33 @@
<layout class="QVBoxLayout" name="verticalLayout_2"> <layout class="QVBoxLayout" name="verticalLayout_2">
<item> <item>
<widget class="QLabel" name="title"> <widget class="QLabel" name="title">
<property name="text"> <property name="font">
<string>Error</string> <font>
</property> <pointsize>18</pointsize>
<property name="textInteractionFlags"> </font>
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set> </property>
</property> <property name="text">
<string>Error</string>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QLabel" name="dev"> <widget class="QLabel" name="dev">
<property name="text"> <property name="font">
<string>TextLabel</string> <font>
</property> <pointsize>14</pointsize>
<property name="textInteractionFlags"> </font>
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set> </property>
</property> <property name="text">
</widget> <string>TextLabel</string>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item> </item>
<item> <item>
<widget class="QLabel" name="owned_label"> <widget class="QLabel" name="owned_label">
@ -76,13 +86,13 @@
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QLabel" name="tags"> <widget class="QLabel" name="tags">
<property name="text"> <property name="text">
<string>TextLabel</string> <string>TextLabel</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QPushButton" name="open_store_button"> <widget class="QPushButton" name="open_store_button">
<property name="text"> <property name="text">

View file

@ -14,42 +14,150 @@ from PyQt5 import QtCore, QtWidgets
class Ui_ShopWidget(object): class Ui_ShopWidget(object):
def setupUi(self, ShopWidget): def setupUi(self, ShopWidget):
ShopWidget.setObjectName("ShopWidget") ShopWidget.setObjectName("ShopWidget")
ShopWidget.resize(697, 362) ShopWidget.resize(850, 572)
self.verticalLayout = QtWidgets.QVBoxLayout(ShopWidget) self.verticalLayout_7 = QtWidgets.QVBoxLayout(ShopWidget)
self.verticalLayout.setObjectName("verticalLayout") self.verticalLayout_7.setObjectName("verticalLayout_7")
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.scrollArea = QtWidgets.QScrollArea(ShopWidget) self.scrollArea = QtWidgets.QScrollArea(ShopWidget)
self.scrollArea.setWidgetResizable(True) self.scrollArea.setWidgetResizable(True)
self.scrollArea.setObjectName("scrollArea") self.scrollArea.setObjectName("scrollArea")
self.scrollAreaWidgetContents = QtWidgets.QWidget() self.scrollAreaWidgetContents = QtWidgets.QWidget()
self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 677, 342)) self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 828, 550))
self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents") self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")
self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.scrollAreaWidgetContents) self.horizontalLayout = QtWidgets.QHBoxLayout(self.scrollAreaWidgetContents)
self.verticalLayout_3.setObjectName("verticalLayout_3") self.horizontalLayout.setObjectName("horizontalLayout")
self.free_game_group_box = QtWidgets.QGroupBox(self.scrollAreaWidgetContents) self.widget = QtWidgets.QWidget(self.scrollAreaWidgetContents)
self.widget.setObjectName("widget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.widget)
self.verticalLayout.setObjectName("verticalLayout")
self.free_game_group_box = QtWidgets.QGroupBox(self.widget)
self.free_game_group_box.setObjectName("free_game_group_box") self.free_game_group_box.setObjectName("free_game_group_box")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.free_game_group_box) self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.free_game_group_box)
self.verticalLayout_3.setObjectName("verticalLayout_3")
self.free_stack = QtWidgets.QStackedWidget(self.free_game_group_box)
self.free_stack.setObjectName("free_stack")
self.free_widget = QtWidgets.QWidget()
self.free_widget.setObjectName("free_widget")
self.verticalLayout_8 = QtWidgets.QVBoxLayout(self.free_widget)
self.verticalLayout_8.setObjectName("verticalLayout_8")
self.free_stack.addWidget(self.free_widget)
self.verticalLayout_3.addWidget(self.free_stack)
self.verticalLayout.addWidget(self.free_game_group_box)
self.discounts_gb = QtWidgets.QGroupBox(self.widget)
self.discounts_gb.setObjectName("discounts_gb")
self.verticalLayout_6 = QtWidgets.QVBoxLayout(self.discounts_gb)
self.verticalLayout_6.setObjectName("verticalLayout_6")
self.discount_stack = QtWidgets.QStackedWidget(self.discounts_gb)
self.discount_stack.setObjectName("discount_stack")
self.discount_widget = QtWidgets.QWidget()
self.discount_widget.setObjectName("discount_widget")
self.discount_stack.addWidget(self.discount_widget)
self.verticalLayout_6.addWidget(self.discount_stack)
self.verticalLayout.addWidget(self.discounts_gb)
self.filter_game_gb = QtWidgets.QGroupBox(self.widget)
self.filter_game_gb.setObjectName("filter_game_gb")
self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.filter_game_gb)
self.verticalLayout_4.setObjectName("verticalLayout_4")
self.game_stack = QtWidgets.QStackedWidget(self.filter_game_gb)
self.game_stack.setObjectName("game_stack")
self.game_widget = QtWidgets.QWidget()
self.game_widget.setObjectName("game_widget")
self.game_stack.addWidget(self.game_widget)
self.verticalLayout_4.addWidget(self.game_stack)
self.verticalLayout.addWidget(self.filter_game_gb)
self.horizontalLayout.addWidget(self.widget)
self.filter_gb = QtWidgets.QGroupBox(self.scrollAreaWidgetContents)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.filter_gb.sizePolicy().hasHeightForWidth())
self.filter_gb.setSizePolicy(sizePolicy)
self.filter_gb.setMinimumSize(QtCore.QSize(150, 0))
self.filter_gb.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.filter_gb.setObjectName("filter_gb")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.filter_gb)
self.verticalLayout_2.setObjectName("verticalLayout_2") self.verticalLayout_2.setObjectName("verticalLayout_2")
self.free_games_stack = QtWidgets.QStackedWidget(self.free_game_group_box) self.reset_button = QtWidgets.QPushButton(self.filter_gb)
self.free_games_stack.setObjectName("free_games_stack") self.reset_button.setObjectName("reset_button")
self.verticalLayout_2.addWidget(self.free_games_stack) self.verticalLayout_2.addWidget(self.reset_button)
self.verticalLayout_3.addWidget(self.free_game_group_box) self.price_gb = QtWidgets.QGroupBox(self.filter_gb)
self.wishlist_gb = QtWidgets.QGroupBox(self.scrollAreaWidgetContents) self.price_gb.setObjectName("price_gb")
self.wishlist_gb.setObjectName("wishlist_gb") self.verticalLayout_9 = QtWidgets.QVBoxLayout(self.price_gb)
self.verticalLayout_3.addWidget(self.wishlist_gb) self.verticalLayout_9.setObjectName("verticalLayout_9")
self.none_price = QtWidgets.QRadioButton(self.price_gb)
self.none_price.setChecked(True)
self.none_price.setObjectName("none_price")
self.verticalLayout_9.addWidget(self.none_price)
self.free_button = QtWidgets.QRadioButton(self.price_gb)
self.free_button.setObjectName("free_button")
self.verticalLayout_9.addWidget(self.free_button)
self.under10 = QtWidgets.QRadioButton(self.price_gb)
self.under10.setObjectName("under10")
self.verticalLayout_9.addWidget(self.under10)
self.under20 = QtWidgets.QRadioButton(self.price_gb)
self.under20.setObjectName("under20")
self.verticalLayout_9.addWidget(self.under20)
self.under30 = QtWidgets.QRadioButton(self.price_gb)
self.under30.setObjectName("under30")
self.verticalLayout_9.addWidget(self.under30)
self.above = QtWidgets.QRadioButton(self.price_gb)
self.above.setObjectName("above")
self.verticalLayout_9.addWidget(self.above)
self.on_discount = QtWidgets.QRadioButton(self.price_gb)
self.on_discount.setObjectName("on_discount")
self.verticalLayout_9.addWidget(self.on_discount)
self.verticalLayout_2.addWidget(self.price_gb)
self.platform_gb = QtWidgets.QGroupBox(self.filter_gb)
self.platform_gb.setObjectName("platform_gb")
self.verticalLayout_13 = QtWidgets.QVBoxLayout(self.platform_gb)
self.verticalLayout_13.setObjectName("verticalLayout_13")
self.verticalLayout_2.addWidget(self.platform_gb)
self.genre_gb = QtWidgets.QGroupBox(self.filter_gb)
self.genre_gb.setObjectName("genre_gb")
self.verticalLayout_12 = QtWidgets.QVBoxLayout(self.genre_gb)
self.verticalLayout_12.setObjectName("verticalLayout_12")
self.verticalLayout_2.addWidget(self.genre_gb)
self.type_gb = QtWidgets.QGroupBox(self.filter_gb)
self.type_gb.setObjectName("type_gb")
self.verticalLayout_11 = QtWidgets.QVBoxLayout(self.type_gb)
self.verticalLayout_11.setObjectName("verticalLayout_11")
self.verticalLayout_2.addWidget(self.type_gb)
self.others_gb = QtWidgets.QGroupBox(self.filter_gb)
self.others_gb.setObjectName("others_gb")
self.verticalLayout_10 = QtWidgets.QVBoxLayout(self.others_gb)
self.verticalLayout_10.setObjectName("verticalLayout_10")
self.verticalLayout_2.addWidget(self.others_gb)
spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.verticalLayout_3.addItem(spacerItem) self.verticalLayout_2.addItem(spacerItem)
self.horizontalLayout.addWidget(self.filter_gb)
self.scrollArea.setWidget(self.scrollAreaWidgetContents) self.scrollArea.setWidget(self.scrollAreaWidgetContents)
self.verticalLayout.addWidget(self.scrollArea) self.horizontalLayout_2.addWidget(self.scrollArea)
self.verticalLayout_7.addLayout(self.horizontalLayout_2)
self.retranslateUi(ShopWidget) self.retranslateUi(ShopWidget)
self.free_games_stack.setCurrentIndex(-1)
QtCore.QMetaObject.connectSlotsByName(ShopWidget) QtCore.QMetaObject.connectSlotsByName(ShopWidget)
def retranslateUi(self, ShopWidget): def retranslateUi(self, ShopWidget):
_translate = QtCore.QCoreApplication.translate _translate = QtCore.QCoreApplication.translate
ShopWidget.setWindowTitle(_translate("ShopWidget", "Form")) ShopWidget.setWindowTitle(_translate("ShopWidget", "Form"))
self.free_game_group_box.setTitle(_translate("ShopWidget", "Free Games")) self.free_game_group_box.setTitle(_translate("ShopWidget", "Free Games"))
self.wishlist_gb.setTitle(_translate("ShopWidget", "Discounts from your wishlist")) self.discounts_gb.setTitle(_translate("ShopWidget", "Discounts from your wishlist"))
self.filter_game_gb.setTitle(_translate("ShopWidget", "Games"))
self.filter_gb.setTitle(_translate("ShopWidget", "Filter"))
self.reset_button.setText(_translate("ShopWidget", "Reset"))
self.price_gb.setTitle(_translate("ShopWidget", "Price"))
self.none_price.setText(_translate("ShopWidget", "None"))
self.free_button.setText(_translate("ShopWidget", "Free"))
self.under10.setText(_translate("ShopWidget", "Under 10"))
self.under20.setText(_translate("ShopWidget", "Under 20"))
self.under30.setText(_translate("ShopWidget", "Under 30"))
self.above.setText(_translate("ShopWidget", "14.99 and above"))
self.on_discount.setText(_translate("ShopWidget", "Discount"))
self.platform_gb.setTitle(_translate("ShopWidget", "Platform"))
self.genre_gb.setTitle(_translate("ShopWidget", "Genre"))
self.type_gb.setTitle(_translate("ShopWidget", "Type"))
self.others_gb.setTitle(_translate("ShopWidget", "Other Tags"))
if __name__ == "__main__": if __name__ == "__main__":

View file

@ -3,73 +3,232 @@
<class>ShopWidget</class> <class>ShopWidget</class>
<widget class="QWidget" name="ShopWidget"> <widget class="QWidget" name="ShopWidget">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>697</width> <width>850</width>
<height>362</height> <height>572</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QScrollArea" name="scrollArea">
<property name="widgetResizable">
<bool>true</bool>
</property> </property>
<widget class="QWidget" name="scrollAreaWidgetContents"> <layout class="QVBoxLayout" name="verticalLayout_7">
<property name="geometry"> <item>
<rect> <layout class="QHBoxLayout" name="horizontalLayout_2">
<x>0</x> <item>
<y>0</y> <widget class="QScrollArea" name="scrollArea">
<width>677</width> <property name="widgetResizable">
<height>342</height> <bool>true</bool>
</rect> </property>
</property> <widget class="QWidget" name="scrollAreaWidgetContents">
<layout class="QVBoxLayout" name="verticalLayout_3"> <property name="geometry">
<item> <rect>
<widget class="QGroupBox" name="free_game_group_box"> <x>0</x>
<property name="title"> <y>0</y>
<string>Free Games</string> <width>828</width>
</property> <height>550</height>
<layout class="QVBoxLayout" name="verticalLayout_2"> </rect>
<item> </property>
<widget class="QStackedWidget" name="free_games_stack"> <layout class="QHBoxLayout" name="horizontalLayout">
<property name="currentIndex"> <item>
<number>-1</number> <widget class="QWidget" name="widget" native="true">
</property> <layout class="QVBoxLayout" name="verticalLayout">
</widget> <item>
</item> <widget class="QGroupBox" name="free_game_group_box">
</layout> <property name="title">
</widget> <string>Free Games</string>
</item> </property>
<item> <layout class="QVBoxLayout" name="verticalLayout_3">
<widget class="QGroupBox" name="wishlist_gb"> <item>
<property name="title"> <widget class="QStackedWidget" name="free_stack">
<string>Discounts from your wishlist</string> <widget class="QWidget" name="free_widget">
</property> <layout class="QVBoxLayout"
</widget> name="verticalLayout_8"/>
</item> </widget>
<item> </widget>
<spacer name="spacer"> </item>
<property name="orientation"> </layout>
<enum>Qt::Vertical</enum> </widget>
</property> </item>
<property name="sizeHint" stdset="0"> <item>
<size> <widget class="QGroupBox" name="discounts_gb">
<width>20</width> <property name="title">
<height>40</height> <string>Discounts from your wishlist</string>
</size> </property>
</property> <layout class="QVBoxLayout" name="verticalLayout_6">
</spacer> <item>
</item> <widget class="QStackedWidget" name="discount_stack">
</layout> <widget class="QWidget" name="discount_widget"/>
</widget> </widget>
</widget> </item>
</item> </layout>
</layout> </widget>
</item>
<item>
<widget class="QGroupBox" name="filter_game_gb">
<property name="title">
<string>Games</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<widget class="QStackedWidget" name="game_stack">
<widget class="QWidget" name="game_widget"/>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="filter_gb">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>150</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="title">
<string>Filter</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QPushButton" name="reset_button">
<property name="text">
<string>Reset</string>
</property>
</widget>
</item>
<item>
<widget class="QGroupBox" name="price_gb">
<property name="title">
<string>Price</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_9">
<item>
<widget class="QRadioButton" name="none_price">
<property name="text">
<string>None</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="free_button">
<property name="text">
<string>Free</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="under10">
<property name="text">
<string>Under 10</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="under20">
<property name="text">
<string>Under 20</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="under30">
<property name="text">
<string>Under 30</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="above">
<property name="text">
<string>14.99 and above</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="on_discount">
<property name="text">
<string>Discount</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="platform_gb">
<property name="title">
<string>Platform</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_13"/>
</widget>
</item>
<item>
<widget class="QGroupBox" name="genre_gb">
<property name="title">
<string>Genre</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_12"/>
</widget>
</item>
<item>
<widget class="QGroupBox" name="type_gb">
<property name="title">
<string>Type</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_11"/>
</widget>
</item>
<item>
<widget class="QGroupBox" name="others_gb">
<property name="title">
<string>Other Tags</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_10"/>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</item>
</layout>
</widget> </widget>
<resources/> <resources/>
<connections/> <connections/>