Merge pull request #277 from loathingKernel/develop
Refactor `ImageSize` location and enable "Import Game" button in game information
This commit is contained in:
commit
da92f2cc98
82
.github/workflows/release-tests.yml
vendored
82
.github/workflows/release-tests.yml
vendored
|
@ -22,11 +22,11 @@ jobs:
|
|||
id: version
|
||||
shell: bash
|
||||
run: |
|
||||
tag_abbrev=$(git tag | sort -h | grep -oE "(^[0-9]+\.[0-9]+(.[0-9]+)?)$" | tail -1)
|
||||
echo "::set-output name=tag_abbrev::$tag_abbrev"
|
||||
echo "::set-output name=tag_offset::$(git rev-list $tag_abbrev..HEAD --count)"
|
||||
echo "::set-output name=sha_short::$(git rev-parse --short HEAD)"
|
||||
echo "::set-output name=full_desc::$(git describe --long --tags)"
|
||||
tag_abbrev=$(git tag --sort=v:refname | grep -oE "(^[0-9]+\.[0-9]+(.[0-9]+)?)$" | tail -1)
|
||||
echo "tag_abbrev=$tag_abbrev" >> $GITHUB_OUTPUT
|
||||
echo "tag_offset=$(git rev-list $tag_abbrev..HEAD --count)" >> $GITHUB_OUTPUT
|
||||
echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
|
||||
echo "full_desc=$(git describe --long --tags)" >> $GITHUB_OUTPUT
|
||||
|
||||
deb-package:
|
||||
needs: version
|
||||
|
@ -48,13 +48,13 @@ jobs:
|
|||
run: |
|
||||
cd build
|
||||
makedeb -d
|
||||
mv *.deb Rare.deb
|
||||
mv *.deb ../Rare.deb
|
||||
|
||||
- name: Upload to Artifacts
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: Rare.deb
|
||||
path: build/Rare.deb
|
||||
name: Rare-${{ needs.version.outputs.tag_abbrev }}.${{ needs.version.outputs.tag_offset }}.deb
|
||||
path: Rare.deb
|
||||
|
||||
appimage:
|
||||
needs: version
|
||||
|
@ -75,44 +75,18 @@ jobs:
|
|||
cp rare/__main__.py .
|
||||
appimage-builder --skip-test
|
||||
mv Rare-*.AppImage Rare.AppImage
|
||||
mv Rare-*.AppImage.zsync Rare.AppImage.zsync
|
||||
|
||||
- name: Upload to Artifacts
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: Rare.AppImage
|
||||
name: Rare-${{ needs.version.outputs.tag_abbrev }}.${{ needs.version.outputs.tag_offset }}.AppImage
|
||||
path: Rare.AppImage
|
||||
|
||||
cx_freeze_zip:
|
||||
needs: version
|
||||
runs-on: "windows-latest"
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
ref: "release"
|
||||
- uses: actions/setup-python@v4
|
||||
with:
|
||||
cache: pip
|
||||
python-version: '3.11'
|
||||
check-latest: true
|
||||
architecture: x64
|
||||
- name: Install build dependencies
|
||||
run: pip3 install cx_freeze
|
||||
- name: Install target dependencies
|
||||
run: |
|
||||
pip3 install -r requirements.txt
|
||||
pip3 install -r requirements-presence.txt
|
||||
pip3 install .
|
||||
- name: Build
|
||||
run: cxfreeze -c rare/__main__.py --target-dir dist --target-name rare --icon rare/resources/images/Rare.ico -OO --base-name Win32GUI
|
||||
- name: Compress
|
||||
run: |
|
||||
python -c "import shutil; shutil.make_archive('Rare-Windows', 'zip', 'dist')"
|
||||
|
||||
- name: Upload to Artifacts
|
||||
- name: Upload to Artifacts (zsync)
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: Rare-Windows-${{ needs.version.outputs.tag_abbrev }}.${{ needs.version.outputs.tag_offset }}.zip
|
||||
path: Rare-Windows.zip
|
||||
name: Rare-${{ needs.version.outputs.tag_abbrev }}.${{ needs.version.outputs.tag_offset }}.AppImage.zsync
|
||||
path: Rare.AppImage.zsync
|
||||
|
||||
nuitka:
|
||||
if: ${{ false }}
|
||||
|
@ -124,8 +98,8 @@ jobs:
|
|||
with:
|
||||
cache: pip
|
||||
python-version: '3.9'
|
||||
architecture: x64
|
||||
check-latest: true
|
||||
architecture: x64
|
||||
- name: Install build dependencies
|
||||
run: pip3 install nuitka ordered-set
|
||||
- name: Install target dependencies
|
||||
|
@ -166,14 +140,17 @@ jobs:
|
|||
run: |
|
||||
Copy-Item -Path "rare.dist\libcrypto-1_1.dll" -Destination "rare.dist\libcrypto-1_1-x64.dll"
|
||||
Copy-Item -Path "rare.dist\libssl-1_1.dll" -Destination "rare.dist\libssl-1_1-x64.dll"
|
||||
- name: Compress
|
||||
run: |
|
||||
python -c "import shutil; shutil.make_archive('Rare-Windows', 'zip', 'rare.dist')"
|
||||
|
||||
- name: Upload to Artifacts
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: Rare-Windows-${{ needs.version.outputs.tag_abbrev }}.${{ needs.version.outputs.tag_offset }}
|
||||
path: rare.dist
|
||||
path: Rare-Windows.zip
|
||||
|
||||
cx_freeze:
|
||||
cx_freeze_msi:
|
||||
needs: version
|
||||
runs-on: "windows-latest"
|
||||
steps:
|
||||
|
@ -193,24 +170,24 @@ jobs:
|
|||
- name: Build
|
||||
run: |
|
||||
python freeze.py bdist_msi
|
||||
mv dist/*.msi dist/Rare-Windows.msi
|
||||
mv dist/*.msi Rare.msi
|
||||
|
||||
- name: Upload to Artifacts
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: Rare-Windows-${{ needs.version.outputs.tag_abbrev }}.${{ needs.version.outputs.tag_offset }}.msi
|
||||
path: dist/*.msi
|
||||
name: Rare-${{ needs.version.outputs.tag_abbrev }}.${{ needs.version.outputs.tag_offset }}.msi
|
||||
path: Rare.msi
|
||||
|
||||
win-zip:
|
||||
cx_freeze_zip:
|
||||
needs: version
|
||||
runs-on: "windows-latest"
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
ref: "release"
|
||||
- uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: '3.9'
|
||||
cache: pip
|
||||
python-version: '3.11'
|
||||
check-latest: true
|
||||
architecture: x64
|
||||
- name: Install build dependencies
|
||||
run: pip3 install cx_freeze
|
||||
|
@ -218,6 +195,7 @@ jobs:
|
|||
run: |
|
||||
pip3 install -r requirements.txt
|
||||
pip3 install -r requirements-presence.txt
|
||||
pip3 install .
|
||||
- name: Build
|
||||
run: cxfreeze -c rare/__main__.py --target-dir dist --target-name rare --icon rare/resources/images/Rare.ico -OO --base-name Win32GUI
|
||||
- name: Compress
|
||||
|
@ -259,9 +237,9 @@ jobs:
|
|||
- name: Create dmg
|
||||
run: |
|
||||
git clone https://github.com/create-dmg/create-dmg
|
||||
create-dmg/create-dmg Rare-${{github.ref}}.dmg dist/Rare.App --volname Rare --volicon rare/resources/images/Rare.icns
|
||||
create-dmg/create-dmg Rare.dmg dist/Rare.App --volname Rare --volicon rare/resources/images/Rare.icns
|
||||
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: Rare-MacOS.dmg
|
||||
path: ./*.dmg
|
||||
name: Rare-${{ needs.version.outputs.tag_abbrev }}.${{ needs.version.outputs.tag_offset }}.dmg
|
||||
path: Rare.dmg
|
||||
|
|
80
.github/workflows/release.yml
vendored
80
.github/workflows/release.yml
vendored
|
@ -50,13 +50,13 @@ jobs:
|
|||
run: |
|
||||
cd build
|
||||
makedeb -d
|
||||
mv *.deb Rare.deb
|
||||
mv *.deb ../Rare.deb
|
||||
|
||||
- name: Upload to Releases
|
||||
uses: svenstaro/upload-release-action@2.2.1
|
||||
with:
|
||||
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
file: build/Rare.deb
|
||||
file: Rare.deb
|
||||
asset_name: Rare-${{ github.event.release.tag_name }}.deb
|
||||
tag: ${{ github.ref }}
|
||||
overwrite: true
|
||||
|
@ -91,7 +91,7 @@ jobs:
|
|||
asset_name: Rare-${{ github.event.release.tag_name }}.AppImage
|
||||
tag: ${{ github.ref }}
|
||||
overwrite: true
|
||||
- name: Upload zsync file to GitHub
|
||||
- name: Upload to Releases (zsync)
|
||||
uses: svenstaro/upload-release-action@2.2.1
|
||||
with:
|
||||
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
@ -100,40 +100,6 @@ jobs:
|
|||
tag: ${{ github.ref }}
|
||||
overwrite: true
|
||||
|
||||
cx_freeze_zip:
|
||||
runs-on: "windows-latest"
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
ref: "release"
|
||||
- uses: actions/setup-python@v4
|
||||
with:
|
||||
cache: pip
|
||||
python-version: '3.11'
|
||||
check-latest: true
|
||||
architecture: x64
|
||||
- name: Install build dependencies
|
||||
run: pip3 install cx_freeze
|
||||
- name: Install target dependencies
|
||||
run: |
|
||||
pip3 install -r requirements.txt
|
||||
pip3 install -r requirements-presence.txt
|
||||
pip3 install .
|
||||
- name: Build
|
||||
run: cxfreeze -c rare/__main__.py --target-dir dist --target-name rare --icon rare/resources/images/Rare.ico -OO --base-name Win32GUI
|
||||
- name: Compress
|
||||
run: |
|
||||
python -c "import shutil; shutil.make_archive('Rare-Windows', 'zip', 'dist')"
|
||||
|
||||
- name: Upload to Releases
|
||||
uses: svenstaro/upload-release-action@2.2.1
|
||||
with:
|
||||
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
file: Rare-Windows.zip
|
||||
asset_name: Rare-Windows-${{ github.event.release.tag_name }}.zip
|
||||
tag: ${{ github.ref }}
|
||||
overwrite: true
|
||||
|
||||
nuitka:
|
||||
if: ${{ false }}
|
||||
runs-on: "windows-latest"
|
||||
|
@ -221,14 +187,48 @@ jobs:
|
|||
- name: Build
|
||||
run: |
|
||||
python freeze.py bdist_msi
|
||||
mv dist/*.msi dist/Rare-Windows.msi
|
||||
mv dist/*.msi Rare.msi
|
||||
|
||||
- name: Upload to Releases
|
||||
uses: svenstaro/upload-release-action@2.2.1
|
||||
with:
|
||||
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
file: dist/Rare-Windows.msi
|
||||
asset_name: Rare-Windows-${{ github.event.release.tag_name }}.msi
|
||||
file: Rare.msi
|
||||
asset_name: Rare-${{ github.event.release.tag_name }}.msi
|
||||
tag: ${{ github.ref }}
|
||||
overwrite: true
|
||||
|
||||
cx_freeze_zip:
|
||||
runs-on: "windows-latest"
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
ref: "release"
|
||||
- uses: actions/setup-python@v4
|
||||
with:
|
||||
cache: pip
|
||||
python-version: '3.11'
|
||||
check-latest: true
|
||||
architecture: x64
|
||||
- name: Install build dependencies
|
||||
run: pip3 install cx_freeze
|
||||
- name: Install target dependencies
|
||||
run: |
|
||||
pip3 install -r requirements.txt
|
||||
pip3 install -r requirements-presence.txt
|
||||
pip3 install .
|
||||
- name: Build
|
||||
run: cxfreeze -c rare/__main__.py --target-dir dist --target-name rare --icon rare/resources/images/Rare.ico -OO --base-name Win32GUI
|
||||
- name: Compress
|
||||
run: |
|
||||
python -c "import shutil; shutil.make_archive('Rare-Windows', 'zip', 'dist')"
|
||||
|
||||
- name: Upload to Releases
|
||||
uses: svenstaro/upload-release-action@2.2.1
|
||||
with:
|
||||
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
file: Rare-Windows.zip
|
||||
asset_name: Rare-Windows-${{ github.event.release.tag_name }}.zip
|
||||
tag: ${{ github.ref }}
|
||||
overwrite: true
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@ import shutil
|
|||
import sys
|
||||
import traceback
|
||||
from argparse import Namespace
|
||||
from datetime import datetime
|
||||
from datetime import datetime, timezone
|
||||
from typing import Optional
|
||||
|
||||
import requests.exceptions
|
||||
|
@ -70,8 +70,8 @@ class Rare(RareApp):
|
|||
self.launch_dialog.login()
|
||||
|
||||
def poke_timer(self):
|
||||
dt_exp = datetime.fromisoformat(self.core.lgd.userdata['expires_at'][:-1])
|
||||
dt_now = datetime.utcnow()
|
||||
dt_exp = datetime.fromisoformat(self.core.lgd.userdata['expires_at'][:-1]).replace(tzinfo=timezone.utc)
|
||||
dt_now = datetime.utcnow().replace(tzinfo=timezone.utc)
|
||||
td = abs(dt_exp - dt_now)
|
||||
self.timer.start(int(td.total_seconds() - 60) * 1000)
|
||||
logger.info(f"Renewed session expires at {self.core.lgd.userdata['expires_at']}")
|
||||
|
|
|
@ -47,6 +47,7 @@ class GamesTab(QStackedWidget):
|
|||
|
||||
self.game_info_page = GameInfoTabs(self)
|
||||
self.game_info_page.back_clicked.connect(lambda: self.setCurrentWidget(self.games_page))
|
||||
self.game_info_page.import_clicked.connect(self.show_import)
|
||||
self.addWidget(self.game_info_page)
|
||||
|
||||
self.integrations_page = IntegrationsTabs(self)
|
||||
|
@ -117,9 +118,10 @@ class GamesTab(QStackedWidget):
|
|||
)
|
||||
|
||||
@pyqtSlot()
|
||||
def show_import(self):
|
||||
@pyqtSlot(str)
|
||||
def show_import(self, app_name: str = None):
|
||||
self.setCurrentWidget(self.integrations_page)
|
||||
self.integrations_page.show_import()
|
||||
self.integrations_page.show_import(app_name)
|
||||
|
||||
@pyqtSlot()
|
||||
def show_egl_sync(self):
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
from typing import Optional
|
||||
|
||||
from PyQt5.QtCore import Qt
|
||||
from PyQt5.QtCore import Qt, pyqtSignal, pyqtSlot
|
||||
from PyQt5.QtGui import QKeyEvent
|
||||
from PyQt5.QtWidgets import QTreeView
|
||||
|
||||
|
@ -15,6 +15,9 @@ from .cloud_saves import CloudSaves
|
|||
|
||||
|
||||
class GameInfoTabs(SideTabWidget):
|
||||
# str: app_name
|
||||
import_clicked = pyqtSignal(str)
|
||||
|
||||
def __init__(self, parent=None):
|
||||
super(GameInfoTabs, self).__init__(show_back=True, parent=parent)
|
||||
self.core = LegendaryCoreSingleton()
|
||||
|
@ -22,6 +25,7 @@ class GameInfoTabs(SideTabWidget):
|
|||
self.args = ArgumentsSingleton()
|
||||
|
||||
self.info_tab = GameInfo(self)
|
||||
self.info_tab.import_clicked.connect(self.import_clicked)
|
||||
self.info_index = self.addTab(self.info_tab, self.tr("Information"))
|
||||
|
||||
self.settings_tab = GameSettings(self)
|
||||
|
|
|
@ -5,10 +5,9 @@ from PyQt5.QtWidgets import QFrame, QMessageBox, QToolBox
|
|||
|
||||
from rare.models.game import RareGame
|
||||
from rare.shared import LegendaryCoreSingleton, GlobalSignalsSingleton
|
||||
from rare.shared.image_manager import ImageSize
|
||||
from rare.ui.components.tabs.games.game_info.game_dlc import Ui_GameDlc
|
||||
from rare.ui.components.tabs.games.game_info.game_dlc_widget import Ui_GameDlcWidget
|
||||
from rare.widgets.image_widget import ImageWidget
|
||||
from rare.widgets.image_widget import ImageWidget, ImageSize
|
||||
from rare.widgets.side_tab import SideTabContents
|
||||
from rare.utils.misc import widget_object_name
|
||||
|
||||
|
@ -76,6 +75,7 @@ class GameDlc(QToolBox, SideTabContents):
|
|||
|
||||
def __init__(self, parent=None):
|
||||
super(GameDlc, self).__init__(parent=parent)
|
||||
self.implements_scrollarea = True
|
||||
self.ui = Ui_GameDlc()
|
||||
self.ui.setupUi(self)
|
||||
self.core = LegendaryCoreSingleton()
|
||||
|
@ -93,7 +93,7 @@ class GameDlc(QToolBox, SideTabContents):
|
|||
return self.ui.installed_dlc_container.findChild(
|
||||
InstalledGameDlcWidget,
|
||||
name=widget_object_name(InstalledGameDlcWidget, app_name),
|
||||
options = Qt.FindDirectChildrenOnly
|
||||
options=Qt.FindDirectChildrenOnly
|
||||
)
|
||||
|
||||
def get_available(self, app_name: str) -> Optional[AvailableGameDlcWidget]:
|
||||
|
@ -131,7 +131,6 @@ class GameDlc(QToolBox, SideTabContents):
|
|||
i_widget.uninstalled.connect(self.append_available)
|
||||
self.ui.installed_dlc_container.layout().addWidget(i_widget)
|
||||
|
||||
|
||||
def append_available(self, rdlc: RareGame):
|
||||
self.ui.available_dlc_label.setVisible(False)
|
||||
self.ui.available_dlc_container.setVisible(True)
|
||||
|
|
|
@ -7,6 +7,7 @@ from typing import Optional
|
|||
from PyQt5.QtCore import (
|
||||
Qt,
|
||||
pyqtSlot,
|
||||
pyqtSignal,
|
||||
)
|
||||
from PyQt5.QtWidgets import (
|
||||
QMenu,
|
||||
|
@ -17,11 +18,10 @@ from PyQt5.QtWidgets import (
|
|||
|
||||
from rare.models.game import RareGame
|
||||
from rare.shared import RareCore
|
||||
from rare.shared.image_manager import ImageSize
|
||||
from rare.shared.workers import VerifyWorker, MoveWorker
|
||||
from rare.ui.components.tabs.games.game_info.game_info import Ui_GameInfo
|
||||
from rare.utils.misc import format_size
|
||||
from rare.widgets.image_widget import ImageWidget
|
||||
from rare.widgets.image_widget import ImageWidget, ImageSize
|
||||
from rare.widgets.side_tab import SideTabContents
|
||||
from .move_game import MoveGamePopUp, is_game_dir
|
||||
|
||||
|
@ -29,6 +29,9 @@ logger = getLogger("GameInfo")
|
|||
|
||||
|
||||
class GameInfo(QWidget, SideTabContents):
|
||||
# str: app_name
|
||||
import_clicked = pyqtSignal(str)
|
||||
|
||||
def __init__(self, parent=None):
|
||||
super(GameInfo, self).__init__(parent=parent)
|
||||
self.ui = Ui_GameInfo()
|
||||
|
@ -49,6 +52,7 @@ class GameInfo(QWidget, SideTabContents):
|
|||
self.ui.left_layout.insertWidget(0, self.image, alignment=Qt.AlignTop)
|
||||
|
||||
self.ui.install_button.clicked.connect(self.__on_install)
|
||||
self.ui.import_button.clicked.connect(self.__on_import)
|
||||
self.ui.verify_button.clicked.connect(self.__on_verify)
|
||||
self.ui.repair_button.clicked.connect(self.__on_repair)
|
||||
self.ui.uninstall_button.clicked.connect(self.__on_uninstall)
|
||||
|
@ -84,7 +88,10 @@ class GameInfo(QWidget, SideTabContents):
|
|||
else:
|
||||
self.rgame.install()
|
||||
|
||||
# FIXME: Move to RareGame
|
||||
@pyqtSlot()
|
||||
def __on_import(self):
|
||||
self.import_clicked.emit(self.rgame.app_name)
|
||||
|
||||
@pyqtSlot()
|
||||
def __on_uninstall(self):
|
||||
""" This method is to be called from the button only """
|
||||
|
@ -275,7 +282,9 @@ class GameInfo(QWidget, SideTabContents):
|
|||
(not self.rgame.is_installed or self.rgame.is_non_asset) and self.rgame.is_idle
|
||||
)
|
||||
|
||||
self.ui.import_button.setEnabled(False)
|
||||
self.ui.import_button.setEnabled(
|
||||
(not self.rgame.is_installed or self.rgame.is_non_asset) and self.rgame.is_idle
|
||||
)
|
||||
|
||||
self.ui.verify_button.setEnabled(
|
||||
self.rgame.is_installed and (not self.rgame.is_non_asset) and self.rgame.is_idle
|
||||
|
|
|
@ -4,7 +4,7 @@ from typing import Optional
|
|||
from PyQt5.QtCore import QEvent
|
||||
|
||||
from rare.models.game import RareGame
|
||||
from rare.shared.image_manager import ImageSize
|
||||
from rare.models.image import ImageSize
|
||||
from .game_widget import GameWidget
|
||||
from .icon_widget import IconWidget
|
||||
|
||||
|
|
|
@ -13,15 +13,17 @@ from .ubisoft_group import UbisoftGroup
|
|||
class IntegrationsTabs(SideTabWidget):
|
||||
def __init__(self, parent=None):
|
||||
super(IntegrationsTabs, self).__init__(show_back=True, parent=parent)
|
||||
self.import_group = ImportGroup(self)
|
||||
self.import_widget = IntegrationsWidget(
|
||||
ImportGroup(self),
|
||||
self.import_group,
|
||||
self.tr("To import games from Epic Games Store, please enable EGL Sync."),
|
||||
self,
|
||||
)
|
||||
self.import_index = self.addTab(self.import_widget, self.tr("Import Games"))
|
||||
|
||||
self.egl_sync_group = EGLSyncGroup(self)
|
||||
self.egl_sync_widget = IntegrationsWidget(
|
||||
EGLSyncGroup(self),
|
||||
self.egl_sync_group,
|
||||
self.tr("To import EGL games from directories, please use Import Game."),
|
||||
self,
|
||||
)
|
||||
|
@ -32,14 +34,17 @@ class IntegrationsTabs(SideTabWidget):
|
|||
self.tr(""),
|
||||
self,
|
||||
)
|
||||
self.eos_ubisoft.addWidget(UbisoftGroup(self.eos_ubisoft))
|
||||
self.eos_ubisoft.addWidget(EOSGroup(self.eos_ubisoft))
|
||||
self.ubisoft_group = UbisoftGroup(self.eos_ubisoft)
|
||||
self.eos_group = EOSGroup(self.eos_ubisoft)
|
||||
self.eos_ubisoft.addWidget(self.ubisoft_group)
|
||||
self.eos_ubisoft.addWidget(self.eos_group)
|
||||
self.eos_ubisoft_index = self.addTab(self.eos_ubisoft, self.tr("Epic Overlay and Ubisoft"))
|
||||
|
||||
self.setCurrentIndex(self.import_index)
|
||||
|
||||
def show_import(self):
|
||||
def show_import(self, app_name: str = None):
|
||||
self.setCurrentIndex(self.import_index)
|
||||
self.import_group.set_game(app_name)
|
||||
|
||||
def show_egl_sync(self):
|
||||
self.setCurrentIndex(self.egl_sync_index)
|
||||
|
@ -53,13 +58,11 @@ class IntegrationsWidget(QWidget):
|
|||
super(IntegrationsWidget, self).__init__(parent=parent)
|
||||
self.info = QLabel(f"<b>{info}</b>")
|
||||
|
||||
layout = QVBoxLayout(self)
|
||||
self.__layout = QVBoxLayout(self)
|
||||
if widget is not None:
|
||||
layout.addWidget(widget)
|
||||
layout.addWidget(self.info)
|
||||
layout.addItem(
|
||||
QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)
|
||||
)
|
||||
self.__layout.addWidget(widget)
|
||||
self.__layout.addWidget(self.info)
|
||||
self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
|
||||
|
||||
def addWidget(self, widget: QWidget, stretch: int = 0, alignment: Qt.AlignmentFlag = Qt.Alignment()):
|
||||
self.layout().insertWidget(self.layout().count() - 2, widget, stretch, alignment)
|
||||
self.__layout.insertWidget(self.layout().count() - 1, widget, stretch, alignment)
|
||||
|
|
|
@ -217,6 +217,12 @@ class ImportGroup(QGroupBox):
|
|||
|
||||
self.threadpool = QThreadPool.globalInstance()
|
||||
|
||||
def set_game(self, app_name: str):
|
||||
if app_name:
|
||||
folder = self.rcore.get_game(app_name).folder_name
|
||||
self.path_edit.setText(os.path.join(self.core.get_default_install_dir(), folder))
|
||||
self.app_name_edit.setText(app_name)
|
||||
|
||||
def path_edit_callback(self, path) -> Tuple[bool, str, int]:
|
||||
if os.path.exists(path):
|
||||
if os.path.exists(os.path.join(path, ".egstore")):
|
||||
|
@ -252,7 +258,7 @@ class ImportGroup(QGroupBox):
|
|||
self.ui.import_dlcs_check.setEnabled(
|
||||
bool(self.core.get_dlc_for_game(app_name))
|
||||
)
|
||||
self.ui.import_button.setEnabled(True)
|
||||
self.ui.import_button.setEnabled(self.path_edit.is_valid)
|
||||
else:
|
||||
self.ui.import_dlcs_check.setEnabled(False)
|
||||
self.ui.import_button.setEnabled(False)
|
||||
|
|
91
rare/models/image.py
Normal file
91
rare/models/image.py
Normal file
|
@ -0,0 +1,91 @@
|
|||
from enum import Enum
|
||||
|
||||
from PyQt5.QtCore import QSize
|
||||
|
||||
|
||||
class Orientation(Enum):
|
||||
Tall = 0
|
||||
Wide = 1
|
||||
|
||||
|
||||
class ImageSize:
|
||||
class Preset:
|
||||
def __init__(self, divisor: float, pixel_ratio: float, orientation: Orientation = Orientation.Tall,
|
||||
base: 'ImageSize.Preset' = None):
|
||||
self.__divisor = divisor
|
||||
self.__pixel_ratio = pixel_ratio
|
||||
if orientation == Orientation.Tall:
|
||||
self.__img_factor = 67
|
||||
self.__size = QSize(self.__img_factor * 3, self.__img_factor * 4) * pixel_ratio / divisor
|
||||
else:
|
||||
self.__img_factor = 17
|
||||
self.__size = QSize(self.__img_factor * 16, self.__img_factor * 9) * pixel_ratio / divisor
|
||||
# lk: for prettier images set this to true
|
||||
self.__smooth_transform: bool = True
|
||||
if divisor > 2:
|
||||
self.__smooth_transform = False
|
||||
|
||||
if base is not None:
|
||||
self.__base = base
|
||||
else:
|
||||
self.__base = self
|
||||
|
||||
def __eq__(self, other: 'ImageSize.Preset'):
|
||||
return (
|
||||
self.__size == other.size
|
||||
and self.__divisor == other.divisor
|
||||
and self.__smooth_transform == other.smooth
|
||||
and self.__pixel_ratio == other.pixel_ratio
|
||||
)
|
||||
|
||||
@property
|
||||
def size(self) -> QSize:
|
||||
return self.__size
|
||||
|
||||
@property
|
||||
def divisor(self) -> float:
|
||||
return self.__divisor
|
||||
|
||||
@property
|
||||
def smooth(self) -> bool:
|
||||
return self.__smooth_transform
|
||||
|
||||
@property
|
||||
def pixel_ratio(self) -> float:
|
||||
return self.__pixel_ratio
|
||||
|
||||
@property
|
||||
def base(self) -> 'ImageSize.Preset':
|
||||
return self.__base
|
||||
|
||||
Image = Preset(1, 2)
|
||||
"""! @brief Size and pixel ratio of the image on disk"""
|
||||
|
||||
ImageWide = Preset(1, 2, Orientation.Wide)
|
||||
"""! @brief Size and pixel ratio for wide 16/9 image on disk"""
|
||||
|
||||
Display = Preset(1, 1, base=Image)
|
||||
"""! @brief Size and pixel ratio for displaying"""
|
||||
|
||||
DisplayWide = Preset(1, 1, Orientation.Wide, base=ImageWide)
|
||||
"""! @brief Size and pixel ratio for wide 16/9 image display"""
|
||||
|
||||
Wide = DisplayWide
|
||||
|
||||
Normal = Display
|
||||
"""! @brief Same as Display"""
|
||||
|
||||
Small = Preset(3, 1, base=Image)
|
||||
"""! @brief Small image size for displaying"""
|
||||
|
||||
SmallWide = Preset(1, 1, Orientation.Wide, base=ImageWide)
|
||||
"""! @brief Small image size for displaying"""
|
||||
|
||||
Smaller = Preset(4, 1, base=Image)
|
||||
"""! @brief Smaller image size for displaying"""
|
||||
|
||||
SmallerWide = Preset(4, 1, Orientation.Wide, base=ImageWide)
|
||||
"""! @brief Smaller image size for displaying"""
|
||||
|
||||
Icon = Preset(5, 1, base=Image)
|
||||
"""! @brief Smaller image size for UI icons"""
|
|
@ -2,8 +2,6 @@ import hashlib
|
|||
import json
|
||||
import pickle
|
||||
import zlib
|
||||
from enum import Enum
|
||||
|
||||
# from concurrent import futures
|
||||
from logging import getLogger
|
||||
from pathlib import Path
|
||||
|
@ -34,6 +32,7 @@ from PyQt5.QtWidgets import QApplication
|
|||
from legendary.models.game import Game
|
||||
|
||||
from rare.lgndr.core import LegendaryCore
|
||||
from rare.models.image import ImageSize
|
||||
from rare.models.signals import GlobalSignals
|
||||
from rare.utils.paths import image_dir, resources_path, desktop_icon_suffix
|
||||
|
||||
|
@ -45,94 +44,6 @@ if TYPE_CHECKING:
|
|||
logger = getLogger("ImageManager")
|
||||
|
||||
|
||||
class Orientation(Enum):
|
||||
Tall = 0
|
||||
Wide = 1
|
||||
|
||||
|
||||
class ImageSize:
|
||||
class Preset:
|
||||
def __init__(self, divisor: float, pixel_ratio: float, orientation: Orientation = Orientation.Tall,
|
||||
base: 'ImageSize.Preset' = None):
|
||||
self.__divisor = divisor
|
||||
self.__pixel_ratio = pixel_ratio
|
||||
if orientation == Orientation.Tall:
|
||||
self.__img_factor = 67
|
||||
self.__size = QSize(self.__img_factor * 3, self.__img_factor * 4) * pixel_ratio / divisor
|
||||
else:
|
||||
self.__img_factor = 21
|
||||
self.__size = QSize(self.__img_factor * 16, self.__img_factor * 9) * pixel_ratio / divisor
|
||||
# lk: for prettier images set this to true
|
||||
self.__smooth_transform: bool = True
|
||||
if divisor > 2:
|
||||
self.__smooth_transform = False
|
||||
|
||||
if base is not None:
|
||||
self.__base = base
|
||||
else:
|
||||
self.__base = self
|
||||
|
||||
def __eq__(self, other: 'ImageSize.Preset'):
|
||||
return (
|
||||
self.__size == other.size
|
||||
and self.__divisor == other.divisor
|
||||
and self.__smooth_transform == other.smooth
|
||||
and self.__pixel_ratio == other.pixel_ratio
|
||||
)
|
||||
|
||||
@property
|
||||
def size(self) -> QSize:
|
||||
return self.__size
|
||||
|
||||
@property
|
||||
def divisor(self) -> float:
|
||||
return self.__divisor
|
||||
|
||||
@property
|
||||
def smooth(self) -> bool:
|
||||
return self.__smooth_transform
|
||||
|
||||
@property
|
||||
def pixel_ratio(self) -> float:
|
||||
return self.__pixel_ratio
|
||||
|
||||
@property
|
||||
def base(self) -> 'ImageSize.Preset':
|
||||
return self.__base
|
||||
|
||||
Image = Preset(1, 2)
|
||||
"""! @brief Size and pixel ratio of the image on disk"""
|
||||
|
||||
ImageWide = Preset(1, 2, Orientation.Wide)
|
||||
"""! @brief Size and pixel ratio for wide 16/9 image on disk"""
|
||||
|
||||
Display = Preset(1, 1, base=Image)
|
||||
"""! @brief Size and pixel ratio for displaying"""
|
||||
|
||||
DisplayWide = Preset(1, 1, Orientation.Wide, base=ImageWide)
|
||||
"""! @brief Size and pixel ratio for wide 16/9 image display"""
|
||||
|
||||
Wide = DisplayWide
|
||||
|
||||
Normal = Display
|
||||
"""! @brief Same as Display"""
|
||||
|
||||
Small = Preset(3, 1, base=Image)
|
||||
"""! @brief Small image size for displaying"""
|
||||
|
||||
SmallWide = Preset(1, 1, Orientation.Wide, base=ImageWide)
|
||||
"""! @brief Small image size for displaying"""
|
||||
|
||||
Smaller = Preset(4, 1, base=Image)
|
||||
"""! @brief Smaller image size for displaying"""
|
||||
|
||||
SmallerWide = Preset(4, 1, Orientation.Wide, base=ImageWide)
|
||||
"""! @brief Smaller image size for displaying"""
|
||||
|
||||
Icon = Preset(5, 1, base=Image)
|
||||
"""! @brief Smaller image size for UI icons"""
|
||||
|
||||
|
||||
class ImageManager(QObject):
|
||||
class Worker(QRunnable):
|
||||
class Signals(QObject):
|
||||
|
|
|
@ -4,7 +4,7 @@ import time
|
|||
from argparse import Namespace
|
||||
from itertools import chain
|
||||
from logging import getLogger
|
||||
from typing import Dict, Iterator, Callable, Optional, List, Union
|
||||
from typing import Dict, Iterator, Callable, Optional, List, Union, Iterable
|
||||
|
||||
from PyQt5.QtCore import QObject, pyqtSignal, QSettings, pyqtSlot, QThreadPool, QRunnable, QTimer
|
||||
from legendary.lfs.eos import EOSOverlayApp
|
||||
|
@ -93,10 +93,10 @@ class RareCore(QObject):
|
|||
self.queue_workers.remove(worker)
|
||||
self.__signals.application.update_statusbar.emit()
|
||||
|
||||
def active_workers(self) -> Iterator[QueueWorker]:
|
||||
def active_workers(self) -> Iterable[QueueWorker]:
|
||||
return list(filter(lambda w: w.state == QueueWorkerState.ACTIVE, self.queue_workers))
|
||||
|
||||
def queued_workers(self) -> Iterator[QueueWorker]:
|
||||
def queued_workers(self) -> Iterable[QueueWorker]:
|
||||
return list(filter(lambda w: w.state == QueueWorkerState.QUEUED, self.queue_workers))
|
||||
|
||||
def queue_info(self) -> List[QueueWorkerInfo]:
|
||||
|
|
|
@ -15,7 +15,7 @@ from PyQt5.QtGui import (
|
|||
)
|
||||
from PyQt5.QtWidgets import QWidget
|
||||
|
||||
from rare.shared.image_manager import ImageSize
|
||||
from rare.models.image import ImageSize
|
||||
|
||||
OverlayPath = Tuple[QPainterPath, Union[QColor, QLinearGradient]]
|
||||
|
||||
|
@ -152,3 +152,7 @@ class ImageWidget(QWidget):
|
|||
self.paint_image(painter, a0)
|
||||
self.paint_overlay(painter, a0)
|
||||
painter.end()
|
||||
|
||||
|
||||
__all__ = ["ImageSize", "ImageWidget"]
|
||||
|
||||
|
|
Loading…
Reference in a new issue