1
0
Fork 0
mirror of synced 2024-06-02 02:34:40 +12:00

Merge pull request #277 from loathingKernel/develop

Refactor `ImageSize` location and enable "Import Game" button in game information
This commit is contained in:
Dummerle 2023-05-04 01:01:25 +02:00 committed by GitHub
commit da92f2cc98
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
14 changed files with 221 additions and 214 deletions

View file

@ -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

View file

@ -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

View file

@ -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']}")

View file

@ -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):

View file

@ -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)

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -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)

View file

@ -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
View 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"""

View file

@ -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):

View file

@ -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]:

View file

@ -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"]