Show info, if update available; moved tabs to __init__.py
This commit is contained in:
parent
89269c6daa
commit
e89772b5fd
|
@ -88,12 +88,15 @@ class ImportWidget(QWidget):
|
|||
if os.name != "nt":
|
||||
self.core.egl.appdata_path = os.path.join(self.data_path,
|
||||
f"drive_c/users/{getuser()}/Local Settings/Application Data/EpicGamesLauncher/Saved/Config/Windows")
|
||||
try:
|
||||
if self.core.auth_import():
|
||||
logger.info(f"Logged in as {self.core.lgd.userdata['displayName']}")
|
||||
self.success.emit()
|
||||
else:
|
||||
logger.warning("Failed to import existing session")
|
||||
except Exception as e:
|
||||
logger.warning(e)
|
||||
|
||||
if self.core.auth_import():
|
||||
logger.info(f"Logged in as {self.core.lgd.userdata['displayName']}")
|
||||
self.success.emit()
|
||||
else:
|
||||
print("Lol")
|
||||
logger.warning("Error: No valid session found")
|
||||
self.login_text.setText(self.tr("Error: No valid session found"))
|
||||
self.import_button.setText(self.tr("Import"))
|
||||
|
|
|
@ -3,10 +3,10 @@ from PyQt5.QtWidgets import QTabWidget, QWidget
|
|||
from qtawesome import icon
|
||||
|
||||
from Rare.Components.TabUtils import TabBar, TabButtonWidget
|
||||
from Rare.Components.Tabs.CloudSaves.CloudSaves import SyncSaves
|
||||
from Rare.Components.Tabs.CloudSaves import SyncSaves
|
||||
from Rare.Components.Tabs.Downloads.DownloadTab import DownloadTab
|
||||
from Rare.Components.Tabs.Games.GamesTab import GameTab
|
||||
from Rare.Components.Tabs.Settings.SettingsTab import SettingsTab
|
||||
from Rare.Components.Tabs.Games import GameTab
|
||||
from Rare.Components.Tabs.Settings import SettingsTab
|
||||
from Rare.utils.Models import InstallOptions
|
||||
from custom_legendary.core import LegendaryCore
|
||||
|
||||
|
@ -43,7 +43,8 @@ class TabWidget(QTabWidget):
|
|||
self.addTab(self.account, "")
|
||||
self.setTabEnabled(disabled_tab + 1, False)
|
||||
# self.settings = SettingsTab(core)
|
||||
self.addTab(self.settings, icon("fa.gear", color='white'), None)
|
||||
|
||||
self.addTab(self.settings, icon("fa.gear", color='white'), "(!)" if self.settings.about.update_available else "")
|
||||
self.setIconSize(QSize(25, 25))
|
||||
self.tabBar().setTabButton(3, self.tabBar().RightSide, TabButtonWidget(core))
|
||||
|
||||
|
|
|
@ -20,7 +20,7 @@ class MiniWidget(QWidget):
|
|||
self.layout.addWidget(QLabel(self.tr("Logged in as ") + username))
|
||||
|
||||
self.open_browser = QPushButton(self.tr("Account settings"))
|
||||
self.open_browser.clicked.connect(self.open_account)
|
||||
self.open_browser.clicked.connect(lambda: webbrowser.open("https://www.epicgames.com/account/personal?productName=epicgames"))
|
||||
self.layout.addWidget(self.open_browser)
|
||||
|
||||
self.logout_button = QPushButton(self.tr("Logout"))
|
||||
|
@ -37,5 +37,4 @@ class MiniWidget(QWidget):
|
|||
self.core.lgd.invalidate_userdata()
|
||||
QCoreApplication.exit()
|
||||
|
||||
def open_account(self):
|
||||
webbrowser.open("https://www.epicgames.com/account/personal?productName=epicgames")
|
||||
|
||||
|
|
|
@ -1,121 +0,0 @@
|
|||
from logging import getLogger
|
||||
|
||||
from PyQt5.QtCore import QThread, pyqtSignal, Qt
|
||||
from PyQt5.QtWidgets import *
|
||||
|
||||
from Rare.Components.Dialogs.PathInputDialog import PathInputDialog
|
||||
from Rare.Components.Tabs.CloudSaves.SyncWidget import SyncWidget
|
||||
from Rare.utils.QtExtensions import WaitingSpinner
|
||||
from custom_legendary.core import LegendaryCore
|
||||
from custom_legendary.models.game import SaveGameStatus
|
||||
|
||||
logger = getLogger("Sync Saves")
|
||||
|
||||
|
||||
class LoadThread(QThread):
|
||||
signal = pyqtSignal(list)
|
||||
|
||||
def __init__(self, core: LegendaryCore):
|
||||
super(LoadThread, self).__init__()
|
||||
self.core = core
|
||||
|
||||
def run(self) -> None:
|
||||
saves = self.core.get_save_games()
|
||||
self.signal.emit(saves)
|
||||
|
||||
|
||||
class SyncSaves(QScrollArea):
|
||||
|
||||
def __init__(self, core: LegendaryCore):
|
||||
super(SyncSaves, self).__init__()
|
||||
self.core = core
|
||||
self.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
|
||||
self.load_saves()
|
||||
|
||||
def load_saves(self):
|
||||
self.widget = QWidget()
|
||||
layout = QVBoxLayout()
|
||||
layout.addWidget(WaitingSpinner())
|
||||
layout.addWidget(QLabel("<h4>Loading Cloud Saves</h4>"))
|
||||
layout.addStretch()
|
||||
self.widget.setLayout(layout)
|
||||
self.setWidget(self.widget)
|
||||
|
||||
self.start_thread = LoadThread(self.core)
|
||||
self.start_thread.signal.connect(self.setup_ui)
|
||||
self.start_thread.start()
|
||||
self.igames = self.core.get_installed_list()
|
||||
|
||||
def setup_ui(self, saves: list):
|
||||
self.start_thread.disconnect()
|
||||
self.main_layout = QVBoxLayout()
|
||||
self.title = QLabel(
|
||||
f"<h1>" + self.tr("Cloud Saves") + "</h1>\n" + self.tr("Found Saves for folowing Games"))
|
||||
self.main_layout.addWidget(self.title)
|
||||
|
||||
saves_games = []
|
||||
for i in saves:
|
||||
if not i.app_name in saves_games and self.core.is_installed(i.app_name):
|
||||
saves_games.append(i.app_name)
|
||||
if len(saves_games) == 0:
|
||||
# QMessageBox.information(self.tr("No Games Found"), self.tr("Your games don't support cloud save"))
|
||||
self.title.setText(
|
||||
f"<h1>" + self.tr("Cloud Saves") + "</h1>\n" + self.tr("Your games does not support Cloud Saves"))
|
||||
self.setWidget(self.title)
|
||||
return
|
||||
|
||||
self.sync_all_button = QPushButton(self.tr("Sync all games"))
|
||||
self.sync_all_button.clicked.connect(self.sync_all)
|
||||
self.main_layout.addWidget(self.sync_all_button)
|
||||
|
||||
latest_save = {}
|
||||
for i in sorted(saves, key=lambda a: a.datetime):
|
||||
latest_save[i.app_name] = i
|
||||
|
||||
logger.info(f'Got {len(latest_save)} remote save game(s)')
|
||||
|
||||
self.widgets = []
|
||||
for igame in self.igames:
|
||||
game = self.core.get_game(igame.app_name)
|
||||
if not game.supports_cloud_saves:
|
||||
continue
|
||||
if latest_save.get(igame.app_name):
|
||||
sync_widget = SyncWidget(igame, latest_save[igame.app_name], self.core)
|
||||
else:
|
||||
continue
|
||||
sync_widget.reload.connect(self.reload)
|
||||
self.main_layout.addWidget(sync_widget)
|
||||
self.widgets.append(sync_widget)
|
||||
|
||||
self.widget = QWidget()
|
||||
self.main_layout.addStretch(1)
|
||||
self.widget.setLayout(self.main_layout)
|
||||
self.setWidgetResizable(True)
|
||||
self.setWidget(self.widget)
|
||||
|
||||
def reload(self):
|
||||
self.setWidget(QWidget())
|
||||
self.load_saves()
|
||||
self.update()
|
||||
|
||||
def sync_all(self):
|
||||
logger.info("Sync all Games")
|
||||
for w in self.widgets:
|
||||
if not w.igame.save_path:
|
||||
save_path = self.core.get_save_path(w.igame.app_name)
|
||||
if '%' in save_path or '{' in save_path:
|
||||
self.logger.info_label("Could not find save_path")
|
||||
save_path = PathInputDialog(self.tr("Found no savepath"),
|
||||
self.tr("No save path was found. Please select path or skip"))
|
||||
if save_path == "":
|
||||
continue
|
||||
else:
|
||||
w.igame.save_path = save_path
|
||||
if w.res == SaveGameStatus.SAME_AGE:
|
||||
continue
|
||||
if w.res == SaveGameStatus.REMOTE_NEWER:
|
||||
logger.info("Download")
|
||||
w.download()
|
||||
elif w.res == SaveGameStatus.LOCAL_NEWER:
|
||||
logger.info("Upload")
|
||||
w.upload()
|
|
@ -0,0 +1,121 @@
|
|||
from logging import getLogger
|
||||
|
||||
from PyQt5.QtCore import QThread, pyqtSignal, Qt
|
||||
from PyQt5.QtWidgets import *
|
||||
|
||||
from Rare.Components.Dialogs.PathInputDialog import PathInputDialog
|
||||
from Rare.Components.Tabs.CloudSaves.SyncWidget import SyncWidget
|
||||
from Rare.utils.QtExtensions import WaitingSpinner
|
||||
from custom_legendary.core import LegendaryCore
|
||||
from custom_legendary.models.game import SaveGameStatus
|
||||
|
||||
logger = getLogger("Sync Saves")
|
||||
|
||||
|
||||
class LoadThread(QThread):
|
||||
signal = pyqtSignal(list)
|
||||
|
||||
def __init__(self, core: LegendaryCore):
|
||||
super(LoadThread, self).__init__()
|
||||
self.core = core
|
||||
|
||||
def run(self) -> None:
|
||||
saves = self.core.get_save_games()
|
||||
self.signal.emit(saves)
|
||||
|
||||
|
||||
class SyncSaves(QScrollArea):
|
||||
|
||||
def __init__(self, core: LegendaryCore):
|
||||
super(SyncSaves, self).__init__()
|
||||
self.core = core
|
||||
self.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
|
||||
self.load_saves()
|
||||
|
||||
def load_saves(self):
|
||||
self.widget = QWidget()
|
||||
layout = QVBoxLayout()
|
||||
layout.addWidget(WaitingSpinner())
|
||||
layout.addWidget(QLabel("<h4>Loading Cloud Saves</h4>"))
|
||||
layout.addStretch()
|
||||
self.widget.setLayout(layout)
|
||||
self.setWidget(self.widget)
|
||||
|
||||
self.start_thread = LoadThread(self.core)
|
||||
self.start_thread.signal.connect(self.setup_ui)
|
||||
self.start_thread.start()
|
||||
self.igames = self.core.get_installed_list()
|
||||
|
||||
def setup_ui(self, saves: list):
|
||||
self.start_thread.disconnect()
|
||||
self.main_layout = QVBoxLayout()
|
||||
self.title = QLabel(
|
||||
f"<h1>" + self.tr("Cloud Saves") + "</h1>\n" + self.tr("Found Saves for folowing Games"))
|
||||
self.main_layout.addWidget(self.title)
|
||||
|
||||
saves_games = []
|
||||
for i in saves:
|
||||
if not i.app_name in saves_games and self.core.is_installed(i.app_name):
|
||||
saves_games.append(i.app_name)
|
||||
if len(saves_games) == 0:
|
||||
# QMessageBox.information(self.tr("No Games Found"), self.tr("Your games don't support cloud save"))
|
||||
self.title.setText(
|
||||
f"<h1>" + self.tr("Cloud Saves") + "</h1>\n" + self.tr("Your games does not support Cloud Saves"))
|
||||
self.setWidget(self.title)
|
||||
return
|
||||
|
||||
self.sync_all_button = QPushButton(self.tr("Sync all games"))
|
||||
self.sync_all_button.clicked.connect(self.sync_all)
|
||||
self.main_layout.addWidget(self.sync_all_button)
|
||||
|
||||
latest_save = {}
|
||||
for i in sorted(saves, key=lambda a: a.datetime):
|
||||
latest_save[i.app_name] = i
|
||||
|
||||
logger.info(f'Got {len(latest_save)} remote save game(s)')
|
||||
|
||||
self.widgets = []
|
||||
for igame in self.igames:
|
||||
game = self.core.get_game(igame.app_name)
|
||||
if not game.supports_cloud_saves:
|
||||
continue
|
||||
if latest_save.get(igame.app_name):
|
||||
sync_widget = SyncWidget(igame, latest_save[igame.app_name], self.core)
|
||||
else:
|
||||
continue
|
||||
sync_widget.reload.connect(self.reload)
|
||||
self.main_layout.addWidget(sync_widget)
|
||||
self.widgets.append(sync_widget)
|
||||
|
||||
self.widget = QWidget()
|
||||
self.main_layout.addStretch(1)
|
||||
self.widget.setLayout(self.main_layout)
|
||||
self.setWidgetResizable(True)
|
||||
self.setWidget(self.widget)
|
||||
|
||||
def reload(self):
|
||||
self.setWidget(QWidget())
|
||||
self.load_saves()
|
||||
self.update()
|
||||
|
||||
def sync_all(self):
|
||||
logger.info("Sync all Games")
|
||||
for w in self.widgets:
|
||||
if not w.igame.save_path:
|
||||
save_path = self.core.get_save_path(w.igame.app_name)
|
||||
if '%' in save_path or '{' in save_path:
|
||||
self.logger.info_label("Could not find save_path")
|
||||
save_path = PathInputDialog(self.tr("Found no savepath"),
|
||||
self.tr("No save path was found. Please select path or skip"))
|
||||
if save_path == "":
|
||||
continue
|
||||
else:
|
||||
w.igame.save_path = save_path
|
||||
if w.res == SaveGameStatus.SAME_AGE:
|
||||
continue
|
||||
if w.res == SaveGameStatus.REMOTE_NEWER:
|
||||
logger.info("Download")
|
||||
w.download()
|
||||
elif w.res == SaveGameStatus.LOCAL_NEWER:
|
||||
logger.info("Upload")
|
||||
w.upload()
|
|
@ -1,107 +0,0 @@
|
|||
from PyQt5.QtCore import QSettings, QSize
|
||||
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QCheckBox, QLineEdit, QPushButton, QStackedLayout, QLabel
|
||||
from qtawesome import icon
|
||||
|
||||
from Rare.Components.Tabs.Games.GameInfo.GameInfo import InfoTabs
|
||||
from Rare.Components.Tabs.Games.GameList import GameList
|
||||
from Rare.Components.Tabs.Games.ImportWidget import ImportWidget
|
||||
from Rare.utils.QtExtensions import SelectViewWidget
|
||||
|
||||
|
||||
class GameTab(QWidget):
|
||||
def __init__(self, core):
|
||||
super(GameTab, self).__init__()
|
||||
self.layout = QStackedLayout()
|
||||
self.default_widget = Games(core)
|
||||
self.default_widget.game_list.show_game_info.connect(self.show_info)
|
||||
self.default_widget.head_bar.import_game.clicked.connect(lambda: self.layout.setCurrentIndex(2))
|
||||
self.layout.addWidget(self.default_widget)
|
||||
self.game_info = InfoTabs(core)
|
||||
self.game_info.info.update_list.connect(self.update_list)
|
||||
self.layout.addWidget(self.game_info)
|
||||
|
||||
self.default_widget.head_bar.refresh_list.clicked.connect(self.update_list)
|
||||
|
||||
self.import_widget = ImportWidget(core)
|
||||
self.layout.addWidget(self.import_widget)
|
||||
self.import_widget.back_button.clicked.connect(lambda: self.layout.setCurrentIndex(0))
|
||||
self.import_widget.update_list.connect(self.update_list)
|
||||
self.setLayout(self.layout)
|
||||
|
||||
def update_list(self):
|
||||
self.default_widget.game_list.update_list(self.default_widget.head_bar.view.isChecked())
|
||||
self.layout.setCurrentIndex(0)
|
||||
|
||||
def show_info(self, app_name):
|
||||
self.game_info.update_game(app_name)
|
||||
self.game_info.setCurrentIndex(1)
|
||||
self.layout.setCurrentIndex(1)
|
||||
|
||||
|
||||
class Games(QWidget):
|
||||
def __init__(self, core):
|
||||
super(Games, self).__init__()
|
||||
self.layout = QVBoxLayout()
|
||||
|
||||
self.head_bar = GameListHeadBar()
|
||||
self.head_bar.setObjectName("head_bar")
|
||||
|
||||
self.game_list = GameList(core)
|
||||
|
||||
self.head_bar.search_bar.textChanged.connect(
|
||||
lambda: self.game_list.filter(self.head_bar.search_bar.text()))
|
||||
|
||||
self.head_bar.installed_only.stateChanged.connect(lambda:
|
||||
self.game_list.installed_only(
|
||||
self.head_bar.installed_only.isChecked()))
|
||||
self.layout.addWidget(self.head_bar)
|
||||
self.layout.addWidget(self.game_list)
|
||||
# self.layout.addStretch(1)
|
||||
self.head_bar.view.toggled.connect(self.toggle_view)
|
||||
|
||||
self.setLayout(self.layout)
|
||||
|
||||
def toggle_view(self):
|
||||
self.game_list.setCurrentIndex(1 if self.head_bar.view.isChecked() else 0)
|
||||
settings = QSettings()
|
||||
settings.setValue("icon_view", not self.head_bar.view.isChecked())
|
||||
|
||||
|
||||
class GameListHeadBar(QWidget):
|
||||
def __init__(self):
|
||||
super(GameListHeadBar, self).__init__()
|
||||
self.layout = QHBoxLayout()
|
||||
self.installed_only = QCheckBox(self.tr("Installed only"))
|
||||
self.settings = QSettings()
|
||||
self.installed_only.setChecked(self.settings.value("installed_only", False, bool))
|
||||
self.layout.addWidget(self.installed_only)
|
||||
|
||||
self.layout.addStretch(1)
|
||||
|
||||
self.import_game = QPushButton(icon("mdi.import", color="white"), self.tr("Import Game"))
|
||||
self.layout.addWidget(self.import_game)
|
||||
|
||||
self.layout.addStretch(1)
|
||||
|
||||
self.search_bar = QLineEdit()
|
||||
self.search_bar.setObjectName("search_bar")
|
||||
self.search_bar.setFrame(False)
|
||||
icon_label = QLabel()
|
||||
icon_label.setPixmap(icon("fa.search", color="white").pixmap(QSize(20, 20)))
|
||||
self.layout.addWidget(icon_label)
|
||||
self.search_bar.setMinimumWidth(200)
|
||||
self.search_bar.setPlaceholderText(self.tr("Search Game"))
|
||||
self.layout.addWidget(self.search_bar)
|
||||
|
||||
self.layout.addStretch(2)
|
||||
|
||||
checked = QSettings().value("icon_view", True, bool)
|
||||
|
||||
self.view = SelectViewWidget(checked)
|
||||
self.layout.addWidget(self.view)
|
||||
self.layout.addStretch(1)
|
||||
self.refresh_list = QPushButton()
|
||||
self.refresh_list.setIcon(icon("fa.refresh", color="white")) # Reload icon
|
||||
self.layout.addWidget(self.refresh_list)
|
||||
|
||||
self.setLayout(self.layout)
|
|
@ -0,0 +1,107 @@
|
|||
from PyQt5.QtCore import QSettings, QSize
|
||||
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QCheckBox, QLineEdit, QPushButton, QStackedLayout, QLabel
|
||||
from qtawesome import icon
|
||||
|
||||
from Rare.Components.Tabs.Games.GameInfo.GameInfo import InfoTabs
|
||||
from Rare.Components.Tabs.Games.GameList import GameList
|
||||
from Rare.Components.Tabs.Games.ImportWidget import ImportWidget
|
||||
from Rare.utils.QtExtensions import SelectViewWidget
|
||||
|
||||
|
||||
class GameTab(QWidget):
|
||||
def __init__(self, core):
|
||||
super(GameTab, self).__init__()
|
||||
self.layout = QStackedLayout()
|
||||
self.default_widget = Games(core)
|
||||
self.default_widget.game_list.show_game_info.connect(self.show_info)
|
||||
self.default_widget.head_bar.import_game.clicked.connect(lambda: self.layout.setCurrentIndex(2))
|
||||
self.layout.addWidget(self.default_widget)
|
||||
self.game_info = InfoTabs(core)
|
||||
self.game_info.info.update_list.connect(self.update_list)
|
||||
self.layout.addWidget(self.game_info)
|
||||
|
||||
self.default_widget.head_bar.refresh_list.clicked.connect(self.update_list)
|
||||
|
||||
self.import_widget = ImportWidget(core)
|
||||
self.layout.addWidget(self.import_widget)
|
||||
self.import_widget.back_button.clicked.connect(lambda: self.layout.setCurrentIndex(0))
|
||||
self.import_widget.update_list.connect(self.update_list)
|
||||
self.setLayout(self.layout)
|
||||
|
||||
def update_list(self):
|
||||
self.default_widget.game_list.update_list(self.default_widget.head_bar.view.isChecked())
|
||||
self.layout.setCurrentIndex(0)
|
||||
|
||||
def show_info(self, app_name):
|
||||
self.game_info.update_game(app_name)
|
||||
self.game_info.setCurrentIndex(1)
|
||||
self.layout.setCurrentIndex(1)
|
||||
|
||||
|
||||
class Games(QWidget):
|
||||
def __init__(self, core):
|
||||
super(Games, self).__init__()
|
||||
self.layout = QVBoxLayout()
|
||||
|
||||
self.head_bar = GameListHeadBar()
|
||||
self.head_bar.setObjectName("head_bar")
|
||||
|
||||
self.game_list = GameList(core)
|
||||
|
||||
self.head_bar.search_bar.textChanged.connect(
|
||||
lambda: self.game_list.filter(self.head_bar.search_bar.text()))
|
||||
|
||||
self.head_bar.installed_only.stateChanged.connect(lambda:
|
||||
self.game_list.installed_only(
|
||||
self.head_bar.installed_only.isChecked()))
|
||||
self.layout.addWidget(self.head_bar)
|
||||
self.layout.addWidget(self.game_list)
|
||||
# self.layout.addStretch(1)
|
||||
self.head_bar.view.toggled.connect(self.toggle_view)
|
||||
|
||||
self.setLayout(self.layout)
|
||||
|
||||
def toggle_view(self):
|
||||
self.game_list.setCurrentIndex(1 if self.head_bar.view.isChecked() else 0)
|
||||
settings = QSettings()
|
||||
settings.setValue("icon_view", not self.head_bar.view.isChecked())
|
||||
|
||||
|
||||
class GameListHeadBar(QWidget):
|
||||
def __init__(self):
|
||||
super(GameListHeadBar, self).__init__()
|
||||
self.layout = QHBoxLayout()
|
||||
self.installed_only = QCheckBox(self.tr("Installed only"))
|
||||
self.settings = QSettings()
|
||||
self.installed_only.setChecked(self.settings.value("installed_only", False, bool))
|
||||
self.layout.addWidget(self.installed_only)
|
||||
|
||||
self.layout.addStretch(1)
|
||||
|
||||
self.import_game = QPushButton(icon("mdi.import", color="white"), self.tr("Import Game"))
|
||||
self.layout.addWidget(self.import_game)
|
||||
|
||||
self.layout.addStretch(1)
|
||||
|
||||
self.search_bar = QLineEdit()
|
||||
self.search_bar.setObjectName("search_bar")
|
||||
self.search_bar.setFrame(False)
|
||||
icon_label = QLabel()
|
||||
icon_label.setPixmap(icon("fa.search", color="white").pixmap(QSize(20, 20)))
|
||||
self.layout.addWidget(icon_label)
|
||||
self.search_bar.setMinimumWidth(200)
|
||||
self.search_bar.setPlaceholderText(self.tr("Search Game"))
|
||||
self.layout.addWidget(self.search_bar)
|
||||
|
||||
self.layout.addStretch(2)
|
||||
|
||||
checked = QSettings().value("icon_view", True, bool)
|
||||
|
||||
self.view = SelectViewWidget(checked)
|
||||
self.layout.addWidget(self.view)
|
||||
self.layout.addStretch(1)
|
||||
self.refresh_list = QPushButton()
|
||||
self.refresh_list.setIcon(icon("fa.refresh", color="white")) # Reload icon
|
||||
self.layout.addWidget(self.refresh_list)
|
||||
|
||||
self.setLayout(self.layout)
|
|
@ -1,6 +1,9 @@
|
|||
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel
|
||||
import webbrowser
|
||||
|
||||
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel, QPushButton
|
||||
|
||||
from Rare import __version__
|
||||
from Rare.utils.utils import get_latest_version
|
||||
|
||||
|
||||
class About(QWidget):
|
||||
|
@ -13,6 +16,15 @@ class About(QWidget):
|
|||
|
||||
self.version = QLabel("Version: " + __version__)
|
||||
self.layout.addWidget(self.version)
|
||||
latest_tag = get_latest_version()
|
||||
self.update_available = latest_tag != __version__
|
||||
if latest_tag != __version__:
|
||||
print(f"Update available: {__version__} -> {latest_tag}")
|
||||
self.update_available = QLabel(self.tr("Update available: {} -> {}").format(__version__, latest_tag))
|
||||
self.layout.addWidget(self.update_available)
|
||||
self.open_browser = QPushButton(self.tr("Download latest release"))
|
||||
self.layout.addWidget(self.open_browser)
|
||||
self.open_browser.clicked.connect(lambda: webbrowser.open("https://github.com/Dummerle/Rare/releases/latest"))
|
||||
|
||||
self.dev = QLabel(self.tr("Developer:") + "<a href='https://github.com/Dummerle'>Dummerle</a>")
|
||||
self.dev.setToolTip("Github")
|
||||
|
|
|
@ -1,22 +0,0 @@
|
|||
import os
|
||||
|
||||
from PyQt5.QtWidgets import QTabWidget
|
||||
|
||||
from Rare.Components.Tabs.Settings.About import About
|
||||
from Rare.Components.Tabs.Settings.Legendary import LegendarySettings
|
||||
from Rare.Components.Tabs.Settings.Linux import LinuxSettings
|
||||
from Rare.Components.Tabs.Settings.Rare import RareSettings
|
||||
from Rare.utils.QtExtensions import SideTabBar
|
||||
|
||||
|
||||
class SettingsTab(QTabWidget):
|
||||
def __init__(self, core):
|
||||
super(SettingsTab, self).__init__()
|
||||
self.core = core
|
||||
self.setTabBar(SideTabBar())
|
||||
self.setTabPosition(QTabWidget.West)
|
||||
self.addTab(RareSettings(), "Rare")
|
||||
self.addTab(LegendarySettings(core), "Legendary")
|
||||
if os.name != "nt":
|
||||
self.addTab(LinuxSettings(core), "Linux")
|
||||
self.addTab(About(), "About")
|
|
@ -0,0 +1,24 @@
|
|||
import os
|
||||
|
||||
from PyQt5.QtWidgets import QTabWidget
|
||||
|
||||
from Rare.Components.Tabs.Settings.About import About
|
||||
from Rare.Components.Tabs.Settings.Legendary import LegendarySettings
|
||||
from Rare.Components.Tabs.Settings.Linux import LinuxSettings
|
||||
from Rare.Components.Tabs.Settings.Rare import RareSettings
|
||||
from Rare.utils.QtExtensions import SideTabBar
|
||||
|
||||
|
||||
class SettingsTab(QTabWidget):
|
||||
def __init__(self, core):
|
||||
super(SettingsTab, self).__init__()
|
||||
self.core = core
|
||||
self.setTabBar(SideTabBar())
|
||||
self.setTabPosition(QTabWidget.West)
|
||||
self.addTab(RareSettings(), "Rare")
|
||||
self.addTab(LegendarySettings(core), "Legendary")
|
||||
if os.name != "nt":
|
||||
self.addTab(LinuxSettings(core), "Linux")
|
||||
self.about = About()
|
||||
|
||||
self.addTab(self.about, "About (!)" if self.about.update_available else "About")
|
|
@ -1,5 +1,5 @@
|
|||
import os
|
||||
|
||||
__version__ = "0.9.8.3"
|
||||
__version__ = "0.9.8"
|
||||
style_path = os.path.join(os.path.dirname(__file__), "Styles/")
|
||||
lang_path = os.path.join(os.path.dirname(__file__), "languages/")
|
||||
|
|
|
@ -7,11 +7,11 @@ import requests
|
|||
from PIL import Image, UnidentifiedImageError
|
||||
from PyQt5.QtCore import pyqtSignal, QLocale, QSettings
|
||||
|
||||
from Rare import lang_path
|
||||
from Rare import lang_path, __version__
|
||||
from custom_legendary.core import LegendaryCore
|
||||
|
||||
logger = getLogger("Utils")
|
||||
s = QSettings("Rare", "Rare")
|
||||
s = QSettings()
|
||||
IMAGE_DIR = s.value("img_dir", os.path.expanduser("~/.cache/rare"), type=str)
|
||||
logger.info("IMAGE DIRECTORY: " + IMAGE_DIR)
|
||||
|
||||
|
@ -118,3 +118,9 @@ def get_possible_langs():
|
|||
if i.endswith(".qm"):
|
||||
langs.append(i.split(".")[0])
|
||||
return langs
|
||||
|
||||
|
||||
def get_latest_version():
|
||||
resp = requests.get("https://api.github.com/repos/Dummerle/Rare/releases/latest")
|
||||
tag = json.loads(resp.content.decode("utf-8"))["tag_name"]
|
||||
return tag
|
||||
|
|
Loading…
Reference in a new issue