Merge pull request #137 from Dummerle/multi-platform
Add support for MacOS and 32 bit games + Fix many bugs
This commit is contained in:
commit
37e3c624ba
33 changed files with 624 additions and 448 deletions
|
@ -1 +1 @@
|
||||||
Subproject commit 857de50b4e3a05b05de3403d29700af1c83a3144
|
Subproject commit 1aa43e44e1fe0e5c776b6a217df218240c7dbac2
|
|
@ -1,4 +1,5 @@
|
||||||
import os
|
import os
|
||||||
|
import platform
|
||||||
from multiprocessing import Queue as MPQueue
|
from multiprocessing import Queue as MPQueue
|
||||||
|
|
||||||
from PyQt5.QtCore import Qt, QObject, QRunnable, QThreadPool, pyqtSignal, pyqtSlot
|
from PyQt5.QtCore import Qt, QObject, QRunnable, QThreadPool, pyqtSignal, pyqtSlot
|
||||||
|
@ -59,6 +60,20 @@ class InstallDialog(QDialog, Ui_InstallDialog):
|
||||||
self.warn_label.setVisible(False)
|
self.warn_label.setVisible(False)
|
||||||
self.warn_message.setVisible(False)
|
self.warn_message.setVisible(False)
|
||||||
|
|
||||||
|
platforms = ["Windows"]
|
||||||
|
if dl_item.options.app_name in shared.api_results.bit32_games:
|
||||||
|
platforms.append("Win32")
|
||||||
|
if dl_item.options.app_name in shared.api_results.mac_games:
|
||||||
|
platforms.append("Mac")
|
||||||
|
self.platform_combo_box.addItems(platforms)
|
||||||
|
self.platform_combo_box.currentIndexChanged.connect(lambda: self.option_changed(None))
|
||||||
|
self.platform_combo_box.currentIndexChanged.connect(lambda i: QMessageBox.warning(self, "Warning", self.tr(
|
||||||
|
"You will not be able to run the Game if you choose {}").format(self.platform_combo_box.itemText(i)))
|
||||||
|
if (self.platform_combo_box.currentText() == "Mac" and platform.system() != "Darwin") else None)
|
||||||
|
|
||||||
|
if platform.system() == "Darwin" and "Mac" in platforms:
|
||||||
|
self.platform_combo_box.setCurrentIndex(platforms.index("Mac"))
|
||||||
|
|
||||||
if self.core.lgd.config.has_option("Legendary", "max_workers"):
|
if self.core.lgd.config.has_option("Legendary", "max_workers"):
|
||||||
max_workers = self.core.lgd.config.get("Legendary", "max_workers")
|
max_workers = self.core.lgd.config.get("Legendary", "max_workers")
|
||||||
else:
|
else:
|
||||||
|
@ -110,6 +125,7 @@ class InstallDialog(QDialog, Ui_InstallDialog):
|
||||||
self.dl_item.options.force = self.force_download_check.isChecked()
|
self.dl_item.options.force = self.force_download_check.isChecked()
|
||||||
self.dl_item.options.ignore_space_req = self.ignore_space_check.isChecked()
|
self.dl_item.options.ignore_space_req = self.ignore_space_check.isChecked()
|
||||||
self.dl_item.options.no_install = self.download_only_check.isChecked()
|
self.dl_item.options.no_install = self.download_only_check.isChecked()
|
||||||
|
self.dl_item.options.platform = self.platform_combo_box.currentText()
|
||||||
self.dl_item.options.sdl_list = ['']
|
self.dl_item.options.sdl_list = ['']
|
||||||
for cb in self.sdl_list_checks:
|
for cb in self.sdl_list_checks:
|
||||||
if data := cb.isChecked():
|
if data := cb.isChecked():
|
||||||
|
@ -232,7 +248,7 @@ class InstallInfoWorker(QRunnable):
|
||||||
# override_manifest=,
|
# override_manifest=,
|
||||||
# override_old_manifest=,
|
# override_old_manifest=,
|
||||||
# override_base_url=,
|
# override_base_url=,
|
||||||
# platform_override=,
|
platform=self.dl_item.options.platform,
|
||||||
# file_prefix_filter=,
|
# file_prefix_filter=,
|
||||||
# file_exclude_filter=,
|
# file_exclude_filter=,
|
||||||
# file_install_tag=,
|
# file_install_tag=,
|
||||||
|
|
|
@ -49,10 +49,34 @@ class ApiRequestWorker(QRunnable):
|
||||||
self.signals.result.emit(result, text)
|
self.signals.result.emit(result, text)
|
||||||
|
|
||||||
|
|
||||||
|
class AssetWorker(QRunnable):
|
||||||
|
def __init__(self):
|
||||||
|
super(AssetWorker, self).__init__()
|
||||||
|
self.signals = ApiSignals()
|
||||||
|
self.setAutoDelete(True)
|
||||||
|
self.assets = dict()
|
||||||
|
|
||||||
|
def run(self) -> None:
|
||||||
|
for platform in shared.core.get_installed_platforms():
|
||||||
|
self.assets.update({platform: self.get_asset(platform)})
|
||||||
|
self.signals.result.emit(self.assets, "assets")
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_asset(platform):
|
||||||
|
if not shared.core.egs.user:
|
||||||
|
return []
|
||||||
|
assets = [
|
||||||
|
GameAsset.from_egs_json(a) for a in
|
||||||
|
shared.core.egs.get_game_assets(platform=platform)
|
||||||
|
]
|
||||||
|
|
||||||
|
return assets
|
||||||
|
|
||||||
|
|
||||||
class LaunchDialog(QDialog, Ui_LaunchDialog):
|
class LaunchDialog(QDialog, Ui_LaunchDialog):
|
||||||
quit_app = pyqtSignal(int)
|
quit_app = pyqtSignal(int)
|
||||||
start_app = pyqtSignal()
|
start_app = pyqtSignal()
|
||||||
finished = False
|
finished = 0
|
||||||
|
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
super(LaunchDialog, self).__init__(parent=parent)
|
super(LaunchDialog, self).__init__(parent=parent)
|
||||||
|
@ -102,20 +126,23 @@ class LaunchDialog(QDialog, Ui_LaunchDialog):
|
||||||
api_requests = [
|
api_requests = [
|
||||||
["32bit", self.core.get_game_and_dlc_list, (True, "Win32")],
|
["32bit", self.core.get_game_and_dlc_list, (True, "Win32")],
|
||||||
["mac", self.core.get_game_and_dlc_list, (True, "Mac")],
|
["mac", self.core.get_game_and_dlc_list, (True, "Mac")],
|
||||||
["assets", self.core.egs.get_game_assets, ()],
|
|
||||||
]
|
]
|
||||||
# gamelist and no_asset games are from Image worker
|
# gamelist and no_asset games are from Image worker
|
||||||
worker = ApiRequestWorker(api_requests)
|
worker = ApiRequestWorker(api_requests)
|
||||||
worker.signals.result.connect(self.handle_api_worker_result)
|
worker.signals.result.connect(self.handle_api_worker_result)
|
||||||
self.thread_pool.start(worker)
|
self.thread_pool.start(worker)
|
||||||
|
|
||||||
|
asset_worker = AssetWorker()
|
||||||
|
asset_worker.signals.result.connect(self.handle_api_worker_result)
|
||||||
|
self.thread_pool.start(asset_worker)
|
||||||
|
|
||||||
# cloud save from another worker, because it is used in cloud_save_utils too
|
# cloud save from another worker, because it is used in cloud_save_utils too
|
||||||
cloud_worker = CloudWorker()
|
cloud_worker = CloudWorker()
|
||||||
cloud_worker.signals.result_ready.connect(lambda x: self.handle_api_worker_result(x, "saves"))
|
cloud_worker.signals.result_ready.connect(lambda x: self.handle_api_worker_result(x, "saves"))
|
||||||
self.thread_pool.start(cloud_worker)
|
self.thread_pool.start(cloud_worker)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
self.finished = True
|
self.finished = 2
|
||||||
self.api_results.game_list, self.api_results.dlcs = self.core.get_game_and_dlc_list(False)
|
self.api_results.game_list, self.api_results.dlcs = self.core.get_game_and_dlc_list(False)
|
||||||
self.finish()
|
self.finish()
|
||||||
|
|
||||||
|
@ -130,18 +157,16 @@ class LaunchDialog(QDialog, Ui_LaunchDialog):
|
||||||
self.api_results.bit32_games = [i.app_name for i in result[0]] if result else []
|
self.api_results.bit32_games = [i.app_name for i in result[0]] if result else []
|
||||||
elif text == "mac":
|
elif text == "mac":
|
||||||
self.api_results.mac_games = [i.app_name for i in result[0]] if result else []
|
self.api_results.mac_games = [i.app_name for i in result[0]] if result else []
|
||||||
elif text == "assets":
|
|
||||||
if not result:
|
|
||||||
assets = self.core.lgd.assets
|
|
||||||
else:
|
|
||||||
assets = [GameAsset.from_egs_json(a) for a in result]
|
|
||||||
self.core.lgd.assets = assets
|
|
||||||
self.api_results.assets = assets
|
|
||||||
elif text == "no_assets":
|
elif text == "no_assets":
|
||||||
self.api_results.no_asset_games = result if result else []
|
self.api_results.no_asset_games = result if result else []
|
||||||
|
|
||||||
elif text == "saves":
|
elif text == "saves":
|
||||||
self.api_results.saves = result
|
self.api_results.saves = result
|
||||||
|
elif text == "assets":
|
||||||
|
self.core.lgd.assets = result
|
||||||
|
self.finish()
|
||||||
|
return
|
||||||
|
|
||||||
if self.api_results:
|
if self.api_results:
|
||||||
self.finish()
|
self.finish()
|
||||||
|
@ -152,11 +177,11 @@ class LaunchDialog(QDialog, Ui_LaunchDialog):
|
||||||
self.finish()
|
self.finish()
|
||||||
|
|
||||||
def finish(self):
|
def finish(self):
|
||||||
if self.finished:
|
if self.finished == 2:
|
||||||
logger.info("App starting")
|
logger.info("App starting")
|
||||||
self.image_info.setText(self.tr("Starting..."))
|
self.image_info.setText(self.tr("Starting..."))
|
||||||
shared.args.offline = self.offline
|
shared.args.offline = self.offline
|
||||||
shared.init_api_response(self.api_results)
|
shared.init_api_response(self.api_results)
|
||||||
self.start_app.emit()
|
self.start_app.emit()
|
||||||
else:
|
else:
|
||||||
self.finished = True
|
self.finished += 1
|
||||||
|
|
|
@ -1,13 +1,14 @@
|
||||||
import datetime
|
import datetime
|
||||||
from logging import getLogger
|
from logging import getLogger
|
||||||
|
from typing import List, Dict
|
||||||
|
|
||||||
from PyQt5.QtCore import QThread, pyqtSignal, QSettings
|
from PyQt5.QtCore import QThread, pyqtSignal, QSettings
|
||||||
from PyQt5.QtWidgets import QWidget, QMessageBox, QVBoxLayout, QLabel, QPushButton, \
|
from PyQt5.QtWidgets import QWidget, QMessageBox, QVBoxLayout, QLabel, QPushButton, \
|
||||||
QGroupBox
|
QGroupBox
|
||||||
|
|
||||||
from legendary.core import LegendaryCore
|
from legendary.core import LegendaryCore
|
||||||
from legendary.models.downloading import UIUpdate
|
from legendary.models.downloading import UIUpdate
|
||||||
from legendary.models.game import Game, InstalledGame
|
from legendary.models.game import Game, InstalledGame
|
||||||
|
|
||||||
from rare import shared
|
from rare import shared
|
||||||
from rare.components.dialogs.install_dialog import InstallDialog
|
from rare.components.dialogs.install_dialog import InstallDialog
|
||||||
from rare.components.tabs.downloads.dl_queue_widget import DlQueueWidget, DlWidget
|
from rare.components.tabs.downloads.dl_queue_widget import DlQueueWidget, DlWidget
|
||||||
|
@ -21,7 +22,7 @@ logger = getLogger("Download")
|
||||||
|
|
||||||
class DownloadsTab(QWidget, Ui_DownloadsTab):
|
class DownloadsTab(QWidget, Ui_DownloadsTab):
|
||||||
thread: QThread
|
thread: QThread
|
||||||
dl_queue = list()
|
dl_queue: List[InstallQueueItemModel] = []
|
||||||
dl_status = pyqtSignal(int)
|
dl_status = pyqtSignal(int)
|
||||||
|
|
||||||
def __init__(self, updates: list):
|
def __init__(self, updates: list):
|
||||||
|
@ -43,7 +44,7 @@ class DownloadsTab(QWidget, Ui_DownloadsTab):
|
||||||
self.update_layout = QVBoxLayout(self.updates)
|
self.update_layout = QVBoxLayout(self.updates)
|
||||||
self.queue_scroll_contents_layout.addWidget(self.updates)
|
self.queue_scroll_contents_layout.addWidget(self.updates)
|
||||||
|
|
||||||
self.update_widgets = {}
|
self.update_widgets: Dict[str, UpdateWidget] = {}
|
||||||
|
|
||||||
self.update_text = QLabel(self.tr("No updates available"))
|
self.update_text = QLabel(self.tr("No updates available"))
|
||||||
self.update_layout.addWidget(self.update_text)
|
self.update_layout.addWidget(self.update_text)
|
||||||
|
@ -59,6 +60,7 @@ class DownloadsTab(QWidget, Ui_DownloadsTab):
|
||||||
self.signals.game_uninstalled.connect(self.remove_update)
|
self.signals.game_uninstalled.connect(self.remove_update)
|
||||||
|
|
||||||
self.signals.add_download.connect(lambda app_name: self.add_update(self.core.get_installed_game(app_name)))
|
self.signals.add_download.connect(lambda app_name: self.add_update(self.core.get_installed_game(app_name)))
|
||||||
|
shared.signals.game_uninstalled.connect(self.game_uninstalled)
|
||||||
|
|
||||||
self.reset_infos()
|
self.reset_infos()
|
||||||
|
|
||||||
|
@ -75,6 +77,23 @@ class DownloadsTab(QWidget, Ui_DownloadsTab):
|
||||||
if QSettings().value("auto_update", False, bool):
|
if QSettings().value("auto_update", False, bool):
|
||||||
self.get_install_options(InstallOptionsModel(app_name=igame.app_name, update=True, silent=True))
|
self.get_install_options(InstallOptionsModel(app_name=igame.app_name, update=True, silent=True))
|
||||||
widget.update_button.setDisabled(True)
|
widget.update_button.setDisabled(True)
|
||||||
|
self.update_text.setVisible(False)
|
||||||
|
|
||||||
|
def game_uninstalled(self, app_name):
|
||||||
|
# game in dl_queue
|
||||||
|
for i, item in enumerate(self.dl_queue):
|
||||||
|
if item.options.app_name == app_name:
|
||||||
|
self.dl_queue.pop(i)
|
||||||
|
self.queue_widget.update_queue(self.dl_queue)
|
||||||
|
break
|
||||||
|
|
||||||
|
# game has available update
|
||||||
|
if app_name in self.update_widgets.keys():
|
||||||
|
self.remove_update(app_name)
|
||||||
|
|
||||||
|
# if game is updating
|
||||||
|
if self.active_game and self.active_game.app_name == app_name:
|
||||||
|
self.stop_download()
|
||||||
|
|
||||||
def remove_update(self, app_name):
|
def remove_update(self, app_name):
|
||||||
if w := self.update_widgets.get(app_name):
|
if w := self.update_widgets.get(app_name):
|
||||||
|
@ -128,10 +147,9 @@ class DownloadsTab(QWidget, Ui_DownloadsTab):
|
||||||
self.queue_widget.update_queue(self.dl_queue)
|
self.queue_widget.update_queue(self.dl_queue)
|
||||||
|
|
||||||
if game.app_name in self.update_widgets.keys():
|
if game.app_name in self.update_widgets.keys():
|
||||||
self.update_widgets[game.app_name].setVisible(False)
|
igame = self.core.get_installed_game(game.app_name)
|
||||||
self.update_widgets.pop(game.app_name)
|
if self.core.get_asset(game.app_name, igame.platform, False).build_version == igame.version:
|
||||||
if len(self.update_widgets) == 0:
|
self.remove_update(game.app_name)
|
||||||
self.update_text.setVisible(True)
|
|
||||||
|
|
||||||
self.signals.send_notification.emit(game.app_title)
|
self.signals.send_notification.emit(game.app_title)
|
||||||
self.signals.update_gamelist.emit([game.app_name])
|
self.signals.update_gamelist.emit([game.app_name])
|
||||||
|
@ -207,10 +225,10 @@ class DownloadsTab(QWidget, Ui_DownloadsTab):
|
||||||
class UpdateWidget(QWidget):
|
class UpdateWidget(QWidget):
|
||||||
update_signal = pyqtSignal(InstallOptionsModel)
|
update_signal = pyqtSignal(InstallOptionsModel)
|
||||||
|
|
||||||
def __init__(self, core: LegendaryCore, game: InstalledGame, parent):
|
def __init__(self, core: LegendaryCore, igame: InstalledGame, parent):
|
||||||
super(UpdateWidget, self).__init__(parent=parent)
|
super(UpdateWidget, self).__init__(parent=parent)
|
||||||
self.core = core
|
self.core = core
|
||||||
self.game = game
|
self.game = igame
|
||||||
|
|
||||||
self.layout = QVBoxLayout()
|
self.layout = QVBoxLayout()
|
||||||
self.title = QLabel(self.game.title)
|
self.title = QLabel(self.game.title)
|
||||||
|
@ -223,8 +241,8 @@ class UpdateWidget(QWidget):
|
||||||
self.layout.addWidget(self.update_button)
|
self.layout.addWidget(self.update_button)
|
||||||
self.layout.addWidget(self.update_with_settings)
|
self.layout.addWidget(self.update_with_settings)
|
||||||
self.layout.addWidget(QLabel(
|
self.layout.addWidget(QLabel(
|
||||||
self.tr("Version: ") + self.game.version + " -> " + self.core.get_asset(self.game.app_name,
|
self.tr("Version: ") + self.game.version + " -> " +
|
||||||
True).build_version))
|
self.core.get_asset(self.game.app_name, self.game.platform, True).build_version))
|
||||||
|
|
||||||
self.setLayout(self.layout)
|
self.setLayout(self.layout)
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
from logging import getLogger
|
from logging import getLogger
|
||||||
|
from typing import Tuple, Dict
|
||||||
|
|
||||||
from PyQt5.QtCore import QSettings, QObjectCleanupHandler
|
from PyQt5.QtCore import QSettings, QObjectCleanupHandler
|
||||||
from PyQt5.QtGui import QImage, QPixmap
|
from PyQt5.QtGui import QImage, QPixmap
|
||||||
|
@ -28,7 +29,7 @@ logger = getLogger("GamesTab")
|
||||||
|
|
||||||
|
|
||||||
class GamesTab(QStackedWidget, Ui_GamesTab):
|
class GamesTab(QStackedWidget, Ui_GamesTab):
|
||||||
widgets = dict()
|
widgets: Dict[str, Tuple[InstalledIconWidget, InstalledListWidget]] = dict()
|
||||||
running_games = list()
|
running_games = list()
|
||||||
updates = set()
|
updates = set()
|
||||||
active_filter = 0
|
active_filter = 0
|
||||||
|
@ -130,8 +131,8 @@ class GamesTab(QStackedWidget, Ui_GamesTab):
|
||||||
self.setCurrentIndex(2)
|
self.setCurrentIndex(2)
|
||||||
self.import_sync_tabs.show_egl_sync()
|
self.import_sync_tabs.show_egl_sync()
|
||||||
|
|
||||||
def show_game_info(self, game):
|
def show_game_info(self, app_name):
|
||||||
self.game_info_tabs.update_game(game)
|
self.game_info_tabs.update_game(app_name)
|
||||||
self.setCurrentIndex(1)
|
self.setCurrentIndex(1)
|
||||||
|
|
||||||
def show_uninstalled_info(self, game):
|
def show_uninstalled_info(self, game):
|
||||||
|
@ -237,7 +238,7 @@ class GamesTab(QStackedWidget, Ui_GamesTab):
|
||||||
visible = False
|
visible = False
|
||||||
elif filter_name == "32bit" and self.bit32:
|
elif filter_name == "32bit" and self.bit32:
|
||||||
visible = w.game.app_name in self.bit32
|
visible = w.game.app_name in self.bit32
|
||||||
elif filter_name == "mac":
|
elif filter_name == "mac" and self.mac_games:
|
||||||
visible = w.game.app_name in self.mac_games
|
visible = w.game.app_name in self.mac_games
|
||||||
elif filter_name == "installable":
|
elif filter_name == "installable":
|
||||||
visible = w.game.app_name not in self.no_asset_names
|
visible = w.game.app_name not in self.no_asset_names
|
||||||
|
@ -263,7 +264,7 @@ class GamesTab(QStackedWidget, Ui_GamesTab):
|
||||||
igame = self.core.get_installed_game(app_name)
|
igame = self.core.get_installed_game(app_name)
|
||||||
for w in widgets:
|
for w in widgets:
|
||||||
w.igame = igame
|
w.igame = igame
|
||||||
w.update_available = self.core.get_asset(w.game.app_name,
|
w.update_available = self.core.get_asset(w.game.app_name, w.igame.platform,
|
||||||
True).build_version != igame.version
|
True).build_version != igame.version
|
||||||
widgets[0].leaveEvent(None)
|
widgets[0].leaveEvent(None)
|
||||||
# new installed
|
# new installed
|
||||||
|
|
|
@ -80,8 +80,8 @@ class CloudSaveDialog(QDialog, Ui_SyncSaveDialog):
|
||||||
|
|
||||||
self.title_label.setText(self.title_label.text() + igame.title)
|
self.title_label.setText(self.title_label.text() + igame.title)
|
||||||
|
|
||||||
self.date_info_local.setText(dt_local.strftime("%A, %d. %B %Y %I:%M%p"))
|
self.date_info_local.setText(dt_local.strftime("%A, %d. %B %Y %X"))
|
||||||
self.date_info_remote.setText(dt_remote.strftime("%A, %d. %B %Y %I:%M%p"))
|
self.date_info_remote.setText(dt_remote.strftime("%A, %d. %B %Y %X"))
|
||||||
|
|
||||||
new_text = self.tr(" (newer)")
|
new_text = self.tr(" (newer)")
|
||||||
if newer == "remote":
|
if newer == "remote":
|
||||||
|
|
|
@ -2,7 +2,6 @@ from PyQt5.QtCore import Qt
|
||||||
from PyQt5.QtGui import QKeyEvent
|
from PyQt5.QtGui import QKeyEvent
|
||||||
|
|
||||||
import rare.shared as shared
|
import rare.shared as shared
|
||||||
from legendary.models.game import Game
|
|
||||||
from rare.utils.extra_widgets import SideTabWidget
|
from rare.utils.extra_widgets import SideTabWidget
|
||||||
from .game_dlc import GameDlc
|
from .game_dlc import GameDlc
|
||||||
from .game_info import GameInfo
|
from .game_info import GameInfo
|
||||||
|
@ -28,17 +27,17 @@ class GameInfoTabs(SideTabWidget):
|
||||||
|
|
||||||
self.tabBar().setCurrentIndex(1)
|
self.tabBar().setCurrentIndex(1)
|
||||||
|
|
||||||
def update_game(self, game: Game):
|
def update_game(self, app_name: str):
|
||||||
self.setCurrentIndex(1)
|
self.setCurrentIndex(1)
|
||||||
self.info.update_game(game)
|
self.info.update_game(app_name)
|
||||||
self.settings.update_game(game)
|
self.settings.update_game(app_name)
|
||||||
|
|
||||||
# DLC Tab: Disable if no dlcs available
|
# DLC Tab: Disable if no dlcs available
|
||||||
if len(self.dlc_list[game.asset_info.catalog_item_id]) == 0:
|
if len(self.dlc_list[self.core.get_game(app_name).catalog_item_id]) == 0:
|
||||||
self.setTabEnabled(3, False)
|
self.setTabEnabled(3, False)
|
||||||
else:
|
else:
|
||||||
self.setTabEnabled(3, True)
|
self.setTabEnabled(3, True)
|
||||||
self.dlc.update_dlcs(game.app_name)
|
self.dlc.update_dlcs(app_name)
|
||||||
|
|
||||||
def keyPressEvent(self, e: QKeyEvent):
|
def keyPressEvent(self, e: QKeyEvent):
|
||||||
if e.key() == Qt.Key_Escape:
|
if e.key() == Qt.Key_Escape:
|
||||||
|
|
|
@ -31,7 +31,7 @@ class GameDlc(QWidget, Ui_GameDlc):
|
||||||
|
|
||||||
def update_dlcs(self, app_name):
|
def update_dlcs(self, app_name):
|
||||||
self.game = self.core.get_game(app_name)
|
self.game = self.core.get_game(app_name)
|
||||||
dlcs = self.dlcs[self.game.asset_info.catalog_item_id]
|
dlcs = self.dlcs[self.game.catalog_item_id]
|
||||||
self.game_title.setText(f"<h2>{self.game.app_title}</h2>")
|
self.game_title.setText(f"<h2>{self.game.app_title}</h2>")
|
||||||
|
|
||||||
if self.installed_dlc_widgets:
|
if self.installed_dlc_widgets:
|
||||||
|
@ -43,8 +43,8 @@ class GameDlc(QWidget, Ui_GameDlc):
|
||||||
dlc_widget.install.disconnect()
|
dlc_widget.install.disconnect()
|
||||||
dlc_widget.deleteLater()
|
dlc_widget.deleteLater()
|
||||||
self.available_dlc_widgets.clear()
|
self.available_dlc_widgets.clear()
|
||||||
for dlc in sorted(dlcs, key=lambda x: x.app_title):
|
|
||||||
|
|
||||||
|
for dlc in sorted(dlcs, key=lambda x: x.app_title):
|
||||||
if self.core.is_installed(dlc.app_name):
|
if self.core.is_installed(dlc.app_name):
|
||||||
dlc_widget = GameDlcWidget(dlc, True)
|
dlc_widget = GameDlcWidget(dlc, True)
|
||||||
self.installed_dlc_contents_layout.addWidget(dlc_widget)
|
self.installed_dlc_contents_layout.addWidget(dlc_widget)
|
||||||
|
@ -86,7 +86,7 @@ class GameDlcWidget(QFrame, Ui_GameDlcWidget):
|
||||||
self.dlc = dlc
|
self.dlc = dlc
|
||||||
|
|
||||||
self.dlc_name.setText(dlc.app_title)
|
self.dlc_name.setText(dlc.app_title)
|
||||||
self.version.setText(dlc.app_version)
|
self.version.setText(dlc.app_version())
|
||||||
self.app_name.setText(dlc.app_name)
|
self.app_name.setText(dlc.app_name)
|
||||||
|
|
||||||
self.pixmap = get_pixmap(dlc.app_name)
|
self.pixmap = get_pixmap(dlc.app_name)
|
||||||
|
|
|
@ -92,6 +92,9 @@ class GameInfo(QWidget, Ui_GameInfo):
|
||||||
igame.needs_verification = False
|
igame.needs_verification = False
|
||||||
self.core.lgd.set_installed_game(self.igame.app_name, igame)
|
self.core.lgd.set_installed_game(self.igame.app_name, igame)
|
||||||
self.verification_finished.emit(igame)
|
self.verification_finished.emit(igame)
|
||||||
|
elif failed == missing == -1:
|
||||||
|
QMessageBox.warning(self, "Warning", self.tr("Something went wrong"))
|
||||||
|
|
||||||
else:
|
else:
|
||||||
ans = QMessageBox.question(self, "Summary", self.tr(
|
ans = QMessageBox.question(self, "Summary", self.tr(
|
||||||
'Verification failed, {} file(s) corrupted, {} file(s) are missing. Do you want to repair them?').format(
|
'Verification failed, {} file(s) corrupted, {} file(s) are missing. Do you want to repair them?').format(
|
||||||
|
@ -102,18 +105,21 @@ class GameInfo(QWidget, Ui_GameInfo):
|
||||||
self.verify_widget.setCurrentIndex(0)
|
self.verify_widget.setCurrentIndex(0)
|
||||||
self.verify_threads.pop(app_name)
|
self.verify_threads.pop(app_name)
|
||||||
|
|
||||||
def update_game(self, game: Game):
|
def update_game(self, app_name: str):
|
||||||
self.game = game
|
self.game = self.core.get_game(app_name)
|
||||||
self.igame = self.core.get_installed_game(game.app_name)
|
self.igame = self.core.get_installed_game(self.game.app_name)
|
||||||
self.game_title.setText(f'<h2>{self.game.app_title}</h2>')
|
self.game_title.setText(f'<h2>{self.game.app_title}</h2>')
|
||||||
|
|
||||||
pixmap = get_pixmap(game.app_name)
|
pixmap = get_pixmap(self.game.app_name)
|
||||||
w = 200
|
w = 200
|
||||||
pixmap = pixmap.scaled(w, int(w * 4 / 3))
|
pixmap = pixmap.scaled(w, int(w * 4 / 3))
|
||||||
self.image.setPixmap(pixmap)
|
self.image.setPixmap(pixmap)
|
||||||
|
|
||||||
self.app_name.setText(self.game.app_name)
|
self.app_name.setText(self.game.app_name)
|
||||||
self.version.setText(self.game.app_version)
|
if self.igame:
|
||||||
|
self.version.setText(self.igame.version)
|
||||||
|
else:
|
||||||
|
self.version.setText(self.game.app_version(self.igame.platform if self.igame else "Windows"))
|
||||||
self.dev.setText(self.game.metadata["developer"])
|
self.dev.setText(self.game.metadata["developer"])
|
||||||
|
|
||||||
if self.igame:
|
if self.igame:
|
||||||
|
@ -121,9 +127,11 @@ class GameInfo(QWidget, Ui_GameInfo):
|
||||||
self.install_path.setText(self.igame.install_path)
|
self.install_path.setText(self.igame.install_path)
|
||||||
self.install_size.setVisible(True)
|
self.install_size.setVisible(True)
|
||||||
self.install_path.setVisible(True)
|
self.install_path.setVisible(True)
|
||||||
|
self.platform.setText(self.igame.platform)
|
||||||
else:
|
else:
|
||||||
self.install_size.setVisible(False)
|
self.install_size.setVisible(False)
|
||||||
self.install_path.setVisible(False)
|
self.install_path.setVisible(False)
|
||||||
|
self.platform.setText("Windows")
|
||||||
|
|
||||||
if not self.igame:
|
if not self.igame:
|
||||||
# origin game
|
# origin game
|
||||||
|
@ -139,13 +147,13 @@ class GameInfo(QWidget, Ui_GameInfo):
|
||||||
|
|
||||||
if platform.system() != "Windows":
|
if platform.system() != "Windows":
|
||||||
self.grade.setText(self.tr("Loading"))
|
self.grade.setText(self.tr("Loading"))
|
||||||
self.steam_worker.set_app_name(game.app_name)
|
self.steam_worker.set_app_name(self.game.app_name)
|
||||||
QThreadPool.globalInstance().start(self.steam_worker)
|
QThreadPool.globalInstance().start(self.steam_worker)
|
||||||
|
|
||||||
if len(self.verify_threads.keys()) == 0 or not self.verify_threads.get(game.app_name):
|
if len(self.verify_threads.keys()) == 0 or not self.verify_threads.get(self.game.app_name):
|
||||||
self.verify_widget.setCurrentIndex(0)
|
self.verify_widget.setCurrentIndex(0)
|
||||||
elif self.verify_threads.get(game.app_name):
|
elif self.verify_threads.get(self.game.app_name):
|
||||||
self.verify_widget.setCurrentIndex(1)
|
self.verify_widget.setCurrentIndex(1)
|
||||||
self.verify_progress.setValue(
|
self.verify_progress.setValue(
|
||||||
self.verify_threads[game.app_name].num / self.verify_threads[game.app_name].total * 100
|
self.verify_threads[self.game.app_name].num / self.verify_threads[self.game.app_name].total * 100
|
||||||
)
|
)
|
||||||
|
|
|
@ -111,10 +111,8 @@ class GameSettings(QWidget, Ui_GameSettings):
|
||||||
self.linux_settings_contents_layout.addWidget(self.linux_settings)
|
self.linux_settings_contents_layout.addWidget(self.linux_settings)
|
||||||
self.linux_settings_contents_layout.setAlignment(Qt.AlignTop)
|
self.linux_settings_contents_layout.setAlignment(Qt.AlignTop)
|
||||||
else:
|
else:
|
||||||
self.game_settings_layout.setAlignment(Qt.AlignTop)
|
|
||||||
self.linux_settings_scroll.setVisible(False)
|
self.linux_settings_scroll.setVisible(False)
|
||||||
|
self.game_settings_layout.setAlignment(Qt.AlignTop)
|
||||||
# skip_update_check
|
|
||||||
|
|
||||||
def compute_save_path(self):
|
def compute_save_path(self):
|
||||||
if self.core.is_installed(self.game.app_name) and self.game.supports_cloud_saves:
|
if self.core.is_installed(self.game.app_name) and self.game.supports_cloud_saves:
|
||||||
|
@ -252,11 +250,10 @@ class GameSettings(QWidget, Ui_GameSettings):
|
||||||
self.core.lgd.config.set(self.game.app_name + ".env", "STEAM_COMPAT_DATA_PATH", text)
|
self.core.lgd.config.set(self.game.app_name + ".env", "STEAM_COMPAT_DATA_PATH", text)
|
||||||
self.core.lgd.save_config()
|
self.core.lgd.save_config()
|
||||||
|
|
||||||
def update_game(self, game: Game):
|
def update_game(self, app_name: str):
|
||||||
self.change = False
|
self.change = False
|
||||||
self.game = game
|
self.game = self.core.get_game(app_name)
|
||||||
self.igame = self.core.get_installed_game(game.app_name)
|
self.igame = self.core.get_installed_game(self.game.app_name)
|
||||||
app_name = game.app_name
|
|
||||||
if self.igame:
|
if self.igame:
|
||||||
if self.igame.can_run_offline:
|
if self.igame.can_run_offline:
|
||||||
offline = self.core.lgd.config.get(self.game.app_name, "offline", fallback="unset")
|
offline = self.core.lgd.config.get(self.game.app_name, "offline", fallback="unset")
|
||||||
|
@ -288,6 +285,11 @@ class GameSettings(QWidget, Ui_GameSettings):
|
||||||
if platform.system() != "Windows":
|
if platform.system() != "Windows":
|
||||||
self.linux_settings.update_game(app_name)
|
self.linux_settings.update_game(app_name)
|
||||||
|
|
||||||
|
if self.igame and self.igame.platform == "Mac":
|
||||||
|
self.linux_settings_scroll.setVisible(False)
|
||||||
|
else:
|
||||||
|
self.linux_settings_scroll.setVisible(True)
|
||||||
|
|
||||||
proton = self.core.lgd.config.get(f"{app_name}", "wrapper", fallback="").replace('"', "")
|
proton = self.core.lgd.config.get(f"{app_name}", "wrapper", fallback="").replace('"', "")
|
||||||
if proton and "proton" in proton:
|
if proton and "proton" in proton:
|
||||||
self.proton_prefix.setEnabled(True)
|
self.proton_prefix.setEnabled(True)
|
||||||
|
|
|
@ -74,6 +74,7 @@ class UninstalledInfo(QWidget, Ui_GameInfo):
|
||||||
|
|
||||||
self.game_actions_stack.setCurrentIndex(1)
|
self.game_actions_stack.setCurrentIndex(1)
|
||||||
self.game_actions_stack.resize(self.game_actions_stack.minimumSize())
|
self.game_actions_stack.resize(self.game_actions_stack.minimumSize())
|
||||||
|
self.lbl_platform.setText(self.tr("Platforms"))
|
||||||
|
|
||||||
def install_game(self):
|
def install_game(self):
|
||||||
self.signals.install_game.emit(InstallOptionsModel(app_name=self.game.app_name))
|
self.signals.install_game.emit(InstallOptionsModel(app_name=self.game.app_name))
|
||||||
|
@ -81,6 +82,12 @@ class UninstalledInfo(QWidget, Ui_GameInfo):
|
||||||
def update_game(self, game: Game):
|
def update_game(self, game: Game):
|
||||||
self.game = game
|
self.game = game
|
||||||
self.game_title.setText(f"<h2>{self.game.app_title}</h2>")
|
self.game_title.setText(f"<h2>{self.game.app_title}</h2>")
|
||||||
|
available_platforms = ["Windows"]
|
||||||
|
if self.game.app_name in shared.api_results.bit32_games:
|
||||||
|
available_platforms.append("32 Bit")
|
||||||
|
if self.game.app_name in shared.api_results.mac_games:
|
||||||
|
available_platforms.append("macOS")
|
||||||
|
self.platform.setText(", ".join(available_platforms))
|
||||||
|
|
||||||
pixmap = get_pixmap(game.app_name)
|
pixmap = get_pixmap(game.app_name)
|
||||||
w = 200
|
w = 200
|
||||||
|
@ -88,7 +95,7 @@ class UninstalledInfo(QWidget, Ui_GameInfo):
|
||||||
self.image.setPixmap(pixmap)
|
self.image.setPixmap(pixmap)
|
||||||
|
|
||||||
self.app_name.setText(self.game.app_name)
|
self.app_name.setText(self.game.app_name)
|
||||||
self.version.setText(self.game.app_version)
|
self.version.setText(self.game.app_version("Windows"))
|
||||||
self.dev.setText(self.game.metadata["developer"])
|
self.dev.setText(self.game.metadata["developer"])
|
||||||
self.install_size.setText("N/A")
|
self.install_size.setText("N/A")
|
||||||
self.install_path.setText("N/A")
|
self.install_path.setText("N/A")
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import os
|
import os
|
||||||
import platform
|
import platform
|
||||||
|
import shutil
|
||||||
import webbrowser
|
import webbrowser
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from logging import getLogger
|
from logging import getLogger
|
||||||
|
@ -134,7 +135,7 @@ class GameUtils(QObject):
|
||||||
if not skip_update_check and not self.core.is_noupdate_game(app_name):
|
if not skip_update_check and not self.core.is_noupdate_game(app_name):
|
||||||
# check updates
|
# check updates
|
||||||
try:
|
try:
|
||||||
latest = self.core.get_asset(app_name, update=False)
|
latest = self.core.get_asset(app_name, igame.platform, update=False)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
self.finished.emit(app_name, self.tr("Metadata doesn't exist"))
|
self.finished.emit(app_name, self.tr("Metadata doesn't exist"))
|
||||||
return
|
return
|
||||||
|
@ -161,6 +162,7 @@ class GameUtils(QObject):
|
||||||
environment.insert(env, value)
|
environment.insert(env, value)
|
||||||
|
|
||||||
if platform.system() != "Windows":
|
if platform.system() != "Windows":
|
||||||
|
# wine prefixes
|
||||||
for env in ["STEAM_COMPAT_DATA_PATH", "WINEPREFIX"]:
|
for env in ["STEAM_COMPAT_DATA_PATH", "WINEPREFIX"]:
|
||||||
if val := full_env.get(env):
|
if val := full_env.get(env):
|
||||||
if not os.path.exists(val):
|
if not os.path.exists(val):
|
||||||
|
@ -168,18 +170,24 @@ class GameUtils(QObject):
|
||||||
os.makedirs(val)
|
os.makedirs(val)
|
||||||
except PermissionError as e:
|
except PermissionError as e:
|
||||||
logger.error(str(e))
|
logger.error(str(e))
|
||||||
if QMessageBox.question(None, "Error",
|
QMessageBox.warning(None, "Error",
|
||||||
self.tr(
|
self.tr(
|
||||||
"Error while launching {}. No permission to create {} for {}\nLaunch anyway?").format(
|
"Error while launching {}. No permission to create {} for {}").format(
|
||||||
game.app_title, val, env),
|
game.app_title, val, env))
|
||||||
buttons=QMessageBox.Yes | QMessageBox.No,
|
process.deleteLater()
|
||||||
defaultButton=QMessageBox.Yes) == QMessageBox.No:
|
return
|
||||||
process.deleteLater()
|
# check wine executable
|
||||||
return
|
if shutil.which(full_params[0]) is None:
|
||||||
|
# wine binary does not exist
|
||||||
|
QMessageBox.warning(None, "Warning", self.tr(
|
||||||
|
"Wine executable '{}' does not exist. Please change it in Settings").format(full_params[0]))
|
||||||
|
process.deleteLater()
|
||||||
|
return
|
||||||
|
|
||||||
process.setProcessEnvironment(environment)
|
process.setProcessEnvironment(environment)
|
||||||
process.game_finished.connect(self.game_finished)
|
process.game_finished.connect(self.game_finished)
|
||||||
running_game = RunningGameModel(process=process, app_name=app_name, always_ask_sync=ask_always_sync)
|
running_game = RunningGameModel(process=process, app_name=app_name, always_ask_sync=ask_always_sync)
|
||||||
|
|
||||||
process.start(full_params[0], full_params[1:])
|
process.start(full_params[0], full_params[1:])
|
||||||
self.game_launched.emit(app_name)
|
self.game_launched.emit(app_name)
|
||||||
logger.info(f"{game.app_title} launched")
|
logger.info(f"{game.app_title} launched")
|
||||||
|
@ -197,9 +205,18 @@ class GameUtils(QObject):
|
||||||
fallback=os.path.expanduser("~/.wine"))
|
fallback=os.path.expanduser("~/.wine"))
|
||||||
if not wine_bin:
|
if not wine_bin:
|
||||||
wine_bin = self.core.lgd.config.get(game.app_name, 'wine_executable', fallback="/usr/bin/wine")
|
wine_bin = self.core.lgd.config.get(game.app_name, 'wine_executable', fallback="/usr/bin/wine")
|
||||||
|
|
||||||
|
if shutil.which(wine_bin) is None:
|
||||||
|
# wine binary does not exist
|
||||||
|
QMessageBox.warning(None, "Warning",
|
||||||
|
self.tr("Wine executable '{}' does not exist. Please change it in Settings").format(
|
||||||
|
wine_bin))
|
||||||
|
process.deleteLater()
|
||||||
|
return
|
||||||
|
|
||||||
env = self.core.get_app_environment(game.app_name, wine_pfx=wine_pfx)
|
env = self.core.get_app_environment(game.app_name, wine_pfx=wine_pfx)
|
||||||
|
|
||||||
if not wine_bin or not env.get('WINEPREFIX') and not os.path.exists("/usr/bin/wine"):
|
if not env.get('WINEPREFIX') and not os.path.exists("/usr/bin/wine"):
|
||||||
logger.error(f'In order to launch Origin correctly you must specify the wine binary and prefix '
|
logger.error(f'In order to launch Origin correctly you must specify the wine binary and prefix '
|
||||||
f'to use in the configuration file or command line. See the README for details.')
|
f'to use in the configuration file or command line. See the README for details.')
|
||||||
self.finished.emit(app_name, self.tr("No wine executable selected. Please set it in settings"))
|
self.finished.emit(app_name, self.tr("No wine executable selected. Please set it in settings"))
|
||||||
|
@ -215,14 +232,9 @@ class GameUtils(QObject):
|
||||||
if QSettings().value("show_console", False, bool):
|
if QSettings().value("show_console", False, bool):
|
||||||
self.console.show()
|
self.console.show()
|
||||||
process.readyReadStandardOutput.connect(lambda: self.console.log(
|
process.readyReadStandardOutput.connect(lambda: self.console.log(
|
||||||
bytes(process.readAllStandardOutput()).decode("utf-8", errors="ignore")))
|
str(process.readAllStandardOutput().data(), "utf-8", "ignore")))
|
||||||
process.readyReadStandardError.connect(lambda: self.console.error(
|
process.readyReadStandardError.connect(lambda: self.console.error(
|
||||||
bytes(process.readAllStandardOutput()).decode("utf-8", errors="ignore")))
|
str(process.readAllStandardError().data(), "utf-8", "ignore")))
|
||||||
else:
|
|
||||||
process.readyReadStandardOutput.connect(
|
|
||||||
lambda: print(bytes(process.readAllStandardOutput()).decode("utf-8", errors="ignore")))
|
|
||||||
process.readyReadStandardError.connect(
|
|
||||||
lambda: print(bytes(process.readAllStandardError()).decode("utf-8", errors="ignore")))
|
|
||||||
|
|
||||||
def game_finished(self, exit_code, app_name):
|
def game_finished(self, exit_code, app_name):
|
||||||
logger.info("Game exited with exit code: " + str(exit_code))
|
logger.info("Game exited with exit code: " + str(exit_code))
|
||||||
|
|
|
@ -6,7 +6,6 @@ from PyQt5.QtCore import pyqtSignal, QProcess, QSettings, Qt, QByteArray
|
||||||
from PyQt5.QtGui import QPixmap
|
from PyQt5.QtGui import QPixmap
|
||||||
from PyQt5.QtWidgets import QGroupBox, QMessageBox, QAction, QLabel
|
from PyQt5.QtWidgets import QGroupBox, QMessageBox, QAction, QLabel
|
||||||
|
|
||||||
from legendary.models.game import Game
|
|
||||||
from rare import shared
|
from rare import shared
|
||||||
from rare.components.tabs.games.game_utils import GameUtils
|
from rare.components.tabs.games.game_utils import GameUtils
|
||||||
from rare.utils import utils
|
from rare.utils import utils
|
||||||
|
@ -17,7 +16,7 @@ logger = getLogger("Game")
|
||||||
|
|
||||||
class BaseInstalledWidget(QGroupBox):
|
class BaseInstalledWidget(QGroupBox):
|
||||||
launch_signal = pyqtSignal(str, QProcess, list)
|
launch_signal = pyqtSignal(str, QProcess, list)
|
||||||
show_info = pyqtSignal(Game)
|
show_info = pyqtSignal(str)
|
||||||
finish_signal = pyqtSignal(str, int)
|
finish_signal = pyqtSignal(str, int)
|
||||||
proc: QProcess()
|
proc: QProcess()
|
||||||
|
|
||||||
|
@ -55,10 +54,12 @@ class BaseInstalledWidget(QGroupBox):
|
||||||
self.image.setPixmap(pixmap.scaled(200, int(200 * 4 / 3), transformMode=Qt.SmoothTransformation))
|
self.image.setPixmap(pixmap.scaled(200, int(200 * 4 / 3), transformMode=Qt.SmoothTransformation))
|
||||||
self.game_running = False
|
self.game_running = False
|
||||||
self.offline = shared.args.offline
|
self.offline = shared.args.offline
|
||||||
if self.game.third_party_store == "Origin":
|
self.update_available = False
|
||||||
self.update_available = False
|
if self.game.third_party_store != "Origin" or self.igame:
|
||||||
else:
|
remote_version = self.core.get_asset(self.game.app_name, platform=self.igame.platform, update=False).build_version
|
||||||
self.update_available = self.core.get_asset(self.game.app_name, False).build_version != self.igame.version
|
if remote_version != self.igame.version:
|
||||||
|
self.update_available = True
|
||||||
|
|
||||||
self.data = QByteArray()
|
self.data = QByteArray()
|
||||||
self.setContentsMargins(0, 0, 0, 0)
|
self.setContentsMargins(0, 0, 0, 0)
|
||||||
self.settings = QSettings()
|
self.settings = QSettings()
|
||||||
|
|
|
@ -49,7 +49,7 @@ class InstalledIconWidget(BaseInstalledWidget):
|
||||||
|
|
||||||
self.menu_btn.setObjectName("menu_button")
|
self.menu_btn.setObjectName("menu_button")
|
||||||
|
|
||||||
self.menu_btn.clicked.connect(lambda: self.show_info.emit(self.game))
|
self.menu_btn.clicked.connect(lambda: self.show_info.emit(self.game.app_name))
|
||||||
self.menu_btn.setFixedWidth(17)
|
self.menu_btn.setFixedWidth(17)
|
||||||
minilayout.addWidget(self.menu_btn)
|
minilayout.addWidget(self.menu_btn)
|
||||||
minilayout.addStretch(1)
|
minilayout.addStretch(1)
|
||||||
|
@ -86,6 +86,8 @@ class InstalledIconWidget(BaseInstalledWidget):
|
||||||
self.info_label.setText(self.texts["default"]["syncing"])
|
self.info_label.setText(self.texts["default"]["syncing"])
|
||||||
elif self.update_available:
|
elif self.update_available:
|
||||||
self.info_label.setText(self.texts["default"]["update_available"])
|
self.info_label.setText(self.texts["default"]["update_available"])
|
||||||
|
elif self.igame and self.igame.needs_verification:
|
||||||
|
self.info_label.setText(self.texts["needs_verification"])
|
||||||
else:
|
else:
|
||||||
self.info_label.setText("")
|
self.info_label.setText("")
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
from logging import getLogger
|
from logging import getLogger
|
||||||
|
|
||||||
from PyQt5.QtCore import QProcess, pyqtSignal
|
from PyQt5.QtCore import QProcess, pyqtSignal, Qt
|
||||||
from PyQt5.QtWidgets import QHBoxLayout, QLabel, QPushButton, QVBoxLayout
|
from PyQt5.QtWidgets import QHBoxLayout, QLabel, QPushButton, QVBoxLayout
|
||||||
from qtawesome import icon
|
from qtawesome import icon
|
||||||
|
|
||||||
from rare.components.tabs.games.game_widgets.base_installed_widget import BaseInstalledWidget
|
from rare.components.tabs.games.game_widgets.base_installed_widget import BaseInstalledWidget
|
||||||
|
from rare.utils.utils import get_size
|
||||||
|
|
||||||
logger = getLogger("GameWidget")
|
logger = getLogger("GameWidget")
|
||||||
|
|
||||||
|
@ -19,17 +20,16 @@ class InstalledListWidget(BaseInstalledWidget):
|
||||||
self.dev = self.game.metadata["developer"]
|
self.dev = self.game.metadata["developer"]
|
||||||
if self.game.third_party_store != "Origin":
|
if self.game.third_party_store != "Origin":
|
||||||
self.size = self.igame.install_size
|
self.size = self.igame.install_size
|
||||||
self.launch_params = self.igame.launch_parameters
|
|
||||||
else:
|
else:
|
||||||
self.size = 0
|
self.size = 0
|
||||||
self.launch_params = ""
|
|
||||||
|
|
||||||
self.layout = QHBoxLayout()
|
self.layout = QHBoxLayout()
|
||||||
|
self.setLayout(self.layout)
|
||||||
|
self.layout.addWidget(self.image)
|
||||||
|
|
||||||
##Layout on the right
|
##Layout on the right
|
||||||
self.childLayout = QVBoxLayout()
|
self.childLayout = QVBoxLayout()
|
||||||
|
self.layout.addLayout(self.childLayout)
|
||||||
self.layout.addWidget(self.image)
|
|
||||||
|
|
||||||
play_icon = icon("ei.play")
|
play_icon = icon("ei.play")
|
||||||
self.title_label = QLabel(f"<h1>{self.game.app_title}</h1>")
|
self.title_label = QLabel(f"<h1>{self.game.app_title}</h1>")
|
||||||
|
@ -41,7 +41,7 @@ class InstalledListWidget(BaseInstalledWidget):
|
||||||
self.launch_button.setFixedWidth(150)
|
self.launch_button.setFixedWidth(150)
|
||||||
|
|
||||||
self.info = QPushButton("Info")
|
self.info = QPushButton("Info")
|
||||||
self.info.clicked.connect(lambda: self.show_info.emit(self.game))
|
self.info.clicked.connect(lambda: self.show_info.emit(self.game.app_name))
|
||||||
self.info.setFixedWidth(80)
|
self.info.setFixedWidth(80)
|
||||||
|
|
||||||
self.info_label = QLabel("")
|
self.info_label = QLabel("")
|
||||||
|
@ -57,15 +57,13 @@ class InstalledListWidget(BaseInstalledWidget):
|
||||||
self.childLayout.addWidget(self.developer_label)
|
self.childLayout.addWidget(self.developer_label)
|
||||||
if not self.is_origin:
|
if not self.is_origin:
|
||||||
self.version_label = QLabel("Version: " + str(self.igame.version))
|
self.version_label = QLabel("Version: " + str(self.igame.version))
|
||||||
self.size_label = QLabel(f"{self.tr('Installed size')}: {round(self.size / (1024 ** 3), 2)} GB")
|
self.size_label = QLabel(f"{self.tr('Installed size')}: {get_size(self.size)}")
|
||||||
|
|
||||||
self.childLayout.addWidget(self.version_label)
|
self.childLayout.addWidget(self.version_label)
|
||||||
self.childLayout.addWidget(self.size_label)
|
self.childLayout.addWidget(self.size_label)
|
||||||
|
|
||||||
self.childLayout.addStretch(1)
|
self.childLayout.setAlignment(Qt.AlignTop)
|
||||||
self.layout.addLayout(self.childLayout)
|
self.layout.setAlignment(Qt.AlignLeft)
|
||||||
self.layout.addStretch(1)
|
|
||||||
self.setLayout(self.layout)
|
|
||||||
|
|
||||||
self.game_utils.cloud_save_finished.connect(self.sync_finished)
|
self.game_utils.cloud_save_finished.connect(self.sync_finished)
|
||||||
self.game_utils.finished.connect(self.game_finished)
|
self.game_utils.finished.connect(self.game_finished)
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
from logging import getLogger
|
from logging import getLogger
|
||||||
|
|
||||||
|
from PyQt5.QtCore import Qt
|
||||||
from PyQt5.QtWidgets import QLabel, QHBoxLayout, QVBoxLayout, QPushButton
|
from PyQt5.QtWidgets import QLabel, QHBoxLayout, QVBoxLayout, QPushButton
|
||||||
|
|
||||||
from legendary.core import LegendaryCore
|
from legendary.core import LegendaryCore
|
||||||
|
@ -13,24 +14,21 @@ class ListWidgetUninstalled(BaseUninstalledWidget):
|
||||||
def __init__(self, core: LegendaryCore, game, pixmap):
|
def __init__(self, core: LegendaryCore, game, pixmap):
|
||||||
super(ListWidgetUninstalled, self).__init__(game, core, pixmap)
|
super(ListWidgetUninstalled, self).__init__(game, core, pixmap)
|
||||||
self.layout = QHBoxLayout()
|
self.layout = QHBoxLayout()
|
||||||
|
self.setLayout(self.layout)
|
||||||
self.layout.addWidget(self.image)
|
self.layout.addWidget(self.image)
|
||||||
|
|
||||||
self.child_layout = QVBoxLayout()
|
self.child_layout = QVBoxLayout()
|
||||||
|
self.layout.addLayout(self.child_layout)
|
||||||
|
|
||||||
self.title_label = QLabel(f"<h2>{self.game.app_title}</h2>")
|
self.title_label = QLabel(f"<h2>{self.game.app_title}</h2>")
|
||||||
self.app_name_label = QLabel(f"App Name: {self.game.app_name}")
|
self.app_name_label = QLabel(f"App Name: {self.game.app_name}")
|
||||||
self.version_label = QLabel(f"Version: {self.game.app_version}")
|
|
||||||
self.install_button = QPushButton(self.tr("Install"))
|
self.install_button = QPushButton(self.tr("Install"))
|
||||||
self.install_button.setFixedWidth(120)
|
self.install_button.setFixedWidth(120)
|
||||||
self.install_button.clicked.connect(self.install)
|
self.install_button.clicked.connect(self.install)
|
||||||
|
|
||||||
self.child_layout.addWidget(self.title_label)
|
self.child_layout.addWidget(self.title_label)
|
||||||
self.child_layout.addWidget(self.app_name_label)
|
self.child_layout.addWidget(self.app_name_label)
|
||||||
self.child_layout.addWidget(self.version_label)
|
|
||||||
self.child_layout.addWidget(self.install_button)
|
self.child_layout.addWidget(self.install_button)
|
||||||
self.child_layout.addStretch(1)
|
|
||||||
self.layout.addLayout(self.child_layout)
|
|
||||||
|
|
||||||
self.layout.addStretch(1)
|
self.layout.setAlignment(Qt.AlignLeft)
|
||||||
self.setLayout(self.layout)
|
self.child_layout.setAlignment(Qt.AlignTop)
|
||||||
|
|
|
@ -21,10 +21,11 @@ class GameListHeadBar(QWidget):
|
||||||
self.tr("Installed only"),
|
self.tr("Installed only"),
|
||||||
self.tr("Offline Games"),
|
self.tr("Offline Games"),
|
||||||
self.tr("32 Bit Games"),
|
self.tr("32 Bit Games"),
|
||||||
|
self.tr("Mac games"),
|
||||||
self.tr("Exclude Origin")])
|
self.tr("Exclude Origin")])
|
||||||
self.layout().addWidget(self.filter)
|
self.layout().addWidget(self.filter)
|
||||||
|
|
||||||
self.available_filters = ["all", "installed", "offline", "32bit", "installable"]
|
self.available_filters = ["all", "installed", "offline", "32bit", "mac", "installable"]
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self.filter.setCurrentIndex(self.settings.value("filter", 0, int))
|
self.filter.setCurrentIndex(self.settings.value("filter", 0, int))
|
||||||
|
|
|
@ -127,11 +127,10 @@ class ImportGroup(QGroupBox, Ui_ImportGroup):
|
||||||
for i in os.listdir(os.path.join(path, ".egstore")):
|
for i in os.listdir(os.path.join(path, ".egstore")):
|
||||||
if i.endswith(".mancpn"):
|
if i.endswith(".mancpn"):
|
||||||
file = os.path.join(path, ".egstore", i)
|
file = os.path.join(path, ".egstore", i)
|
||||||
break
|
return json.load(open(file, "r")).get("AppName")
|
||||||
else:
|
else:
|
||||||
logger.warning("File was not found")
|
logger.warning("File was not found")
|
||||||
return None
|
return None
|
||||||
return json.load(open(file, "r"))["AppName"]
|
|
||||||
|
|
||||||
def import_game(self, path=None):
|
def import_game(self, path=None):
|
||||||
app_name = self.app_name.text()
|
app_name = self.app_name.text()
|
||||||
|
@ -145,20 +144,18 @@ class ImportGroup(QGroupBox, Ui_ImportGroup):
|
||||||
self.info_label.setText(self.tr("Could not find app name"))
|
self.info_label.setText(self.tr("Could not find app name"))
|
||||||
return
|
return
|
||||||
|
|
||||||
if legendary_utils.import_game(self.core, app_name=app_name, path=path):
|
if not (err := legendary_utils.import_game(self.core, app_name=app_name, path=path)):
|
||||||
igame = self.core.get_installed_game(app_name)
|
igame = self.core.get_installed_game(app_name)
|
||||||
self.info_label.setText(self.tr("Successfully imported {}. Reload library").format(
|
self.info_label.setText(self.tr("Successfully imported {}").format(igame.title))
|
||||||
igame.title))
|
|
||||||
self.app_name.setText(str())
|
self.app_name.setText(str())
|
||||||
|
|
||||||
shared.signals.update_gamelist.emit([app_name])
|
shared.signals.update_gamelist.emit([app_name])
|
||||||
|
|
||||||
if igame.version != self.core.get_asset(app_name, False).build_version:
|
if igame.version != self.core.get_asset(app_name, igame.platform, False).build_version:
|
||||||
# update available
|
# update available
|
||||||
shared.signals.add_download.emit(igame.app_name)
|
shared.signals.add_download.emit(igame.app_name)
|
||||||
shared.signals.update_download_tab_text.emit()
|
shared.signals.update_download_tab_text.emit()
|
||||||
|
|
||||||
else:
|
else:
|
||||||
logger.warning(f'Failed to import "{app_name}"')
|
logger.warning(f'Failed to import "{app_name}"')
|
||||||
self.info_label.setText(self.tr("Failed to import {}").format(app_name))
|
self.info_label.setText(self.tr("Could not import {}: ").format(app_name) + err)
|
||||||
return
|
return
|
||||||
|
|
|
@ -30,8 +30,7 @@ class Shop(QStackedWidget):
|
||||||
self.search_results = SearchResults(self.api_core)
|
self.search_results = SearchResults(self.api_core)
|
||||||
self.addWidget(self.search_results)
|
self.addWidget(self.search_results)
|
||||||
self.search_results.show_info.connect(self.show_game_info)
|
self.search_results.show_info.connect(self.show_game_info)
|
||||||
|
self.info = ShopGameInfo([i.asset_infos["Windows"].namespace for i in shared.api_results.game_list], self.api_core)
|
||||||
self.info = ShopGameInfo([i.asset_info.namespace for i in shared.api_results.game_list], self.api_core)
|
|
||||||
self.addWidget(self.info)
|
self.addWidget(self.info)
|
||||||
self.info.back_button.clicked.connect(lambda: self.setCurrentIndex(0))
|
self.info.back_button.clicked.connect(lambda: self.setCurrentIndex(0))
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ import webbrowser
|
||||||
|
|
||||||
from PyQt5.QtCore import Qt
|
from PyQt5.QtCore import Qt
|
||||||
from PyQt5.QtGui import QPixmap, QFont
|
from PyQt5.QtGui import QPixmap, QFont
|
||||||
from PyQt5.QtWidgets import QWidget, QLabel, QPushButton, QHBoxLayout, QSpacerItem, QGroupBox
|
from PyQt5.QtWidgets import QWidget, QLabel, QPushButton, QHBoxLayout, QSpacerItem, QGroupBox, QTabWidget, QGridLayout
|
||||||
from qtawesome import icon
|
from qtawesome import icon
|
||||||
|
|
||||||
from rare import shared
|
from rare import shared
|
||||||
|
@ -75,7 +75,9 @@ class ShopGameInfo(QWidget, Ui_shop_info):
|
||||||
self.open_store_button.setText(self.tr("Buy Game in Epic Games Store"))
|
self.open_store_button.setText(self.tr("Buy Game in Epic Games Store"))
|
||||||
self.owned_label.setVisible(False)
|
self.owned_label.setVisible(False)
|
||||||
|
|
||||||
self.dev.setText(self.tr("Loading"))
|
for i in range(self.req_group_box.layout().count()):
|
||||||
|
self.req_group_box.layout().itemAt(i).widget().deleteLater()
|
||||||
|
|
||||||
self.price.setText(self.tr("Loading"))
|
self.price.setText(self.tr("Loading"))
|
||||||
self.wishlist_button.setVisible(False)
|
self.wishlist_button.setVisible(False)
|
||||||
# self.title.setText(self.tr("Loading"))
|
# self.title.setText(self.tr("Loading"))
|
||||||
|
@ -124,6 +126,7 @@ class ShopGameInfo(QWidget, Ui_shop_info):
|
||||||
self.dev.setText(self.data.get("seller", {}).get("name", ""))
|
self.dev.setText(self.data.get("seller", {}).get("name", ""))
|
||||||
return
|
return
|
||||||
self.title.setText(self.game.title)
|
self.title.setText(self.game.title)
|
||||||
|
|
||||||
self.price.setFont(QFont())
|
self.price.setFont(QFont())
|
||||||
if self.game.price == "0" or self.game.price == 0:
|
if self.game.price == "0" or self.game.price == 0:
|
||||||
self.price.setText(self.tr("Free"))
|
self.price.setText(self.tr("Free"))
|
||||||
|
@ -141,22 +144,28 @@ class ShopGameInfo(QWidget, Ui_shop_info):
|
||||||
|
|
||||||
bold_font = QFont()
|
bold_font = QFont()
|
||||||
bold_font.setBold(True)
|
bold_font.setBold(True)
|
||||||
min_label = QLabel(self.tr("Minimum"))
|
|
||||||
min_label.setFont(bold_font)
|
|
||||||
rec_label = QLabel(self.tr("Recommend"))
|
|
||||||
rec_label.setFont(bold_font)
|
|
||||||
|
|
||||||
if self.game.reqs:
|
if self.game.reqs:
|
||||||
self.req_group_box.layout().addWidget(min_label, 0, 1)
|
req_tabs = QTabWidget()
|
||||||
self.req_group_box.layout().addWidget(rec_label, 0, 2)
|
for system in self.game.reqs:
|
||||||
for i, (key, value) in enumerate(self.game.reqs.get("Windows", {}).items()):
|
min_label = QLabel(self.tr("Minimum"))
|
||||||
self.req_group_box.layout().addWidget(QLabel(key), i + 1, 0)
|
min_label.setFont(bold_font)
|
||||||
min_label = QLabel(value[0])
|
rec_label = QLabel(self.tr("Recommend"))
|
||||||
min_label.setWordWrap(True)
|
rec_label.setFont(bold_font)
|
||||||
self.req_group_box.layout().addWidget(min_label, i + 1, 1)
|
req_widget = QWidget()
|
||||||
rec_label = QLabel(value[1])
|
req_widget.setLayout(QGridLayout())
|
||||||
rec_label.setWordWrap(True)
|
req_widget.layout().addWidget(min_label, 0, 1)
|
||||||
self.req_group_box.layout().addWidget(rec_label, i + 1, 2)
|
req_widget.layout().addWidget(rec_label, 0, 2)
|
||||||
|
for i, (key, value) in enumerate(self.game.reqs.get(system, {}).items()):
|
||||||
|
req_widget.layout().addWidget(QLabel(key), i + 1, 0)
|
||||||
|
min_label = QLabel(value[0])
|
||||||
|
min_label.setWordWrap(True)
|
||||||
|
req_widget.layout().addWidget(min_label, i + 1, 1)
|
||||||
|
rec_label = QLabel(value[1])
|
||||||
|
rec_label.setWordWrap(True)
|
||||||
|
req_widget.layout().addWidget(rec_label, i + 1, 2)
|
||||||
|
req_tabs.addTab(req_widget, system)
|
||||||
|
self.req_group_box.layout().addWidget(req_tabs)
|
||||||
else:
|
else:
|
||||||
self.req_group_box.layout().addWidget(QLabel(self.tr("Could not get requirements")))
|
self.req_group_box.layout().addWidget(QLabel(self.tr("Could not get requirements")))
|
||||||
self.req_group_box.setVisible(True)
|
self.req_group_box.setVisible(True)
|
||||||
|
|
Binary file not shown.
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
# Form implementation generated from reading ui file 'rare/ui/components/dialogs/install_dialog.ui'
|
# Form implementation generated from reading ui file 'rare/ui/components/dialogs/install_dialog.ui'
|
||||||
#
|
#
|
||||||
# Created by: PyQt5 UI code generator 5.15.4
|
# Created by: PyQt5 UI code generator 5.15.6
|
||||||
#
|
#
|
||||||
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
|
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
|
||||||
# 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.
|
||||||
|
@ -14,7 +14,7 @@ from PyQt5 import QtCore, QtGui, QtWidgets
|
||||||
class Ui_InstallDialog(object):
|
class Ui_InstallDialog(object):
|
||||||
def setupUi(self, InstallDialog):
|
def setupUi(self, InstallDialog):
|
||||||
InstallDialog.setObjectName("InstallDialog")
|
InstallDialog.setObjectName("InstallDialog")
|
||||||
InstallDialog.resize(324, 296)
|
InstallDialog.resize(340, 296)
|
||||||
InstallDialog.setWindowTitle("Rare")
|
InstallDialog.setWindowTitle("Rare")
|
||||||
self.install_dialog_layout = QtWidgets.QFormLayout(InstallDialog)
|
self.install_dialog_layout = QtWidgets.QFormLayout(InstallDialog)
|
||||||
self.install_dialog_layout.setSizeConstraint(QtWidgets.QLayout.SetFixedSize)
|
self.install_dialog_layout.setSizeConstraint(QtWidgets.QLayout.SetFixedSize)
|
||||||
|
@ -62,7 +62,7 @@ class Ui_InstallDialog(object):
|
||||||
self.install_dialog_layout.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.force_download_check)
|
self.install_dialog_layout.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.force_download_check)
|
||||||
self.ignore_space_label = QtWidgets.QLabel(InstallDialog)
|
self.ignore_space_label = QtWidgets.QLabel(InstallDialog)
|
||||||
self.ignore_space_label.setObjectName("ignore_space_label")
|
self.ignore_space_label.setObjectName("ignore_space_label")
|
||||||
self.install_dialog_layout.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.ignore_space_label)
|
self.install_dialog_layout.setWidget(5, QtWidgets.QFormLayout.LabelRole, self.ignore_space_label)
|
||||||
self.ignore_space_layout = QtWidgets.QHBoxLayout()
|
self.ignore_space_layout = QtWidgets.QHBoxLayout()
|
||||||
self.ignore_space_layout.setObjectName("ignore_space_layout")
|
self.ignore_space_layout.setObjectName("ignore_space_layout")
|
||||||
self.ignore_space_check = QtWidgets.QCheckBox(InstallDialog)
|
self.ignore_space_check = QtWidgets.QCheckBox(InstallDialog)
|
||||||
|
@ -79,10 +79,10 @@ class Ui_InstallDialog(object):
|
||||||
self.ignore_space_info_label.setFont(font)
|
self.ignore_space_info_label.setFont(font)
|
||||||
self.ignore_space_info_label.setObjectName("ignore_space_info_label")
|
self.ignore_space_info_label.setObjectName("ignore_space_info_label")
|
||||||
self.ignore_space_layout.addWidget(self.ignore_space_info_label)
|
self.ignore_space_layout.addWidget(self.ignore_space_info_label)
|
||||||
self.install_dialog_layout.setLayout(4, QtWidgets.QFormLayout.FieldRole, self.ignore_space_layout)
|
self.install_dialog_layout.setLayout(5, QtWidgets.QFormLayout.FieldRole, self.ignore_space_layout)
|
||||||
self.download_only_label = QtWidgets.QLabel(InstallDialog)
|
self.download_only_label = QtWidgets.QLabel(InstallDialog)
|
||||||
self.download_only_label.setObjectName("download_only_label")
|
self.download_only_label.setObjectName("download_only_label")
|
||||||
self.install_dialog_layout.setWidget(5, QtWidgets.QFormLayout.LabelRole, self.download_only_label)
|
self.install_dialog_layout.setWidget(6, QtWidgets.QFormLayout.LabelRole, self.download_only_label)
|
||||||
self.download_only_layout = QtWidgets.QHBoxLayout()
|
self.download_only_layout = QtWidgets.QHBoxLayout()
|
||||||
self.download_only_layout.setObjectName("download_only_layout")
|
self.download_only_layout.setObjectName("download_only_layout")
|
||||||
self.download_only_check = QtWidgets.QCheckBox(InstallDialog)
|
self.download_only_check = QtWidgets.QCheckBox(InstallDialog)
|
||||||
|
@ -100,10 +100,10 @@ class Ui_InstallDialog(object):
|
||||||
self.download_only_info_label.setFont(font)
|
self.download_only_info_label.setFont(font)
|
||||||
self.download_only_info_label.setObjectName("download_only_info_label")
|
self.download_only_info_label.setObjectName("download_only_info_label")
|
||||||
self.download_only_layout.addWidget(self.download_only_info_label)
|
self.download_only_layout.addWidget(self.download_only_info_label)
|
||||||
self.install_dialog_layout.setLayout(5, QtWidgets.QFormLayout.FieldRole, self.download_only_layout)
|
self.install_dialog_layout.setLayout(6, QtWidgets.QFormLayout.FieldRole, self.download_only_layout)
|
||||||
self.sdl_list_label = QtWidgets.QLabel(InstallDialog)
|
self.sdl_list_label = QtWidgets.QLabel(InstallDialog)
|
||||||
self.sdl_list_label.setObjectName("sdl_list_label")
|
self.sdl_list_label.setObjectName("sdl_list_label")
|
||||||
self.install_dialog_layout.setWidget(6, QtWidgets.QFormLayout.LabelRole, self.sdl_list_label)
|
self.install_dialog_layout.setWidget(7, QtWidgets.QFormLayout.LabelRole, self.sdl_list_label)
|
||||||
self.sdl_list_frame = QtWidgets.QFrame(InstallDialog)
|
self.sdl_list_frame = QtWidgets.QFrame(InstallDialog)
|
||||||
self.sdl_list_frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
|
self.sdl_list_frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
|
||||||
self.sdl_list_frame.setFrameShadow(QtWidgets.QFrame.Raised)
|
self.sdl_list_frame.setFrameShadow(QtWidgets.QFrame.Raised)
|
||||||
|
@ -111,35 +111,35 @@ class Ui_InstallDialog(object):
|
||||||
self.sdl_list_layout = QtWidgets.QVBoxLayout(self.sdl_list_frame)
|
self.sdl_list_layout = QtWidgets.QVBoxLayout(self.sdl_list_frame)
|
||||||
self.sdl_list_layout.setSpacing(0)
|
self.sdl_list_layout.setSpacing(0)
|
||||||
self.sdl_list_layout.setObjectName("sdl_list_layout")
|
self.sdl_list_layout.setObjectName("sdl_list_layout")
|
||||||
self.install_dialog_layout.setWidget(6, QtWidgets.QFormLayout.FieldRole, self.sdl_list_frame)
|
self.install_dialog_layout.setWidget(7, QtWidgets.QFormLayout.FieldRole, self.sdl_list_frame)
|
||||||
self.download_size_label = QtWidgets.QLabel(InstallDialog)
|
self.download_size_label = QtWidgets.QLabel(InstallDialog)
|
||||||
self.download_size_label.setObjectName("download_size_label")
|
self.download_size_label.setObjectName("download_size_label")
|
||||||
self.install_dialog_layout.setWidget(7, QtWidgets.QFormLayout.LabelRole, self.download_size_label)
|
self.install_dialog_layout.setWidget(8, QtWidgets.QFormLayout.LabelRole, self.download_size_label)
|
||||||
self.download_size_info_label = QtWidgets.QLabel(InstallDialog)
|
self.download_size_info_label = QtWidgets.QLabel(InstallDialog)
|
||||||
font = QtGui.QFont()
|
font = QtGui.QFont()
|
||||||
font.setItalic(True)
|
font.setItalic(True)
|
||||||
self.download_size_info_label.setFont(font)
|
self.download_size_info_label.setFont(font)
|
||||||
self.download_size_info_label.setObjectName("download_size_info_label")
|
self.download_size_info_label.setObjectName("download_size_info_label")
|
||||||
self.install_dialog_layout.setWidget(7, QtWidgets.QFormLayout.FieldRole, self.download_size_info_label)
|
self.install_dialog_layout.setWidget(8, QtWidgets.QFormLayout.FieldRole, self.download_size_info_label)
|
||||||
self.install_size_label = QtWidgets.QLabel(InstallDialog)
|
self.install_size_label = QtWidgets.QLabel(InstallDialog)
|
||||||
self.install_size_label.setObjectName("install_size_label")
|
self.install_size_label.setObjectName("install_size_label")
|
||||||
self.install_dialog_layout.setWidget(8, QtWidgets.QFormLayout.LabelRole, self.install_size_label)
|
self.install_dialog_layout.setWidget(9, QtWidgets.QFormLayout.LabelRole, self.install_size_label)
|
||||||
self.install_size_info_label = QtWidgets.QLabel(InstallDialog)
|
self.install_size_info_label = QtWidgets.QLabel(InstallDialog)
|
||||||
font = QtGui.QFont()
|
font = QtGui.QFont()
|
||||||
font.setItalic(True)
|
font.setItalic(True)
|
||||||
self.install_size_info_label.setFont(font)
|
self.install_size_info_label.setFont(font)
|
||||||
self.install_size_info_label.setObjectName("install_size_info_label")
|
self.install_size_info_label.setObjectName("install_size_info_label")
|
||||||
self.install_dialog_layout.setWidget(8, QtWidgets.QFormLayout.FieldRole, self.install_size_info_label)
|
self.install_dialog_layout.setWidget(9, QtWidgets.QFormLayout.FieldRole, self.install_size_info_label)
|
||||||
self.warn_label = QtWidgets.QLabel(InstallDialog)
|
self.warn_label = QtWidgets.QLabel(InstallDialog)
|
||||||
self.warn_label.setObjectName("warn_label")
|
self.warn_label.setObjectName("warn_label")
|
||||||
self.install_dialog_layout.setWidget(9, QtWidgets.QFormLayout.LabelRole, self.warn_label)
|
self.install_dialog_layout.setWidget(10, QtWidgets.QFormLayout.LabelRole, self.warn_label)
|
||||||
self.warn_message = QtWidgets.QLabel(InstallDialog)
|
self.warn_message = QtWidgets.QLabel(InstallDialog)
|
||||||
font = QtGui.QFont()
|
font = QtGui.QFont()
|
||||||
font.setItalic(True)
|
font.setItalic(True)
|
||||||
self.warn_message.setFont(font)
|
self.warn_message.setFont(font)
|
||||||
self.warn_message.setWordWrap(True)
|
self.warn_message.setWordWrap(True)
|
||||||
self.warn_message.setObjectName("warn_message")
|
self.warn_message.setObjectName("warn_message")
|
||||||
self.install_dialog_layout.setWidget(9, QtWidgets.QFormLayout.FieldRole, self.warn_message)
|
self.install_dialog_layout.setWidget(10, QtWidgets.QFormLayout.FieldRole, self.warn_message)
|
||||||
self.button_layout = QtWidgets.QHBoxLayout()
|
self.button_layout = QtWidgets.QHBoxLayout()
|
||||||
self.button_layout.setObjectName("button_layout")
|
self.button_layout.setObjectName("button_layout")
|
||||||
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
|
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
|
||||||
|
@ -153,7 +153,13 @@ class Ui_InstallDialog(object):
|
||||||
self.install_button = QtWidgets.QPushButton(InstallDialog)
|
self.install_button = QtWidgets.QPushButton(InstallDialog)
|
||||||
self.install_button.setObjectName("install_button")
|
self.install_button.setObjectName("install_button")
|
||||||
self.button_layout.addWidget(self.install_button)
|
self.button_layout.addWidget(self.install_button)
|
||||||
self.install_dialog_layout.setLayout(12, QtWidgets.QFormLayout.SpanningRole, self.button_layout)
|
self.install_dialog_layout.setLayout(13, QtWidgets.QFormLayout.SpanningRole, self.button_layout)
|
||||||
|
self.platform_combo_box = QtWidgets.QComboBox(InstallDialog)
|
||||||
|
self.platform_combo_box.setObjectName("platform_combo_box")
|
||||||
|
self.install_dialog_layout.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.platform_combo_box)
|
||||||
|
self.platform_label = QtWidgets.QLabel(InstallDialog)
|
||||||
|
self.platform_label.setObjectName("platform_label")
|
||||||
|
self.install_dialog_layout.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.platform_label)
|
||||||
|
|
||||||
self.retranslateUi(InstallDialog)
|
self.retranslateUi(InstallDialog)
|
||||||
QtCore.QMetaObject.connectSlotsByName(InstallDialog)
|
QtCore.QMetaObject.connectSlotsByName(InstallDialog)
|
||||||
|
@ -179,6 +185,7 @@ class Ui_InstallDialog(object):
|
||||||
self.cancel_button.setText(_translate("InstallDialog", "Cancel"))
|
self.cancel_button.setText(_translate("InstallDialog", "Cancel"))
|
||||||
self.verify_button.setText(_translate("InstallDialog", "Verify"))
|
self.verify_button.setText(_translate("InstallDialog", "Verify"))
|
||||||
self.install_button.setText(_translate("InstallDialog", "Install"))
|
self.install_button.setText(_translate("InstallDialog", "Install"))
|
||||||
|
self.platform_label.setText(_translate("InstallDialog", "Platform"))
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>324</width>
|
<width>340</width>
|
||||||
<height>296</height>
|
<height>296</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
|
@ -87,14 +87,14 @@
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="4" column="0">
|
<item row="5" column="0">
|
||||||
<widget class="QLabel" name="ignore_space_label">
|
<widget class="QLabel" name="ignore_space_label">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Ignore free space</string>
|
<string>Ignore free space</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="4" column="1">
|
<item row="5" column="1">
|
||||||
<layout class="QHBoxLayout" name="ignore_space_layout">
|
<layout class="QHBoxLayout" name="ignore_space_layout">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QCheckBox" name="ignore_space_check">
|
<widget class="QCheckBox" name="ignore_space_check">
|
||||||
|
@ -120,14 +120,14 @@
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item row="5" column="0">
|
<item row="6" column="0">
|
||||||
<widget class="QLabel" name="download_only_label">
|
<widget class="QLabel" name="download_only_label">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Download only</string>
|
<string>Download only</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="5" column="1">
|
<item row="6" column="1">
|
||||||
<layout class="QHBoxLayout" name="download_only_layout">
|
<layout class="QHBoxLayout" name="download_only_layout">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QCheckBox" name="download_only_check">
|
<widget class="QCheckBox" name="download_only_check">
|
||||||
|
@ -156,14 +156,14 @@
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item row="6" column="0">
|
<item row="7" column="0">
|
||||||
<widget class="QLabel" name="sdl_list_label">
|
<widget class="QLabel" name="sdl_list_label">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Optional packs</string>
|
<string>Optional packs</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="6" column="1">
|
<item row="7" column="1">
|
||||||
<widget class="QFrame" name="sdl_list_frame">
|
<widget class="QFrame" name="sdl_list_frame">
|
||||||
<property name="frameShape">
|
<property name="frameShape">
|
||||||
<enum>QFrame::StyledPanel</enum>
|
<enum>QFrame::StyledPanel</enum>
|
||||||
|
@ -178,14 +178,14 @@
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="7" column="0">
|
<item row="8" column="0">
|
||||||
<widget class="QLabel" name="download_size_label">
|
<widget class="QLabel" name="download_size_label">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Download size</string>
|
<string>Download size</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="7" column="1">
|
<item row="8" column="1">
|
||||||
<widget class="QLabel" name="download_size_info_label">
|
<widget class="QLabel" name="download_size_info_label">
|
||||||
<property name="font">
|
<property name="font">
|
||||||
<font>
|
<font>
|
||||||
|
@ -197,14 +197,14 @@
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="8" column="0">
|
<item row="9" column="0">
|
||||||
<widget class="QLabel" name="install_size_label">
|
<widget class="QLabel" name="install_size_label">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Total install size</string>
|
<string>Total install size</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="8" column="1">
|
<item row="9" column="1">
|
||||||
<widget class="QLabel" name="install_size_info_label">
|
<widget class="QLabel" name="install_size_info_label">
|
||||||
<property name="font">
|
<property name="font">
|
||||||
<font>
|
<font>
|
||||||
|
@ -216,14 +216,14 @@
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="9" column="0">
|
<item row="10" column="0">
|
||||||
<widget class="QLabel" name="warn_label">
|
<widget class="QLabel" name="warn_label">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Warnings</string>
|
<string>Warnings</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="9" column="1">
|
<item row="10" column="1">
|
||||||
<widget class="QLabel" name="warn_message">
|
<widget class="QLabel" name="warn_message">
|
||||||
<property name="font">
|
<property name="font">
|
||||||
<font>
|
<font>
|
||||||
|
@ -238,7 +238,7 @@
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="12" column="0" colspan="2">
|
<item row="13" column="0" colspan="2">
|
||||||
<layout class="QHBoxLayout" name="button_layout">
|
<layout class="QHBoxLayout" name="button_layout">
|
||||||
<item>
|
<item>
|
||||||
<spacer name="button_hspacer">
|
<spacer name="button_hspacer">
|
||||||
|
@ -276,6 +276,16 @@
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="4" column="1">
|
||||||
|
<widget class="QComboBox" name="platform_combo_box"/>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="0">
|
||||||
|
<widget class="QLabel" name="platform_label">
|
||||||
|
<property name="text">
|
||||||
|
<string>Platform</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<resources/>
|
<resources/>
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
# Form implementation generated from reading ui file 'rare/ui/components/tabs/games/game_info/game_info.ui'
|
# Form implementation generated from reading ui file 'rare/ui/components/tabs/games/game_info/game_info.ui'
|
||||||
#
|
#
|
||||||
# Created by: PyQt5 UI code generator 5.15.4
|
# Created by: PyQt5 UI code generator 5.15.6
|
||||||
#
|
#
|
||||||
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
|
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
|
||||||
# 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.
|
||||||
|
@ -21,11 +21,16 @@ class Ui_GameInfo(object):
|
||||||
self.layout_game_info_form.setContentsMargins(6, 6, 6, 6)
|
self.layout_game_info_form.setContentsMargins(6, 6, 6, 6)
|
||||||
self.layout_game_info_form.setSpacing(12)
|
self.layout_game_info_form.setSpacing(12)
|
||||||
self.layout_game_info_form.setObjectName("layout_game_info_form")
|
self.layout_game_info_form.setObjectName("layout_game_info_form")
|
||||||
self.install_size = QtWidgets.QLabel(GameInfo)
|
spacerItem = QtWidgets.QSpacerItem(20, 0, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
|
||||||
self.install_size.setText("error")
|
self.layout_game_info_form.addItem(spacerItem, 9, 0, 1, 1)
|
||||||
self.install_size.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse)
|
self.lbl_platform = QtWidgets.QLabel(GameInfo)
|
||||||
self.install_size.setObjectName("install_size")
|
font = QtGui.QFont()
|
||||||
self.layout_game_info_form.addWidget(self.install_size, 4, 1, 1, 1)
|
font.setBold(True)
|
||||||
|
font.setWeight(75)
|
||||||
|
self.lbl_platform.setFont(font)
|
||||||
|
self.lbl_platform.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
|
||||||
|
self.lbl_platform.setObjectName("lbl_platform")
|
||||||
|
self.layout_game_info_form.addWidget(self.lbl_platform, 6, 0, 1, 1)
|
||||||
self.lbl_dev = QtWidgets.QLabel(GameInfo)
|
self.lbl_dev = QtWidgets.QLabel(GameInfo)
|
||||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
|
||||||
sizePolicy.setHorizontalStretch(0)
|
sizePolicy.setHorizontalStretch(0)
|
||||||
|
@ -42,19 +47,7 @@ class Ui_GameInfo(object):
|
||||||
self.version.setText("error")
|
self.version.setText("error")
|
||||||
self.version.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse)
|
self.version.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse)
|
||||||
self.version.setObjectName("version")
|
self.version.setObjectName("version")
|
||||||
self.layout_game_info_form.addWidget(self.version, 2, 1, 1, 1)
|
self.layout_game_info_form.addWidget(self.version, 2, 2, 1, 1)
|
||||||
self.lbl_install_path = QtWidgets.QLabel(GameInfo)
|
|
||||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
|
|
||||||
sizePolicy.setHorizontalStretch(0)
|
|
||||||
sizePolicy.setVerticalStretch(0)
|
|
||||||
sizePolicy.setHeightForWidth(self.lbl_install_path.sizePolicy().hasHeightForWidth())
|
|
||||||
self.lbl_install_path.setSizePolicy(sizePolicy)
|
|
||||||
font = QtGui.QFont()
|
|
||||||
font.setBold(True)
|
|
||||||
font.setWeight(75)
|
|
||||||
self.lbl_install_path.setFont(font)
|
|
||||||
self.lbl_install_path.setObjectName("lbl_install_path")
|
|
||||||
self.layout_game_info_form.addWidget(self.lbl_install_path, 5, 0, 1, 1, QtCore.Qt.AlignRight)
|
|
||||||
self.lbl_install_size = QtWidgets.QLabel(GameInfo)
|
self.lbl_install_size = QtWidgets.QLabel(GameInfo)
|
||||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
|
||||||
sizePolicy.setHorizontalStretch(0)
|
sizePolicy.setHorizontalStretch(0)
|
||||||
|
@ -67,74 +60,6 @@ class Ui_GameInfo(object):
|
||||||
self.lbl_install_size.setFont(font)
|
self.lbl_install_size.setFont(font)
|
||||||
self.lbl_install_size.setObjectName("lbl_install_size")
|
self.lbl_install_size.setObjectName("lbl_install_size")
|
||||||
self.layout_game_info_form.addWidget(self.lbl_install_size, 4, 0, 1, 1, QtCore.Qt.AlignRight)
|
self.layout_game_info_form.addWidget(self.lbl_install_size, 4, 0, 1, 1, QtCore.Qt.AlignRight)
|
||||||
spacerItem = QtWidgets.QSpacerItem(0, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
|
|
||||||
self.layout_game_info_form.addItem(spacerItem, 7, 1, 1, 1)
|
|
||||||
spacerItem1 = QtWidgets.QSpacerItem(20, 0, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
|
|
||||||
self.layout_game_info_form.addItem(spacerItem1, 7, 0, 1, 1)
|
|
||||||
self.lbl_version = QtWidgets.QLabel(GameInfo)
|
|
||||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
|
|
||||||
sizePolicy.setHorizontalStretch(0)
|
|
||||||
sizePolicy.setVerticalStretch(0)
|
|
||||||
sizePolicy.setHeightForWidth(self.lbl_version.sizePolicy().hasHeightForWidth())
|
|
||||||
self.lbl_version.setSizePolicy(sizePolicy)
|
|
||||||
font = QtGui.QFont()
|
|
||||||
font.setBold(True)
|
|
||||||
font.setWeight(75)
|
|
||||||
self.lbl_version.setFont(font)
|
|
||||||
self.lbl_version.setObjectName("lbl_version")
|
|
||||||
self.layout_game_info_form.addWidget(self.lbl_version, 2, 0, 1, 1, QtCore.Qt.AlignRight)
|
|
||||||
self.lbl_app_name = QtWidgets.QLabel(GameInfo)
|
|
||||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
|
|
||||||
sizePolicy.setHorizontalStretch(0)
|
|
||||||
sizePolicy.setVerticalStretch(0)
|
|
||||||
sizePolicy.setHeightForWidth(self.lbl_app_name.sizePolicy().hasHeightForWidth())
|
|
||||||
self.lbl_app_name.setSizePolicy(sizePolicy)
|
|
||||||
font = QtGui.QFont()
|
|
||||||
font.setBold(True)
|
|
||||||
font.setWeight(75)
|
|
||||||
self.lbl_app_name.setFont(font)
|
|
||||||
self.lbl_app_name.setObjectName("lbl_app_name")
|
|
||||||
self.layout_game_info_form.addWidget(self.lbl_app_name, 1, 0, 1, 1, QtCore.Qt.AlignRight)
|
|
||||||
self.dev = QtWidgets.QLabel(GameInfo)
|
|
||||||
self.dev.setText("error")
|
|
||||||
self.dev.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse)
|
|
||||||
self.dev.setObjectName("dev")
|
|
||||||
self.layout_game_info_form.addWidget(self.dev, 0, 1, 1, 1)
|
|
||||||
self.app_name = QtWidgets.QLabel(GameInfo)
|
|
||||||
self.app_name.setText("error")
|
|
||||||
self.app_name.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse)
|
|
||||||
self.app_name.setObjectName("app_name")
|
|
||||||
self.layout_game_info_form.addWidget(self.app_name, 1, 1, 1, 1)
|
|
||||||
self.install_path = QtWidgets.QLabel(GameInfo)
|
|
||||||
self.install_path.setText("error")
|
|
||||||
self.install_path.setWordWrap(True)
|
|
||||||
self.install_path.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse)
|
|
||||||
self.install_path.setObjectName("install_path")
|
|
||||||
self.layout_game_info_form.addWidget(self.install_path, 5, 1, 1, 1)
|
|
||||||
self.lbl_game_actions = QtWidgets.QLabel(GameInfo)
|
|
||||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
|
|
||||||
sizePolicy.setHorizontalStretch(0)
|
|
||||||
sizePolicy.setVerticalStretch(0)
|
|
||||||
sizePolicy.setHeightForWidth(self.lbl_game_actions.sizePolicy().hasHeightForWidth())
|
|
||||||
self.lbl_game_actions.setSizePolicy(sizePolicy)
|
|
||||||
font = QtGui.QFont()
|
|
||||||
font.setBold(True)
|
|
||||||
font.setWeight(75)
|
|
||||||
self.lbl_game_actions.setFont(font)
|
|
||||||
self.lbl_game_actions.setObjectName("lbl_game_actions")
|
|
||||||
self.layout_game_info_form.addWidget(self.lbl_game_actions, 6, 0, 1, 1, QtCore.Qt.AlignRight)
|
|
||||||
self.lbl_grade = QtWidgets.QLabel(GameInfo)
|
|
||||||
font = QtGui.QFont()
|
|
||||||
font.setBold(True)
|
|
||||||
font.setWeight(75)
|
|
||||||
self.lbl_grade.setFont(font)
|
|
||||||
self.lbl_grade.setObjectName("lbl_grade")
|
|
||||||
self.layout_game_info_form.addWidget(self.lbl_grade, 3, 0, 1, 1, QtCore.Qt.AlignRight)
|
|
||||||
self.grade = QtWidgets.QLabel(GameInfo)
|
|
||||||
self.grade.setText("error")
|
|
||||||
self.grade.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse)
|
|
||||||
self.grade.setObjectName("grade")
|
|
||||||
self.layout_game_info_form.addWidget(self.grade, 3, 1, 1, 1)
|
|
||||||
self.game_actions_stack = QtWidgets.QStackedWidget(GameInfo)
|
self.game_actions_stack = QtWidgets.QStackedWidget(GameInfo)
|
||||||
self.game_actions_stack.setMinimumSize(QtCore.QSize(250, 0))
|
self.game_actions_stack.setMinimumSize(QtCore.QSize(250, 0))
|
||||||
self.game_actions_stack.setObjectName("game_actions_stack")
|
self.game_actions_stack.setObjectName("game_actions_stack")
|
||||||
|
@ -184,39 +109,127 @@ class Ui_GameInfo(object):
|
||||||
self.install_button.setObjectName("install_button")
|
self.install_button.setObjectName("install_button")
|
||||||
self.uninstalled_layout.addWidget(self.install_button)
|
self.uninstalled_layout.addWidget(self.install_button)
|
||||||
self.game_actions_stack.addWidget(self.uninstalled_page)
|
self.game_actions_stack.addWidget(self.uninstalled_page)
|
||||||
self.layout_game_info_form.addWidget(self.game_actions_stack, 6, 1, 1, 1, QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
|
self.layout_game_info_form.addWidget(self.game_actions_stack, 8, 2, 1, 1, QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
|
||||||
|
self.app_name = QtWidgets.QLabel(GameInfo)
|
||||||
|
self.app_name.setText("error")
|
||||||
|
self.app_name.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse)
|
||||||
|
self.app_name.setObjectName("app_name")
|
||||||
|
self.layout_game_info_form.addWidget(self.app_name, 1, 2, 1, 1)
|
||||||
|
self.dev = QtWidgets.QLabel(GameInfo)
|
||||||
|
self.dev.setText("error")
|
||||||
|
self.dev.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse)
|
||||||
|
self.dev.setObjectName("dev")
|
||||||
|
self.layout_game_info_form.addWidget(self.dev, 0, 2, 1, 1)
|
||||||
|
self.lbl_game_actions = QtWidgets.QLabel(GameInfo)
|
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
|
||||||
|
sizePolicy.setHorizontalStretch(0)
|
||||||
|
sizePolicy.setVerticalStretch(0)
|
||||||
|
sizePolicy.setHeightForWidth(self.lbl_game_actions.sizePolicy().hasHeightForWidth())
|
||||||
|
self.lbl_game_actions.setSizePolicy(sizePolicy)
|
||||||
|
font = QtGui.QFont()
|
||||||
|
font.setBold(True)
|
||||||
|
font.setWeight(75)
|
||||||
|
self.lbl_game_actions.setFont(font)
|
||||||
|
self.lbl_game_actions.setObjectName("lbl_game_actions")
|
||||||
|
self.layout_game_info_form.addWidget(self.lbl_game_actions, 8, 0, 1, 1, QtCore.Qt.AlignRight)
|
||||||
|
spacerItem1 = QtWidgets.QSpacerItem(0, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
|
||||||
|
self.layout_game_info_form.addItem(spacerItem1, 9, 2, 1, 1)
|
||||||
|
self.install_size = QtWidgets.QLabel(GameInfo)
|
||||||
|
self.install_size.setText("error")
|
||||||
|
self.install_size.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse)
|
||||||
|
self.install_size.setObjectName("install_size")
|
||||||
|
self.layout_game_info_form.addWidget(self.install_size, 4, 2, 1, 1)
|
||||||
|
self.grade = QtWidgets.QLabel(GameInfo)
|
||||||
|
self.grade.setText("error")
|
||||||
|
self.grade.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse)
|
||||||
|
self.grade.setObjectName("grade")
|
||||||
|
self.layout_game_info_form.addWidget(self.grade, 3, 2, 1, 1)
|
||||||
|
self.lbl_grade = QtWidgets.QLabel(GameInfo)
|
||||||
|
font = QtGui.QFont()
|
||||||
|
font.setBold(True)
|
||||||
|
font.setWeight(75)
|
||||||
|
self.lbl_grade.setFont(font)
|
||||||
|
self.lbl_grade.setObjectName("lbl_grade")
|
||||||
|
self.layout_game_info_form.addWidget(self.lbl_grade, 3, 0, 1, 1, QtCore.Qt.AlignRight)
|
||||||
|
self.lbl_install_path = QtWidgets.QLabel(GameInfo)
|
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
|
||||||
|
sizePolicy.setHorizontalStretch(0)
|
||||||
|
sizePolicy.setVerticalStretch(0)
|
||||||
|
sizePolicy.setHeightForWidth(self.lbl_install_path.sizePolicy().hasHeightForWidth())
|
||||||
|
self.lbl_install_path.setSizePolicy(sizePolicy)
|
||||||
|
font = QtGui.QFont()
|
||||||
|
font.setBold(True)
|
||||||
|
font.setWeight(75)
|
||||||
|
self.lbl_install_path.setFont(font)
|
||||||
|
self.lbl_install_path.setObjectName("lbl_install_path")
|
||||||
|
self.layout_game_info_form.addWidget(self.lbl_install_path, 5, 0, 1, 1, QtCore.Qt.AlignRight)
|
||||||
|
self.lbl_version = QtWidgets.QLabel(GameInfo)
|
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
|
||||||
|
sizePolicy.setHorizontalStretch(0)
|
||||||
|
sizePolicy.setVerticalStretch(0)
|
||||||
|
sizePolicy.setHeightForWidth(self.lbl_version.sizePolicy().hasHeightForWidth())
|
||||||
|
self.lbl_version.setSizePolicy(sizePolicy)
|
||||||
|
font = QtGui.QFont()
|
||||||
|
font.setBold(True)
|
||||||
|
font.setWeight(75)
|
||||||
|
self.lbl_version.setFont(font)
|
||||||
|
self.lbl_version.setObjectName("lbl_version")
|
||||||
|
self.layout_game_info_form.addWidget(self.lbl_version, 2, 0, 1, 1, QtCore.Qt.AlignRight)
|
||||||
|
self.lbl_app_name = QtWidgets.QLabel(GameInfo)
|
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
|
||||||
|
sizePolicy.setHorizontalStretch(0)
|
||||||
|
sizePolicy.setVerticalStretch(0)
|
||||||
|
sizePolicy.setHeightForWidth(self.lbl_app_name.sizePolicy().hasHeightForWidth())
|
||||||
|
self.lbl_app_name.setSizePolicy(sizePolicy)
|
||||||
|
font = QtGui.QFont()
|
||||||
|
font.setBold(True)
|
||||||
|
font.setWeight(75)
|
||||||
|
self.lbl_app_name.setFont(font)
|
||||||
|
self.lbl_app_name.setObjectName("lbl_app_name")
|
||||||
|
self.layout_game_info_form.addWidget(self.lbl_app_name, 1, 0, 1, 1, QtCore.Qt.AlignRight)
|
||||||
|
self.install_path = QtWidgets.QLabel(GameInfo)
|
||||||
|
self.install_path.setText("error")
|
||||||
|
self.install_path.setWordWrap(True)
|
||||||
|
self.install_path.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse)
|
||||||
|
self.install_path.setObjectName("install_path")
|
||||||
|
self.layout_game_info_form.addWidget(self.install_path, 5, 2, 1, 1)
|
||||||
|
self.platform = QtWidgets.QLabel(GameInfo)
|
||||||
|
self.platform.setObjectName("platform")
|
||||||
|
self.layout_game_info_form.addWidget(self.platform, 6, 2, 1, 1)
|
||||||
self.layout_game_info.addLayout(self.layout_game_info_form, 2, 1, 1, 1)
|
self.layout_game_info.addLayout(self.layout_game_info_form, 2, 1, 1, 1)
|
||||||
|
self.game_title = QtWidgets.QLabel(GameInfo)
|
||||||
|
self.game_title.setText("error")
|
||||||
|
self.game_title.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse)
|
||||||
|
self.game_title.setObjectName("game_title")
|
||||||
|
self.layout_game_info.addWidget(self.game_title, 0, 0, 1, 3)
|
||||||
self.image = QtWidgets.QLabel(GameInfo)
|
self.image = QtWidgets.QLabel(GameInfo)
|
||||||
self.image.setFrameShape(QtWidgets.QFrame.StyledPanel)
|
self.image.setFrameShape(QtWidgets.QFrame.StyledPanel)
|
||||||
self.image.setFrameShadow(QtWidgets.QFrame.Sunken)
|
self.image.setFrameShadow(QtWidgets.QFrame.Sunken)
|
||||||
self.image.setText("")
|
self.image.setText("")
|
||||||
self.image.setObjectName("image")
|
self.image.setObjectName("image")
|
||||||
self.layout_game_info.addWidget(self.image, 2, 0, 1, 1, QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
|
self.layout_game_info.addWidget(self.image, 2, 0, 1, 1, QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
|
||||||
self.game_title = QtWidgets.QLabel(GameInfo)
|
|
||||||
self.game_title.setText("error")
|
|
||||||
self.game_title.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse)
|
|
||||||
self.game_title.setObjectName("game_title")
|
|
||||||
self.layout_game_info.addWidget(self.game_title, 0, 0, 1, 3)
|
|
||||||
|
|
||||||
self.retranslateUi(GameInfo)
|
self.retranslateUi(GameInfo)
|
||||||
self.game_actions_stack.setCurrentIndex(0)
|
self.game_actions_stack.setCurrentIndex(1)
|
||||||
self.verify_widget.setCurrentIndex(0)
|
self.verify_widget.setCurrentIndex(0)
|
||||||
QtCore.QMetaObject.connectSlotsByName(GameInfo)
|
QtCore.QMetaObject.connectSlotsByName(GameInfo)
|
||||||
|
|
||||||
def retranslateUi(self, GameInfo):
|
def retranslateUi(self, GameInfo):
|
||||||
_translate = QtCore.QCoreApplication.translate
|
_translate = QtCore.QCoreApplication.translate
|
||||||
GameInfo.setWindowTitle(_translate("GameInfo", "Game Info"))
|
GameInfo.setWindowTitle(_translate("GameInfo", "Game Info"))
|
||||||
|
self.lbl_platform.setText(_translate("GameInfo", "Platform"))
|
||||||
self.lbl_dev.setText(_translate("GameInfo", "Developer"))
|
self.lbl_dev.setText(_translate("GameInfo", "Developer"))
|
||||||
self.lbl_install_path.setText(_translate("GameInfo", "Installation Path"))
|
|
||||||
self.lbl_install_size.setText(_translate("GameInfo", "Installation Size"))
|
self.lbl_install_size.setText(_translate("GameInfo", "Installation Size"))
|
||||||
self.lbl_version.setText(_translate("GameInfo", "Version"))
|
|
||||||
self.lbl_app_name.setText(_translate("GameInfo", "Application Name"))
|
|
||||||
self.lbl_game_actions.setText(_translate("GameInfo", "Actions"))
|
|
||||||
self.lbl_grade.setText(_translate("GameInfo", "ProtonDB Grade"))
|
|
||||||
self.verify_button.setText(_translate("GameInfo", "Verify Installation"))
|
self.verify_button.setText(_translate("GameInfo", "Verify Installation"))
|
||||||
self.repair_button.setText(_translate("GameInfo", "Repair Instalation"))
|
self.repair_button.setText(_translate("GameInfo", "Repair Instalation"))
|
||||||
self.uninstall_button.setText(_translate("GameInfo", "Uninstall Game"))
|
self.uninstall_button.setText(_translate("GameInfo", "Uninstall Game"))
|
||||||
self.install_button.setText(_translate("GameInfo", "Install Game"))
|
self.install_button.setText(_translate("GameInfo", "Install Game"))
|
||||||
|
self.lbl_game_actions.setText(_translate("GameInfo", "Actions"))
|
||||||
|
self.lbl_grade.setText(_translate("GameInfo", "ProtonDB Grade"))
|
||||||
|
self.lbl_install_path.setText(_translate("GameInfo", "Installation Path"))
|
||||||
|
self.lbl_version.setText(_translate("GameInfo", "Version"))
|
||||||
|
self.lbl_app_name.setText(_translate("GameInfo", "Application Name"))
|
||||||
|
self.platform.setText(_translate("GameInfo", "error"))
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
|
@ -31,13 +31,32 @@
|
||||||
<property name="spacing">
|
<property name="spacing">
|
||||||
<number>12</number>
|
<number>12</number>
|
||||||
</property>
|
</property>
|
||||||
<item row="4" column="1">
|
<item row="9" column="0">
|
||||||
<widget class="QLabel" name="install_size">
|
<spacer name="vs_game_info_form">
|
||||||
<property name="text">
|
<property name="orientation">
|
||||||
<string notr="true">error</string>
|
<enum>Qt::Vertical</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="textInteractionFlags">
|
<property name="sizeHint" stdset="0">
|
||||||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item row="6" column="0">
|
||||||
|
<widget class="QLabel" name="lbl_platform">
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<weight>75</weight>
|
||||||
|
<bold>true</bold>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Platform</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
@ -60,7 +79,7 @@
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="1">
|
<item row="2" column="2">
|
||||||
<widget class="QLabel" name="version">
|
<widget class="QLabel" name="version">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string notr="true">error</string>
|
<string notr="true">error</string>
|
||||||
|
@ -70,25 +89,6 @@
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="5" column="0" alignment="Qt::AlignRight">
|
|
||||||
<widget class="QLabel" name="lbl_install_path">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<weight>75</weight>
|
|
||||||
<bold>true</bold>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Installation Path</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="4" column="0" alignment="Qt::AlignRight">
|
<item row="4" column="0" alignment="Qt::AlignRight">
|
||||||
<widget class="QLabel" name="lbl_install_size">
|
<widget class="QLabel" name="lbl_install_size">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
|
@ -108,146 +108,7 @@
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="7" column="1">
|
<item row="8" column="2" alignment="Qt::AlignLeft|Qt::AlignTop">
|
||||||
<spacer name="hs_game_info_form">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>0</width>
|
|
||||||
<height>20</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
<item row="7" column="0">
|
|
||||||
<spacer name="vs_game_info_form">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Vertical</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>20</width>
|
|
||||||
<height>0</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="0" alignment="Qt::AlignRight">
|
|
||||||
<widget class="QLabel" name="lbl_version">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<weight>75</weight>
|
|
||||||
<bold>true</bold>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Version</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0" alignment="Qt::AlignRight">
|
|
||||||
<widget class="QLabel" name="lbl_app_name">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<weight>75</weight>
|
|
||||||
<bold>true</bold>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Application Name</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="1">
|
|
||||||
<widget class="QLabel" name="dev">
|
|
||||||
<property name="text">
|
|
||||||
<string notr="true">error</string>
|
|
||||||
</property>
|
|
||||||
<property name="textInteractionFlags">
|
|
||||||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="1">
|
|
||||||
<widget class="QLabel" name="app_name">
|
|
||||||
<property name="text">
|
|
||||||
<string notr="true">error</string>
|
|
||||||
</property>
|
|
||||||
<property name="textInteractionFlags">
|
|
||||||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="5" column="1">
|
|
||||||
<widget class="QLabel" name="install_path">
|
|
||||||
<property name="text">
|
|
||||||
<string notr="true">error</string>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="textInteractionFlags">
|
|
||||||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="6" column="0" alignment="Qt::AlignRight">
|
|
||||||
<widget class="QLabel" name="lbl_game_actions">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<weight>75</weight>
|
|
||||||
<bold>true</bold>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Actions</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="0" alignment="Qt::AlignRight">
|
|
||||||
<widget class="QLabel" name="lbl_grade">
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<weight>75</weight>
|
|
||||||
<bold>true</bold>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>ProtonDB Grade</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="1">
|
|
||||||
<widget class="QLabel" name="grade">
|
|
||||||
<property name="text">
|
|
||||||
<string notr="true">error</string>
|
|
||||||
</property>
|
|
||||||
<property name="textInteractionFlags">
|
|
||||||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="6" column="1" alignment="Qt::AlignLeft|Qt::AlignTop">
|
|
||||||
<widget class="QStackedWidget" name="game_actions_stack">
|
<widget class="QStackedWidget" name="game_actions_stack">
|
||||||
<property name="minimumSize">
|
<property name="minimumSize">
|
||||||
<size>
|
<size>
|
||||||
|
@ -366,8 +227,180 @@
|
||||||
</widget>
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="1" column="2">
|
||||||
|
<widget class="QLabel" name="app_name">
|
||||||
|
<property name="text">
|
||||||
|
<string notr="true">error</string>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="2">
|
||||||
|
<widget class="QLabel" name="dev">
|
||||||
|
<property name="text">
|
||||||
|
<string notr="true">error</string>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="8" column="0" alignment="Qt::AlignRight">
|
||||||
|
<widget class="QLabel" name="lbl_game_actions">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<weight>75</weight>
|
||||||
|
<bold>true</bold>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Actions</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="9" column="2">
|
||||||
|
<spacer name="hs_game_info_form">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>0</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="2">
|
||||||
|
<widget class="QLabel" name="install_size">
|
||||||
|
<property name="text">
|
||||||
|
<string notr="true">error</string>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="2">
|
||||||
|
<widget class="QLabel" name="grade">
|
||||||
|
<property name="text">
|
||||||
|
<string notr="true">error</string>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="0" alignment="Qt::AlignRight">
|
||||||
|
<widget class="QLabel" name="lbl_grade">
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<weight>75</weight>
|
||||||
|
<bold>true</bold>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>ProtonDB Grade</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="0" alignment="Qt::AlignRight">
|
||||||
|
<widget class="QLabel" name="lbl_install_path">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<weight>75</weight>
|
||||||
|
<bold>true</bold>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Installation Path</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0" alignment="Qt::AlignRight">
|
||||||
|
<widget class="QLabel" name="lbl_version">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<weight>75</weight>
|
||||||
|
<bold>true</bold>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Version</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0" alignment="Qt::AlignRight">
|
||||||
|
<widget class="QLabel" name="lbl_app_name">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<weight>75</weight>
|
||||||
|
<bold>true</bold>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Application Name</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="2">
|
||||||
|
<widget class="QLabel" name="install_path">
|
||||||
|
<property name="text">
|
||||||
|
<string notr="true">error</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="6" column="2">
|
||||||
|
<widget class="QLabel" name="platform">
|
||||||
|
<property name="text">
|
||||||
|
<string notr="true">error</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="0" column="0" colspan="3">
|
||||||
|
<widget class="QLabel" name="game_title">
|
||||||
|
<property name="text">
|
||||||
|
<string notr="true">error</string>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item row="2" column="0" alignment="Qt::AlignLeft|Qt::AlignTop">
|
<item row="2" column="0" alignment="Qt::AlignLeft|Qt::AlignTop">
|
||||||
<widget class="QLabel" name="image">
|
<widget class="QLabel" name="image">
|
||||||
<property name="frameShape">
|
<property name="frameShape">
|
||||||
|
@ -381,16 +414,6 @@
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="0" column="0" colspan="3">
|
|
||||||
<widget class="QLabel" name="game_title">
|
|
||||||
<property name="text">
|
|
||||||
<string notr="true">error</string>
|
|
||||||
</property>
|
|
||||||
<property name="textInteractionFlags">
|
|
||||||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<resources/>
|
<resources/>
|
||||||
|
|
|
@ -100,7 +100,7 @@ class VerifyWorker(QRunnable):
|
||||||
update_manifest(self.app_name, self.core)
|
update_manifest(self.app_name, self.core)
|
||||||
manifest_data, _ = self.core.get_installed_manifest(self.app_name)
|
manifest_data, _ = self.core.get_installed_manifest(self.app_name)
|
||||||
if not manifest_data:
|
if not manifest_data:
|
||||||
self.signals.summary.emit(0, 0, self.app_name)
|
self.signals.summary.emit(-1, -1, self.app_name)
|
||||||
return
|
return
|
||||||
|
|
||||||
manifest = self.core.load_manifest(manifest_data)
|
manifest = self.core.load_manifest(manifest_data)
|
||||||
|
@ -160,27 +160,50 @@ class VerifyWorker(QRunnable):
|
||||||
self.signals.summary.emit(len(failed), len(missing), self.app_name)
|
self.signals.summary.emit(len(failed), len(missing), self.app_name)
|
||||||
|
|
||||||
|
|
||||||
def import_game(core: LegendaryCore, app_name: str, path: str):
|
def import_game(core: LegendaryCore, app_name: str, path: str) -> str:
|
||||||
|
_tr = QCoreApplication.translate
|
||||||
logger.info("Import " + app_name)
|
logger.info("Import " + app_name)
|
||||||
game = core.get_game(app_name)
|
game = core.get_game(app_name, update_meta=False)
|
||||||
|
if not game:
|
||||||
|
return _tr("LgdUtils", "Could not get game for {}").format(app_name)
|
||||||
|
|
||||||
|
if core.is_installed(app_name):
|
||||||
|
logger.error(f"{game.app_title} is already installed")
|
||||||
|
return _tr("LgdUtils", "{} is already installed").format(game.app_title)
|
||||||
|
|
||||||
|
if not os.path.exists(path):
|
||||||
|
logger.error("Path does not exist")
|
||||||
|
return _tr("LgdUtils", "Path does not exist")
|
||||||
|
|
||||||
manifest, igame = core.import_game(game, path)
|
manifest, igame = core.import_game(game, path)
|
||||||
exe_path = os.path.join(path, manifest.meta.launch_exe.lstrip('/'))
|
exe_path = os.path.join(path, manifest.meta.launch_exe.lstrip('/'))
|
||||||
|
|
||||||
|
if not os.path.exists(exe_path):
|
||||||
|
logger.error(f"Launch Executable of {game.app_title} does not exist")
|
||||||
|
return _tr("LgdUtils", "Launch executable of {} does not exist").format(game.app_title)
|
||||||
|
|
||||||
|
if game.is_dlc:
|
||||||
|
release_info = game.metadata.get('mainGameItem', {}).get('releaseInfo')
|
||||||
|
if release_info:
|
||||||
|
main_game_appname = release_info[0]['appId']
|
||||||
|
main_game_title = game.metadata['mainGameItem']['title']
|
||||||
|
if not core.is_installed(main_game_appname):
|
||||||
|
return _tr("LgdUtils", "Game is a DLC, but {} is not installed").format(main_game_title)
|
||||||
|
else:
|
||||||
|
return _tr("LgdUtils", "Unable to get base game information for DLC")
|
||||||
|
|
||||||
total = len(manifest.file_manifest_list.elements)
|
total = len(manifest.file_manifest_list.elements)
|
||||||
found = sum(os.path.exists(os.path.join(path, f.filename))
|
found = sum(os.path.exists(os.path.join(path, f.filename))
|
||||||
for f in manifest.file_manifest_list.elements)
|
for f in manifest.file_manifest_list.elements)
|
||||||
ratio = found / total
|
ratio = found / total
|
||||||
if not os.path.exists(exe_path):
|
|
||||||
logger.error(f"Game {game.app_title} failed to import")
|
if ratio < 0.9:
|
||||||
return False
|
logger.warning(
|
||||||
if ratio < 0.95:
|
"Game files are missing. It may be not the latest version or it is corrupt")
|
||||||
logger.error(
|
# return False
|
||||||
"Game files are missing. It may be not the lates version ore it is corrupt")
|
|
||||||
return False
|
|
||||||
core.install_game(igame)
|
core.install_game(igame)
|
||||||
if igame.needs_verification:
|
if igame.needs_verification:
|
||||||
logger.info(logger.info(
|
logger.info(f"{igame.title} needs verification")
|
||||||
f'NOTE: The game installation will have to be verified before it can be updated '
|
|
||||||
f'with legendary. Run "legendary repair {app_name}" to do so.'))
|
|
||||||
|
|
||||||
logger.info("Successfully imported Game: " + game.app_title)
|
logger.info("Successfully imported Game: " + game.app_title)
|
||||||
return True
|
return ""
|
||||||
|
|
|
@ -23,6 +23,7 @@ class InstallOptionsModel:
|
||||||
sdl_list: list = field(default_factory=lambda: [''])
|
sdl_list: list = field(default_factory=lambda: [''])
|
||||||
update: bool = False
|
update: bool = False
|
||||||
silent: bool = False
|
silent: bool = False
|
||||||
|
platform: str = ""
|
||||||
|
|
||||||
def set_no_install(self, enabled: bool) -> None:
|
def set_no_install(self, enabled: bool) -> None:
|
||||||
self.no_install = enabled
|
self.no_install = enabled
|
||||||
|
@ -98,7 +99,6 @@ class ApiResults:
|
||||||
dlcs: list = None
|
dlcs: list = None
|
||||||
bit32_games: list = None
|
bit32_games: list = None
|
||||||
mac_games: list = None
|
mac_games: list = None
|
||||||
assets: list = None
|
|
||||||
no_asset_games: list = None
|
no_asset_games: list = None
|
||||||
saves: list = None
|
saves: list = None
|
||||||
|
|
||||||
|
@ -107,7 +107,6 @@ class ApiResults:
|
||||||
and self.dlcs is not None \
|
and self.dlcs is not None \
|
||||||
and self.bit32_games is not None \
|
and self.bit32_games is not None \
|
||||||
and self.mac_games is not None \
|
and self.mac_games is not None \
|
||||||
and self.assets is not None \
|
|
||||||
and self.no_asset_games is not None \
|
and self.no_asset_games is not None \
|
||||||
and self.saves is not None
|
and self.saves is not None
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@ import requests
|
||||||
from PyQt5.QtCore import pyqtSignal, pyqtSlot, QObject, QRunnable, QSettings, Qt
|
from PyQt5.QtCore import pyqtSignal, pyqtSlot, QObject, QRunnable, QSettings, Qt
|
||||||
from PyQt5.QtGui import QPalette, QColor, QPixmap, QImage
|
from PyQt5.QtGui import QPalette, QColor, QPixmap, QImage
|
||||||
from PyQt5.QtWidgets import QApplication, QStyleFactory
|
from PyQt5.QtWidgets import QApplication, QStyleFactory
|
||||||
from requests import HTTPError
|
from requests.exceptions import HTTPError
|
||||||
|
|
||||||
from legendary.models.game import Game
|
from legendary.models.game import Game
|
||||||
from .models import PathSpec
|
from .models import PathSpec
|
||||||
|
@ -474,3 +474,11 @@ class CloudWorker(QRunnable):
|
||||||
def get_raw_save_path(game: Game):
|
def get_raw_save_path(game: Game):
|
||||||
if game.supports_cloud_saves:
|
if game.supports_cloud_saves:
|
||||||
return game.metadata.get("customAttributes", {}).get("CloudSaveFolder", {}).get("value")
|
return game.metadata.get("customAttributes", {}).get("CloudSaveFolder", {}).get("value")
|
||||||
|
|
||||||
|
|
||||||
|
def get_default_platform(app_name):
|
||||||
|
if platform.system() != "Darwin" or app_name not in shared.api_results.mac_games:
|
||||||
|
return "Windows"
|
||||||
|
|
||||||
|
else:
|
||||||
|
return "Mac"
|
Loading…
Reference in a new issue