Compare commits

..

17 Commits
v2.8.5 ... v2.9

Author SHA1 Message Date
kramo
eac6d63010 v2.9 2024-07-10 16:22:10 +02:00
kramo
beda52b575 Add macOS documentation 2024-07-10 16:10:06 +02:00
Weblate (bot)
13cefac34d Translated using Weblate (Czech) (#271)
Currently translated at 100.0% (140 of 140 strings)


Translate-URL: https://hosted.weblate.org/projects/cartridges/cartridges/cs/
Translation: Cartridges/Cartridges

Co-authored-by: foo expert <deferred_water346@simplelogin.com>
2024-07-10 16:03:21 +02:00
kramo
d79686b9a1 Fix Windows CI 2024-07-10 15:31:52 +02:00
kramo
eff60d5990 Add macOS CI 2024-07-10 15:26:17 +02:00
kramo
823641d909 Make Heroic and itch sources available on macOS 2024-07-10 15:12:47 +02:00
kramo
6c2ab8099b macOS Improvements 2024-07-10 14:02:37 +02:00
Brage Fuglseth
d8137871c5 readme: Update Flathub badge (#277)
See https://fosstodon.org/@bragefuglseth/112753049810610017. This primarily serves as a way to let me sleep at night again.
2024-07-09 15:27:30 +02:00
kramo
f396a4679c Fix weird spacing in header bar 2024-07-08 16:19:00 +02:00
kramo
c1226197f8 Don't horizontally scroll sidebar 2024-07-08 15:49:31 +02:00
kramo
8504689426 Simplify Meson 2024-07-08 15:37:18 +02:00
dependabot[bot]
aafc64023c Bump softprops/action-gh-release from 2.0.5 to 2.0.6 (#273)
Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 2.0.5 to 2.0.6.
- [Release notes](https://github.com/softprops/action-gh-release/releases)
- [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)
- [Commits](https://github.com/softprops/action-gh-release/compare/v2.0.5...v2.0.6)

---
updated-dependencies:
- dependency-name: softprops/action-gh-release
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-01 20:06:05 +02:00
dependabot[bot]
eab96edfc7 Bump dawidd6/action-download-artifact from 3.1.4 to 6 (#274)
Bumps [dawidd6/action-download-artifact](https://github.com/dawidd6/action-download-artifact) from 3.1.4 to 6.
- [Release notes](https://github.com/dawidd6/action-download-artifact/releases)
- [Commits](https://github.com/dawidd6/action-download-artifact/compare/v3.1.4...v6)

---
updated-dependencies:
- dependency-name: dawidd6/action-download-artifact
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-01 20:05:54 +02:00
kramo
72f15ba7fd Add .DS_Store to .gitignore 2024-07-01 11:32:19 +02:00
kramo
63a797ce33 Add Steam darwin library location 2024-06-29 09:37:55 +02:00
kramo
8640e37252 Add Steam darwin logic 2024-06-29 03:14:07 +02:00
kramo
57db530af5 Better cross-platform logic in catrridges.in 2024-06-29 03:01:28 +02:00
30 changed files with 273 additions and 110 deletions

View File

@@ -21,7 +21,7 @@ jobs:
uses: flatpak/flatpak-github-actions/flatpak-builder@v6.3 uses: flatpak/flatpak-github-actions/flatpak-builder@v6.3
with: with:
bundle: page.kramo.Cartridges.Devel.flatpak bundle: page.kramo.Cartridges.Devel.flatpak
manifest-path: flatpak/page.kramo.Cartridges.Devel.json manifest-path: build-aux/flatpak/page.kramo.Cartridges.Devel.json
windows: windows:
name: Windows name: Windows
@@ -51,10 +51,49 @@ jobs:
timeout 2 cartridges; [ "$?" -eq "124" ] timeout 2 cartridges; [ "$?" -eq "124" ]
- name: Inno Setup - name: Inno Setup
run: iscc ".\_build\windows\Cartridges.iss" run: iscc ".\_build\build-aux\windows\Cartridges.iss"
- name: Upload Artifact - name: Upload Artifact
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
name: Windows Installer name: Windows Installer
path: _build/windows/Output/Cartridges Setup.exe path: _build/build-aux/windows/Output/Cartridges Windows.exe
macos:
name: macOS
runs-on: macos-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up Homebrew
id: set-up-homebrew
uses: Homebrew/actions/setup-homebrew@master
- name: Install Dependencies
run: |
brew install meson pygobject3 libadwaita adwaita-icon-theme desktop-file-utils pyinstaller pillow
pip3 install --break-system-packages requests PyYAML
- name: Meson Build
run: |
meson setup _build
ninja install -C _build
- name: PyInstaller
env:
PYTHONPATH: /opt/homebrew/opt/homebrew/lib/python3.12/site-packages
run: |
cd build-aux/macos
pyinstaller ./cartridges.spec
- name: Zip
run: |
cd build-aux/macos/dist
zip -yr Cartridges\ macOS.zip Cartridges.app
- name: Upload Artifact
uses: actions/upload-artifact@v4
with:
path: build-aux/macos/dist/Cartridges macOS.zip
name: macOS Application

View File

@@ -1,8 +1,7 @@
name: Publish Release name: Publish Release
on: on:
push: push:
tags: tags: "*"
"*"
concurrency: concurrency:
group: release-${{ github.sha }} group: release-${{ github.sha }}
@@ -16,7 +15,7 @@ jobs:
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Download workflow artifact - name: Download workflow artifact
uses: dawidd6/action-download-artifact@v3.1.4 uses: dawidd6/action-download-artifact@v6
with: with:
workflow: ci.yml workflow: ci.yml
commit: ${{ github.sha }} commit: ${{ github.sha }}
@@ -39,9 +38,11 @@ jobs:
run: echo tag_name=${GITHUB_REF#refs/tags/} >> $GITHUB_OUTPUT run: echo tag_name=${GITHUB_REF#refs/tags/} >> $GITHUB_OUTPUT
- name: Publish release - name: Publish release
uses: softprops/action-gh-release@v2.0.5 uses: softprops/action-gh-release@v2.0.6
with: with:
files: Windows Installer/Cartridges Setup.exe files: |
Windows Installer/Cartridges Windows.exe
macOS Application/Cartridges macOS.zip
fail_on_unmatched_files: true fail_on_unmatched_files: true
tag_name: ${{ steps.get_tag_name.outputs.tag_name }} tag_name: ${{ steps.get_tag_name.outputs.tag_name }}
body_path: release_notes body_path: release_notes

3
.gitignore vendored
View File

@@ -1,4 +1,7 @@
/subprojects/blueprint-compiler /subprojects/blueprint-compiler
/build-aux/macos/build
/build-aux/macos/dist
/.flatpak /.flatpak
/.flatpak-builder /.flatpak-builder
/.vscode /.vscode
.DS_Store

View File

@@ -33,6 +33,11 @@ The project can be translated on [Weblate](https://hosted.weblate.org/engage/car
2. From the MSYS2 shell, install the required dependencies listed [here](https://github.com/kra-mo/cartridges/blob/main/.github/workflows/ci.yml). 2. From the MSYS2 shell, install the required dependencies listed [here](https://github.com/kra-mo/cartridges/blob/main/.github/workflows/ci.yml).
3. Build it via Meson. 3. Build it via Meson.
## For macOS
1. Install [Homebrew](https://brew.sh/).
2. Using `brew` and `pip3`, install the required dependencies listed [here](https://github.com/kra-mo/cartridges/blob/main/.github/workflows/ci.yml).
3. Build it via Meson.
## Meson ## Meson
```bash ```bash
git clone https://github.com/kra-mo/cartridges.git git clone https://github.com/kra-mo/cartridges.git

View File

@@ -65,11 +65,9 @@ Thank you for your generosity! 💜
## Linux ## Linux
### Flathub
The app is available on Flathub. The app is available on Flathub.
<a href=https://flathub.org/apps/page.kramo.Cartridges><img width='240' alt='Download on Flathub' src='https://dl.flathub.org/assets/badges/flathub-badge-en.png'/></a> <a href=https://flathub.org/apps/page.kramo.Cartridges><img alt='Download on Flathub' src='https://flathub.org/api/badge?svg&locale=en'/></a>
## Windows ## Windows
@@ -84,6 +82,13 @@ Note: Windows might present you with a warning when trying to install the app. T
Install the latest release with the command: `winget install cartridges`. Install the latest release with the command: `winget install cartridges`.
## macOS
1. Download the latest release from [Releases](https://github.com/kra-mo/cartridges/releases).
2. Move the app into your Applications folder.
Note: macOS might tell you that the application could not be checked for malicious software or something similar. In this case, open System Settings > Privacy & Security, scroll down, find the warning about Cartridges and click "Open Anyway". More information can be found [here](https://support.apple.com/en-us/102445).
## Building manually ## Building manually
See [Building](https://github.com/kra-mo/cartridges/blob/main/CONTRIBUTING.md#building). See [Building](https://github.com/kra-mo/cartridges/blob/main/CONTRIBUTING.md#building).

View File

@@ -130,7 +130,7 @@
"sources" : [ "sources" : [
{ {
"type" : "dir", "type" : "dir",
"path" : ".." "path" : "../.."
} }
] ]
} }

View File

@@ -0,0 +1,59 @@
# -*- mode: python ; coding: utf-8 -*-
a = Analysis(
["../../_build/cartridges/cartridges"],
pathex=[],
binaries=[],
datas=[("../../_build/data/cartridges.gresource", "Resources")],
hiddenimports=[],
hookspath=[],
hooksconfig={
"gi": {
"module-versions": {
"Gtk": "4.0",
},
},
},
runtime_hooks=[],
excludes=[],
noarchive=False,
optimize=0,
)
pyz = PYZ(a.pure)
exe = EXE(
pyz,
a.scripts,
[],
exclude_binaries=True,
name="Cartridges",
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=False,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
)
coll = COLLECT(
exe,
a.binaries,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name="Cartridges",
)
app = BUNDLE(
coll,
name="Cartridges.app",
icon="./icon.icns",
bundle_identifier="page.kramo.Cartridges",
info_plist={
"LSApplicationCategoryType": "public.app-category.games",
},
)

BIN
build-aux/macos/icon.icns Normal file

Binary file not shown.

View File

@@ -15,10 +15,10 @@ AppSupportURL=https://github.com/kra-mo/cartridges/issues
AppUpdatesURL={#MyAppURL} AppUpdatesURL={#MyAppURL}
DefaultDirName={autopf64}\{#MyAppName} DefaultDirName={autopf64}\{#MyAppName}
DisableProgramGroupPage=yes DisableProgramGroupPage=yes
LicenseFile=..\..\LICENSE LicenseFile=..\..\..\LICENSE
PrivilegesRequiredOverridesAllowed=dialog PrivilegesRequiredOverridesAllowed=dialog
OutputBaseFilename=Cartridges Setup OutputBaseFilename=Cartridges Windows
SetupIconFile=..\..\windows\icon.ico SetupIconFile=..\..\..\build-aux\windows\icon.ico
Compression=lzma Compression=lzma
SolidCompression=yes SolidCompression=yes
WizardStyle=modern WizardStyle=modern
@@ -49,7 +49,7 @@ Source: "D:\a\_temp\msys64\ucrt64\share\icons\*"; DestDir: "{app}\share\icons";
Source: "D:\a\_temp\msys64\ucrt64\share\glib-2.0\*"; DestDir: "{app}\share\glib-2.0"; Flags: recursesubdirs ignoreversion Source: "D:\a\_temp\msys64\ucrt64\share\glib-2.0\*"; DestDir: "{app}\share\glib-2.0"; Flags: recursesubdirs ignoreversion
Source: "D:\a\_temp\msys64\ucrt64\share\gtk-4.0\*"; DestDir: "{app}\share\gtk-4.0"; Flags: recursesubdirs ignoreversion Source: "D:\a\_temp\msys64\ucrt64\share\gtk-4.0\*"; DestDir: "{app}\share\gtk-4.0"; Flags: recursesubdirs ignoreversion
Source: "..\..\windows\icon.ico"; DestDir: "{app}"; Flags: recursesubdirs ignoreversion Source: "..\..\..\build-aux\windows\icon.ico"; DestDir: "{app}"; Flags: recursesubdirs ignoreversion
[Icons] [Icons]
Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\bin\{#MyAppExeName}"; Parameters: """{app}\bin\cartridges"""; IconFilename: "{app}\icon.ico" Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\bin\{#MyAppExeName}"; Parameters: """{app}\bin\cartridges"""; IconFilename: "{app}\icon.ico"

View File

Before

Width:  |  Height:  |  Size: 169 KiB

After

Width:  |  Height:  |  Size: 169 KiB

View File

@@ -3,5 +3,5 @@ configure_file(
output: 'Cartridges.iss', output: 'Cartridges.iss',
configuration: conf, configuration: conf,
install: true, install: true,
install_dir: '.' install_dir: '.',
) )

View File

@@ -2,7 +2,7 @@
# cartridges.in # cartridges.in
# #
# Copyright 2022-2023 kramo # Copyright 2022-2024 kramo
# #
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
@@ -24,6 +24,8 @@ import locale
import os import os
import signal import signal
import sys import sys
from pathlib import Path
from platform import system
VERSION = "@VERSION@" VERSION = "@VERSION@"
@@ -36,7 +38,7 @@ else:
sys.path.insert(1, PKGDATADIR) sys.path.insert(1, PKGDATADIR)
signal.signal(signal.SIGINT, signal.SIG_DFL) signal.signal(signal.SIGINT, signal.SIG_DFL)
if os.name != "nt": if system() == "Linux":
locale.bindtextdomain("cartridges", LOCALEDIR) locale.bindtextdomain("cartridges", LOCALEDIR)
locale.textdomain("cartridges") locale.textdomain("cartridges")
gettext.install("cartridges", LOCALEDIR) gettext.install("cartridges", LOCALEDIR)
@@ -44,8 +46,14 @@ else:
gettext.install("cartridges") gettext.install("cartridges")
if __name__ == "__main__": if __name__ == "__main__":
from gi.repository import Gio from gi.repository import Gio, GLib
try:
# For a macOS application bundle
resource = Gio.Resource.load(
str(Path(__file__).parent / "Resources" / "cartridges.gresource")
)
except GLib.GError:
resource = Gio.Resource.load(os.path.join(PKGDATADIR, "cartridges.gresource")) resource = Gio.Resource.load(os.path.join(PKGDATADIR, "cartridges.gresource"))
resource._register() # pylint: disable=protected-access resource._register() # pylint: disable=protected-access

View File

@@ -17,9 +17,9 @@
# #
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
import os
import shlex import shlex
from pathlib import Path from pathlib import Path
from sys import platform
from time import time from time import time
from typing import Any, Optional from typing import Any, Optional
@@ -106,7 +106,7 @@ class DetailsDialog(Adw.Dialog):
# As in software # As in software
exe_name = _("program") exe_name = _("program")
if os.name == "nt": if platform == "win32":
exe_name += ".exe" exe_name += ".exe"
# Translate this string as you would translate "path to {}" # Translate this string as you would translate "path to {}"
exe_path = _("C:\\path\\to\\{}").format(exe_name) exe_path = _("C:\\path\\to\\{}").format(exe_name)
@@ -118,7 +118,7 @@ class DetailsDialog(Adw.Dialog):
exe_path = _("/path/to/{}").format(exe_name) exe_path = _("/path/to/{}").format(exe_name)
# Translate this string as you would translate "path to {}" # Translate this string as you would translate "path to {}"
file_path = _("/path/to/{}").format(file_name) file_path = _("/path/to/{}").format(file_name)
command = "xdg-open" command = "open" if platform == "darwin" else "xdg-open"
# pylint: disable=line-too-long # pylint: disable=line-too-long
exec_info_text = _( exec_info_text = _(

View File

@@ -355,7 +355,7 @@ class HeroicSource(URLExecutableSource):
name = _("Heroic") name = _("Heroic")
iterable_class = HeroicSourceIterable iterable_class = HeroicSourceIterable
url_format = "heroic://launch/{runner}/{app_name}" url_format = "heroic://launch/{runner}/{app_name}"
available_on = {"linux", "win32"} available_on = {"linux", "win32", "darwin"}
locations: HeroicLocations locations: HeroicLocations
@@ -377,6 +377,7 @@ class HeroicSource(URLExecutableSource):
/ "config" / "config"
/ "heroic", / "heroic",
shared.appdata_dir / "heroic", shared.appdata_dir / "heroic",
shared.app_support_dir / "heroic",
), ),
paths={ paths={
"config.json": LocationSubPath("config.json"), "config.json": LocationSubPath("config.json"),

View File

@@ -81,7 +81,7 @@ class ItchSource(URLExecutableSource):
name = _("itch") name = _("itch")
iterable_class = ItchSourceIterable iterable_class = ItchSourceIterable
url_format = "itch://caves/{cave_id}/launch" url_format = "itch://caves/{cave_id}/launch"
available_on = {"linux", "win32"} available_on = {"linux", "win32", "darwin"}
locations: ItchLocations locations: ItchLocations
@@ -95,6 +95,7 @@ class ItchSource(URLExecutableSource):
shared.config_dir / "itch", shared.config_dir / "itch",
shared.host_config_dir / "itch", shared.host_config_dir / "itch",
shared.appdata_dir / "itch", shared.appdata_dir / "itch",
shared.app_support_dir / "itch",
), ),
paths={ paths={
"butler.db": LocationSubPath("db/butler.db"), "butler.db": LocationSubPath("db/butler.db"),

View File

@@ -125,6 +125,8 @@ class URLExecutableSource(ExecutableFormatSource):
return "start " + self.url_format return "start " + self.url_format
case "linux": case "linux":
return "xdg-open " + self.url_format return "xdg-open " + self.url_format
case "darwin":
return "open " + self.url_format
case other: case other:
raise NotImplementedError( raise NotImplementedError(
f"No URL handler command available for {other}" f"No URL handler command available for {other}"

View File

@@ -112,7 +112,7 @@ class SteamLocations(NamedTuple):
class SteamSource(URLExecutableSource): class SteamSource(URLExecutableSource):
source_id = "steam" source_id = "steam"
name = _("Steam") name = _("Steam")
available_on = {"linux", "win32"} available_on = {"linux", "win32", "darwin"}
iterable_class = SteamSourceIterable iterable_class = SteamSourceIterable
url_format = "steam://rungameid/{game_id}" url_format = "steam://rungameid/{game_id}"
@@ -128,6 +128,7 @@ class SteamSource(URLExecutableSource):
shared.data_dir / "Steam", shared.data_dir / "Steam",
shared.flatpak_dir / "com.valvesoftware.Steam" / "data" / "Steam", shared.flatpak_dir / "com.valvesoftware.Steam" / "data" / "Steam",
shared.programfiles32_dir / "Steam", shared.programfiles32_dir / "Steam",
shared.app_support_dir / "Steam",
), ),
paths={ paths={
"libraryfolders.vdf": LocationSubPath( "libraryfolders.vdf": LocationSubPath(

View File

@@ -87,10 +87,17 @@ class CartridgesApplication(Adw.Application):
self.add_main_option_entries((search, launch)) self.add_main_option_entries((search, launch))
if sys.platform == "darwin" and (settings := Gtk.Settings.get_default()):
settings.props.gtk_decoration_layout = "close,minimize,maximize:"
def do_activate(self) -> None: # pylint: disable=arguments-differ def do_activate(self) -> None: # pylint: disable=arguments-differ
"""Called on app creation""" """Called on app creation"""
try:
setup_logging() setup_logging()
except ValueError:
pass
log_system_info() log_system_info()
# Set fallback icon-name # Set fallback icon-name
@@ -375,7 +382,7 @@ class CartridgesApplication(Adw.Application):
if action[1:2]: if action[1:2]:
self.set_accels_for_action( self.set_accels_for_action(
f"app.{action[0]}" if scope == self else f"win.{action[0]}", f"app.{action[0]}" if scope == self else f"win.{action[0]}",
action[1], tuple(s.replace("<primary>", "<meta>") for s in action[1]),
) )
scope.add_action(simple_action) scope.add_action(simple_action)

View File

@@ -1,11 +1,11 @@
moduledir = join_paths(python_dir, 'cartridges') moduledir = python_dir / 'cartridges'
configure_file( configure_file(
input: 'cartridges.in', input: 'cartridges.in',
output: 'cartridges', output: 'cartridges',
configuration: conf, configuration: conf,
install: true, install: true,
install_dir: get_option('bindir') install_dir: get_option('bindir'),
) )
install_subdir('importer', install_dir: moduledir) install_subdir('importer', install_dir: moduledir)
@@ -21,11 +21,7 @@ install_data(
'details_dialog.py', 'details_dialog.py',
'game.py', 'game.py',
'game_cover.py', 'game_cover.py',
configure_file( configure_file(input: 'shared.py.in', output: 'shared.py', configuration: conf),
input: 'shared.py.in',
output: 'shared.py',
configuration: conf
)
], ],
install_dir: moduledir install_dir: moduledir,
) )

View File

@@ -30,6 +30,7 @@ from cartridges import shared
from cartridges.errors.friendly_error import FriendlyError from cartridges.errors.friendly_error import FriendlyError
from cartridges.game import Game from cartridges.game import Game
from cartridges.importer.bottles_source import BottlesSource from cartridges.importer.bottles_source import BottlesSource
from cartridges.importer.desktop_source import DesktopSource
from cartridges.importer.flatpak_source import FlatpakSource from cartridges.importer.flatpak_source import FlatpakSource
from cartridges.importer.heroic_source import HeroicSource from cartridges.importer.heroic_source import HeroicSource
from cartridges.importer.itch_source import ItchSource from cartridges.importer.itch_source import ItchSource
@@ -169,6 +170,10 @@ class CartridgesPreferences(Adw.PreferencesDialog):
else: else:
self.init_source_row(source) self.init_source_row(source)
# Special case for the desktop source
if not DesktopSource().is_available:
self.desktop_switch.set_visible(False)
# SteamGridDB # SteamGridDB
def sgdb_key_changed(*_args: Any) -> None: def sgdb_key_changed(*_args: Any) -> None:
shared.schema.set_string("sgdb-key", self.sgdb_key_entry_row.get_text()) shared.schema.set_string("sgdb-key", self.sgdb_key_entry_row.get_text())

View File

@@ -64,6 +64,8 @@ local_appdata_dir = Path(
) )
programfiles32_dir = Path(getenv("programfiles(x86)") or r"C:\Program Files (x86)") programfiles32_dir = Path(getenv("programfiles(x86)") or r"C:\Program Files (x86)")
app_support_dir = home / "Library" / "Application Support"
try: try:
scale_factor = max( scale_factor = max(
monitor.get_scale_factor() monitor.get_scale_factor()
@@ -79,4 +81,4 @@ win = None
importer = None importer = None
import_time = None import_time = None
store = None store = None
log_files = None log_files = []

View File

@@ -18,8 +18,9 @@
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
from typing import Any, Optional from typing import Any, Optional
from sys import platform
from gi.repository import Adw, Gio, GLib, Gtk from gi.repository import Adw, Gio, GLib, Gtk, Pango
from cartridges import shared from cartridges import shared
from cartridges.game import Game from cartridges.game import Game
@@ -33,6 +34,7 @@ class CartridgesWindow(Adw.ApplicationWindow):
overlay_split_view = Gtk.Template.Child() overlay_split_view = Gtk.Template.Child()
navigation_view = Gtk.Template.Child() navigation_view = Gtk.Template.Child()
sidebar_navigation_page = Gtk.Template.Child()
sidebar = Gtk.Template.Child() sidebar = Gtk.Template.Child()
all_games_row_box = Gtk.Template.Child() all_games_row_box = Gtk.Template.Child()
all_games_no_label = Gtk.Template.Child() all_games_no_label = Gtk.Template.Child()
@@ -152,6 +154,8 @@ class CartridgesWindow(Adw.ApplicationWindow):
Gtk.Label( Gtk.Label(
label=self.get_application().get_source_name(source_id), label=self.get_application().get_source_name(source_id),
halign=Gtk.Align.START, halign=Gtk.Align.START,
wrap=True,
wrap_mode=Pango.WrapMode.CHAR,
) )
) )
@@ -213,6 +217,9 @@ class CartridgesWindow(Adw.ApplicationWindow):
def __init__(self, **kwargs: Any) -> None: def __init__(self, **kwargs: Any) -> None:
super().__init__(**kwargs) super().__init__(**kwargs)
if platform == "darwin":
self.sidebar_navigation_page.set_title("")
self.details_view.set_measure_overlay(self.details_view_toolbar_view, True) self.details_view.set_measure_overlay(self.details_view_toolbar_view, True)
self.details_view.set_clip_overlay(self.details_view_toolbar_view, False) self.details_view.set_clip_overlay(self.details_view_toolbar_view, False)

View File

@@ -79,7 +79,7 @@ template $CartridgesWindow: Adw.ApplicationWindow {
sidebar-width-fraction: .2; sidebar-width-fraction: .2;
[sidebar] [sidebar]
Adw.NavigationPage { Adw.NavigationPage sidebar_navigation_page {
title: _("Cartridges"); title: _("Cartridges");
Adw.ToolbarView { Adw.ToolbarView {
@@ -94,6 +94,8 @@ template $CartridgesWindow: Adw.ApplicationWindow {
} }
ScrolledWindow { ScrolledWindow {
hscrollbar-policy: never;
ListBox sidebar { ListBox sidebar {
Box all_games_row_box { Box all_games_row_box {
margin-top: 12; margin-top: 12;
@@ -109,6 +111,8 @@ template $CartridgesWindow: Adw.ApplicationWindow {
Label { Label {
halign: start; halign: start;
label: _("All Games"); label: _("All Games");
wrap: true;
wrap-mode: char;
} }
Label all_games_no_label { Label all_games_no_label {
@@ -135,6 +139,8 @@ template $CartridgesWindow: Adw.ApplicationWindow {
halign: start; halign: start;
label: _("Added"); label: _("Added");
margin-end: 6; margin-end: 6;
wrap: true;
wrap-mode: char;
} }
Label added_games_no_label { Label added_games_no_label {
@@ -175,15 +181,11 @@ template $CartridgesWindow: Adw.ApplicationWindow {
[top] [top]
Adw.HeaderBar header_bar { Adw.HeaderBar header_bar {
[start] [start]
Revealer {
transition-type: slide_right;
reveal-child: bind overlay_split_view.show-sidebar inverted;
Button show_sidebar_button { Button show_sidebar_button {
icon-name: "sidebar-show-symbolic"; icon-name: "sidebar-show-symbolic";
action-name: "win.show_sidebar"; action-name: "win.show_sidebar";
tooltip-text: _("Toggle Sidebar"); tooltip-text: _("Toggle Sidebar");
} visible: bind overlay_split_view.show-sidebar inverted;
} }
[start] [start]

View File

@@ -1,11 +1,11 @@
scalable_dir = join_paths('hicolor', 'scalable', 'apps') scalable_dir = join_paths('hicolor', 'scalable', 'apps')
install_data( install_data(
join_paths(scalable_dir, ('@0@.svg').format(app_id)), join_paths(scalable_dir, ('@0@.svg').format(app_id)),
install_dir: join_paths(get_option('datadir'), 'icons', scalable_dir) install_dir: join_paths(get_option('datadir'), 'icons', scalable_dir),
) )
symbolic_dir = join_paths('hicolor', 'symbolic', 'apps') symbolic_dir = join_paths('hicolor', 'symbolic', 'apps')
install_data( install_data(
join_paths(symbolic_dir, ('@0@-symbolic.svg').format(app_id)), join_paths(symbolic_dir, ('@0@-symbolic.svg').format(app_id)),
install_dir: join_paths(get_option('datadir'), 'icons', symbolic_dir) install_dir: join_paths(get_option('datadir'), 'icons', symbolic_dir),
) )

View File

@@ -1,20 +1,28 @@
blueprints = custom_target('blueprints', blueprints = custom_target(
'blueprints',
input: files( input: files(
'gtk/help-overlay.blp', 'gtk/details-dialog.blp',
'gtk/window.blp',
'gtk/game.blp', 'gtk/game.blp',
'gtk/help-overlay.blp',
'gtk/preferences.blp', 'gtk/preferences.blp',
'gtk/details-dialog.blp' 'gtk/window.blp',
), ),
output: '.', output: '.',
command: [find_program('blueprint-compiler'), 'batch-compile', '@OUTPUT@', '@CURRENT_SOURCE_DIR@', '@INPUT@'], command: [
find_program('blueprint-compiler'),
'batch-compile',
'@OUTPUT@',
'@CURRENT_SOURCE_DIR@',
'@INPUT@',
],
) )
gnome.compile_resources('cartridges', gnome.compile_resources(
'cartridges',
configure_file( configure_file(
input: 'cartridges.gresource.xml.in', input: 'cartridges.gresource.xml.in',
output: 'cartridges.gresource.xml', output: 'cartridges.gresource.xml',
configuration: conf configuration: conf,
), ),
gresource_bundle: true, gresource_bundle: true,
install: true, install: true,
@@ -22,27 +30,26 @@ gnome.compile_resources('cartridges',
dependencies: blueprints, dependencies: blueprints,
) )
if host_machine.system() == 'windows' if host_machine.system() == 'windows'
desktop_file = configure_file( desktop_file = configure_file(
input: 'page.kramo.Cartridges.desktop.in', input: 'page.kramo.Cartridges.desktop.in',
output: app_id + '.desktop.in', output: app_id + '.desktop.in',
configuration: conf, configuration: conf,
install: true, install: true,
install_dir: join_paths(get_option('datadir'), 'applications') install_dir: join_paths(get_option('datadir'), 'applications'),
) )
else else
desktop_file = i18n.merge_file( desktop_file = i18n.merge_file(
input: configure_file( input: configure_file(
input: 'page.kramo.Cartridges.desktop.in', input: 'page.kramo.Cartridges.desktop.in',
output: app_id + '.desktop.in', output: app_id + '.desktop.in',
configuration: conf configuration: conf,
), ),
output: app_id + '.desktop', output: app_id + '.desktop',
type: 'desktop', type: 'desktop',
po_dir: '../po', po_dir: '../po',
install: true, install: true,
install_dir: join_paths(get_option('datadir'), 'applications') install_dir: join_paths(get_option('datadir'), 'applications'),
) )
endif endif
@@ -59,29 +66,30 @@ if host_machine.system() == 'windows'
output: app_id + '.metainfo.xml', output: app_id + '.metainfo.xml',
configuration: conf, configuration: conf,
install: true, install: true,
install_dir: join_paths(get_option('datadir'), 'metainfo') install_dir: join_paths(get_option('datadir'), 'metainfo'),
) )
else else
appstream_file = i18n.merge_file( appstream_file = i18n.merge_file(
input: configure_file( input: configure_file(
input: 'page.kramo.Cartridges.metainfo.xml.in', input: 'page.kramo.Cartridges.metainfo.xml.in',
output: app_id + '.metainfo.xml.in', output: app_id + '.metainfo.xml.in',
configuration: conf configuration: conf,
), ),
output: app_id + '.metainfo.xml', output: app_id + '.metainfo.xml',
po_dir: '../po', po_dir: '../po',
install: true, install: true,
install_dir: join_paths(get_option('datadir'), 'metainfo') install_dir: join_paths(get_option('datadir'), 'metainfo'),
) )
endif endif
if host_machine.system() != 'windows' if host_machine.system() != 'windows'
appstreamcli = find_program('appstreamcli', required: false) appstreamcli = find_program('appstreamcli', required: false)
if appstreamcli.found() if appstreamcli.found()
test('Validate appstream file', test(
'Validate appstream file',
appstreamcli, appstreamcli,
args: ['validate', '--no-net', '--explain', appstream_file], args: ['validate', '--no-net', '--explain', appstream_file],
workdir: meson.current_build_dir() workdir: meson.current_build_dir(),
) )
endif endif
endif endif
@@ -90,16 +98,18 @@ install_data(
configure_file( configure_file(
input: 'page.kramo.Cartridges.gschema.xml.in', input: 'page.kramo.Cartridges.gschema.xml.in',
output: app_id + '.gschema.xml', output: app_id + '.gschema.xml',
configuration: conf configuration: conf,
), ),
install_dir: join_paths(get_option('datadir'), 'glib-2.0/schemas') install_dir: join_paths(get_option('datadir'), 'glib-2.0/schemas'),
) )
compile_schemas = find_program('glib-compile-schemas', required: false) compile_schemas = find_program('glib-compile-schemas', required: false)
if compile_schemas.found() if compile_schemas.found()
test('Validate schema file', test(
'Validate schema file',
compile_schemas, compile_schemas,
args: ['--strict', '--dry-run', meson.current_source_dir()]) args: ['--strict', '--dry-run', meson.current_source_dir()],
)
endif endif
subdir('icons') subdir('icons')

View File

@@ -54,6 +54,14 @@
</screenshots> </screenshots>
<content_rating type="oars-1.1" /> <content_rating type="oars-1.1" />
<releases> <releases>
<release version="2.9" date="2024-07-10">
<description translate="no">
<ul>
<li>Cartridges is now available on macOS! You can download it from GitHub.</li>
<li>Updated translations</li>
</ul>
</description>
</release>
<release version="2.8.5" date="2024-05-25"> <release version="2.8.5" date="2024-05-25">
<description translate="no"> <description translate="no">
<ul> <ul>

View File

@@ -35,7 +35,7 @@ Stored as a Unix time stamp.
The executable to run when launching a game. The executable to run when launching a game.
If the source has a URL handler, using that is preferred. In that case, the value should be `"xdg-open url://example/url"` for Linux and `"start url://example/url"` for Windows. If the source has a URL handler, using that is preferred. In that case, the value should be `"xdg-open url://example/url"` for Linux, `"start url://example/url"` for Windows and `"open url://example/url"` for macOS.
Stored as either a string (preferred) or an argument vector to be passed to the shell through [subprocess.Popen](https://docs.python.org/3/library/subprocess.html#popen-constructor). Stored as either a string (preferred) or an argument vector to be passed to the shell through [subprocess.Popen](https://docs.python.org/3/library/subprocess.html#popen-constructor).

View File

@@ -1,7 +1,11 @@
project('cartridges', project(
version: '2.8.5', 'cartridges',
version: '2.9',
meson_version: '>= 0.59.0', meson_version: '>= 0.59.0',
default_options: [ 'warning_level=2', 'werror=false', ], default_options: [
'warning_level=2',
'werror=false',
],
) )
# Translations are broken on Windows for multiple reasons # Translations are broken on Windows for multiple reasons
@@ -44,7 +48,7 @@ subdir('data')
subdir('cartridges') subdir('cartridges')
if host_machine.system() == 'windows' if host_machine.system() == 'windows'
subdir('windows') subdir('build-aux/windows')
else else
subdir('search-provider') subdir('search-provider')
subdir('po') subdir('po')

View File

@@ -1,13 +1,13 @@
# SOME DESCRIPTIVE TITLE. # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR kramo # Copyright (C) YEAR kramo
# This file is distributed under the same license as the Cartridges package. # This file is distributed under the same license as the Cartridges package.
# foo expert <deferred_water346@simplelogin.com>, 2023. # foo expert <deferred_water346@simplelogin.com>, 2023, 2024.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Cartridges\n" "Project-Id-Version: Cartridges\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-04-14 12:48+0200\n" "POT-Creation-Date: 2024-04-14 12:48+0200\n"
"PO-Revision-Date: 2023-09-24 16:04+0000\n" "PO-Revision-Date: 2024-06-28 07:09+0000\n"
"Last-Translator: foo expert <deferred_water346@simplelogin.com>\n" "Last-Translator: foo expert <deferred_water346@simplelogin.com>\n"
"Language-Team: Czech <https://hosted.weblate.org/projects/cartridges/" "Language-Team: Czech <https://hosted.weblate.org/projects/cartridges/"
"cartridges/cs/>\n" "cartridges/cs/>\n"
@@ -15,8 +15,8 @@ msgstr ""
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n"
"X-Generator: Weblate 5.1-dev\n" "X-Generator: Weblate 5.7-dev\n"
#: data/page.kramo.Cartridges.desktop.in:3 #: data/page.kramo.Cartridges.desktop.in:3
#: data/page.kramo.Cartridges.metainfo.xml.in:9 #: data/page.kramo.Cartridges.metainfo.xml.in:9
@@ -276,15 +276,13 @@ msgstr "Flatpak"
#. The location of the system-wide data directory #. The location of the system-wide data directory
#: data/gtk/preferences.blp:351 #: data/gtk/preferences.blp:351
#, fuzzy
msgid "System Location" msgid "System Location"
msgstr "Nastavit umístění" msgstr "Systémové umístění"
#. The location of the user-specific data directory #. The location of the user-specific data directory
#: data/gtk/preferences.blp:369 #: data/gtk/preferences.blp:369
#, fuzzy
msgid "User Location" msgid "User Location"
msgstr "Nastavit umístění" msgstr "Uživatelské umístění"
#: data/gtk/preferences.blp:386 #: data/gtk/preferences.blp:386
msgid "Import Game Launchers" msgid "Import Game Launchers"
@@ -323,17 +321,16 @@ msgid "Prefer Animated Images"
msgstr "Upřednostnit animované obrázky" msgstr "Upřednostnit animované obrázky"
#: data/gtk/preferences.blp:433 #: data/gtk/preferences.blp:433
#, fuzzy
msgid "Update Covers" msgid "Update Covers"
msgstr "Odstranit obal" msgstr "Aktualizovat obálky"
#: data/gtk/preferences.blp:434 #: data/gtk/preferences.blp:434
msgid "Fetch covers for games already in your library" msgid "Fetch covers for games already in your library"
msgstr "" msgstr "Najít obálky pro hry ve vaší knihovně"
#: data/gtk/preferences.blp:439 #: data/gtk/preferences.blp:439
msgid "Update" msgid "Update"
msgstr "" msgstr "Aktualizovat"
#: data/gtk/window.blp:6 data/gtk/window.blp:14 #: data/gtk/window.blp:6 data/gtk/window.blp:14
msgid "No Games Found" msgid "No Games Found"
@@ -417,15 +414,15 @@ msgstr "O Kazetách"
#: data/gtk/window.blp:561 #: data/gtk/window.blp:561
msgid "IGDB" msgid "IGDB"
msgstr "" msgstr "IGDB"
#: data/gtk/window.blp:563 #: data/gtk/window.blp:563
msgid "ProtonDB" msgid "ProtonDB"
msgstr "" msgstr "ProtonDB"
#: data/gtk/window.blp:565 #: data/gtk/window.blp:565
msgid "HowLongToBeat" msgid "HowLongToBeat"
msgstr "" msgstr "HowLongToBeat"
#. The variable is the title of the game #. The variable is the title of the game
#: cartridges/main.py:205 cartridges/game.py:125 #: cartridges/main.py:205 cartridges/game.py:125
@@ -553,11 +550,11 @@ msgstr ""
#: cartridges/preferences.py:196 #: cartridges/preferences.py:196
msgid "Downloading covers…" msgid "Downloading covers…"
msgstr "" msgstr "Stahování obálek…"
#: cartridges/preferences.py:215 #: cartridges/preferences.py:215
msgid "Covers updated" msgid "Covers updated"
msgstr "" msgstr "Obálky aktualizovány"
#: cartridges/preferences.py:360 #: cartridges/preferences.py:360
msgid "Installation Not Found" msgid "Installation Not Found"

View File

@@ -7,19 +7,19 @@ configure_file(
input: 'cartridges-search-provider.in', input: 'cartridges-search-provider.in',
output: 'cartridges-search-provider', output: 'cartridges-search-provider',
configuration: conf, configuration: conf,
install_dir: libexecdir install_dir: libexecdir,
) )
configure_file( configure_file(
input: 'page.kramo.Cartridges.SearchProvider.service.in', input: 'page.kramo.Cartridges.SearchProvider.service.in',
output: app_id + '.SearchProvider.service', output: app_id + '.SearchProvider.service',
configuration: conf, configuration: conf,
install_dir: service_dir install_dir: service_dir,
) )
configure_file( configure_file(
input: 'page.kramo.Cartridges.SearchProvider.ini', input: 'page.kramo.Cartridges.SearchProvider.ini',
output: app_id + '.SearchProvider.ini', output: app_id + '.SearchProvider.ini',
configuration: conf, configuration: conf,
install_dir: serarch_provider_dir install_dir: serarch_provider_dir,
) )