Compare commits

..

12 Commits

Author SHA1 Message Date
kramo
3d2c26937d Gtk.FileDialog syntax 2023-01-29 14:46:57 +01:00
kramo
6d72292c2d Update icon 2023-01-29 14:35:44 +01:00
kramo
99e6cbf169 Support for Heroic import 2023-01-29 14:27:27 +01:00
kramo
4759357764 Remove arbitrary full session bus access 2023-01-29 10:49:24 +01:00
kra-mo
731ed439d5 Update GTK code style 2023-01-14 23:47:27 +01:00
kramo
e3181adfc2 Update icon 2023-01-13 14:09:36 +01:00
kra-mo
26ebc45095 Update for Gtk.FileDialog 2023-01-04 17:21:43 +01:00
kramo
ffa926dc7c Update README.md 2022-12-26 15:27:51 +01:00
kramo
2d27493f91 Update README.md 2022-12-26 15:27:26 +01:00
kra-mo
3b4e946111 Update README.md 2022-12-26 15:18:26 +01:00
kra-mo
728ac4a9df Create screenshot.webp 2022-12-26 15:17:00 +01:00
kramo
2a897a3832 Update README.md 2022-12-26 15:13:10 +01:00
20 changed files with 799 additions and 408 deletions

View File

@@ -1,2 +1,50 @@
# game-shelf
A GTK4 + Libadwaita game launcher
<div align="center">
<img src="data/icons/hicolor/scalable/apps/hu.kramo.GameShelf.svg" width="128" height="128">
# Game Shelf
A GTK4 + Libadwaita game launcher
<img src="data/screenshot.webp">
</div>
## The Project
Game Shelf is a simple game launcher written in Python using GTK4 + Libadwaita.
### Features
- Manually adding and editing games
- Importing games from Steam and Heroic
- Hiding games
- Searching and sorting by title, date added and last played
## Building
### GNOME Builder
1. Download [GNOME Builder](https://flathub.org/apps/details/org.gnome.Builder).
2. Click "Clone Repository" with `https://github.com/kra-mo/game-shelf.git` as the URL.
3. Click on the build button (hammer) at the top.
4. Install `org.gnome.Platform` from the [gnome-nightly repository](https://wiki.gnome.org/Apps/Nightly) if needed.
## Installation
### From Releases
1. Install `org.gnome.Platform` from the [gnome-nightly repository](https://wiki.gnome.org/Apps/Nightly) if needed.
2. Download the latest release from Releases.
3. Install it via GNOME Software or `flatpak install hu.kramo.GameShelf.flatpak`.
### From GNOME Builder
Click the down arrow next to the hammer at the top of your GNOME Builder window, then click "Export". This will create a flatpak that then can be installed on your system.
## Contributing
### Code
Fork the repository, make your changes, then create a pull request.
### Translations
Currently, translations can be added manually with the following steps:
1. Clone the repository.
2. If it isn't already there, add your language to `/po/LINGUAS`.
3. Create a new translation from the `/po/gameshelf.pot` file with a program such as [Poedit](https://poedit.net/).
4. Save the file as `[YOUR LANGUAGE CODE].po` to `/po/`.
5. Create a pull request with your translations.

View File

@@ -4,8 +4,20 @@
<key name="exit-after-launch" type="b">
<default>false</default>
</key>
<key name="heroic-import-epic" type="b">
<default>true</default>
</key>
<key name="heroic-import-gog" type="b">
<default>true</default>
</key>
<key name="heroic-import-sideload" type="b">
<default>true</default>
</key>
<key name="steam-location" type="s">
<default>"~/.steam/"</default>
</key>
<key name="heroic-location" type="s">
<default>"~/.var/app/com.heroicgameslauncher.hgl/config/heroic/"</default>
</key>
<key name="sort-mode" type="s">
<choices>

View File

@@ -6,7 +6,7 @@
<name>Game Shelf</name>
<summary>Launch all your games</summary>
<description>
<p>Game Shelf is a simple game launcher. It has support for importing your games from Steam with organizational features such as hiding and sorting by date added or last played.</p>
<p>Game Shelf is a simple game launcher. It has support for importing your games from Steam and Heroic with organizational features such as hiding and sorting by date added or last played.</p>
</description>
<launchable type="desktop-id">hu.kramo.GameShelf.desktop</launchable>
<developer_name>kramo</developer_name>

View File

@@ -1,22 +1,36 @@
<svg width="128" height="128" viewBox="0 0 128 128" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="20" y="8" width="88" height="112" rx="9" fill="#C64600"/>
<rect x="20" y="8" width="88" height="95" rx="9" fill="#FF7800"/>
<rect x="26" y="14" width="76" height="50" rx="4" fill="black"/>
<rect x="38" y="20" width="52" height="38" rx="4" fill="url(#paint0_linear_5_31)"/>
<rect x="54" y="107" width="9" height="9" rx="4.5" fill="#241F31"/>
<rect x="70" y="109" width="5" height="5" rx="2.5" fill="#241F31"/>
<rect x="40" y="73" width="7" height="21" rx="3.5" fill="black"/>
<rect x="54" y="80" width="7" height="21" rx="3.5" transform="rotate(90 54 80)" fill="black"/>
<rect x="40" y="72" width="7" height="21" rx="3.5" fill="#241F31"/>
<rect x="54" y="79" width="7" height="21" rx="3.5" transform="rotate(90 54 79)" fill="#241F31"/>
<rect x="80" y="80" width="11" height="11" rx="5.5" transform="rotate(90 80 80)" fill="black"/>
<rect x="94" y="73" width="11" height="11" rx="5.5" transform="rotate(90 94 73)" fill="black"/>
<rect x="80" y="79" width="11" height="11" rx="5.5" transform="rotate(90 80 79)" fill="#241F31"/>
<rect x="94" y="72" width="11" height="11" rx="5.5" transform="rotate(90 94 72)" fill="#241F31"/>
<defs>
<linearGradient id="paint0_linear_5_31" x1="38" y1="20" x2="38" y2="58" gradientUnits="userSpaceOnUse">
<stop stop-color="#597E53"/>
<stop offset="1" stop-color="#97AE79"/>
</linearGradient>
</defs>
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" fill="none">
<rect width="88" height="112" x="20" y="8" fill="url(#a)" rx="9" style="fill:url(#a)"/>
<rect width="88" height="95" x="20" y="8" fill="url(#b)" rx="9" style="fill:url(#b)"/>
<rect width="74" height="46" x="27" y="15" fill="#000" rx="5"/>
<rect width="50" height="34" x="39" y="21" fill="url(#c)" rx="4" style="fill:url(#c)"/>
<rect width="9" height="9" x="55" y="107" fill="#241f31" rx="4.5"/>
<rect width="5" height="5" x="57" y="109" fill="#000" rx="2.5"/>
<rect width="5" height="5" x="71" y="109" fill="#241f31" rx="2.5"/>
<rect width="7" height="21" x="40" y="72" fill="#000" rx="3.5"/>
<rect width="7" height="21" x="79" y="-54" fill="#000" rx="3.5" transform="rotate(90)"/>
<rect width="7" height="21" x="40" y="71" fill="#241f31" rx="3.5"/>
<rect width="7" height="21" x="78" y="-54" fill="#241f31" rx="3.5" transform="rotate(90)"/>
<rect width="11" height="11" x="80" y="-80" fill="#000" rx="5.5" transform="rotate(90)"/>
<rect width="11" height="11" x="73" y="-94" fill="#000" rx="5.5" transform="rotate(90)"/>
<rect width="11" height="11" x="79" y="-80" fill="#241f31" rx="5.5" transform="rotate(90)"/>
<rect width="11" height="11" x="72" y="-94" fill="#241f31" rx="5.5" transform="rotate(90)"/>
<defs>
<linearGradient id="a" x1="20" x2="108" y1="120" y2="120" gradientUnits="userSpaceOnUse">
<stop stop-color="#FF7800"/>
<stop offset=".06" stop-color="#FFA348"/>
<stop offset=".21" stop-color="#FFA348" style="stop-color:#ff7800;stop-opacity:1"/>
<stop offset=".8" stop-color="#FFA348" style="stop-color:#ff7800;stop-opacity:1"/>
<stop offset=".94" stop-color="#FFA348"/>
<stop offset="1" stop-color="#FF7800"/>
</linearGradient>
<linearGradient id="b" x1="64" x2="64" y1="8" y2="103" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#FFA348" style="stop-color:#f6d32d;stop-opacity:1"/>
<stop offset=".9" stop-color="#F6D32D"/>
<stop offset="1" stop-color="#F9F06B"/>
</linearGradient>
<linearGradient id="c" x1="39" x2="39" y1="21" y2="55" gradientUnits="userSpaceOnUse">
<stop stop-color="#53784D"/>
<stop offset="1" stop-color="#B2D18B"/>
</linearGradient>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
data/screenshot.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 878 KiB

View File

@@ -9,9 +9,10 @@
"--socket=fallback-x11",
"--device=dri",
"--socket=wayland",
"--socket=session-bus",
"--talk-name=org.freedesktop.Flatpak",
"--filesystem=xdg-run/gvfsd",
"--filesystem=~/.steam/steam/"
"--filesystem=~/.steam/steam/",
"--filesystem=~/.var/app/com.heroicgameslauncher.hgl/config/heroic/"
],
"cleanup" : [
"/include",

View File

@@ -1,5 +1,5 @@
project('gameshelf',
version: '0.1.0',
version: '0.1.1',
meson_version: '>= 0.59.0',
default_options: [ 'warning_level=2', 'werror=false', ],
)

View File

@@ -1,6 +1,3 @@
data/hu.kramo.GameShelf.desktop.in
data/hu.kramo.GameShelf.metainfo.xml.in
src/main.py
src/window.py
src/window.blp
@@ -12,3 +9,5 @@ src/gtk/preferences.blp
src/utils/create_details_window.py
src/utils/create_dialog.py
src/utils/steam_parser.py
src/utils/heroic_parser.py

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-12-26 14:29+0100\n"
"POT-Creation-Date: 2023-01-29 14:12+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,243 +17,286 @@ msgstr ""
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: game.blp:32 ../utils/create_details_window.py:72
msgid "Title"
msgstr ""
#: game.blp:62 game.blp:88 ../window.blp:132
msgid "Play"
msgstr ""
#: game.blp:69 game.blp:95 ../window.blp:374 ../window.blp:393
msgid "Edit"
msgstr ""
#: game.blp:74 ../window.blp:379
msgid "Hide"
msgstr ""
#: game.blp:79 game.blp:105 ../window.blp:384 ../window.blp:403
msgid "Remove"
msgstr ""
#: game.blp:100 ../window.blp:398
msgid "Unhide"
msgstr ""
#: preferences.blp:10
msgid "General"
msgstr ""
#: preferences.blp:13
msgid "Exit after launching a game"
msgstr ""
#: preferences.blp:25
msgid "Steam install location"
msgstr ""
#: preferences.blp:26
msgid "Directory to use when importing games"
msgstr ""
#: ../window.blp:6 ../window.blp:14 ../utils/steam_parser.py:98
msgid "No Games Found"
msgstr ""
#: ../window.blp:7
msgid "Try a different search."
msgstr ""
#: ../window.blp:15
msgid "Use the + button to add games."
msgstr ""
#: ../window.blp:22
msgid "No Hidden Games"
msgstr ""
#: ../window.blp:23
msgid "Games you hide will appear here."
msgstr ""
#: ../window.blp:29
msgid "Game Shelf"
msgstr ""
#: ../window.blp:52
msgid "Game Details"
msgstr ""
#: ../window.blp:90
msgid "Game Title"
msgstr ""
#: ../window.blp:241
msgid "Hidden Games"
msgstr ""
#: ../window.blp:299
msgid "Sort"
msgstr ""
#: ../window.blp:302
msgid "A-Z"
msgstr ""
#: ../window.blp:308
msgid "Z-A"
msgstr ""
#: ../window.blp:314
msgid "Newest"
msgstr ""
#: ../window.blp:320
msgid "Oldest"
msgstr ""
#: ../window.blp:326
msgid "Last Played"
msgstr ""
#: ../window.blp:333
msgid "Show Hidden"
msgstr ""
#: ../window.blp:341
msgid "Preferences"
msgstr ""
#: ../window.blp:346
msgid "Keyboard Shortcuts"
msgstr ""
#: ../window.blp:351
msgid "About Game Shelf"
msgstr ""
#: ../window.blp:360
msgid "Add Game"
msgstr ""
#: ../window.blp:365
msgid "Import From Steam"
msgstr ""
#. Create toast for undoing the remove action
#: ../main.py:126
msgid " removed"
#: src/main.py:133
msgid "removed"
msgstr ""
#: ../main.py:127
#: src/main.py:134
msgid "Undo"
msgstr ""
#: ../window.py:196
#: src/window.py:195
msgid "Today"
msgstr ""
#: ../window.py:198
#: src/window.py:197
msgid "Yesterday"
msgstr ""
#: ../window.py:222
#: src/window.py:221
msgid "Added: "
msgstr ""
#: ../window.py:223
#: src/window.py:222
msgid "Last played: "
msgstr ""
#: ../window.py:223
#: src/window.py:222
msgid "Last played: Never"
msgstr ""
#: ../utils/create_details_window.py:33
#: src/window.blp:6 src/window.blp:14 src/utils/steam_parser.py:98
#: src/utils/heroic_parser.py:153
msgid "No Games Found"
msgstr ""
#: src/window.blp:7
msgid "Try a different search."
msgstr ""
#: src/window.blp:15
msgid "Use the + button to add games."
msgstr ""
#: src/window.blp:22
msgid "No Hidden Games"
msgstr ""
#: src/window.blp:23
msgid "Games you hide will appear here."
msgstr ""
#: src/window.blp:29
msgid "Game Shelf"
msgstr ""
#: src/window.blp:52
msgid "Game Details"
msgstr ""
#: src/window.blp:90
msgid "Game Title"
msgstr ""
#: src/window.blp:132 src/gtk/game.blp:62 src/gtk/game.blp:88
msgid "Play"
msgstr ""
#: src/window.blp:241
msgid "Hidden Games"
msgstr ""
#: src/window.blp:299
msgid "Sort"
msgstr ""
#: src/window.blp:302
msgid "A-Z"
msgstr ""
#: src/window.blp:308
msgid "Z-A"
msgstr ""
#: src/window.blp:314
msgid "Newest"
msgstr ""
#: src/window.blp:320
msgid "Oldest"
msgstr ""
#: src/window.blp:326
msgid "Last Played"
msgstr ""
#: src/window.blp:333
msgid "Show Hidden"
msgstr ""
#: src/window.blp:341
msgid "Preferences"
msgstr ""
#: src/window.blp:346
msgid "Keyboard Shortcuts"
msgstr ""
#: src/window.blp:351
msgid "About Game Shelf"
msgstr ""
#: src/window.blp:360
msgid "Add Game"
msgstr ""
#: src/window.blp:365
msgid "Import From Steam"
msgstr ""
#: src/window.blp:370
msgid "Import From Heroic"
msgstr ""
#: src/window.blp:379 src/window.blp:398 src/gtk/game.blp:69
#: src/gtk/game.blp:95
msgid "Edit"
msgstr ""
#: src/window.blp:384 src/gtk/game.blp:74
msgid "Hide"
msgstr ""
#: src/window.blp:389 src/window.blp:408 src/gtk/game.blp:79
#: src/gtk/game.blp:105
msgid "Remove"
msgstr ""
#: src/window.blp:403 src/gtk/game.blp:100
msgid "Unhide"
msgstr ""
#: src/gtk/game.blp:32 src/utils/create_details_window.py:82
msgid "Title"
msgstr ""
#: src/gtk/preferences.blp:10
msgid "General"
msgstr ""
#: src/gtk/preferences.blp:13
msgid "Exit After Launching Games"
msgstr ""
#: src/gtk/preferences.blp:25
msgid "Steam Install Location"
msgstr ""
#: src/gtk/preferences.blp:26 src/gtk/preferences.blp:40
msgid "Directory to use when importing games"
msgstr ""
#: src/gtk/preferences.blp:39
msgid "Heroic Install Location"
msgstr ""
#: src/gtk/preferences.blp:49
msgid "Import Epic Games"
msgstr ""
#: src/gtk/preferences.blp:57
msgid "Import GOG Games"
msgstr ""
#: src/gtk/preferences.blp:65
msgid "Import Sideloaded Games"
msgstr ""
#: src/utils/create_details_window.py:38
msgid "Add New Game"
msgstr ""
#: ../utils/create_details_window.py:37
#: src/utils/create_details_window.py:42
msgid "Confirm"
msgstr ""
#: ../utils/create_details_window.py:39
#: src/utils/create_details_window.py:44
msgid "Edit Game Details"
msgstr ""
#: ../utils/create_details_window.py:43
#: src/utils/create_details_window.py:48
msgid "Apply"
msgstr ""
#: ../utils/create_details_window.py:46
#: src/utils/create_details_window.py:51
msgid "Images"
msgstr ""
#: ../utils/create_details_window.py:73
#: src/utils/create_details_window.py:83
msgid "The title of the game"
msgstr ""
#: ../utils/create_details_window.py:77
#: src/utils/create_details_window.py:88
msgid "Executable"
msgstr ""
#: ../utils/create_details_window.py:78
#: src/utils/create_details_window.py:89
msgid "File to open or command to run when launching the game"
msgstr ""
#: ../utils/create_details_window.py:86
#: src/utils/create_details_window.py:98
msgid "Cancel"
msgstr ""
#: ../utils/create_details_window.py:133 ../utils/create_details_window.py:137
#: src/utils/create_details_window.py:141
#: src/utils/create_details_window.py:145
msgid "Couldn't Add Game"
msgstr ""
#: ../utils/create_details_window.py:133 ../utils/create_details_window.py:158
#: src/utils/create_details_window.py:141
#: src/utils/create_details_window.py:166
msgid "Game title cannot be empty."
msgstr ""
#: ../utils/create_details_window.py:137 ../utils/create_details_window.py:162
#: src/utils/create_details_window.py:145
#: src/utils/create_details_window.py:170
msgid "Executable cannot be empty."
msgstr ""
#: ../utils/create_details_window.py:158 ../utils/create_details_window.py:162
#: src/utils/create_details_window.py:166
#: src/utils/create_details_window.py:170
msgid "Couldn't Apply Preferences"
msgstr ""
#: ../utils/create_dialog.py:24
#: src/utils/create_dialog.py:24
msgid "Dismiss"
msgstr ""
#: ../utils/steam_parser.py:49
#: src/utils/steam_parser.py:49 src/utils/heroic_parser.py:49
msgid "Couldn't Import Games"
msgstr ""
#: ../utils/steam_parser.py:49
#: src/utils/steam_parser.py:49
msgid "Steam directory cannot be found."
msgstr ""
#: ../utils/steam_parser.py:49
#: src/utils/steam_parser.py:49
msgid "Set Steam Location"
msgstr ""
#: ../utils/steam_parser.py:98
#: src/utils/steam_parser.py:98
msgid "No new games found in Steam library."
msgstr ""
#: ../utils/steam_parser.py:100 ../utils/steam_parser.py:102
#: src/utils/steam_parser.py:100 src/utils/steam_parser.py:102
msgid "Steam Games Imported"
msgstr ""
#: ../utils/steam_parser.py:100
#: src/utils/steam_parser.py:100 src/utils/heroic_parser.py:155
msgid "Successfully imported 1 game."
msgstr ""
#: ../utils/steam_parser.py:102
msgid "Successfully imported "
#: src/utils/steam_parser.py:102 src/utils/heroic_parser.py:157
msgid "Successfully imported"
msgstr ""
#: ../utils/steam_parser.py:102
msgid " games."
#: src/utils/steam_parser.py:102 src/utils/heroic_parser.py:157
msgid "games."
msgstr ""
#: src/utils/heroic_parser.py:49
msgid "Heroic directory cannot be found."
msgstr ""
#: src/utils/heroic_parser.py:49
msgid "Set Heroic Location"
msgstr ""
#: src/utils/heroic_parser.py:153
msgid "No new games found in Heroic library."
msgstr ""
#: src/utils/heroic_parser.py:155 src/utils/heroic_parser.py:157
msgid "Heroic Games Imported"
msgstr ""

BIN
po/hu.mo

Binary file not shown.

365
po/hu.po
View File

@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-12-26 14:29+0100\n"
"PO-Revision-Date: 2022-12-26 14:33+0100\n"
"POT-Creation-Date: 2023-01-29 14:12+0100\n"
"PO-Revision-Date: 2023-01-29 14:19+0100\n"
"Last-Translator: kramo <contact@kramo.hu>\n"
"Language-Team: \n"
"Language: hu\n"
@@ -18,243 +18,286 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 3.2.2\n"
#: game.blp:32 ../utils/create_details_window.py:72
msgid "Title"
msgstr "Cím"
#: game.blp:62 game.blp:88 ../window.blp:132
msgid "Play"
msgstr "Játék"
#: game.blp:69 game.blp:95 ../window.blp:374 ../window.blp:393
msgid "Edit"
msgstr "Szerkeszt"
#: game.blp:74 ../window.blp:379
msgid "Hide"
msgstr "Elrejt"
#: game.blp:79 game.blp:105 ../window.blp:384 ../window.blp:403
msgid "Remove"
msgstr "Eltávolít"
#: game.blp:100 ../window.blp:398
msgid "Unhide"
msgstr "Mutat"
#: preferences.blp:10
msgid "General"
msgstr "Általános"
#: preferences.blp:13
msgid "Exit after launching a game"
msgstr "Kilépés játék indítása után"
#: preferences.blp:25
msgid "Steam install location"
msgstr "Steam telepítés helye"
#: preferences.blp:26
msgid "Directory to use when importing games"
msgstr "Az importáláskor használatos mappa"
#: ../window.blp:6 ../window.blp:14 ../utils/steam_parser.py:98
msgid "No Games Found"
msgstr "Nem Találhatóak Játékok"
#: ../window.blp:7
msgid "Try a different search."
msgstr "Próbálkozz más kereséssel."
#: ../window.blp:15
msgid "Use the + button to add games."
msgstr "Használd a + gombot a játékok hozzáadásához."
#: ../window.blp:22
msgid "No Hidden Games"
msgstr "Nincsenek Rejtett Játékok"
#: ../window.blp:23
msgid "Games you hide will appear here."
msgstr "A rejtett játékaid itt lesznek megtalálhatók."
#: ../window.blp:29
msgid "Game Shelf"
msgstr "Játékpolc"
#: ../window.blp:52
msgid "Game Details"
msgstr "Játék Részletei"
#: ../window.blp:90
msgid "Game Title"
msgstr "Cím"
#: ../window.blp:241
msgid "Hidden Games"
msgstr "Rejtett Játékok"
#: ../window.blp:299
msgid "Sort"
msgstr "Rendezés"
#: ../window.blp:302
msgid "A-Z"
msgstr "A-Z"
#: ../window.blp:308
msgid "Z-A"
msgstr "Z-A"
#: ../window.blp:314
msgid "Newest"
msgstr "Legújabb"
#: ../window.blp:320
msgid "Oldest"
msgstr "Legrégebbi"
#: ../window.blp:326
msgid "Last Played"
msgstr "Legutóbb játszott"
#: ../window.blp:333
msgid "Show Hidden"
msgstr "Rejtett Játékok"
#: ../window.blp:341
msgid "Preferences"
msgstr "Beállítások"
#: ../window.blp:346
msgid "Keyboard Shortcuts"
msgstr "Billentyűparancsok"
#: ../window.blp:351
msgid "About Game Shelf"
msgstr "A Játékpolcról"
#: ../window.blp:360
msgid "Add Game"
msgstr "Játék Hozzáadása"
#: ../window.blp:365
msgid "Import From Steam"
msgstr "Importálás Steam-ből"
#. Create toast for undoing the remove action
#: ../main.py:126
msgid " removed"
msgstr " eltávolítva"
#: src/main.py:133
msgid "removed"
msgstr "eltávolítva"
#: ../main.py:127
#: src/main.py:134
msgid "Undo"
msgstr "Visszavonás"
#: ../window.py:196
#: src/window.py:195
msgid "Today"
msgstr "Ma"
#: ../window.py:198
#: src/window.py:197
msgid "Yesterday"
msgstr "Tegnap"
#: ../window.py:222
#: src/window.py:221
msgid "Added: "
msgstr "Hozzáadva: "
#: ../window.py:223
#: src/window.py:222
msgid "Last played: "
msgstr "Legutóbb játszva: "
#: ../window.py:223
#: src/window.py:222
msgid "Last played: Never"
msgstr "Legutóbb játszva: Soha"
#: ../utils/create_details_window.py:33
#: src/window.blp:6 src/window.blp:14 src/utils/steam_parser.py:98
#: src/utils/heroic_parser.py:153
msgid "No Games Found"
msgstr "Nem Találhatóak Játékok"
#: src/window.blp:7
msgid "Try a different search."
msgstr "Próbálkozz más kereséssel."
#: src/window.blp:15
msgid "Use the + button to add games."
msgstr "Használd a + gombot a játékok hozzáadásához."
#: src/window.blp:22
msgid "No Hidden Games"
msgstr "Nincsenek Rejtett Játékok"
#: src/window.blp:23
msgid "Games you hide will appear here."
msgstr "A rejtett játékaid itt lesznek megtalálhatók."
#: src/window.blp:29
msgid "Game Shelf"
msgstr "Játékpolc"
#: src/window.blp:52
msgid "Game Details"
msgstr "Játék Részletei"
#: src/window.blp:90
msgid "Game Title"
msgstr "Cím"
#: src/window.blp:132 src/gtk/game.blp:62 src/gtk/game.blp:88
msgid "Play"
msgstr "Játék"
#: src/window.blp:241
msgid "Hidden Games"
msgstr "Rejtett Játékok"
#: src/window.blp:299
msgid "Sort"
msgstr "Rendezés"
#: src/window.blp:302
msgid "A-Z"
msgstr "A-Z"
#: src/window.blp:308
msgid "Z-A"
msgstr "Z-A"
#: src/window.blp:314
msgid "Newest"
msgstr "Legújabb"
#: src/window.blp:320
msgid "Oldest"
msgstr "Legrégebbi"
#: src/window.blp:326
msgid "Last Played"
msgstr "Legutóbb játszott"
#: src/window.blp:333
msgid "Show Hidden"
msgstr "Rejtett Játékok"
#: src/window.blp:341
msgid "Preferences"
msgstr "Beállítások"
#: src/window.blp:346
msgid "Keyboard Shortcuts"
msgstr "Billentyűparancsok"
#: src/window.blp:351
msgid "About Game Shelf"
msgstr "A Játékpolcról"
#: src/window.blp:360
msgid "Add Game"
msgstr "Játék Hozzáadása"
#: src/window.blp:365
msgid "Import From Steam"
msgstr "Importálás Steam-ből"
#: src/window.blp:370
msgid "Import From Heroic"
msgstr "Importálás Heroic-ból"
#: src/window.blp:379 src/window.blp:398 src/gtk/game.blp:69
#: src/gtk/game.blp:95
msgid "Edit"
msgstr "Szerkeszt"
#: src/window.blp:384 src/gtk/game.blp:74
msgid "Hide"
msgstr "Elrejt"
#: src/window.blp:389 src/window.blp:408 src/gtk/game.blp:79
#: src/gtk/game.blp:105
msgid "Remove"
msgstr "Eltávolít"
#: src/window.blp:403 src/gtk/game.blp:100
msgid "Unhide"
msgstr "Mutat"
#: src/gtk/game.blp:32 src/utils/create_details_window.py:82
msgid "Title"
msgstr "Cím"
#: src/gtk/preferences.blp:10
msgid "General"
msgstr "Általános"
#: src/gtk/preferences.blp:13
msgid "Exit After Launching Games"
msgstr "Kilépés Játékok Indítása Után"
#: src/gtk/preferences.blp:25
msgid "Steam Install Location"
msgstr "Steam Telepítés Helye"
#: src/gtk/preferences.blp:26 src/gtk/preferences.blp:40
msgid "Directory to use when importing games"
msgstr "Az importáláskor használatos mappa"
#: src/gtk/preferences.blp:39
msgid "Heroic Install Location"
msgstr "Heroic Telepítés Helye"
#: src/gtk/preferences.blp:49
msgid "Import Epic Games"
msgstr "Epic Games Játékok Importálása"
#: src/gtk/preferences.blp:57
msgid "Import GOG Games"
msgstr "GOG Játékok Importálása"
#: src/gtk/preferences.blp:65
msgid "Import Sideloaded Games"
msgstr "Manuálisan Hozzáadott Játékok Importálása"
#: src/utils/create_details_window.py:38
msgid "Add New Game"
msgstr "Új Játék Hozzáadása"
#: ../utils/create_details_window.py:37
#: src/utils/create_details_window.py:42
msgid "Confirm"
msgstr "Megerősít"
#: ../utils/create_details_window.py:39
#: src/utils/create_details_window.py:44
msgid "Edit Game Details"
msgstr "Játék Részleteinek Szerkesztése"
#: ../utils/create_details_window.py:43
#: src/utils/create_details_window.py:48
msgid "Apply"
msgstr "Alkalmaz"
#: ../utils/create_details_window.py:46
#: src/utils/create_details_window.py:51
msgid "Images"
msgstr "Képek"
#: ../utils/create_details_window.py:73
#: src/utils/create_details_window.py:83
msgid "The title of the game"
msgstr "A játék címe"
#: ../utils/create_details_window.py:77
#: src/utils/create_details_window.py:88
msgid "Executable"
msgstr "Program"
#: ../utils/create_details_window.py:78
#: src/utils/create_details_window.py:89
msgid "File to open or command to run when launching the game"
msgstr "Fájl megnyitása vagy parancs futtatása a játék indításakor"
#: ../utils/create_details_window.py:86
#: src/utils/create_details_window.py:98
msgid "Cancel"
msgstr "Mégse"
#: ../utils/create_details_window.py:133 ../utils/create_details_window.py:137
#: src/utils/create_details_window.py:141
#: src/utils/create_details_window.py:145
msgid "Couldn't Add Game"
msgstr "Nem Lehet Hozzáadni a Játékot"
#: ../utils/create_details_window.py:133 ../utils/create_details_window.py:158
#: src/utils/create_details_window.py:141
#: src/utils/create_details_window.py:166
msgid "Game title cannot be empty."
msgstr "A cím nem lehet üres."
#: ../utils/create_details_window.py:137 ../utils/create_details_window.py:162
#: src/utils/create_details_window.py:145
#: src/utils/create_details_window.py:170
msgid "Executable cannot be empty."
msgstr "A program nem lehet üres."
#: ../utils/create_details_window.py:158 ../utils/create_details_window.py:162
#: src/utils/create_details_window.py:166
#: src/utils/create_details_window.py:170
msgid "Couldn't Apply Preferences"
msgstr "Nem Lehet Menteni a Beállításokat"
#: ../utils/create_dialog.py:24
#: src/utils/create_dialog.py:24
msgid "Dismiss"
msgstr "Rendben"
#: ../utils/steam_parser.py:49
#: src/utils/steam_parser.py:49 src/utils/heroic_parser.py:49
msgid "Couldn't Import Games"
msgstr "Nem Lehet Importálni a Játékot"
#: ../utils/steam_parser.py:49
#: src/utils/steam_parser.py:49
msgid "Steam directory cannot be found."
msgstr "A Steam mappa nem található."
#: ../utils/steam_parser.py:49
#: src/utils/steam_parser.py:49
msgid "Set Steam Location"
msgstr "Steam Mappa Kiválasztása"
#: ../utils/steam_parser.py:98
#: src/utils/steam_parser.py:98
msgid "No new games found in Steam library."
msgstr "Nem találhatók új játékok a Steam könyvtárban."
#: ../utils/steam_parser.py:100 ../utils/steam_parser.py:102
#: src/utils/steam_parser.py:100 src/utils/steam_parser.py:102
msgid "Steam Games Imported"
msgstr "Steam Játékok Importálva"
#: ../utils/steam_parser.py:100
#: src/utils/steam_parser.py:100 src/utils/heroic_parser.py:155
msgid "Successfully imported 1 game."
msgstr "1 játék sikeresen importálva."
#: ../utils/steam_parser.py:102
msgid "Successfully imported "
msgstr "Sikeresen importálva "
#: src/utils/steam_parser.py:102 src/utils/heroic_parser.py:157
msgid "Successfully imported"
msgstr "Sikeresen importálva"
#: ../utils/steam_parser.py:102
msgid " games."
msgstr " játék."
#: src/utils/steam_parser.py:102 src/utils/heroic_parser.py:157
msgid "games."
msgstr "játék."
#: src/utils/heroic_parser.py:49
msgid "Heroic directory cannot be found."
msgstr "A Heroic mappa nem található."
#: src/utils/heroic_parser.py:49
msgid "Set Heroic Location"
msgstr "Heroic Mappa Kiválasztása"
#: src/utils/heroic_parser.py:153
msgid "No new games found in Heroic library."
msgstr "Nem találhatók új játékok a Heroic könyvtárban."
#: src/utils/heroic_parser.py:155 src/utils/heroic_parser.py:157
msgid "Heroic Games Imported"
msgstr "Heroic Játékok Importálva"

View File

@@ -3,14 +3,14 @@ using Adw 1;
template PreferencesWindow : Adw.PreferencesWindow {
search-enabled: false;
default-height: 400;
default-height: 500;
Adw.PreferencesPage {
Adw.PreferencesGroup {
title: _("General");
Adw.ActionRow {
title: _("Exit after launching a game");
title: _("Exit After Launching Games");
Switch exit_after_launch_switch {
valign: center;
@@ -22,7 +22,7 @@ template PreferencesWindow : Adw.PreferencesWindow {
title: "Steam";
Adw.ActionRow {
title: _("Steam install location");
title: _("Steam Install Location");
subtitle: _("Directory to use when importing games");
Button steam_file_chooser_button {
@@ -31,5 +31,43 @@ template PreferencesWindow : Adw.PreferencesWindow {
}
}
}
Adw.PreferencesGroup {
title: "Heroic";
Adw.ActionRow {
title: _("Heroic Install Location");
subtitle: _("Directory to use when importing games");
Button heroic_file_chooser_button {
icon-name: "folder-symbolic";
valign: center;
}
}
Adw.ActionRow {
title: _("Import Epic Games");
Switch import_epic_games_switch {
valign: center;
}
}
Adw.ActionRow {
title: _("Import GOG Games");
Switch import_gog_games_switch {
valign: center;
}
}
Adw.ActionRow {
title: _("Import Sideloaded Games");
Switch import_sideload_games_switch {
valign: center;
}
}
}
}
}

View File

@@ -30,6 +30,7 @@ from .toggle_hidden import toggle_hidden
from .save_games import save_games
from .run_command import run_command
from .steam_parser import steam_parser
from .heroic_parser import heroic_parser
from .create_details_window import create_details_window
class GameShelfApplication(Adw.Application):
@@ -39,6 +40,7 @@ class GameShelfApplication(Adw.Application):
self.create_action("about", self.on_about_action)
self.create_action("preferences", self.on_preferences_action)
self.create_action("steam_import", self.on_steam_import_action)
self.create_action("heroic_import", self.on_heroic_import_action)
self.create_action("launch_game", self.on_launch_game_action)
self.create_action("hide_game", self.on_hide_game_action)
self.create_action("edit_details", self.on_edit_details_action)
@@ -71,7 +73,7 @@ class GameShelfApplication(Adw.Application):
application_name="Game Shelf",
application_icon="hu.kramo.GameShelf",
developer_name="kramo",
version="0.1.0",
version="0.1.1",
developers=["kramo"],
copyright="© 2022 kramo",
license_type=Gtk.License.GPL_3_0)
@@ -85,6 +87,11 @@ class GameShelfApplication(Adw.Application):
save_games(games)
self.props.active_window.update_games(games.keys())
def on_heroic_import_action(self, widget, callback=None):
games = heroic_parser(self.props.active_window, self.on_heroic_import_action)
save_games(games)
self.props.active_window.update_games(games.keys())
def on_launch_game_action(self, widget, callback=None):
# Launch the game and update the last played value
@@ -123,7 +130,7 @@ class GameShelfApplication(Adw.Application):
self.props.active_window.on_go_back_action(None, None)
# Create toast for undoing the remove action
toast = Adw.Toast.new(self.props.active_window.games[game_id]["name"] + (_(" removed")))
toast = Adw.Toast.new(self.props.active_window.games[game_id]["name"] + " " + (_("removed")))
toast.set_button_label(_("Undo"))
toast.connect("button-clicked", self.props.active_window.on_undo_remove_action, game_id)
toast.set_priority(Adw.ToastPriority.HIGH)

View File

@@ -44,6 +44,7 @@ gameshelf_sources = [
'preferences.py',
'game.py',
'utils/steam_parser.py',
'utils/heroic_parser.py',
'utils/run_command.py',
'utils/get_games.py',
'utils/get_cover.py',

View File

@@ -24,7 +24,12 @@ class PreferencesWindow(Adw.PreferencesWindow):
__gtype_name__ = 'PreferencesWindow'
exit_after_launch_switch = Gtk.Template.Child()
import_epic_games_switch = Gtk.Template.Child()
import_gog_games_switch = Gtk.Template.Child()
import_sideload_games_switch = Gtk.Template.Child()
steam_file_chooser_button = Gtk.Template.Child()
heroic_file_chooser_button = Gtk.Template.Child()
def __init__(self, parent_widget, **kwargs):
super().__init__(**kwargs)
@@ -32,8 +37,11 @@ class PreferencesWindow(Adw.PreferencesWindow):
self.set_transient_for(parent_widget)
schema = parent_widget.schema
schema.bind("exit-after-launch", self.exit_after_launch_switch, "active", Gio.SettingsBindFlags.DEFAULT)
schema.bind("heroic-import-epic", self.import_epic_games_switch, "active", Gio.SettingsBindFlags.DEFAULT)
schema.bind("heroic-import-gog", self.import_gog_games_switch, "active", Gio.SettingsBindFlags.DEFAULT)
schema.bind("heroic-import-sideload", self.import_sideload_games_switch, "active", Gio.SettingsBindFlags.DEFAULT)
filechooser = Gtk.FileDialog.new()
filechooser = Gtk.FileDialog()
def set_steam_dir(source, result, user_data):
try:
@@ -41,7 +49,14 @@ class PreferencesWindow(Adw.PreferencesWindow):
except GLib.GError:
pass
def choose_folder(widget):
filechooser.select_folder(parent_widget, None, None, set_steam_dir, None)
def set_heroic_dir(source, result, user_data):
try:
schema.set_string("heroic-location", filechooser.select_folder_finish(result).get_path())
except GLib.GError:
pass
self.steam_file_chooser_button.connect("clicked", choose_folder)
def choose_folder(widget, function):
filechooser.select_folder(parent_widget, None, function, None)
self.steam_file_chooser_button.connect("clicked", choose_folder, set_steam_dir)
self.heroic_file_chooser_button.connect("clicked", choose_folder, set_heroic_dir)

View File

@@ -19,12 +19,17 @@
def create_details_window(parent_widget, game_id = None):
import os, json, time
from gi.repository import Adw, Gtk, GLib, GdkPixbuf
from gi.repository import Adw, Gtk, Gio, GLib, GdkPixbuf
from .create_dialog import create_dialog
from .save_games import save_games
from .save_cover import save_cover
window = Adw.Window.new()
window = Adw.Window(
modal = True,
default_width = 450,
default_height = 650,
transient_for = parent_widget
)
games = parent_widget.games
pixbuf = None
@@ -32,8 +37,8 @@ def create_details_window(parent_widget, game_id = None):
if game_id == None:
window.set_title(_("Add New Game"))
cover = Gtk.Picture.new_for_pixbuf(parent_widget.placeholder_pixbuf)
name = Gtk.Entry.new()
executable = Gtk.Entry.new()
name = Gtk.Entry()
executable = Gtk.Entry()
apply_button = Gtk.Button.new_with_label(_("Confirm"))
else:
window.set_title(_("Edit Game Details"))
@@ -42,43 +47,50 @@ def create_details_window(parent_widget, game_id = None):
executable = Gtk.Entry.new_with_buffer(Gtk.EntryBuffer.new((games[game_id]["executable"]), -1))
apply_button = Gtk.Button.new_with_label(_("Apply"))
file_filter = Gtk.FileFilter.new()
file_filter.set_name(_("Images"))
file_filter.add_pixbuf_formats()
filechooser = Gtk.FileDialog.new()
filechooser.set_current_filter(file_filter)
image_filter = Gtk.FileFilter(
name= _("Images")
)
image_filter.add_pixbuf_formats()
file_filters = Gio.ListStore.new(Gtk.FileFilter)
file_filters.append(image_filter)
filechooser = Gtk.FileDialog()
filechooser.set_filters(file_filters)
cover.add_css_class("card")
cover.set_size_request(200, 300)
cover_button = Gtk.Button.new_from_icon_name("document-edit-symbolic")
cover_button.set_halign(Gtk.Align.END)
cover_button.set_valign(Gtk.Align.END)
cover_button.set_margin_bottom(6)
cover_button.set_margin_end(6)
cover_button.add_css_class("circular")
cover_button.add_css_class("osd")
cover_button = Gtk.Button(
icon_name = "document-edit-symbolic",
halign = Gtk.Align.END,
valign = Gtk.Align.END,
margin_bottom = 6,
margin_end = 6,
css_classes = ["circular", "osd"],
)
cover_overlay = Gtk.Overlay.new()
cover_overlay.set_child(cover)
cover_overlay = Gtk.Overlay(
child = cover,
halign = Gtk.Align.CENTER,
valign = Gtk.Align.CENTER,
)
cover_overlay.add_overlay(cover_button)
cover_overlay.set_halign(Gtk.Align.CENTER)
cover_overlay.set_valign(Gtk.Align.CENTER)
cover_group = Adw.PreferencesGroup.new()
cover_group = Adw.PreferencesGroup()
cover_group.add(cover_overlay)
title_group = Adw.PreferencesGroup.new()
title_group.set_title(_("Title"))
title_group.set_description(_("The title of the game"))
title_group = Adw.PreferencesGroup(
title = _("Title"),
description = _("The title of the game"),
)
title_group.add(name)
exec_group = Adw.PreferencesGroup.new()
exec_group.set_title(_("Executable"))
exec_group.set_description(_("File to open or command to run when launching the game"))
exec_group = Adw.PreferencesGroup(
title = _("Executable"),
description = _("File to open or command to run when launching the game"),
)
exec_group.add(executable)
general_page = Adw.PreferencesPage.new()
general_page = Adw.PreferencesPage()
general_page.add(cover_group)
general_page.add(title_group)
general_page.add(exec_group)
@@ -87,27 +99,23 @@ def create_details_window(parent_widget, game_id = None):
apply_button.add_css_class("suggested-action")
header_bar = Adw.HeaderBar.new()
header_bar.set_show_start_title_buttons(False)
header_bar.set_show_end_title_buttons(False)
header_bar = Adw.HeaderBar(
show_start_title_buttons = False,
show_end_title_buttons = False,
)
header_bar.pack_start(cancel_button)
header_bar.pack_end(apply_button)
main_box = Gtk.Box.new(Gtk.Orientation.VERTICAL, 0)
main_box.append(header_bar)
main_box.append(general_page)
window.set_modal(True)
window.set_default_size(500, 650)
window.set_content(main_box)
window.set_transient_for(parent_widget)
def choose_cover(widget):
filechooser.open(window, None, None, set_cover, None)
filechooser.open(window, None, set_cover, None)
def set_cover(source, result, _):
nonlocal pixbuf
try:
pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(filechooser.open_finish(result).get_path(), 200, 300, False)
cover.set_pixbuf(pixbuf)
@@ -185,7 +193,7 @@ def create_details_window(parent_widget, game_id = None):
name.connect("activate", focus_executable)
executable.connect("activate", apply_preferences)
shortcut_controller = Gtk.ShortcutController.new()
shortcut_controller = Gtk.ShortcutController()
shortcut_controller.add_shortcut(Gtk.Shortcut.new(Gtk.ShortcutTrigger.parse_string('Escape'), Gtk.CallbackAction.new(close_window)))
window.add_controller(shortcut_controller)

158
src/utils/heroic_parser.py Normal file
View File

@@ -0,0 +1,158 @@
# heroic_parser.py
#
# Copyright 2022 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 <http://www.gnu.org/licenses/>.
#
# SPDX-License-Identifier: GPL-3.0-or-later
def heroic_parser(parent_widget, action):
import os, json, time
from gi.repository import Gtk, GLib
from .create_dialog import create_dialog
from .save_cover import save_cover
schema = parent_widget.schema
heroic_dir = os.path.expanduser(os.path.join(schema.get_string("heroic-location")))
def heroic_not_found():
filechooser = Gtk.FileDialog.new()
def set_heroic_dir(source, result, _):
try:
schema.set_string("heroic-location", filechooser.select_folder_finish(result).get_path())
heroic_dir = heroic_dir = os.path.join(schema.get_string("heroic-location"))
action(None, None)
except GLib.GError:
return
def choose_folder(widget):
filechooser.select_folder(parent_widget, None, set_heroic_dir, None)
def response(widget, response):
if response == "choose_folder":
choose_folder(widget)
create_dialog(parent_widget, _("Couldn't Import Games"), _("Heroic directory cannot be found."), "choose_folder", _("Set Heroic Location")).connect("response", response)
if os.path.exists(os.path.join(heroic_dir, "config.json")) == True:
pass
else:
heroic_not_found()
return {}
heroic_games = {}
current_time = int(time.time())
# Import Epic games
if schema.get_boolean("heroic-import-epic") == False:
pass
elif os.path.exists(os.path.join(heroic_dir, "lib-cache", "installInfo.json")) == True:
open_file = open(os.path.join(heroic_dir, "lib-cache", "installInfo.json"), "r")
data = open_file.read()
open_file.close()
installInfo = json.loads(data)
for item in installInfo:
if installInfo[item]["install"] != None:
values = {}
app_name = installInfo[item]["game"]["app_name"]
values["game_id"] = "heroic_epic_" + app_name
if values["game_id"] in parent_widget.games and "removed" not in parent_widget.games[values["game_id"]].keys():
continue
values["name"] = installInfo[item]["game"]["title"]
values["executable"] = "xdg-open heroic://launch/" + app_name
values["hidden"] = False
values["source"] = "heroic_epic"
values["added"] = current_time
values["last_played"] = 0
if os.path.isfile(os.path.join(heroic_dir, "icons", app_name + ".jpg")) == True:
values["pixbuf_options"] = save_cover(values, parent_widget, os.path.join(os.path.join(heroic_dir, "icons", app_name + ".jpg")))
heroic_games[values["game_id"]] = values
# Import GOG games
if schema.get_boolean("heroic-import-gog") == False:
pass
elif os.path.exists(os.path.join(heroic_dir, "gog_store", "installed.json")) == True:
open_file = open(os.path.join(heroic_dir, "gog_store", "installed.json"), "r")
data = open_file.read()
open_file.close()
installed = json.loads(data)
for item in installed["installed"]:
values = {}
app_name = item["appName"]
values["game_id"] = "heroic_gog_" + app_name
if values["game_id"] in parent_widget.games and "removed" not in parent_widget.games[values["game_id"]].keys():
continue
# Get game title from library.json as it's not present in installed.json
open_file = open(os.path.join(heroic_dir, "gog_store", "library.json"), "r")
data = open_file.read()
open_file.close()
library = json.loads(data)
for game in library["games"]:
if game["app_name"] == app_name:
values["name"] = game["title"]
break
values["executable"] = "xdg-open heroic://launch/" + app_name
values["hidden"] = False
values["source"] = "heroic_gog"
values["added"] = current_time
values["last_played"] = 0
if os.path.isfile(os.path.join(heroic_dir, "icons", app_name + ".jpg")) == True:
values["pixbuf_options"] = save_cover(values, parent_widget, os.path.join(os.path.join(heroic_dir, "icons", app_name + ".jpg")))
heroic_games[values["game_id"]] = values
# Import sideloaded games
if schema.get_boolean("heroic-import-sideload") == False:
pass
elif os.path.exists(os.path.join(heroic_dir, "sideload_apps", "library.json")) == True:
open_file = open(os.path.join(heroic_dir, "sideload_apps", "library.json"), "r")
data = open_file.read()
open_file.close()
library = json.loads(data)
for item in library["games"]:
values = {}
app_name = item["app_name"]
values["game_id"] = "heroic_sideload_" + app_name
if values["game_id"] in parent_widget.games and "removed" not in parent_widget.games[values["game_id"]].keys():
continue
values["name"] = item["title"]
values["executable"] = "xdg-open heroic://launch/" + app_name
values["hidden"] = False
values["source"] = "heroic_sideload"
values["added"] = current_time
values["last_played"] = 0
if os.path.isfile(os.path.join(heroic_dir, "icons", app_name + ".jpg")) == True:
values["pixbuf_options"] = save_cover(values, parent_widget, os.path.join(os.path.join(heroic_dir, "icons", app_name + ".jpg")))
heroic_games[values["game_id"]] = values
if len(heroic_games) == 0:
create_dialog(parent_widget, _("No Games Found"), _("No new games found in Heroic library."))
elif len(heroic_games) == 1:
create_dialog(parent_widget, _("Heroic Games Imported"), _("Successfully imported 1 game."))
elif len(heroic_games) > 1:
create_dialog(parent_widget, _("Heroic Games Imported"), _("Successfully imported") + " " + str(len(heroic_games)) + " " + _("games."))
return heroic_games

View File

@@ -40,7 +40,7 @@ def steam_parser(parent_widget, action):
return
def choose_folder(widget):
filechooser.select_folder(parent_widget, None, None, set_steam_dir, None)
filechooser.select_folder(parent_widget, None, set_steam_dir, None)
def response(widget, response):
if response == "choose_folder":
@@ -58,23 +58,23 @@ def steam_parser(parent_widget, action):
steam_not_found()
return {}
steam_dir = os.path.join(schema.get_string("steam-location"))
steam_dir = schema.get_string("steam-location")
appmanifests = []
datatypes = ["appid", "name"]
steam_games = {}
current_time = int(time.time())
for file in os.listdir(os.path.join(steam_dir, "steamapps")):
path = os.path.join(steam_dir, "steamapps", file)
if os.path.isfile(path) and "appmanifest" in file:
for open_file in os.listdir(os.path.join(steam_dir, "steamapps")):
path = os.path.join(steam_dir, "steamapps", open_file)
if os.path.isfile(path) and "appmanifest" in open_file:
appmanifests.append(path)
for appmanifest in appmanifests:
values = {}
file = open(appmanifest, "r")
data = file.read()
file.close()
open_file = open(appmanifest, "r")
data = open_file.read()
open_file.close()
for datatype in datatypes:
value = re.findall("\"" + datatype + "\"\t\t\"(.*)\"\n", data)
values [datatype] = value[0]
@@ -99,5 +99,5 @@ def steam_parser(parent_widget, action):
elif len(steam_games) == 1:
create_dialog(parent_widget, _("Steam Games Imported"), _("Successfully imported 1 game."))
elif len(steam_games) > 1:
create_dialog(parent_widget, _("Steam Games Imported"), _("Successfully imported ") + str(len(steam_games)) + _(" games."))
create_dialog(parent_widget, _("Steam Games Imported"), _("Successfully imported") + " " + str(len(steam_games)) + " " + _("games."))
return steam_games

View File

@@ -365,6 +365,11 @@ menu add_games {
label: _("Import From Steam");
action: "app.steam_import";
}
item {
label: _("Import From Heroic");
action: "app.heroic_import";
}
}
}

View File

@@ -127,7 +127,7 @@ class GameShelfWindow(Adw.ApplicationWindow):
self.hidden_library.append(entry)
entry.cover_button.connect("clicked", self.show_overview, game_id)
entry.menu_button.connect("state-flags-changed", self.set_active_game, game_id)
entry.menu_button.get_popover().connect("notify::visible", self.set_active_game, game_id)
if self.visible_widgets == {}:
self.library_bin.set_child(self.notice_empty)
@@ -185,9 +185,8 @@ class GameShelfWindow(Adw.ApplicationWindow):
self.hidden_library_bin.set_child(self.hidden_scrolledwindow)
return filtered
def set_active_game(self, widget, flags, game):
if "GTK_STATE_FLAG_FOCUS_WITHIN" in flags.value_names:
self.active_game_id = game
def set_active_game(self, widget, _, game):
self.active_game_id = game
def get_time(self, timestamp):
date = datetime.datetime.fromtimestamp(timestamp)