Add Desktop links for Linux
This commit is contained in:
parent
113efd1de3
commit
7b83c27c27
14
.github/workflows/release.yml
vendored
14
.github/workflows/release.yml
vendored
|
@ -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: |
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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()
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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()
|
||||||
|
|
||||||
|
|
|
@ -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")
|
||||||
|
|
Loading…
Reference in a new issue