diff --git a/src/locales/be/translation.json b/src/locales/be/translation.json
index 6618e4f3..3c03e8bc 100644
--- a/src/locales/be/translation.json
+++ b/src/locales/be/translation.json
@@ -72,7 +72,8 @@
"change": "Змяніць",
"repacks_modal_description": "Абярыце рэпак, які хочаце сцягнуць",
"select_folder_hint": "Каб змяніць папку па змоўчанні, адкрыйце",
- "download_now": "Сцягнуць зараз"
+ "download_now": "Сцягнуць зараз",
+ "favorites": "Улюбленыя"
},
"activation": {
"title": "Актываваць Hydra",
diff --git a/src/locales/bg/translation.json b/src/locales/bg/translation.json
index 857d3ed4..7f5bc6a4 100644
--- a/src/locales/bg/translation.json
+++ b/src/locales/bg/translation.json
@@ -176,7 +176,8 @@
"manage_files_description": "Управлявайте кои файлове ще бъдат архивирани и възстановени",
"select_folder": "Избери папка",
"backup_from": "Резервно копие от {{date}}",
- "custom_backup_location_set": "Задаване на персонализирано местоположение за архивиране"
+ "custom_backup_location_set": "Задаване на персонализирано местоположение за архивиране",
+ "favorites": "Любими игри"
},
"activation": {
"title": "Активирай Hydra",
diff --git a/src/locales/ca/translation.json b/src/locales/ca/translation.json
index 6d689f2b..d341e685 100644
--- a/src/locales/ca/translation.json
+++ b/src/locales/ca/translation.json
@@ -113,7 +113,8 @@
"download_paused": "Descàrrega en pausa",
"last_downloaded_option": "Opció de l'última descàrrega",
"create_shortcut_success": "Accés directe creat satisfactòriament",
- "create_shortcut_error": "Error al crear l'accés directe"
+ "create_shortcut_error": "Error al crear l'accés directe",
+ "favorites": "Favorits"
},
"activation": {
"title": "Activa l'Hydra",
diff --git a/src/locales/cs/translation.json b/src/locales/cs/translation.json
index b3543f94..62ce1952 100644
--- a/src/locales/cs/translation.json
+++ b/src/locales/cs/translation.json
@@ -166,7 +166,8 @@
"manage_files_description": "Spravovat, které soubory budou zálohovány a obnoveny",
"select_folder": "Vybrat složku",
"backup_from": "Zálohy z {{date}}",
- "custom_backup_location_set": "Vlastní umístění záloh nastaveno"
+ "custom_backup_location_set": "Vlastní umístění záloh nastaveno",
+ "favorites": "Oblíbené"
},
"activation": {
"title": "Aktivovat hydru",
diff --git a/src/locales/da/translation.json b/src/locales/da/translation.json
index 9a7c700f..761fefac 100644
--- a/src/locales/da/translation.json
+++ b/src/locales/da/translation.json
@@ -129,7 +129,8 @@
"download": "Download",
"executable_path_in_use": "Eksekverbar allerede i brug af \"{{game}}\"",
"warning": "Advarsel:",
- "hydra_needs_to_remain_open": "Hydra skal forblive åbent for at denne download kan gennemføres. I tilfælde af at Hydra lukker før downloaden er færdig, mister du dit fremskridt."
+ "hydra_needs_to_remain_open": "Hydra skal forblive åbent for at denne download kan gennemføres. I tilfælde af at Hydra lukker før downloaden er færdig, mister du dit fremskridt.",
+ "favorites": "Favoriter"
},
"activation": {
"title": "Aktivér Hydra",
diff --git a/src/locales/de/translation.json b/src/locales/de/translation.json
index c94b0913..bbc37fcd 100644
--- a/src/locales/de/translation.json
+++ b/src/locales/de/translation.json
@@ -113,7 +113,8 @@
"download_paused": "Download ist pausiert",
"last_downloaded_option": "Letzte Download-Option",
"create_shortcut_success": "Verknüpfung erfolgreich erstellt",
- "create_shortcut_error": "Fehler bei Erstellung von Verknüpfung"
+ "create_shortcut_error": "Fehler bei Erstellung von Verknüpfung",
+ "favorites": "Favoriten"
},
"activation": {
"title": "Hydra aktivieren",
diff --git a/src/locales/en/translation.json b/src/locales/en/translation.json
index bbe922f2..8a573cf7 100644
--- a/src/locales/en/translation.json
+++ b/src/locales/en/translation.json
@@ -188,8 +188,10 @@
"download_error_gofile_quota_exceeded": "You have exceeded your Gofile monthly quota. Please await the quota to reset.",
"download_error_real_debrid_account_not_authorized": "Your Real-Debrid account is not authorized to make new downloads. Please check your account settings and try again.",
"download_error_not_cached_in_real_debrid": "This download is not available on Real-Debrid and polling download status from Real-Debrid is not yet available.",
- "download_error_not_cached_in_torbox": "This download is not available on Torbox and polling download status from Torbox is not yet available."
+ "download_error_not_cached_in_torbox": "This download is not available on Torbox and polling download status from Torbox is not yet available.",
+ "favorites": "Favorites"
},
+
"activation": {
"title": "Activate Hydra",
"installation_id": "Installation ID:",
diff --git a/src/locales/es/translation.json b/src/locales/es/translation.json
index 43839e9e..3c0c02c1 100644
--- a/src/locales/es/translation.json
+++ b/src/locales/es/translation.json
@@ -184,7 +184,8 @@
"reset_achievements_description": "Esto reiniciará todos los logros de {{game}}",
"reset_achievements_title": "¿Estás seguro?",
"reset_achievements_success": "Logros reiniciados exitosamente",
- "reset_achievements_error": "Se produjo un error al reiniciar los logros"
+ "reset_achievements_error": "Se produjo un error al reiniciar los logros",
+ "favorites": "Favorites"
},
"activation": {
"title": "Activar Hydra",
diff --git a/src/locales/et/translation.json b/src/locales/et/translation.json
index 97e69a90..f87933a2 100644
--- a/src/locales/et/translation.json
+++ b/src/locales/et/translation.json
@@ -165,7 +165,8 @@
"manage_files_description": "Hallake, millised failid varundatakse ja taastatakse",
"select_folder": "Vali kaust",
"backup_from": "Varundamine kuupäevast {{date}}",
- "custom_backup_location_set": "Kohandatud varundamise asukoht määratud"
+ "custom_backup_location_set": "Kohandatud varundamise asukoht määratud",
+ "favorites": "Töölist"
},
"activation": {
"title": "Aktiveeri Hydra",
diff --git a/src/locales/fa/translation.json b/src/locales/fa/translation.json
index 9d4f7280..92d80cab 100644
--- a/src/locales/fa/translation.json
+++ b/src/locales/fa/translation.json
@@ -72,7 +72,8 @@
"change": "تغییر",
"repacks_modal_description": "ریپک مورد نظر برای دانلود را انتخاب کنید",
"select_folder_hint": "برای تغییر پوشهی پیشفرض به <0>Settings0> بروید",
- "download_now": "الان دانلود کن"
+ "download_now": "الان دانلود کن",
+ "favorites": "علاقهمندیها"
},
"activation": {
"title": "فعال کردن هایدرا",
diff --git a/src/locales/fr/translation.json b/src/locales/fr/translation.json
index 4d310681..6ca4eaec 100644
--- a/src/locales/fr/translation.json
+++ b/src/locales/fr/translation.json
@@ -64,10 +64,12 @@
"close": "Fermer",
"deleting": "Suppression du programme d'installation…",
"playing_now": "Jeu en cours",
- "last_time_played": "Dernièrement joué {{period}}"
+ "last_time_played": "Dernièrement joué {{period}}",
+ "favorites": "Favoris"
},
"activation": {
"title": "Activer Hydra",
+
"installation_id": "ID d'installation :",
"enter_activation_code": "Entrez votre code d'activation",
"message": "Si vous ne savez pas où demander ceci, vous ne devriez pas l'avoir.",
diff --git a/src/locales/hu/translation.json b/src/locales/hu/translation.json
index 0863d1e8..e428880c 100644
--- a/src/locales/hu/translation.json
+++ b/src/locales/hu/translation.json
@@ -72,7 +72,8 @@
"change": "Változtatás",
"repacks_modal_description": "Choose the repack you want to download",
"select_folder_hint": "Ahhoz, hogy megváltoztasd a helyet, hozzákell férned a",
- "download_now": "Töltsd le most"
+ "download_now": "Töltsd le most",
+ "favorites": "Kedvenc játékok"
},
"activation": {
"title": "Hydra Aktiválása",
diff --git a/src/locales/id/translation.json b/src/locales/id/translation.json
index a813d770..1d443c0a 100644
--- a/src/locales/id/translation.json
+++ b/src/locales/id/translation.json
@@ -113,7 +113,8 @@
"download_paused": "Unduhan dijeda",
"last_downloaded_option": "Opsi terakhir diunduh",
"create_shortcut_success": "Pintasan berhasil dibuat",
- "create_shortcut_error": "Gagal membuat pintasan"
+ "create_shortcut_error": "Gagal membuat pintasan",
+ "favorites": "Favorit"
},
"activation": {
"title": "Aktifkan Hydra",
diff --git a/src/locales/it/translation.json b/src/locales/it/translation.json
index 742f889f..cb2d1947 100644
--- a/src/locales/it/translation.json
+++ b/src/locales/it/translation.json
@@ -79,7 +79,8 @@
"previous_screenshot": "Screenshot precedente",
"next_screenshot": "Screenshot successivo",
"screenshot": "Screenshot {{number}}",
- "open_screenshot": "Apri screenshot {{number}}"
+ "open_screenshot": "Apri screenshot {{number}}",
+ "favorites": "Preferiti"
},
"activation": {
"title": "Attiva Hydra",
diff --git a/src/locales/kk/translation.json b/src/locales/kk/translation.json
index e66cd5ed..2edc6328 100644
--- a/src/locales/kk/translation.json
+++ b/src/locales/kk/translation.json
@@ -112,7 +112,8 @@
"download_paused": "Жүктеу тоқтатылды",
"last_downloaded_option": "Соңғы жүктеу нұсқасы",
"create_shortcut_success": "Жарлық жасалды",
- "create_shortcut_error": "Жарлық жасау мүмкін болмады"
+ "create_shortcut_error": "Жарлық жасау мүмкін болмады",
+ "favorites": "Қолданған"
},
"activation": {
"title": "Hydra-ны белсендіру",
diff --git a/src/locales/ko/translation.json b/src/locales/ko/translation.json
index bc8e6056..6dcf9aaf 100644
--- a/src/locales/ko/translation.json
+++ b/src/locales/ko/translation.json
@@ -72,7 +72,8 @@
"change": "바꾸기",
"repacks_modal_description": "다운로드 할 리팩을 선택해 주세요",
"select_folder_hint": "기본 폴더를 바꾸려면 <0>설정0>으로 가세요",
- "download_now": "지금 다운로드"
+ "download_now": "지금 다운로드",
+ "favorites": "즐겨찾기"
},
"activation": {
"title": "Hydra 실행",
diff --git a/src/locales/nb/translation.json b/src/locales/nb/translation.json
index a6fb1bcc..463b6503 100644
--- a/src/locales/nb/translation.json
+++ b/src/locales/nb/translation.json
@@ -129,7 +129,8 @@
"download": "Last ned",
"executable_path_in_use": "Kjørbar fil blir allerede brukt av \"{{game}}\"",
"warning": "Advarsel:",
- "hydra_needs_to_remain_open": "Hydra skal forbli åpent for at denne nedlastingen kan gjennomføres. I tilfelle av at Hydra lukker før nedlastingen er ferdig, mister du fremskrittet ditt."
+ "hydra_needs_to_remain_open": "Hydra skal forbli åpent for at denne nedlastingen kan gjennomføres. I tilfelle av at Hydra lukker før nedlastingen er ferdig, mister du fremskrittet ditt.",
+ "favorites": "Favoritter"
},
"activation": {
"title": "Aktivér Hydra",
diff --git a/src/locales/nl/translation.json b/src/locales/nl/translation.json
index 6d9de5fa..05ecc542 100644
--- a/src/locales/nl/translation.json
+++ b/src/locales/nl/translation.json
@@ -72,7 +72,8 @@
"change": "Verander",
"repacks_modal_description": "Kies de herverpakking die u wilt downloaden",
"select_folder_hint": "Om de standaardmap te wijzigen, gaat u naar <0>instellingen0>",
- "download_now": "Download nu"
+ "download_now": "Download nu",
+ "favorites": "Favorieten"
},
"activation": {
"title": "Activeer Hydra",
diff --git a/src/locales/pl/translation.json b/src/locales/pl/translation.json
index bdaf822c..add0cbda 100644
--- a/src/locales/pl/translation.json
+++ b/src/locales/pl/translation.json
@@ -79,7 +79,8 @@
"previous_screenshot": "Poprzedni zrzut ekranu",
"next_screenshot": "Następny zrzut ekranu",
"screenshot": "Zrzut ekranu {{number}}",
- "open_screenshot": "Otwórz zrzut ekranu {{number}}"
+ "open_screenshot": "Otwórz zrzut ekranu {{number}}",
+ "favorites": "Ulubione"
},
"activation": {
"title": "Aktywuj Hydra",
diff --git a/src/locales/pt-BR/translation.json b/src/locales/pt-BR/translation.json
index b34f1874..9526eadd 100644
--- a/src/locales/pt-BR/translation.json
+++ b/src/locales/pt-BR/translation.json
@@ -177,8 +177,10 @@
"download_error_gofile_quota_exceeded": "Você excedeu sua cota mensal do Gofile. Por favor, aguarde a cota resetar.",
"download_error_real_debrid_account_not_authorized": "Sua conta do Real-Debrid não está autorizada a fazer novos downloads. Por favor, verifique sua assinatura e tente novamente.",
"download_error_not_cached_in_real_debrid": "Este download não está disponível no Real-Debrid e a verificação do status do download não está disponível.",
- "download_error_not_cached_in_torbox": "Este download não está disponível no Torbox e a verificação do status do download não está disponível."
+ "download_error_not_cached_in_torbox": "Este download não está disponível no Torbox e a verificação do status do download não está disponível.",
+ "favorites": "Favoritos"
},
+
"activation": {
"title": "Ativação",
"installation_id": "ID da instalação:",
diff --git a/src/locales/pt-PT/translation.json b/src/locales/pt-PT/translation.json
index 3b8496ae..a89c8be7 100644
--- a/src/locales/pt-PT/translation.json
+++ b/src/locales/pt-PT/translation.json
@@ -157,8 +157,10 @@
"no_download_option_info": "Sem informações disponíveis",
"backup_deletion_failed": "Falha ao apagar o backup",
"max_number_of_artifacts_reached": "Número máximo de backups atingido para este jogo",
- "achievements_not_sync": "As tuas conquistas não estão sincronizadas"
+ "achievements_not_sync": "As tuas conquistas não estão sincronizadas",
+ "favorites": "Favoritos"
},
+
"activation": {
"title": "Ativação",
"installation_id": "ID da instalação:",
diff --git a/src/locales/ro/translation.json b/src/locales/ro/translation.json
index 9003ecc6..d46f049f 100644
--- a/src/locales/ro/translation.json
+++ b/src/locales/ro/translation.json
@@ -84,7 +84,8 @@
"screenshot": "Captură de ecran {{number}}",
"open_screenshot": "Deschide captura de ecran {{number}}",
"download_settings": "Setări de descărcare",
- "downloader": "Program de descărcare"
+ "downloader": "Program de descărcare",
+ "favorites": "Favorite"
},
"activation": {
"title": "Activează Hydra",
diff --git a/src/locales/ru/translation.json b/src/locales/ru/translation.json
index 18b8f1f5..1639cf8c 100644
--- a/src/locales/ru/translation.json
+++ b/src/locales/ru/translation.json
@@ -182,7 +182,8 @@
"no_write_permission": "Невозможно загрузить в эту директорию. Нажмите здесь, чтобы узнать больше.",
"reset_achievements_title": "Вы уверены?",
"reset_achievements_success": "Достижения успешно сброшены",
- "reset_achievements_error": "Не удалось сбросить достижения"
+ "reset_achievements_error": "Не удалось сбросить достижения",
+ "favorites": "Избранное"
},
"activation": {
"title": "Активировать Hydra",
diff --git a/src/locales/tr/translation.json b/src/locales/tr/translation.json
index 9095b693..3423704d 100644
--- a/src/locales/tr/translation.json
+++ b/src/locales/tr/translation.json
@@ -184,7 +184,8 @@
"reset_achievements_description": "Bu işlem {{game}} için tüm başarıları sıfırlar",
"reset_achievements_title": "Emin misiniz?",
"reset_achievements_success": "Başarılar başarıyla sıfırlandı",
- "reset_achievements_error": "Başarılar sıfırlanamadı"
+ "reset_achievements_error": "Başarılar sıfırlanamadı",
+ "favorites": "Favoriler"
},
"activation": {
"title": "Hydra'yı Aktive Et",
diff --git a/src/locales/uk/translation.json b/src/locales/uk/translation.json
index 174e768c..919560a6 100644
--- a/src/locales/uk/translation.json
+++ b/src/locales/uk/translation.json
@@ -110,7 +110,8 @@
"remove_from_library_description": "{{game}} буде видалено з вашої бібліотеки",
"remove_from_library_title": "Ви впевнені?",
"screenshot": "Скріншот",
- "select_executable": "Обрати"
+ "select_executable": "Обрати",
+ "favorites": "Улюблені"
},
"activation": {
"title": "Активувати Hydra",
diff --git a/src/locales/zh/translation.json b/src/locales/zh/translation.json
index ba48a21b..3c99d774 100644
--- a/src/locales/zh/translation.json
+++ b/src/locales/zh/translation.json
@@ -165,7 +165,8 @@
"manage_files_description": "管理哪些文件要备份和恢复",
"select_folder": "选择文件夹",
"backup_from": "{{date}} 时备份",
- "custom_backup_location_set": "自定义备份文件位置"
+ "custom_backup_location_set": "自定义备份文件位置",
+ "favorites": "收藏"
},
"activation": {
"title": "激活 Hydra",
diff --git a/src/main/events/index.ts b/src/main/events/index.ts
index 570fa378..dc64b40e 100644
--- a/src/main/events/index.ts
+++ b/src/main/events/index.ts
@@ -13,6 +13,8 @@ import "./catalogue/get-developers";
import "./hardware/get-disk-free-space";
import "./hardware/check-folder-write-permission";
import "./library/add-game-to-library";
+import "./library/add-game-to-favorites";
+import "./library/remove-game-from-favorites";
import "./library/create-game-shortcut";
import "./library/close-game";
import "./library/delete-game-folder";
diff --git a/src/main/events/library/add-game-to-favorites.ts b/src/main/events/library/add-game-to-favorites.ts
new file mode 100644
index 00000000..93237541
--- /dev/null
+++ b/src/main/events/library/add-game-to-favorites.ts
@@ -0,0 +1,21 @@
+import { registerEvent } from "../register-event";
+import { gamesSublevel, levelKeys } from "@main/level";
+import type { GameShop } from "@types";
+
+const addGameToFavorites = async (
+ _event: Electron.IpcMainInvokeEvent,
+ shop: GameShop,
+ objectId: string
+) => {
+ const gameKey = levelKeys.game(shop, objectId);
+
+ const game = await gamesSublevel.get(gameKey);
+ if (!game) return;
+
+ await gamesSublevel.put(gameKey, {
+ ...game,
+ favorite: true,
+ });
+};
+
+registerEvent("addGameToFavorites", addGameToFavorites);
diff --git a/src/main/events/library/remove-game-from-favorites.ts b/src/main/events/library/remove-game-from-favorites.ts
new file mode 100644
index 00000000..9e592314
--- /dev/null
+++ b/src/main/events/library/remove-game-from-favorites.ts
@@ -0,0 +1,21 @@
+import { registerEvent } from "../register-event";
+import { gamesSublevel, levelKeys } from "@main/level";
+import type { GameShop } from "@types";
+
+const removeGameFromFavorites = async (
+ _event: Electron.IpcMainInvokeEvent,
+ shop: GameShop,
+ objectId: string
+) => {
+ const gameKey = levelKeys.game(shop, objectId);
+
+ const game = await gamesSublevel.get(gameKey);
+ if (!game) return;
+
+ await gamesSublevel.put(gameKey, {
+ ...game,
+ favorite: false,
+ });
+};
+
+registerEvent("removeGameFromFavorites", removeGameFromFavorites);
diff --git a/src/preload/index.ts b/src/preload/index.ts
index e1393269..ef61cbb9 100644
--- a/src/preload/index.ts
+++ b/src/preload/index.ts
@@ -110,11 +110,16 @@ contextBridge.exposeInMainWorld("electron", {
executablePath: string | null
) =>
ipcRenderer.invoke("updateExecutablePath", shop, objectId, executablePath),
+ addGameToFavorites: (shop: GameShop, objectId: string) =>
+ ipcRenderer.invoke("addGameToFavorites", shop, objectId),
+ removeGameFromFavorites: (shop: GameShop, objectId: string) =>
+ ipcRenderer.invoke("removeGameFromFavorites", shop, objectId),
updateLaunchOptions: (
shop: GameShop,
objectId: string,
launchOptions: string | null
) => ipcRenderer.invoke("updateLaunchOptions", shop, objectId, launchOptions),
+
selectGameWinePrefix: (
shop: GameShop,
objectId: string,
diff --git a/src/renderer/src/components/sidebar/sidebar.tsx b/src/renderer/src/components/sidebar/sidebar.tsx
index 5801de37..816bbdb0 100644
--- a/src/renderer/src/components/sidebar/sidebar.tsx
+++ b/src/renderer/src/components/sidebar/sidebar.tsx
@@ -206,6 +206,48 @@ export function Sidebar() {
+
+ {t("favorites")}
+
+
+ {sortedLibrary
+ .filter((game) => game.favorite)
+ .map((game) => (
+ -
+
+
+ ))}
+
+
+
{t("my_library")}
@@ -217,39 +259,41 @@ export function Sidebar() {
/>
- {filteredLibrary.map((game) => (
- -
-
+
+ ))}
diff --git a/src/renderer/src/declaration.d.ts b/src/renderer/src/declaration.d.ts
index ab485359..8e31aa83 100644
--- a/src/renderer/src/declaration.d.ts
+++ b/src/renderer/src/declaration.d.ts
@@ -96,6 +96,11 @@ declare global {
objectId: string,
executablePath: string | null
) => Promise;
+ addGameToFavorites: (shop: GameShop, objectId: string) => Promise;
+ removeGameFromFavorites: (
+ shop: GameShop,
+ objectId: string
+ ) => Promise;
updateLaunchOptions: (
shop: GameShop,
objectId: string,
diff --git a/src/renderer/src/pages/game-details/hero/hero-panel-actions.tsx b/src/renderer/src/pages/game-details/hero/hero-panel-actions.tsx
index 68290313..f2884a1f 100644
--- a/src/renderer/src/pages/game-details/hero/hero-panel-actions.tsx
+++ b/src/renderer/src/pages/game-details/hero/hero-panel-actions.tsx
@@ -1,6 +1,8 @@
import {
DownloadIcon,
GearIcon,
+ HeartFillIcon,
+ HeartIcon,
PlayIcon,
PlusCircleIcon,
} from "@primer/octicons-react";
@@ -52,6 +54,30 @@ export function HeroPanelActions() {
}
};
+ const addGameToFavorites = async () => {
+ setToggleLibraryGameDisabled(true);
+
+ try {
+ await window.electron.addGameToFavorites(shop, objectId!);
+ updateLibrary();
+ updateGame();
+ } finally {
+ setToggleLibraryGameDisabled(false);
+ }
+ };
+
+ const removeGameFromFavorites = async () => {
+ setToggleLibraryGameDisabled(true);
+
+ try {
+ await window.electron.removeGameFromFavorites(shop, objectId!);
+ updateLibrary();
+ updateGame();
+ } finally {
+ setToggleLibraryGameDisabled(false);
+ }
+ };
+
const openGame = async () => {
if (game) {
if (game.executablePath) {
@@ -159,6 +185,16 @@ export function HeroPanelActions() {
{gameActionButton()}
+
+ {game.favorite ? : }
+
+
+
setShowGameOptionsModal(true)}
theme="outline"
diff --git a/src/types/level.types.ts b/src/types/level.types.ts
index aa28d9dd..2956165a 100644
--- a/src/types/level.types.ts
+++ b/src/types/level.types.ts
@@ -42,6 +42,7 @@ export interface Game {
winePrefixPath?: string | null;
executablePath?: string | null;
launchOptions?: string | null;
+ favorite?: boolean;
}
export interface Download {