1
0
Fork 0
mirror of synced 2024-06-29 03:31:06 +12:00

Add Desktop links for Linux

This commit is contained in:
Dummerle 2021-04-13 16:56:44 +02:00
parent 113efd1de3
commit 7b83c27c27
8 changed files with 117 additions and 35 deletions

View file

@ -82,16 +82,10 @@ jobs:
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: Install Deps - name: Install Deps
run: sudo apt install run: |
python3-all sudo apt install python3-all python3-stdeb dh-python python3-setuptools python3-wheel
python3-stdeb sudo pip install -r requirements.txt
dh-python
python3-requests
python3-pyqt5
python3-pil
python3-qtawesome
python3-setuptools
python3-wheel
- name: run python setup - name: run python setup
run: | run: |

View file

@ -7,8 +7,13 @@ def main():
parser = ArgumentParser() parser = ArgumentParser()
parser.add_argument("-V", "--version", action="store_true") parser.add_argument("-V", "--version", action="store_true")
parser.add_argument("-S", "--silent", action="store_true") parser.add_argument("-S", "--silent", action="store_true")
subparsers = parser.add_subparsers(title="Commands", dest="subparser")
launch_parser = subparsers.add_parser("launch")
launch_parser.add_argument('app_name', help='Name of the app', metavar='<App Name>')
args = parser.parse_args() args = parser.parse_args()
if args.version: if args.version:
print(__version__) print(__version__)
exit(0) exit(0)

View file

@ -77,7 +77,7 @@ class App(QApplication):
self.launch_dialog.show() self.launch_dialog.show()
def start_app(self): def start_app(self):
self.mainwindow = MainWindow(self.core) self.mainwindow = MainWindow(self.core, self.args)
self.tray_icon = TrayIcon(self) self.tray_icon = TrayIcon(self)
self.tray_icon.exit_action.triggered.connect(lambda: exit(0)) self.tray_icon.exit_action.triggered.connect(lambda: exit(0))
self.tray_icon.start_rare.triggered.connect(self.mainwindow.show) self.tray_icon.start_rare.triggered.connect(self.mainwindow.show)

View file

@ -1,5 +1,5 @@
import platform from logging import getLogger
import time
from PyQt5.QtCore import QSettings from PyQt5.QtCore import QSettings
from PyQt5.QtGui import QCloseEvent from PyQt5.QtGui import QCloseEvent
from PyQt5.QtWidgets import QMainWindow, QMessageBox from PyQt5.QtWidgets import QMainWindow, QMessageBox
@ -8,10 +8,12 @@ from custom_legendary.core import LegendaryCore
from rare.components.tab_widget import TabWidget from rare.components.tab_widget import TabWidget
from rare.utils.rpc import DiscordRPC from rare.utils.rpc import DiscordRPC
logger = getLogger("Window")
class MainWindow(QMainWindow): class MainWindow(QMainWindow):
def __init__(self, core: LegendaryCore): def __init__(self, core: LegendaryCore, args):
super(MainWindow, self).__init__() super(MainWindow, self).__init__()
self.settings = QSettings() self.settings = QSettings()
self.core = core self.core = core
@ -31,13 +33,20 @@ class MainWindow(QMainWindow):
# Remove RPC # Remove RPC
self.tab_widget.delete_presence.connect(self.rpc.set_discord_rpc) self.tab_widget.delete_presence.connect(self.rpc.set_discord_rpc)
# Show RPC on changed rare_settings # Show RPC on changed rare_settings
self.tab_widget.settings.rare_settings.rpc.update_settings.connect(lambda: self.rpc.changed_settings(self.tab_widget.games_tab.default_widget.game_list.running_games)) self.tab_widget.settings.rare_settings.rpc.update_settings.connect(
lambda: self.rpc.changed_settings(self.tab_widget.games_tab.default_widget.game_list.running_games))
game = self.tab_widget.games_tab.default_widget.game_list.active_game game = self.tab_widget.games_tab.default_widget.game_list.active_game
if game != ("", 0): if game != ("", 0):
self.set_discord_rpc(game[0]) # Appname self.set_discord_rpc(game[0]) # Appname
self.show() self.show()
if args.subparser == "launch":
logger.info("Launching " + self.core.get_installed_game(args.app_name).title)
if args.app_name in self.tab_widget.games_tab.default_widget.game_list.widgets.keys():
self.tab_widget.games_tab.default_widget.game_list.widgets[args.app_name][1].launch()
else:
logger.info(f"Could not find {args.app_name} in Games")
def closeEvent(self, e: QCloseEvent): def closeEvent(self, e: QCloseEvent):
if self.settings.value("sys_tray", True, bool): if self.settings.value("sys_tray", True, bool):
@ -45,11 +54,12 @@ class MainWindow(QMainWindow):
e.ignore() e.ignore()
return return
elif self.tab_widget.downloadTab.active_game is not None: 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: 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() e.ignore()
return return
if self.settings.value("save_size", False, bool): if self.settings.value("save_size", False, bool):
size = self.size().width(), self.size().height() size = self.size().width(), self.size().height()
self.settings.setValue("window_size", size) self.settings.setValue("window_size", size)
e.accept() e.accept()

View file

@ -6,12 +6,11 @@ from PyQt5.QtWidgets import QWidget, QPushButton, QVBoxLayout, QLabel, QHBoxLayo
QProgressBar, QStackedWidget, QGroupBox, QScrollArea QProgressBar, QStackedWidget, QGroupBox, QScrollArea
from qtawesome import icon from qtawesome import icon
from rare.components.dialogs.uninstall_dialog import UninstallDialog from rare import utils
from rare.components.tabs.games.game_info.game_settings import GameSettings from rare.components.tabs.games.game_info.game_settings import GameSettings
from rare.utils import legendary_utils
from rare.utils.legendary_utils import VerifyThread from rare.utils.legendary_utils import VerifyThread
from rare.utils.extra_widgets import SideTabBar from rare.utils.extra_widgets import SideTabBar
from rare.utils.utils import IMAGE_DIR, get_size from rare.utils.utils import IMAGE_DIR, get_size, create_desktop_link
from custom_legendary.core import LegendaryCore from custom_legendary.core import LegendaryCore
from custom_legendary.models.game import InstalledGame, Game from custom_legendary.models.game import InstalledGame, Game
@ -49,6 +48,7 @@ class GameInfo(QScrollArea):
verify_game = pyqtSignal(str) verify_game = pyqtSignal(str)
verify_threads = {} verify_threads = {}
action = pyqtSignal(str) action = pyqtSignal(str)
desktop_exists = False
def __init__(self, core: LegendaryCore): def __init__(self, core: LegendaryCore):
super(GameInfo, self).__init__() super(GameInfo, self).__init__()
@ -87,6 +87,10 @@ class GameInfo(QScrollArea):
self.install_path.setTextInteractionFlags(Qt.TextSelectableByMouse) self.install_path.setTextInteractionFlags(Qt.TextSelectableByMouse)
right_layout.addWidget(self.install_path) right_layout.addWidget(self.install_path)
self.create_desktop_link_button = QPushButton(self.tr("Create Desktop link"))
right_layout.addWidget(self.create_desktop_link_button)
self.create_desktop_link_button.clicked.connect(self.create_desktop_link)
top_layout.addLayout(right_layout) top_layout.addLayout(right_layout)
top_layout.addStretch() top_layout.addStretch()
self.game_actions = GameActions() self.game_actions = GameActions()
@ -101,6 +105,19 @@ class GameInfo(QScrollArea):
self.widget.setLayout(self.layout) self.widget.setLayout(self.layout)
self.setWidget(self.widget) self.setWidget(self.widget)
def create_desktop_link(self):
if not self.desktop_exists:
create_desktop_link(self.igame.app_name, self.core)
self.create_desktop_link_button.setText(self.tr("Remove Desktop link"))
self.desktop_exists = True
else:
if os.path.exists(os.path.expanduser(f"~/Desktop/{self.igame.title}.desktop")):
os.remove(os.path.expanduser(f"~/Desktop/{self.igame.title}.desktop"))
elif os.path.exists(os.path.expanduser(f"~/Desktop/{self.igame.title}.lnk")):
os.remove(os.path.expanduser(f"~/Desktop/{self.igame.title}.lnk"))
self.desktop_exists = False
self.create_desktop_link_button.setText(self.tr("Create Desktop link"))
def repair(self): def repair(self):
repair_file = os.path.join(self.core.lgd.get_tmp_path(), f'{self.game.app_name}.repair') repair_file = os.path.join(self.core.lgd.get_tmp_path(), f'{self.game.app_name}.repair')
if not os.path.exists(repair_file): if not os.path.exists(repair_file):
@ -169,6 +186,13 @@ class GameInfo(QScrollArea):
self.game_actions.verify_widget.setCurrentIndex(1) self.game_actions.verify_widget.setCurrentIndex(1)
self.game_actions.verify_progress_bar.setValue( self.game_actions.verify_progress_bar.setValue(
self.verify_threads[app_name].num / self.verify_threads[app_name].total * 100) self.verify_threads[app_name].num / self.verify_threads[app_name].total * 100)
if os.path.exists(os.path.expanduser(f"~/Desktop/{self.igame.title}.desktop")) \
or os.path.exists(os.path.expanduser(f"~/Desktop/{self.igame.title}.lnk")):
self.create_desktop_link_button.setText(self.tr("Remove Desktop link"))
self.desktop_exists = True
else:
self.create_desktop_link_button.setText(self.tr("Create Desktop link"))
self.desktop_exists = False
class GameActions(QGroupBox): class GameActions(QGroupBox):
@ -177,8 +201,7 @@ class GameActions(QGroupBox):
self.setTitle(f"{self.tr('Game actions')}") self.setTitle(f"{self.tr('Game actions')}")
self.setStyleSheet("QGroupBox{font-size: 20px}") self.setStyleSheet("QGroupBox{font-size: 20px}")
self.layout = QVBoxLayout() self.layout = QVBoxLayout()
self.game_actions = QLabel("<h3>Game actions</h3>")
# self.layout.addWidget(self.game_actions)
uninstall_layout = QHBoxLayout() uninstall_layout = QHBoxLayout()
self.uninstall_game = QLabel(self.tr("Uninstall game")) self.uninstall_game = QLabel(self.tr("Uninstall game"))
uninstall_layout.addWidget(self.uninstall_game) uninstall_layout.addWidget(self.uninstall_game)

View file

@ -1,12 +1,14 @@
import os
from logging import getLogger from logging import getLogger
from PyQt5.QtCore import pyqtSignal, QProcess, QSettings from PyQt5.QtCore import pyqtSignal, QProcess, QSettings, Qt
from PyQt5.QtWidgets import QGroupBox, QMessageBox from PyQt5.QtWidgets import QGroupBox, QMessageBox, QAction
from custom_legendary.core import LegendaryCore from custom_legendary.core import LegendaryCore
from custom_legendary.models.game import InstalledGame from custom_legendary.models.game import InstalledGame
from rare.components.dialogs.uninstall_dialog import UninstallDialog from rare.components.dialogs.uninstall_dialog import UninstallDialog
from rare.utils import legendary_utils from rare.utils import legendary_utils
from rare.utils.utils import create_desktop_link
logger = getLogger("Game") logger = getLogger("Game")
@ -29,6 +31,36 @@ class BaseInstalledWidget(QGroupBox):
self.setContentsMargins(0, 0, 0, 0) self.setContentsMargins(0, 0, 0, 0)
self.setContextMenuPolicy(Qt.ActionsContextMenu)
launch = QAction(self.tr("Launch"), self)
launch.triggered.connect(self.launch)
self.addAction(launch)
if os.path.exists(os.path.expanduser(f"~/Desktop/{self.igame.title}.desktop"))\
or os.path.exists(os.path.expanduser(f"~/Desktop/{self.igame.title}.lnk")):
self.create_desktop = QAction(self.tr("Remove Desktop link"))
else:
self.create_desktop = QAction(self.tr("Create Desktop link"))
self.create_desktop.triggered.connect(self.create_desktop_link)
self.addAction(self.create_desktop)
uninstall = QAction(self.tr("Uninstall"), self)
uninstall.triggered.connect(self.uninstall)
self.addAction(uninstall)
def create_desktop_link(self):
if not (os.path.exists(os.path.expanduser(f"~/Desktop/{self.igame.title}.desktop"))\
or os.path.exists(os.path.expanduser(f"~/Desktop/{self.igame.title}.lnk"))):
create_desktop_link(self.igame.app_name, self.core)
self.create_desktop.setText(self.tr("Remove Desktop link"))
else:
if os.path.exists(os.path.expanduser(f"~/Desktop/{self.igame.title}.desktop")):
os.remove(os.path.expanduser(f"~/Desktop/{self.igame.title}.desktop"))
elif os.path.exists(os.path.expanduser(f"~/Desktop/{self.igame.title}.lnk")):
os.remove(os.path.expanduser(f"~/Desktop/{self.igame.title}.lnk"))
self.create_desktop.setText(self.tr("Create Desktop link"))
def launch(self, offline=False, skip_version_check=False): def launch(self, offline=False, skip_version_check=False):
if QSettings().value("confirm_start", False, bool): if QSettings().value("confirm_start", False, bool):
if not QMessageBox.question(self, "Launch", self.tr("Do you want to launch {}").format(self.game.app_title), if not QMessageBox.question(self, "Launch", self.tr("Do you want to launch {}").format(self.game.app_title),

View file

@ -22,15 +22,8 @@ class InstalledListWidget(BaseInstalledWidget):
self.dev = core.get_game(self.igame.app_name).metadata["developer"] self.dev = core.get_game(self.igame.app_name).metadata["developer"]
self.size = game.install_size self.size = game.install_size
self.launch_params = game.launch_parameters self.launch_params = game.launch_parameters
self.setContextMenuPolicy(Qt.ActionsContextMenu)
launch = QAction(self.tr("Launch"), self)
launch.triggered.connect(self.launch)
self.addAction(launch)
uninstall = QAction(self.tr("Uninstall"), self)
uninstall.triggered.connect(self.uninstall)
self.addAction(uninstall)
self.layout = QHBoxLayout() self.layout = QHBoxLayout()

View file

@ -1,13 +1,14 @@
import json import json
import os import os
import shutil import shutil
import sys
from logging import getLogger from logging import getLogger
import requests import requests
from PIL import Image, UnidentifiedImageError from PIL import Image, UnidentifiedImageError
from PyQt5.QtCore import pyqtSignal, QLocale, QSettings from PyQt5.QtCore import pyqtSignal, QLocale, QSettings
from rare import lang_path, __version__ from rare import lang_path, __version__, style_path
from custom_legendary.core import LegendaryCore from custom_legendary.core import LegendaryCore
logger = getLogger("Utils") logger = getLogger("Utils")
@ -40,13 +41,14 @@ def download_image(game, force=False):
# to git picture updates # to git picture updates
if not os.path.isfile(f"{IMAGE_DIR}/{game.app_name}/image.json"): if not os.path.isfile(f"{IMAGE_DIR}/{game.app_name}/image.json"):
json_data = {"DieselGameBoxTall": None, "DieselGameBoxLogo": None} json_data = {"DieselGameBoxTall": None, "DieselGameBoxLogo": None, "Thumbnail": None}
else: else:
json_data = json.load(open(f"{IMAGE_DIR}/{game.app_name}/image.json", "r")) json_data = json.load(open(f"{IMAGE_DIR}/{game.app_name}/image.json", "r"))
# Download # Download
for image in game.metadata["keyImages"]: for image in game.metadata["keyImages"]:
if image["type"] == "DieselGameBoxTall" or image["type"] == "DieselGameBoxLogo": if image["type"] == "DieselGameBoxTall" or image["type"] == "DieselGameBoxLogo" or image["type"] == "Thumbnail":
if image["type"] not in json_data.keys():
json_data[image["type"]] = None
if json_data[image["type"]] != image["md5"] or not os.path.isfile( if json_data[image["type"]] != image["md5"] or not os.path.isfile(
f"{IMAGE_DIR}/{game.app_name}/{image['type']}.png"): f"{IMAGE_DIR}/{game.app_name}/{image['type']}.png"):
# Download # Download
@ -131,3 +133,26 @@ def get_size(b: int) -> str:
if b < 1024: if b < 1024:
return f"{b:.2f}{i}B" return f"{b:.2f}{i}B"
b /= 1024 b /= 1024
def create_desktop_link(app_name, core: LegendaryCore):
igame = core.get_installed_game(app_name)
# Linux
if os.name == "posix":
if os.path.exists(os.path.join(QSettings('Rare', 'Rare').value('img_dir', os.path.expanduser('~/.cache/rare/images'), str), igame.app_name, 'Thumbnail.png')):
icon = os.path.join(QSettings('Rare', 'Rare').value('img_dir', os.path.expanduser('~/.cache/rare/images'), str), igame.app_name, 'Thumbnail.png')
else:
icon = os.path.join(QSettings('Rare', 'Rare').value('img_dir', os.path.expanduser('~/.cache/rare/images'), str), igame.app_name, 'DieselGameBoxTall.png')
with open(os.path.expanduser(f"~/Desktop/{igame.title}.desktop"), "w") as desktop_file:
desktop_file.write("[Desktop Entry]\n"
f"Name={igame.title}\n"
f"Type=Application\n"
f"Icon={icon}\n"
f"Exec=rare launch {app_name}\n"
"Terminal=false\n"
"StartupWMClass=rare-game\n"
)
os.chmod(os.path.expanduser(f"~/Desktop/{igame.title}.desktop"), 0o755)
elif os.name == "nt":
logger.info("Create a shortcut is currently not supported on windows")