Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
35acb56a62 | ||
|
|
adacdefdb9 | ||
|
|
7367e40cb3 | ||
|
|
7efa17915f | ||
|
|
bdcded93f3 | ||
|
|
b3a65c3d23 | ||
|
|
06730248a9 | ||
|
|
b46faa951f | ||
|
|
43a04e7d44 | ||
|
|
d74c8aba1a |
4
.github/workflows/ci.yml
vendored
4
.github/workflows/ci.yml
vendored
@@ -73,11 +73,11 @@ jobs:
|
||||
- name: Install Dependencies
|
||||
run: |
|
||||
brew install meson pygobject3 libadwaita adwaita-icon-theme desktop-file-utils pyinstaller pillow
|
||||
pip3 install --break-system-packages requests PyYAML
|
||||
pip3 install --break-system-packages requests PyYAML pyobjc
|
||||
|
||||
- name: Meson Build
|
||||
run: |
|
||||
meson setup _build
|
||||
meson setup _build -Dtiff_compression=jpeg
|
||||
ninja install -C _build
|
||||
|
||||
- name: PyInstaller
|
||||
|
||||
121
cartridges/application_delegate.py
Normal file
121
cartridges/application_delegate.py
Normal file
@@ -0,0 +1,121 @@
|
||||
# application_delegate.py
|
||||
#
|
||||
# Copyright 2024 kramo
|
||||
#
|
||||
# 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
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
"""A set of methods that manage your app’s life cycle and its interaction
|
||||
with common system services."""
|
||||
|
||||
from typing import Any
|
||||
|
||||
from AppKit import NSApp, NSApplication, NSMenu, NSMenuItem # type: ignore
|
||||
from Foundation import NSObject # type: ignore
|
||||
from gi.repository import Gio # type: ignore
|
||||
|
||||
from cartridges import shared
|
||||
|
||||
|
||||
class ApplicationDelegate(NSObject): # type: ignore
|
||||
"""A set of methods that manage your app’s life cycle and its interaction
|
||||
with common system services."""
|
||||
|
||||
def applicationDidFinishLaunching_(self, *_args: Any) -> None:
|
||||
main_menu = NSApp.mainMenu()
|
||||
|
||||
add_game_menu_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(
|
||||
"Add Game", "add:", "n"
|
||||
)
|
||||
|
||||
import_menu_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(
|
||||
"Import", "import:", "i"
|
||||
)
|
||||
|
||||
file_menu = NSMenu.alloc().init()
|
||||
file_menu.addItem_(add_game_menu_item)
|
||||
file_menu.addItem_(import_menu_item)
|
||||
|
||||
file_menu_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(
|
||||
"File", None, ""
|
||||
)
|
||||
file_menu_item.setSubmenu_(file_menu)
|
||||
main_menu.addItem_(file_menu_item)
|
||||
|
||||
show_hidden_menu_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(
|
||||
"Show Hidden", "hidden:", "h"
|
||||
)
|
||||
|
||||
windows_menu = NSMenu.alloc().init()
|
||||
|
||||
view_menu = NSMenu.alloc().init()
|
||||
view_menu.addItem_(show_hidden_menu_item)
|
||||
|
||||
view_menu_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(
|
||||
"View", None, ""
|
||||
)
|
||||
view_menu_item.setSubmenu_(view_menu)
|
||||
main_menu.addItem_(view_menu_item)
|
||||
|
||||
windows_menu = NSMenu.alloc().init()
|
||||
|
||||
windows_menu_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(
|
||||
"Window", None, ""
|
||||
)
|
||||
windows_menu_item.setSubmenu_(windows_menu)
|
||||
main_menu.addItem_(windows_menu_item)
|
||||
|
||||
NSApp.setWindowsMenu_(windows_menu)
|
||||
|
||||
keyboard_shortcuts_menu_item = (
|
||||
NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(
|
||||
"Keyboard Shortcuts", "shortcuts:", "?"
|
||||
)
|
||||
)
|
||||
|
||||
help_menu = NSMenu.alloc().init()
|
||||
help_menu.addItem_(keyboard_shortcuts_menu_item)
|
||||
|
||||
help_menu_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(
|
||||
"Help", None, ""
|
||||
)
|
||||
help_menu_item.setSubmenu_(help_menu)
|
||||
main_menu.addItem_(help_menu_item)
|
||||
|
||||
NSApp.setHelpMenu_(help_menu)
|
||||
|
||||
def add_(self, *_args: Any) -> None:
|
||||
if (not shared.win) or (not (app := shared.win.get_application())):
|
||||
return
|
||||
|
||||
app.lookup_action("add_game").activate()
|
||||
|
||||
def import_(self, *_args: Any) -> None:
|
||||
if (not shared.win) or (not (app := shared.win.get_application())):
|
||||
return
|
||||
|
||||
app.lookup_action("import").activate()
|
||||
|
||||
def hidden_(self, *_args: Any) -> None:
|
||||
if not shared.win:
|
||||
return
|
||||
|
||||
shared.win.lookup_action("show_hidden").activate()
|
||||
|
||||
def shortcuts_(self, *_args: Any) -> None:
|
||||
if (not shared.win) or (not (overlay := shared.win.get_help_overlay())):
|
||||
return
|
||||
|
||||
overlay.present()
|
||||
@@ -59,8 +59,15 @@ class DetailsDialog(Adw.Dialog):
|
||||
|
||||
cover_changed: bool = False
|
||||
|
||||
is_open = False
|
||||
|
||||
def __init__(self, game: Optional[Game] = None, **kwargs: Any):
|
||||
super().__init__(**kwargs)
|
||||
|
||||
# Make it so only one dialog can be open at a time
|
||||
self.__class__.is_open = True
|
||||
self.connect("closed", lambda *_: self.set_is_open(False))
|
||||
|
||||
self.game: Game = game
|
||||
self.game_cover: GameCover = GameCover({self.cover})
|
||||
|
||||
@@ -325,3 +332,6 @@ class DetailsDialog(Adw.Dialog):
|
||||
|
||||
def choose_cover(self, *_args: Any) -> None:
|
||||
self.image_file_dialog.open(self.get_root(), None, self.set_cover)
|
||||
|
||||
def set_is_open(self, is_open: bool) -> None:
|
||||
self.__class__.is_open = is_open
|
||||
|
||||
@@ -24,6 +24,7 @@ import shlex
|
||||
import sys
|
||||
from time import time
|
||||
from typing import Any, Optional
|
||||
from urllib.parse import quote
|
||||
|
||||
import gi
|
||||
|
||||
@@ -57,6 +58,12 @@ from cartridges.store.store import Store
|
||||
from cartridges.utils.run_executable import run_executable
|
||||
from cartridges.window import CartridgesWindow
|
||||
|
||||
if sys.platform == "darwin":
|
||||
from AppKit import NSApp # type: ignore
|
||||
from PyObjCTools import AppHelper
|
||||
|
||||
from cartridges.application_delegate import ApplicationDelegate
|
||||
|
||||
|
||||
class CartridgesApplication(Adw.Application):
|
||||
state = shared.AppState.DEFAULT
|
||||
@@ -87,9 +94,16 @@ class CartridgesApplication(Adw.Application):
|
||||
|
||||
self.add_main_option_entries((search, launch))
|
||||
|
||||
if sys.platform == "darwin" and (settings := Gtk.Settings.get_default()):
|
||||
if sys.platform == "darwin":
|
||||
if settings := Gtk.Settings.get_default():
|
||||
settings.props.gtk_decoration_layout = "close,minimize,maximize:"
|
||||
|
||||
def setup_app_delegate() -> None:
|
||||
NSApp.setDelegate_(ApplicationDelegate.alloc().init()) # type: ignore
|
||||
AppHelper.runEventLoop() # type: ignore
|
||||
|
||||
GLib.Thread.new(None, setup_app_delegate)
|
||||
|
||||
def do_activate(self) -> None: # pylint: disable=arguments-differ
|
||||
"""Called on app creation"""
|
||||
|
||||
@@ -287,7 +301,7 @@ class CartridgesApplication(Adw.Application):
|
||||
_parameter: Any = None,
|
||||
page_name: Optional[str] = None,
|
||||
expander_row: Optional[str] = None,
|
||||
) -> CartridgesWindow:
|
||||
) -> Optional[CartridgesPreferences]:
|
||||
if CartridgesPreferences.is_open:
|
||||
return
|
||||
|
||||
@@ -310,6 +324,9 @@ class CartridgesApplication(Adw.Application):
|
||||
DetailsDialog(shared.win.active_game).present(shared.win)
|
||||
|
||||
def on_add_game_action(self, *_args: Any) -> None:
|
||||
if DetailsDialog.is_open:
|
||||
return
|
||||
|
||||
DetailsDialog().present(shared.win)
|
||||
|
||||
def on_import_action(self, *_args: Any) -> None:
|
||||
@@ -352,7 +369,7 @@ class CartridgesApplication(Adw.Application):
|
||||
self.on_remove_game_action()
|
||||
|
||||
def search(self, uri: str) -> None:
|
||||
Gio.AppInfo.launch_default_for_uri(f"{uri}{shared.win.active_game.name}")
|
||||
Gio.AppInfo.launch_default_for_uri(f"{uri}{quote(shared.win.active_game.name)}")
|
||||
|
||||
def on_igdb_search_action(self, *_args: Any) -> None:
|
||||
self.search("https://www.igdb.com/search?type=1&q=")
|
||||
@@ -382,7 +399,11 @@ class CartridgesApplication(Adw.Application):
|
||||
if action[1:2]:
|
||||
self.set_accels_for_action(
|
||||
f"app.{action[0]}" if scope == self else f"win.{action[0]}",
|
||||
tuple(s.replace("<primary>", "<meta>") for s in action[1]),
|
||||
(
|
||||
tuple(s.replace("<primary>", "<meta>") for s in action[1])
|
||||
if sys.platform == "darwin"
|
||||
else action[1]
|
||||
),
|
||||
)
|
||||
|
||||
scope.add_action(simple_action)
|
||||
|
||||
@@ -15,6 +15,7 @@ install_subdir('logging', install_dir: moduledir)
|
||||
install_subdir('errors', install_dir: moduledir)
|
||||
install_data(
|
||||
[
|
||||
'application_delegate.py',
|
||||
'main.py',
|
||||
'window.py',
|
||||
'preferences.py',
|
||||
|
||||
@@ -450,6 +450,9 @@ class CartridgesWindow(Adw.ApplicationWindow):
|
||||
self.navigation_view.pop_to_page(self.library_page)
|
||||
|
||||
def on_show_hidden_action(self, *_args: Any) -> None:
|
||||
if self.navigation_view.get_visible_page() == self.hidden_library_page:
|
||||
return
|
||||
|
||||
self.navigation_view.push(self.hidden_library_page)
|
||||
|
||||
def on_sort_action(self, action: Gio.SimpleAction, state: GLib.Variant) -> None:
|
||||
|
||||
@@ -54,6 +54,13 @@
|
||||
</screenshots>
|
||||
<content_rating type="oars-1.1" />
|
||||
<releases>
|
||||
<release version="2.9.3" date="2024-07-18">
|
||||
<description translate="no">
|
||||
<ul>
|
||||
<li>Fixed incorrect modifiers being used for keyboard shortcuts</li>
|
||||
</ul>
|
||||
</description>
|
||||
</release>
|
||||
<release version="2.9" date="2024-07-10">
|
||||
<description translate="no">
|
||||
<ul>
|
||||
@@ -62,13 +69,6 @@
|
||||
</ul>
|
||||
</description>
|
||||
</release>
|
||||
<release version="2.8.5" date="2024-05-25">
|
||||
<description translate="no">
|
||||
<ul>
|
||||
<li>Steam runtimes and Proton should stop being imported again</li>
|
||||
</ul>
|
||||
</description>
|
||||
</release>
|
||||
<release version="2.8" date="2024-03-20">
|
||||
<description translate="no">
|
||||
<ul>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
project(
|
||||
'cartridges',
|
||||
version: '2.9',
|
||||
version: '2.9.3',
|
||||
meson_version: '>= 0.59.0',
|
||||
default_options: [
|
||||
'warning_level=2',
|
||||
|
||||
54
po/fa.po
54
po/fa.po
@@ -3,13 +3,14 @@
|
||||
# This file is distributed under the same license as the Cartridges package.
|
||||
# سید حسین موسوی فرد <shmf1385@protonmail.com>, 2023.
|
||||
# Danial Behzadi <dani.behzi@ubuntu.com>, 2023.
|
||||
# آوید <avds+git@disroot.org>, 2024.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Cartridges\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2024-04-14 12:48+0200\n"
|
||||
"PO-Revision-Date: 2023-09-24 16:04+0000\n"
|
||||
"Last-Translator: Danial Behzadi <dani.behzi@ubuntu.com>\n"
|
||||
"PO-Revision-Date: 2024-07-14 20:09+0000\n"
|
||||
"Last-Translator: آوید <avds+git@disroot.org>\n"
|
||||
"Language-Team: Persian <https://hosted.weblate.org/projects/cartridges/"
|
||||
"cartridges/fa/>\n"
|
||||
"Language: fa\n"
|
||||
@@ -17,7 +18,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n > 1;\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.metainfo.xml.in:9
|
||||
@@ -74,7 +75,7 @@ msgstr "لغو"
|
||||
|
||||
#: data/gtk/details-dialog.blp:46
|
||||
msgid "New Cover"
|
||||
msgstr "طرج جلد جدید"
|
||||
msgstr "طرح جلد جدید"
|
||||
|
||||
#: data/gtk/details-dialog.blp:65
|
||||
msgid "Delete Cover"
|
||||
@@ -98,7 +99,7 @@ msgstr "گزینش پرونده"
|
||||
|
||||
#: data/gtk/details-dialog.blp:120
|
||||
msgid "More Info"
|
||||
msgstr "اطّلاعات بیشتر"
|
||||
msgstr "اطلاعات بیشتر"
|
||||
|
||||
#: data/gtk/game.blp:102 data/gtk/game.blp:110 data/gtk/window.blp:443
|
||||
msgid "Edit"
|
||||
@@ -127,7 +128,7 @@ msgstr "جستوجو"
|
||||
|
||||
#: data/gtk/help-overlay.blp:24 data/gtk/window.blp:543
|
||||
msgid "Keyboard Shortcuts"
|
||||
msgstr "میانبرهیا صفحهکلید"
|
||||
msgstr "میانبرهای صفحهکلید"
|
||||
|
||||
#: data/gtk/help-overlay.blp:29 cartridges/game.py:103
|
||||
#: cartridges/preferences.py:134 cartridges/importer/importer.py:394
|
||||
@@ -182,7 +183,7 @@ msgstr "طرح جلد بازی را اجرا میکند"
|
||||
|
||||
#: data/gtk/preferences.blp:21
|
||||
msgid "Swaps the behavior of the cover image and the play button"
|
||||
msgstr "تعویض رفتار تصویر جلد و دکمهٔ بازی کردن"
|
||||
msgstr "تغییر رفتار تصویر جلد و دکمهٔ بازی کردن"
|
||||
|
||||
#: data/gtk/preferences.blp:26 cartridges/details_dialog.py:82
|
||||
msgid "Images"
|
||||
@@ -194,7 +195,7 @@ msgstr "عکسهای با کیفیت بالا"
|
||||
|
||||
#: data/gtk/preferences.blp:30
|
||||
msgid "Save game covers losslessly at the cost of storage"
|
||||
msgstr "ذخیرهٔ طرح جلدهای بدون اتلاف به فیمت ذخیرهسازی"
|
||||
msgstr "ذخیرهٔ طرح جلدهای بدون اتلاف به قیمت ذخیرهسازی"
|
||||
|
||||
#: data/gtk/preferences.blp:35
|
||||
msgid "Danger Zone"
|
||||
@@ -206,7 +207,7 @@ msgstr "حذف کردن همهٔ بازیها"
|
||||
|
||||
#: data/gtk/preferences.blp:120
|
||||
msgid "Remove Uninstalled Games"
|
||||
msgstr "برداشن بازیهای نصب نشده"
|
||||
msgstr "برداشتن بازیهای نصبنشده"
|
||||
|
||||
#: data/gtk/preferences.blp:125
|
||||
msgid "Sources"
|
||||
@@ -254,7 +255,7 @@ msgstr "درونریزی بازیهای آمازون"
|
||||
|
||||
#: data/gtk/preferences.blp:228
|
||||
msgid "Import Sideloaded Games"
|
||||
msgstr "درونریزی بازیهای نصب شده"
|
||||
msgstr "درونریزی بازیهای نصبشده"
|
||||
|
||||
#: data/gtk/preferences.blp:233 cartridges/importer/bottles_source.py:86
|
||||
msgid "Bottles"
|
||||
@@ -278,15 +279,13 @@ msgstr "فلتپک"
|
||||
|
||||
#. The location of the system-wide data directory
|
||||
#: data/gtk/preferences.blp:351
|
||||
#, fuzzy
|
||||
msgid "System Location"
|
||||
msgstr "تنظیم مکان"
|
||||
msgstr "مکان سامانه"
|
||||
|
||||
#. The location of the user-specific data directory
|
||||
#: data/gtk/preferences.blp:369
|
||||
#, fuzzy
|
||||
msgid "User Location"
|
||||
msgstr "تنظیم مکان"
|
||||
msgstr "مکان کاربر"
|
||||
|
||||
#: data/gtk/preferences.blp:386
|
||||
msgid "Import Game Launchers"
|
||||
@@ -322,20 +321,19 @@ msgstr "ترجیح به تصویرهای رسمی"
|
||||
|
||||
#: data/gtk/preferences.blp:427
|
||||
msgid "Prefer Animated Images"
|
||||
msgstr "ترچیح تصویرهای پویا"
|
||||
msgstr "ترجیح تصویرهای پویا"
|
||||
|
||||
#: data/gtk/preferences.blp:433
|
||||
#, fuzzy
|
||||
msgid "Update Covers"
|
||||
msgstr "حذف طرح جلد"
|
||||
msgstr "بهروزرسانی طرح جلد"
|
||||
|
||||
#: data/gtk/preferences.blp:434
|
||||
msgid "Fetch covers for games already in your library"
|
||||
msgstr ""
|
||||
msgstr "دریافت طرح جلد بازیهای کنونی کتابخانهتان"
|
||||
|
||||
#: data/gtk/preferences.blp:439
|
||||
msgid "Update"
|
||||
msgstr ""
|
||||
msgstr "بهروزرسانی"
|
||||
|
||||
#: data/gtk/window.blp:6 data/gtk/window.blp:14
|
||||
msgid "No Games Found"
|
||||
@@ -359,7 +357,7 @@ msgstr "بدون بازی نهفته"
|
||||
|
||||
#: data/gtk/window.blp:41
|
||||
msgid "Games you hide will appear here"
|
||||
msgstr "بازیهایی که پنهان میکنید، اینجا ظاهر خواهند شد"
|
||||
msgstr "بازیهایی که پنهان میکنید، اینجا نمایان خواهند شد"
|
||||
|
||||
#: data/gtk/window.blp:76 data/gtk/window.blp:111 cartridges/main.py:228
|
||||
msgid "All Games"
|
||||
@@ -407,7 +405,7 @@ msgstr "قدیمیترین"
|
||||
|
||||
#: data/gtk/window.blp:528
|
||||
msgid "Last Played"
|
||||
msgstr "آخرین بازی شده"
|
||||
msgstr "آخرین بازیشده"
|
||||
|
||||
#: data/gtk/window.blp:535
|
||||
msgid "Show Hidden"
|
||||
@@ -419,15 +417,15 @@ msgstr "دربارهٔ کارتریجها"
|
||||
|
||||
#: data/gtk/window.blp:561
|
||||
msgid "IGDB"
|
||||
msgstr ""
|
||||
msgstr "IGDB"
|
||||
|
||||
#: data/gtk/window.blp:563
|
||||
msgid "ProtonDB"
|
||||
msgstr ""
|
||||
msgstr "ProtonDB"
|
||||
|
||||
#: data/gtk/window.blp:565
|
||||
msgid "HowLongToBeat"
|
||||
msgstr ""
|
||||
msgstr "HowLongToBeat"
|
||||
|
||||
#. The variable is the title of the game
|
||||
#: cartridges/main.py:205 cartridges/game.py:125
|
||||
@@ -451,7 +449,7 @@ msgstr "هرگز"
|
||||
#. The variable is the date when the game was last played
|
||||
#: cartridges/window.py:380
|
||||
msgid "Last played: {}"
|
||||
msgstr "آخرین بازی شده: {}"
|
||||
msgstr "آخرین بازیشده: {}"
|
||||
|
||||
#: cartridges/details_dialog.py:73
|
||||
msgid "Apply"
|
||||
@@ -555,11 +553,11 @@ msgstr ""
|
||||
|
||||
#: cartridges/preferences.py:196
|
||||
msgid "Downloading covers…"
|
||||
msgstr ""
|
||||
msgstr "در حال دریافت طرحهای جلد…"
|
||||
|
||||
#: cartridges/preferences.py:215
|
||||
msgid "Covers updated"
|
||||
msgstr ""
|
||||
msgstr "طرحهای جلد بهروزرسانی شد"
|
||||
|
||||
#: cartridges/preferences.py:360
|
||||
msgid "Installation Not Found"
|
||||
@@ -599,7 +597,7 @@ msgstr "هیچ بازی جدیدی پیدا نشد"
|
||||
|
||||
#: cartridges/importer/importer.py:379
|
||||
msgid "1 game imported"
|
||||
msgstr "۱ بازی درونریخته شد"
|
||||
msgstr "یک بازی درونریخته شد"
|
||||
|
||||
#. The variable is the number of games
|
||||
#: cartridges/importer/importer.py:383
|
||||
|
||||
Reference in New Issue
Block a user