1
0
Fork 0
mirror of synced 2024-06-29 03:31:06 +12:00
Rare/rare/components/main_window.py
Dummerle 4c9ef8acd8
Many fixes:
- store: updated epic api + many other fixes
- installing widget has now no border
- disable startmenu and desktop link on unsupported os
2021-11-22 20:02:58 +01:00

101 lines
4.1 KiB
Python

import os
from logging import getLogger
from PyQt5.QtCore import Qt, QSettings, QTimer, QSize
from PyQt5.QtGui import QCloseEvent, QCursor
from PyQt5.QtWidgets import QMainWindow, QMessageBox, QApplication
from rare import data_dir, shared
from rare.components.tabs import TabWidget
from rare.utils.rpc import DiscordRPC
logger = getLogger("Window")
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.setAttribute(Qt.WA_DeleteOnClose)
self.settings = QSettings()
self.core = shared.core
self.signals = shared.signals
self.offline = shared.args.offline
self.setWindowTitle("Rare - GUI for legendary")
self.tab_widget = TabWidget(self)
self.setCentralWidget(self.tab_widget)
width, height = 1280, 720
if self.settings.value("save_size", False):
width, height = self.settings.value("window_size", (width, height), tuple)
# move the window outside the viewport
self.move(-50000, -50000)
# show the window in order for it to get decorated, otherwise windowHandle() is null
self.show()
# get the margins of the decorated window
margins = self.windowHandle().frameMargins()
# hide the window again because we don't want to show it at this point
self.hide()
# get the screen the cursor is on
current_screen = QApplication.screenAt(QCursor.pos())
# get the available screen geometry (excludes panels/docks)
screen_rect = current_screen.availableGeometry()
decor_width = margins.left() + margins.right()
decor_height = margins.top() + margins.bottom()
window_size = QSize(width, height).boundedTo(screen_rect.size() - QSize(decor_width, decor_height))
self.resize(window_size)
self.move(screen_rect.center() - self.rect().adjusted(0, 0, decor_width, decor_height).center())
if not shared.args.offline:
self.rpc = DiscordRPC()
if shared.args.subparser == "launch":
if shared.args.app_name in [i.app_name for i in self.tab_widget.games_tab.installed]:
logger.info("Launching " + self.core.get_installed_game(shared.args.app_name).title)
self.tab_widget.games_tab.widgets[shared.args.app_name][1].prepare_launch()
else:
logger.info(
f"Could not find {shared.args.app_name} in Games or it is not installed")
self.timer = QTimer()
self.timer.timeout.connect(self.timer_finished)
self.timer.start(1000)
def timer_finished(self):
file_path = os.path.join(data_dir, "lockfile")
if os.path.exists(file_path):
file = open(file_path, "r")
action = file.read()
file.close()
if action.startswith("launch"):
game = action.replace("launch ", "").replace("\n", "")
if game in [i.app_name for i in self.tab_widget.games_tab.game_list] and self.core.is_installed(game):
self.tab_widget.games_tab.game_utils.prepare_launch(game, offline=shared.args.offline)
else:
logger.info(f"Could not find {game} in Games")
elif action.startswith("start"):
self.show()
os.remove(file_path)
self.timer.start(1000)
def closeEvent(self, e: QCloseEvent):
if self.settings.value("sys_tray", True, bool):
self.hide()
e.ignore()
return
elif self.offline:
pass
elif self.tab_widget.downloadTab.active_game is not None:
if not QMessageBox.question(self, "Close",
self.tr("There is a download active. Do you really want to exit app?"),
QMessageBox.Yes, QMessageBox.No) == QMessageBox.Yes:
e.ignore()
return
if self.settings.value("save_size", False, bool):
size = self.size().width(), self.size().height()
self.settings.setValue("window_size", size)
e.accept()