Merge pull request #353 from an-anime-team/next

Release 3.9.5
This commit is contained in:
Observer KRypt0n_ 2024-03-24 12:49:38 +02:00 committed by GitHub
commit c8b1ea3b2b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
59 changed files with 1337 additions and 1094 deletions

View file

@ -27,7 +27,7 @@ jobs:
- name: Install dependencies
run: |
apt update
apt install -y libgtk-4-dev libadwaita-1-dev git curl
apt install -y build-essential libgtk-4-dev libadwaita-1-dev git curl
- uses: dtolnay/rust-toolchain@stable
with:

View file

@ -26,7 +26,7 @@ jobs:
- name: Install dependencies
run: |
apt update
apt install -y libgtk-4-dev libadwaita-1-dev git curl
apt install -y build-essential libgtk-4-dev libadwaita-1-dev git curl
- uses: dtolnay/rust-toolchain@stable
with:

View file

@ -7,6 +7,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
### Added
- Bundle `applications-system-symbolic` icon to the app
- Added "force grab cursor" option to the gamescope settings
- Added Thai
- Added Ukrainian
### Changed
- Update wish url
- Updated dependencies
- Improved app args parsing
- Updated locales
### Fixed
- Fixed GtkSwitch UI state representation
## [3.9.4] - 29.12.2023
### Changed

644
Cargo.lock generated

File diff suppressed because it is too large Load diff

View file

@ -15,34 +15,35 @@ lto = true
opt-level = "s"
[build-dependencies]
glib-build-tools = "0.18"
glib-build-tools = "0.19"
[dependencies.anime-launcher-sdk]
git = "https://github.com/an-anime-team/anime-launcher-sdk"
tag = "1.12.5"
tag = "1.12.7"
features = ["all", "genshin"]
# path = "../anime-launcher-sdk" # ! for dev purposes only
[dependencies]
relm4 = { version = "0.7.0-beta.2", features = ["macros", "libadwaita"] }
gtk = { package = "gtk4", version = "0.7.3", features = ["v4_12"] }
adw = { package = "libadwaita", version = "0.5.3", features = ["v1_3"] }
relm4 = { version = "0.8.1", features = ["macros", "libadwaita"] }
gtk = { package = "gtk4", version = "0.8.1", features = ["v4_12"] }
adw = { package = "libadwaita", version = "0.6.0", features = ["v1_4"] }
rfd = { version = "0.12.1", features = ["xdg-portal"], default-features = false }
rfd = { version = "0.14.1", features = ["xdg-portal", "tokio"], default-features = false }
open = "5.0.0"
whatadistro = "0.1.0"
serde_json = "1.0"
anyhow = "1.0"
lazy_static = "1.4.0"
cached = { version = "0.46", features = ["proc_macro"] }
cached = { version = "0.49", features = ["proc_macro"] }
md-5 = { version = "0.10", features = ["asm"] }
enum-ordinalize = "4.3"
tracing = "0.1"
tracing-subscriber = "0.3"
fluent-templates = "0.8"
fluent-templates = "0.9"
unic-langid = "0.9"
human-panic = "1.2.2"

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
<path d="m 8 0 c -0.550781 0 -1 0.449219 -1 1 v 0.238281 c 0 0.46875 -0.375 0.902344 -0.820312 1.046875 c -0.023438 0.007813 -0.042969 0.011719 -0.0625 0.019532 c -0.445313 0.148437 -1.003907 0.019531 -1.28125 -0.359376 l -0.140626 -0.195312 c -0.15625 -0.214844 -0.390624 -0.359375 -0.652343 -0.398438 c -0.261719 -0.042968 -0.527344 0.019532 -0.742188 0.175782 c -0.449219 0.324218 -0.550781 0.953125 -0.222656 1.398437 l 0.140625 0.199219 c 0.277344 0.378906 0.226562 0.953125 -0.050781 1.328125 c -0.011719 0.015625 -0.023438 0.035156 -0.035157 0.050781 c -0.273437 0.378906 -0.804687 0.601563 -1.25 0.457032 l -0.230468 -0.074219 c -0.523438 -0.171875 -1.089844 0.117187 -1.257813 0.640625 c -0.171875 0.527344 0.113281 1.089844 0.640625 1.261718 l 0.222656 0.074219 c 0.445313 0.144531 0.738282 0.636719 0.75 1.101563 v 0.070312 c 0.015626 0.464844 -0.304687 0.960938 -0.746093 1.105469 l -0.226563 0.074219 c -0.527344 0.167968 -0.8125 0.734375 -0.640625 1.257812 c 0.167969 0.527344 0.734375 0.8125 1.257813 0.644532 l 0.230468 -0.078126 c 0.445313 -0.144531 0.976563 0.078126 1.25 0.457032 c 0.011719 0.019531 0.027344 0.035156 0.039063 0.050781 c 0.277344 0.375 0.324219 0.953125 0.050781 1.328125 l -0.144531 0.203125 c -0.324219 0.445313 -0.226563 1.070313 0.222656 1.394531 c 0.445313 0.324219 1.070313 0.226563 1.394531 -0.21875 l 0.144532 -0.199218 c 0.273437 -0.375 0.835937 -0.507813 1.277344 -0.359376 c 0.019531 0.007813 0.042968 0.011719 0.0625 0.019532 c 0.445312 0.140625 0.820312 0.578125 0.820312 1.046875 v 0.238281 c 0 0.550781 0.449219 1 1 1 c 0.554688 0 1 -0.449219 1 -1 v -0.238281 c 0 -0.46875 0.378906 -0.90625 0.824219 -1.046875 c 0.019531 -0.007813 0.039062 -0.015625 0.0625 -0.019532 c 0.441406 -0.148437 1.003906 -0.019531 1.277343 0.359376 l 0.144532 0.199218 c 0.324218 0.445313 0.949218 0.542969 1.394531 0.21875 c 0.445313 -0.324218 0.546875 -0.949218 0.222656 -1.394531 l -0.144531 -0.203125 c -0.277344 -0.375 -0.226562 -0.953125 0.050781 -1.328125 c 0.011719 -0.015625 0.023438 -0.03125 0.035157 -0.050781 c 0.273437 -0.378906 0.804687 -0.601563 1.25 -0.457032 l 0.234374 0.078126 c 0.523438 0.167968 1.089844 -0.117188 1.257813 -0.644532 c 0.171875 -0.523437 -0.117187 -1.089844 -0.640625 -1.257812 l -0.230469 -0.074219 c -0.445312 -0.144531 -0.734375 -0.640625 -0.742187 -1.105469 c -0.003906 -0.023437 -0.003906 -0.046875 -0.003906 -0.070312 c -0.015626 -0.464844 0.300781 -0.957032 0.746093 -1.101563 l 0.230469 -0.074219 c 0.523438 -0.171874 0.8125 -0.734374 0.640625 -1.261718 c -0.171875 -0.523438 -0.734375 -0.8125 -1.257813 -0.640625 l -0.230468 0.074219 c -0.445313 0.144531 -0.976563 -0.078126 -1.25 -0.457032 c -0.015625 -0.015625 -0.027344 -0.035156 -0.039063 -0.050781 c -0.277343 -0.375 -0.324219 -0.949219 -0.050781 -1.328125 l 0.144531 -0.199219 c 0.324219 -0.445312 0.226563 -1.074219 -0.222656 -1.398437 c -0.214844 -0.15625 -0.480469 -0.21875 -0.742187 -0.175782 c -0.261719 0.039063 -0.5 0.183594 -0.652344 0.398438 l -0.144532 0.195312 c -0.273437 0.378907 -0.835937 0.507813 -1.277343 0.363282 c -0.023438 -0.007813 -0.042969 -0.015625 -0.066407 -0.023438 c -0.441406 -0.140625 -0.820312 -0.578125 -0.820312 -1.046875 v -0.238281 c 0 -0.550781 -0.449219 -1 -1 -1 z m 0 4 c 0.871094 0 1.675781 0.273438 2.332031 0.742188 c 0.003907 0.007812 0.011719 0.015624 0.019531 0.023437 c 0.011719 0.003906 0.019532 0.007813 0.03125 0.015625 c 0.660157 0.484375 1.160157 1.175781 1.421876 1.976562 v 0.007813 s 0.003906 0.003906 0.003906 0.007813 c 0.292968 0.851562 0.15625 1.65625 0 2.457031 c 0 0 -0.003906 0.003906 -0.003906 0.007812 v 0.003907 c -0.257813 0.800781 -0.757813 1.488281 -1.414063 1.976562 c -0.015625 0.003906 -0.027344 0.011719 -0.039063 0.019531 c -0.007812 0.007813 -0.015624 0.011719 -0.019531 0.019531 c -0.65625 0.46875 -1.460937 0.742188 -2.332031 0.742188 c -0.855469 0 -1.644531 -0.265625 -2.289062 -0.714844 c -0.019532 -0.015625 -0.042969 -0.03125 -0.0625 -0.046875 c -0.011719 -0.007812 -0.023438 -0.015625 -0.035157 -0.019531 c -0.648437 -0.484375 -1.148437 -1.160156 -1.40625 -1.945312 c -0.003906 -0.011719 -0.007812 -0.023438 -0.011719 -0.035157 c -0.003906 -0.007812 -0.007812 -0.011719 -0.011718 -0.019531 c -0.28125 -0.847656 -0.148438 -1.644531 0 -2.4375 c 0.003906 -0.003906 0.007812 -0.011719 0.011718 -0.015625 c 0.003907 -0.015625 0.007813 -0.027344 0.011719 -0.039063 c 0.261719 -0.789062 0.761719 -1.464843 1.414063 -1.945312 c 0.007812 -0.007812 0.019531 -0.011719 0.027344 -0.015625 c 0.019531 -0.015625 0.042968 -0.035156 0.0625 -0.050781 c 0.644531 -0.449219 1.433593 -0.714844 2.289062 -0.714844 z m 0 0" fill="#2e3436"/>
</svg>

After

Width:  |  Height:  |  Size: 4.7 KiB

View file

@ -32,3 +32,4 @@ ko-kr = 한국어
id-id = Indonesia
vi-vn = Tiếng Việt
uk-ua = Українська
th-th = ไทย

View file

@ -11,3 +11,6 @@ nis-description = Eine Open-Source-Upscaling-Technik, die von Nvidia als herstel
other-settings = Andere Einstellungen
framerate-limit = Framerate-Limit
unfocused-framerate-limit = Unfokussiert Framerate-Limit
force-grab-cursor = Cursor greifen erzwingen
force-grab-cursor-description = Verwende immer den relativen Mausmodus, anstatt abhängig von der Sichtbarkeit des Cursors umzuschalten. Der Mauszeiger wird korrekt in der Mitte des Spiels zentriert.

View file

@ -11,3 +11,6 @@ nis-description = An open source upscaling technique developed by Nvidia as a cr
other-settings = Other settings
framerate-limit = Framerate limit
unfocused-framerate-limit = Unfocused framerate limit
force-grab-cursor = Force grab cursor
force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game

View file

@ -11,3 +11,6 @@ nis-description = Una técnica de escalado de código abierto desarrollada por N
other-settings = Otras opciones
framerate-limit = Límite de framerate
unfocused-framerate-limit = Límite de framerate en segundo plano
force-grab-cursor = Force grab cursor
force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game

View file

@ -11,3 +11,6 @@ nis-description = Une technologie de mise à l'échelle Open Source développée
other-settings = Autres paramètres
framerate-limit = Limitation des FPS
unfocused-framerate-limit = Limitation des FPS hors focus
force-grab-cursor = Force grab cursor
force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game

View file

@ -48,8 +48,8 @@ fps-unlocker-description = Eltávolítja az fps limitet. Az anti-cheat észreveh
enabled = Bekapcsolva
fps-unlocker-interval = Overwrite interval
fps-unlocker-interval-description = Delay in milliseconds between overwriting the FPS limit value. Periodic overwrites are necessary to prevent it from resetting
fps-unlocker-interval = Felülírási időköz
fps-unlocker-interval-description = Milliszekundumban (ms) hogy mekkora időközönként van felülírva az fps limit értéke. Erre szükség van hogy ne állítsa vissza magát az fps limit
window-mode = Ablak mód
borderless = Keretmentes

View file

@ -11,3 +11,6 @@ nis-description = Open source upscaling technika az Nvidia-tól, alternatíva a
other-settings = Egyéb beállítások
framerate-limit = FPS limit
unfocused-framerate-limit = Fókuszon kívüli FPS limit
force-grab-cursor = Force grab cursor
force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game

View file

@ -48,8 +48,8 @@ fps-unlocker-description = Meniadakan batas maksimum frame yang dapat dirender o
enabled = Aktifkan
fps-unlocker-interval = Overwrite interval
fps-unlocker-interval-description = Delay in milliseconds between overwriting the FPS limit value. Periodic overwrites are necessary to prevent it from resetting
fps-unlocker-interval = Interval penulisan ulang FPS
fps-unlocker-interval-description = Jeda antara penulisan ulang nilai batas FPS dalam milidetik. Penulisan ulang secara berkala dibutuhkan untuk mencegah nilai batas FPS kembali seperti semula
window-mode = Window Mode
borderless = Tanpa border

View file

@ -11,3 +11,6 @@ nis-description = Teknik peningkatan skala yang dikembangkan oleh Nvidia sebagai
other-settings = Pengaturan lainnya
framerate-limit = Batas framerate
unfocused-framerate-limit = Batas framerate saat tidak fokus
force-grab-cursor = Force grab cursor
force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game

View file

@ -48,8 +48,8 @@ fps-unlocker-description = Rimuovi la limitazione del rendering dei frame modifi
enabled = Abilitato
fps-unlocker-interval = Overwrite interval
fps-unlocker-interval-description = Delay in milliseconds between overwriting the FPS limit value. Periodic overwrites are necessary to prevent it from resetting
fps-unlocker-interval = Intervallo di sovrascrittura
fps-unlocker-interval-description = Ritardo in millisecondi tra le sovrascritture del valore limite FPS. Sovrascritture periodiche sono necessarie per impedire che si reimposti al valore predefinito
window-mode = Modalità della finestra
borderless = Senza bordi

View file

@ -11,3 +11,6 @@ nis-description = Una tecnica di upscaling open-source sviluppata da Nvidia per
other-settings = Altre impostazioni
framerate-limit = Limite del framerate
unfocused-framerate-limit = Limite del framerate quando fuori dal focus
force-grab-cursor = Forza la cattura del cursore
force-grab-cursor-description = Usa sempre la modalità relativa del mouse invece di cambiare in base alla visibilità del cursore. Il cursore del mouse verrà correttamente centrato nel gioco

View file

@ -11,3 +11,6 @@ nis-description = An open source upscaling technique developed by Nvidia as a cr
other-settings = その他の設定
framerate-limit = FPS制限
unfocused-framerate-limit = 非フォーカス時の最大FPS
force-grab-cursor = Force grab cursor
force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game

View file

@ -11,3 +11,6 @@ nis-description = Nvidia가 독점 DLSS 솔루션에 대한 낮은 오버헤드
other-settings = 기타 설정
framerate-limit = 프레임 속도 제한
unfocused-framerate-limit = 초점이 맞지 않는 프레임 속도 제한
force-grab-cursor = Force grab cursor
force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game

View file

@ -11,3 +11,6 @@ nis-description = Een open source opschalingstechniek ontwikkeld door Nvidia als
other-settings = Andere instellingen
framerate-limit = Frameratelimiet
unfocused-framerate-limit = Ongefocuste frameratelimiet
force-grab-cursor = Force grab cursor
force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game

View file

@ -11,3 +11,6 @@ nis-description = Technika skalowania otwartego źródła opracowana przez Nvidi
other-settings = Inne ustawienia
framerate-limit = Limit klatek na sekundę
unfocused-framerate-limit = Limit klatek na sekundę po utraceniu skupienia
force-grab-cursor = Force grab cursor
force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game

View file

@ -11,3 +11,6 @@ nis-description = Uma técnica de upscaling de código aberto desenvolvida pela
other-settings = Outras configuraões
framerate-limit = Limite de taxa de quadros
unfocused-framerate-limit = Limite de taxa de quadros desfocado
force-grab-cursor = Force grab cursor
force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game

View file

@ -11,3 +11,6 @@ nis-description = Открытая техника масштабирования
other-settings = Другие настройки
framerate-limit = Лимит числа кадров
unfocused-framerate-limit = Лимит числа кадров вне фокуса
force-grab-cursor = Принудительный захват курсора
force-grab-cursor-description = Использовать относительный режим мыши вместо переворачивания в зависимости от видимости курсора. Курсор мыши будет правильно центрирован в игре

View file

@ -11,3 +11,6 @@ nis-description = En uppskalningsteknik med öppen källkod som utvecklats av Nv
other-settings = Andra inställningar
framerate-limit = Gräns för bilduppdateringshastighet
unfocused-framerate-limit = Gräns för bilduppdateringshastighet utan fokus
force-grab-cursor = Force grab cursor
force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game

View file

@ -0,0 +1,20 @@
components = ส่วนประกอบ
components-description = จัดการเวอร์ชัน Wine และ DXVK
selected-version = เวอร์ชันที่เลือก
recommended-only = แสดงเเวอร์ชั่นที่แนะนำเท่านั้น
wine-version = เวอร์ชันของ Wine
wine-recommended-description = แสดงเฉพาะเวอร์ชัน Wine ที่แนะนำเท่านั้น
wine-options = การตั้งค่าของ Wine
wine-use-shared-libraries = ใช้ไลบรารีที่ใช้ร่วมกันของ Wine
wine-use-shared-libraries-description = ตั้งค่าตัว LD_LIBRARY_PATH เพื่อโหลดไลบรารีระบบจากบิลด์ Wine ที่เลือก
gstreamer-use-shared-libraries = ใช้ไลบรารีที่ใช้ร่วมกันของ gstreamer
gstreamer-use-shared-libraries-description = ตั้งค่าตัวแปร GST_PLUGIN_PATH เพื่อโหลดไลบรารี gstreamer จากบิลด์ Wine ที่เลือก
dxvk-version = เวอร์ชันของ DXVK
dxvk-selection-disabled = การเลือก DXVK ถูกปิดใช้งานโดยการตั้งค่ากลุ่ม Wine ของคุณ
dxvk-recommended-description = แสดงเฉพาะเวอร์ชัน DXVK ที่แนะนำเท่านั้น

View file

@ -0,0 +1,57 @@
game-settings-description = จัดการการตั้งค่าในเกมและเซสชันบัญชี
sandbox-settings-description = รันเกมในแซนด์บ็อกซ์ คล้ายกับที่ Flatpak ทำ
environment-settings-description = ระบุตัวแปรสภาวะแวดล้อมและคำสั่งเปิดเกม
wine = Wine
synchronization = การซิงโครไนซ์
wine-sync-description = เทคโนโลยีที่ใช้ในการประสานเหตุการณ์ Wine ภายใน
language = ภาษา
wine-lang-description = ภาษาที่ใช้ในสภาพแวดล้อมไวน์ สามารถแก้ไขปัญหารูปแบบแป้นพิมพ์ได้
system = ระบบ
borderless-window = หน้าต่างไร้ขอบ
virtual-desktop = เดสก์ท็อปเสมือน
map-drive-c = เชื่อม ไดรฟ์ C:
map-drive-c-description = เชื่อมโยง ไดรฟ์ C: จาก Wine prefix ไปยังระบบ dosdevices โดยอัตโนมัติ
map-game-folder = เชื่อม โฟลเดอร์เกม
map-game-folder-description = เชื่อมโยงโฟลเดอร์เกมไปยังระบบ dosdevices โดยอัตโนมัติ
game = เกม
hud = HUD
fsr = FSR
fsr-description = ยกระดับความชัดเกมให้เข้ากับขนาดจอภาพของคุณ หากต้องการใช้เลือกความละเอียดที่ต่ำกว่าในการตั้งค่าของเกมแล้วกด Alt+Enter
ultra-quality = คุณภาพเยี่ยม
quality = คุณภาพ
balanced = พอประมาณ
performance = เร็วที่สุด
gamemode = Gamemode
gamemode-description = จัดลำดับความสำคัญของเกมเหนือกระบวนการอื่น
gamescope = Gamescope
gamescope-description = Gamescope เป็นเครื่องมือจาก Valve ที่ช่วยให้เกมทำงานในอินสแตนซ์ Xwayland ที่แยกจากระบบ และรองรับ GPU ของ AMD, Intel และ Nvidia
discord-rpc = Discord RPC
discord-rpc-description = Discord RPC อนุญาตให้คุณให้ข้อมูล Discord ที่คุณกำลังเล่นเกมอยู่เพื่อแจ้งให้เพื่อนของคุณทราบ
icon = ไอคอน
title = หัวข้อ
description = คำอธิบาย
fps-unlocker = FPS Unlocker
fps-unlocker-description = ลบข้อจำกัดในการเรนเดอร์เฟรมโดยการปรับเปลี่ยนหน่วยความจำของเกม สามารถตรวจจับได้โดยระบบการป้องกันการโกงของเกม
enabled = เปิดใช้งาน
fps-unlocker-interval = เขียนทับช่วงเวลา
fps-unlocker-interval-description = การเขียนทับค่าจำกัด FPS ทุกมิลลิวินาที จำเป็นต้องเขียนทับเป็นระยะเพื่อป้องกันไม่ให้รีเซ็ต
window-mode = โหมดหน้าต่างเกม
borderless = โหมดไร้ขอบเขต
popup = ป๊อปอัพ
fullscreen = เต็มจอ

View file

@ -0,0 +1,7 @@
environment = สภาวะแวดล้อม
game-command = คำสั่งเกม
game-command-description = คำสั่งที่ใช้ในการเปิดเกม ตัวยึดตำแหน่ง %command% ถูกสร้างขึ้นโดยอัตโนมัติโดยตัวเรียกใช้งาน ตัวอย่างเช่น: gamemoderun '%command%'
new-variable = ตัวแปรใหม่
name = ชื่อ
value = ค่า
add = เพิ่ม

View file

@ -0,0 +1,66 @@
launcher-folder-opening-error = ไม่สามารถเปิดโฟลเดอร์ Launcher ได้
game-folder-opening-error = ไม่สามารถเปิดโฟลเดอร์เกมได้
config-file-opening-error = ไม่สามารถเปิดไฟล์ config ได้
debug-file-opening-error = ไม่สามารถเปิดไฟล์ debug ได้
wish-url-search-failed = ไม่พบ URL การอธิษฐาน
wish-url-opening-error = ไม่สามารถเปิด URL การอธิษฐานได้
wine-run-error = ล้มเหลวในการปฏิบัติการเรียกใช้ไฟล์ {$executable} โดยใช้ Wine
game-launching-failed = ไม่สามารถเปิดเกมได้
failed-get-selected-wine = ไม่สามารถดาวน์โหลดเวอร์ชัน wine ที่เลือกไปได้
downloading-failed = การดาวน์โหลดล้มเหลว
unpacking-failed = การแกะไฟล์ล้มเหลว
kill-game-process-failed = ไม่สามารถฆ่ากระบวนการของเกมได้
game-file-repairing-error = ไม่สามารถซ่อมแซมไฟล์เกมได้
integrity-files-getting-error = ไม่สามารถรับไฟล์การตรวจสอบความสมบูรณ์ได้
background-downloading-failed = ดาวน์โหลดภาพพื้นหลังไม่สำเร็จ
components-index-sync-failed = ไม่สามารถซิงค์ index ส่วนประกอบ
components-index-verify-failed = ไม่สามารถตรวจสอบ index ส่วนประกอบได้
config-update-error = บันทึกการกำหนดค่าไม่สำเร็จ
wine-prefix-update-failed = ไม่สามารถอัปเดตการตั้งค่า Wine
dxvk-install-failed = ติดตั้ง DXVK ไม่สำเร็จ
voice-package-deletion-error = ลบแพ็คเกจเสียงไม่สำเร็จ
game-diff-finding-error = ไม่พบความแตกต่างของเกม
patch-info-fetching-error = ไม่สามารถเรียกข้อมูลแพตช์ได้
launcher-state-updating-error = อัปเดตสถานะ launcher ไม่สำเร็จ
package-not-available = ไม่พบแพ็คเกจนี้: {$package}
wine-download-error = ดาวน์โหลด Wine ไม่สำเร็จ
wine-unpack-errror = ไม่สามารถแกะไฟล์ Wine ได้
wine-install-failed = ไม่สามารถติดตั้ง Wine ได้
dxvk-download-error = ดาวน์โหลด DXVK ไม่สำเร็จ
dxvk-unpack-error = ไม่สามารถแกะไฟล์ DXVK ได้
dxvk-apply-error = ไม่สามารถติดตั้ง DXVK ได้
downloaded-wine-list-failed = ไม่สามารถแสดงเวอร์ชัน Wine ที่ดาวน์โหลดไปแล้วได้
patch-sync-failed = ไม่สามารถซิงค์โฟลเดอร์แพตช์ได้
patch-state-check-failed = ไม่สามารถตรวจสอบสถานะโฟลเดอร์แพตช์ได้
game-patching-error = ไม่สามารถแพตช์เกมได้
# Disable telemetry
telemetry-servers-disabling-error = ไม่สามารถปิดใช้งานเซิร์ฟเวอร์การวัดและส่งข้อมูล
# Sandbox
documentation-url-open-failed = ไม่สามารถเปิด URL เอกสารประกอบ
# Game
game-session-add-failed = ไม่สามารถเพิ่มเซสชันเกมได้
game-session-update-failed = ไม่สามารถอัปเดตเซสชันเกมได้
game-session-remove-failed = ไม่สามารถลบเซสชันเกมได้
game-session-set-current-failed = ไม่สามารถตั้งเซสชันเกมปัจจุบันได้
game-session-apply-failed = ไม่สามารถติดตั้งเซสชันเกมได้
# Enhancements
discord-rpc-icons-fetch-failed = ไม่สามารถดึงไอคอน Discord RPC
discord-rpc-icon-download-failed = ไม่สามารถดาวน์โหลดไอคอน Discord RPC

View file

@ -0,0 +1,64 @@
welcome = ยินดีต้อนรับ
welcome-page-message =
สวัสดี! ยินดีต้อนรับสู่ An Anime Game Launcher
เราจำเป็นต้องเตรียมบางสิ่งและดาวน์โหลดส่วนประกอบเริ่มต้นก่อนที่คุณจะสามารถเล่นเกมได้
tos-violation-warning = คำเตือนการละเมิดข้อตกลงการใช้บริการของเกม
tos-violation-warning-message =
Launcher นี้เป็นเครื่องมือที่ไม่การเกี่ยวข้องแต่อย่างใดกับ {company-name} หรือ {company-alter-name}.
เครื่องมือนี้ออกแบบมาเพื่ออำนวยความสะดวกในการเล่น {game-name} บน Linux และสร้างขึ้นโดยมีวัตถุประสงค์เพียงอย่างเดียวในการติดตั้งและรันเกมโดยมีความยุ่งยากที่น้อยลง
Launcher นี้ทำงานได้โดยใช้คอมโพเนนต์ที่มีอยู่แล้ว ผู้ใช้จึงจะได้รับประสบการณ์ที่เรียบง่าย
อย่างไรก็ตาม ส่วนประกอบบางอย่างที่ใช้อาจฝ่าฝืนข้อกำหนดในการให้บริการของ {company-name} สำหรับเกม {game-name}
หากคุณใช้ Launcher นี้ บัญชีของคุณอาจถูกระบุว่าไม่เป็นไปตามข้อกำหนดของ {company-name}/{company-alter-name}.
หากเกิดเหตุการณ์เช่นนี้ เนื่องจากบัญชีของคุณไม่ปฏิบัติตามข้อกำหนด, {company-name}/{company-alter-name} จึงมีอิสระที่จะทำสิ่งที่พวกเขาอยาก รวมถึงการแบนบัญชีของคุณ
หากคุณเข้าใจถึงความเสี่ยงในการพยายามเล่นเกมอย่างไม่เป็นทางการ ให้กด ตกลง เพื่อดำเนินการต่อ
tos-dialog-title = คุณแน่ใจหรือว่าคุณเข้าใจสิ่งที่เราพูด?
tos-dialog-message =
1. อย่าเผยแพร่ข้อมูลใดๆ เกี่ยวกับโครงการนี้
2. อย่าใช้มันในทางที่ผิดโดยใช้ไคลเอนต์ดัดแปลง
3. ถามคำถามเป็นพิเศษในเซิร์ฟเวอร์ Discord หรือ Matrix ของเรา
dependencies = โปรแกรมที่จำเป็น
missing-dependencies-title = คุณขาดโปรแกรมที่จำเป็น!
missing-dependencies-message = คุณต้องติดตั้งแพ็คเกจบางอย่างให้กับระบบของคุณก่อนที่จะดำเนินการติดตั้งต่อ
default-paths = เส้นทางเริ่มต้น
choose-default-paths = เลือกเส้นทางเริ่มต้น
show-all-folders = ฉันรู้ว่าฉันกำลังทำอะไรอยู่
show-all-folders-subtitle = แสดงการตั้งค่าการเลือกเส้นทางเพิ่มเติม (ทำตามที่ฉันบอก...)
runners-folder = โฟลเดอร์ Runners
dxvks-folder = โฟลเดอร์ DXVKs
wine-prefix-folder = โฟลเดอร์ prefix ของ Wine
global-game-installation-folder = โฟลเดอร์การติดตั้งเวอร์ชันเกมสากล
chinese-game-installation-folder = โฟลเดอร์การติดตั้งเวอร์ชันเกมจีน
fps-unlocker-folder = โฟลเดอร์ FPS Unlocker
components-index = Index ส่วนประกอบ
patch-folder = โฟลเดอร์แพทช์
temp-folder = โฟลเดอร์ชั่วคราว
migrate = ย้าย
select-voice-packages = เลือกแพ็คเกจภาษาเสียง
download-components = ดาวน์โหลดส่วนประกอบ
download-dxvk = ดาวน์โหลด DXVK
apply-dxvk = ติดตั้ง DXVK
finish = สำเร็จ
finish-title = ทุกอย่างเสร็จแล้ว!
finish-message = ดาวน์โหลดส่วนประกอบพื้นฐานทั้งหมดแล้ว ตอนนี้คุณสามารถรีสตาร์ท Launcher และดาวน์โหลดเกมได้ ยินดีต้อนรับสู่ club ของเรา!

View file

@ -0,0 +1,7 @@
game-sessions = เซสชันเกม
active-sessions = เซสชันที่ใช้งานอยู่
active-session-description = เซสชั่นเกมที่เลือกในปัจจุบัน อัปเดตหลังจากเปิดตัวเกมแต่ละครั้ง
update-session = อัปเดตเซสชันโดยใช้ค่าตั้งค่า Wine ปัจจุบัน
delete-session = ลบเซสชัน

View file

@ -0,0 +1,16 @@
game-resolution = ความละเอียดของเกม
gamescope-resolution = ความละเอียดของ Gamescope
upscaling = การเพิ่มขนาดความละเอียด
integer-scaling = มาตราส่วนจำนวนเต็ม
integer-scaling-description = เปลี่ยนแต่ละพิกเซลเป็นกลุ่มสี่เหลี่ยมจัตุรัสหรือสี่เหลี่ยมของจำนวนเต็มของพิกเซลสีเดียวกัน ป้องกันการสูญเสียความคมชัดเมื่อปรับขนาด Full HD เป็น 4K
gamescope-fsr-description = เทคนิคการขยายขนาดที่พัฒนาโดย AMD เพื่อคุณภาพการขยายขนาดที่ดีขึ้น
nis-description = เทคนิคการขยายขนาดโอเพ่นซอร์สที่พัฒนาโดย Nvidia เป็นทางเลือกข้ามผู้จำหน่ายและมีค่าใช้จ่ายต่ำแทนโซลูชัน DLSS ที่เป็นกรรมสิทธิ์ ซึ่งหมายความว่าใช้งานได้กับ AMD และ Intel GPU รวมถึง Nvidia GPU
other-settings = การตั้งค่าอื่นๆ
framerate-limit = ขีดจำกัดเฟรมเรต
unfocused-framerate-limit = เฟรมเรทจำกัดขณะไม่ได้โฟกัส
force-grab-cursor = Force grab cursor
force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game

View file

@ -0,0 +1,70 @@
appearance = รูปร่าง
modern = โมเดิร์น
classic = คลาสสิค
update-background = อัพเดตภาพพื้นหลัง
update-background-description = ดาวน์โหลดภาพพื้นหลังสำหรับ launcher คุณสามารถปิดการใช้งานเพื่อใช้รูปภาพที่คุณกำหนดเองแทนได้
launcher-language = ภาษาของ launcher
launcher-language-description = ใช้หลังจากรีสตาร์ท launcher
game-edition = ฉบับเกม
global = สากล
china = จีน
game-environment = สภาพแวดล้อมของเกม
game-environment-description = รับคุณสมบัติเฉพาะ เช่น วิธีการชำระเงินอื่นๆ
game-voiceovers = ภาษาพากย์เสียงเกม
game-voiceovers-description = ภาษาเสียงพากย์เกมที่ดาวน์โหลดได้ คุณสามารถเลือกในการตั้งค่าเกม
english = ภาษาอังกฤษ
japanese = ภาษาญี่ปุ่น
korean = ภาษาเกาหลี
chinese = ภาษาจีน
migrate-installation = ย้ายการติดตั้งเกม
migrate-installation-description = เปิดหน้าต่างพิเศษที่คุณสามารถเปลี่ยนโฟลเดอร์การติดตั้งเกมของคุณได้
repair-game = ซ่อมแซมการติดตั้งเกม
status = สถานะ
game-version = เวอร์ชันเกม
game-not-installed = ยังไม่ได้ติดตั้ง
game-predownload-available = มีการอัปเดตเกมให้ดาวน์โหลดได้ล่วงหน้าแล้ว: {$old} -> {$new}
game-update-available = มีอัปเดตเวอร์ชันเกมใหม่: {$old} -> {$new}
game-outdated = เวอร์ชันเกมล้าสมัยเกินไปและไม่สามารถอัปเดตได้. เวอร์ชันล่าสุด: {$latest}
player-patch-version = เวอร์ชั่นแพทช์
player-patch-version-description = แพทช์หลักที่ให้คุณเล่นเกมบน Linux
patch-not-available = ไม่พร้อมใช้งาน
patch-not-available-tooltip = ไม่สามารถเข้าถึงเซิร์ฟเวอร์แพทช์ได้
patch-outdated = แพทช์ล้าสมัย ({$current})
patch-outdated-tooltip = แพทช์ล้าสมัยแล้ว: {$current} -> {$latest}
patch-preparation = เตรียมการ
patch-preparation-tooltip = แพทช์อยู่ระหว่างการพัฒนา
patch-testing-tooltip = มีแพทช์ทดสอบให้ใช้งาน
patch-not-applied-tooltip = แพทช์ยังไม่มีการติดตั้ง
apply-main-patch = ติดตั้งแพทช์หลัก
apply-main-patch-description = การทดลอง. การปิดใช้งานจะทำให้คุณสามารถรันเกมได้โดยไม่ต้องใช้แพตช์ สิ่งนี้อาจไม่ทำงานหรือต้องมีการแก้ไขไฟล์ด้วยตนเอง ใใช้เฉพาะเมื่อคุณรู้ว่าคุณกำลังทำอะไรอยู่
disable-mhypbase = ปิดการใช้งาน mhypbase
disable-mhypbase-description = การทดลอง. หากเปิดใช้งาน launcher จะปิดใช้งาน mhypbase.dll ในระหว่างการติดตั้งแพตช์หลัก ซึ่งในปัจจุบันเทียบเท่ากับแพตช์ xlua ปรับปรุงประสิทธิภาพและลดการใช้งาน CPU
ask-superuser-permissions = ขอสิทธิ์ผู้ใช้ขั้นสูง (superuser)
ask-superuser-permissions-description = Launcher จะใช้ไฟล์เหล่านี้เพื่ออัปเดตไฟล์โฮสต์ของคุณโดยอัตโนมัติ สิ่งนี้ไม่จำเป็นในรุ่น flatpak
launcher-behavior = พฤติกรรม Launcher
launcher-behavior-description = หน้าต่าง Launcher ควรทำอย่างไรเมื่อเริ่มเกม
wine-tools = เครื่องมือ Wine
command-line = Command line
registry-editor = Registry editor
explorer = Explorer
task-manager = Task manager
configuration = Configuration
debugger = Debugger

View file

@ -0,0 +1,76 @@
custom = กำหนดเอง
none = ไม่ใช้
default = ค่าเริ่มต้น
details = รายละเอียด
options = ตัวเลือก
width = ความกว้าง
height = ความสูง
# Menu items
launcher-folder = โฟลเดอร์ Launcher
game-folder = โฟลเดอร์เกม
config-file = ไฟล์ Config
debug-file = ไฟล์ Debug
wish-url = เปิด URL การอธิษฐาน
about = เกี่ยวกับ
close = ปิด
hide = ซ่อน
nothing = ไม่ทำอะไร
save = บันทึก
continue = ดำเนินการต่อ
resume = ดำเนินการต่อ
exit = ออก
check = ตรวจสอบ
restart = เริ่มต้นใหม่
agree = ตกลง
loading-data = กำลังโหลดข้อมูล
downloading-background-picture = กำลังดาวน์โหลดภาพพื้นหลัง
updating-components-index = กำลังอัปเดต index ส่วนประกอบ
loading-game-version = กำลังโหลดเวอร์ชั่นเกม
loading-patch-status = กำลังโหลดสถานะแพทช์
loading-launcher-state = กำลังโหลดสถานะ launcher
loading-launcher-state--game = กำลังโหลดสถานะ launcher: กำลังตรวจสอบเวอร์ชันเกม
loading-launcher-state--voice = กำลังโหลดสถานะ launcher: กำลังตรวจสอบภาษาพากย์เสียง {$locale}
loading-launcher-state--patch = กำลังโหลดสถานะ launcher: กำลังตรวจสอบแพตช์ที่ติดตั้ง
checking-free-space = กำลังตรวจสอบพื้นที่ว่าง
downloading = กำลังดาวน์โหลด
updating-permissions = กำลังอัปเดตสิทธิ์
unpacking = กำลังแกะ
verifying-files = กำลังตรวจสอบไฟล์
repairing-files = กำลังซ่อมแซมไฟล์
migrating-folders = กำลังย้ายโฟลเดอร์
applying-hdiff = กำลังติดตั้งแพตช์ hdiff
removing-outdated = กำลังลบไฟล์ที่ล้าสมัย
components-index-updated = อัปเดตส่วนประกอบแล้ว
launch = เริ่มเกมส์
migrate-folders = ย้ายโฟลเดอร์
migrate-folders-tooltip = อัพเดตโครงสร้างโฟลเดอร์เกม
apply-patch = ติดตั้งแพทช์
disable-telemetry = ปิดใช้งานการวัดและส่งข้อมูล
download-wine = ดาวน์โหลด Wine
create-prefix = สร้างการตั้งค่า Wine
update = อัปเดต
download = ดาวน์โหลด
predownload-update = ดาวน์โหลดล่วงหน้า {$version} อัปเดต ({$size})
kill-game-process = ฆ่ากระบวนการเกม
main-window--patch-unavailable-tooltip = เซิร์ฟเวอร์แพตช์ไม่พร้อมใช้งานและ launcher ไม่สามารถตรวจสอบสถานะการแพตช์ของเกมได้ คุณสามารถรันเกมได้แต่ต้องยอมรับความเสี่ยงเอง
main-window--patch-outdated-tooltip = โแพตช์ล้าสมัยหรืออยู่ในสถานะเตรียมการ ดังนั้นจึงไม่สามารถใช้งานได้ โปรดกลับมาใหม่ในภายหลังเพื่อดูสถานะ
main-window--version-outdated-tooltip = เวอร์ชันล้าสมัยเกินไปและไม่สามารถอัปเดตได้
preferences = การตั้งค่า
general = ทั่วไป
enhancements = การปรับปรุง

View file

@ -0,0 +1,28 @@
sandbox = แซนด์บ็อกซ์
sandbox-description = รันเกมที่แยกออกจากระบบ เพื่อป้องกันไม่ให้เข้าถึงข้อมูลส่วนบุคคลของคุณ
enable-sandboxing = เปิดใช้งานแซนด์บ็อกซ์
enable-sandboxing-description = รันเกมในระบบไฟล์รูทของคุณแบบอ่านได้อย่างเดียว
hide-home-directory = ซ่อนโฮมไดเร็กตอรี่
hide-home-directory-description = ซ่อนโฟลเดอร์ /home, /var/home/$USER และ $HOME ของคุณจากเกม
hostname = ชื่อโฮสต์
additional-arguments = arguments เพิ่มเติม
private-directories = ไดเรกทอรีส่วนตัว
private-directories-description = โฟลเดอร์เหล่านี้จะถูกแทนที่ด้วยระบบไฟล์เสมือนที่ว่างเปล่า (tmpfs) และไฟล์เหล่านั้นจะไม่สามารถเข้าถึงได้โดยเกมแซนด์บ็อกซ์
path = เส้นทาง
shared-directories = ไดเรกทอรีใช้ร่วมกัน
shared-directories-description = ไดเร็กทอรีเหล่านี้จะเชื่อมโยงกับไดเร็กทอรีในระบบโฮสต์ของคุณ
original-path = เส้นทางเดิม
new-path = เส้นทางใหม่
read-only = อ่านได้เท่านั้น
read-only-description = ห้ามเกมเขียนข้อมูลใดๆ ลงในไดเร็กทอรีนี้
symlinks = Symlinks
symlinks-description = สร้าง Symbolic Link จากตำแหน่งเดิมไปยังตำแหน่งใหม่ภายในแซนด์บ็อกซ์ของคุณ

View file

@ -11,3 +11,6 @@ nis-description = DLSS teknolojisine düşük maliyetli bir alternatif olarak Nv
other-settings = Diğer ayarlar
framerate-limit = Kare hızı limiti
unfocused-framerate-limit = Odakta değilken kare hızı limiti
force-grab-cursor = Force grab cursor
force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game

View file

@ -11,3 +11,6 @@ nis-description = Відкрита техніка масштабування з
other-settings = Інші налаштування
framerate-limit = Обмеження кількості кадрів
unfocused-framerate-limit = Обмеження кількості кадрів поза фокусом
force-grab-cursor = Force grab cursor
force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game

View file

@ -11,3 +11,6 @@ nis-description = Một kỹ thuật nâng cấp mã nguồn mở do Nvidia phá
other-settings = Cài đặt khác
framerate-limit = Giới hạn tốc độ khung hình
unfocused-framerate-limit = Giới hạn tốc độ khung hình khi không tập trung
force-grab-cursor = Force grab cursor
force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game

View file

@ -1,6 +1,11 @@
game-resolution = 游戏分辨率
gamescope-resolution = Gamescope 分辨率
integer-scaling = 整数倍数缩放
other-settings = 其它设置
framerate-limit = 帧率限制
unfocused-framerate-limit = 切出游戏帧率限制
integer-scaling = 整数倍数缩放
force-grab-cursor = Force grab cursor
force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game

View file

@ -26,6 +26,7 @@
<file preprocess="xml-stripblanks" alias="list-add-symbolic.svg">images/icons/list-add-symbolic.svg</file>
<file preprocess="xml-stripblanks" alias="view-refresh-symbolic.svg">images/icons/view-refresh-symbolic.svg</file>
<file preprocess="xml-stripblanks" alias="applications-games-symbolic.svg">images/icons/applications-games-symbolic.svg</file>
<file preprocess="xml-stripblanks" alias="applications-system-symbolic.svg">images/icons/applications-system-symbolic.svg</file>
<file preprocess="xml-stripblanks" alias="applications-graphics-symbolic.svg">images/icons/applications-graphics-symbolic.svg</file>
<file preprocess="xml-stripblanks" alias="go-next-symbolic.svg">images/icons/go-next-symbolic.svg</file>
<file preprocess="xml-stripblanks" alias="dialog-information-symbolic.svg">images/icons/dialog-information-symbolic.svg</file>

View file

@ -27,7 +27,8 @@ pub const SUPPORTED_LANGUAGES: &[LanguageIdentifier] = &[
langid!("pl-pl"),
langid!("vi-vn"),
langid!("nl-nl"),
langid!("uk-ua")
langid!("uk-ua"),
langid!("th-th")
];
pub static mut LANG: LanguageIdentifier = langid!("en-us");
@ -105,9 +106,7 @@ macro_rules! tr {
use fluent_templates::Loader;
#[allow(unused_unsafe)]
$crate::i18n::LOCALES
.lookup(unsafe { &$crate::i18n::LANG }, $id)
.expect(&format!("Failed to find a message with given id: {}", stringify!($id)))
$crate::i18n::LOCALES.lookup(unsafe { &$crate::i18n::LANG }, $id)
}
};
@ -125,9 +124,7 @@ macro_rules! tr {
)*
#[allow(unused_unsafe)]
$crate::i18n::LOCALES
.lookup_complete(unsafe { &$crate::i18n::LANG }, $id, Some(&args))
.expect(&format!("Failed to find a message with given id: {}", stringify!($id)))
$crate::i18n::LOCALES.lookup_complete(unsafe { &$crate::i18n::LANG }, $id, Some(&args))
}
};
}

View file

@ -70,6 +70,36 @@ lazy_static::lazy_static! {
///
/// Standard is `$HOME/.local/share/anime-game-launcher/.first-run`
pub static ref FIRST_RUN_FILE: PathBuf = LAUNCHER_FOLDER.join(".first-run");
/// Global app's css
static ref GLOBAL_CSS: String = format!("
progressbar > text {{
margin-bottom: 4px;
}}
window.classic-style {{
background: url(\"file://{}\");
background-repeat: no-repeat;
background-size: cover;
}}
window.classic-style progressbar {{
background-color: #00000020;
border-radius: 16px;
padding: 8px 16px;
}}
window.classic-style progressbar:hover {{
background-color: #00000060;
color: #ffffff;
transition-duration: 0.5s;
transition-timing-function: linear;
}}
.round-bin {{
border-radius: 24px;
}}
", BACKGROUND_FILE.to_string_lossy());
}
fn main() -> anyhow::Result<()> {
@ -105,22 +135,24 @@ fn main() -> anyhow::Result<()> {
let mut no_verbose_tracing = false;
let args = std::env::args().collect::<Vec<_>>();
let mut gtk_args = Vec::new();
// Parse arguments
for i in 0..args.len() {
if args[i] == "--debug" {
force_debug = true;
} else if args[i] == "--run-game" {
run_game = true;
} else if args[i] == "--just-run-game" {
just_run_game = true;
} else if args[i] == "--no-verbose-tracing" {
no_verbose_tracing = true;
} else if args[i] == "--session" {
match args[i].as_str() {
"--debug" => force_debug = true,
"--run-game" => run_game = true,
"--just-run-game" => just_run_game = true,
"--no-verbose-tracing" => no_verbose_tracing = true,
"--session" => {
// Switch active session prior running the app
if let Some(session) = args.get(i + 1) {
Sessions::set_current(session.to_owned())?;
}
},
arg => gtk_args.push(arg.to_string())
}
}
@ -170,36 +202,6 @@ fn main() -> anyhow::Result<()> {
gtk::glib::set_application_name("An Anime Game Launcher");
gtk::glib::set_program_name(Some("An Anime Game Launcher"));
// Set global css
relm4::set_global_css(&format!("
progressbar > text {{
margin-bottom: 4px;
}}
window.classic-style {{
background: url(\"file://{}\");
background-repeat: no-repeat;
background-size: cover;
}}
window.classic-style progressbar {{
background-color: #00000020;
border-radius: 16px;
padding: 8px 16px;
}}
window.classic-style progressbar:hover {{
background-color: #00000060;
color: #ffffff;
transition-duration: 0.5s;
transition-timing-function: linear;
}}
.round-bin {{
border-radius: 24px;
}}
", BACKGROUND_FILE.to_string_lossy()));
// Set UI language
let lang = CONFIG.launcher.language.parse().expect("Wrong language format used in config");
@ -210,7 +212,11 @@ fn main() -> anyhow::Result<()> {
// Run FirstRun window if .first-run file persist
if FIRST_RUN_FILE.exists() {
// Create the app
let app = RelmApp::new(APP_ID);
let app = RelmApp::new(APP_ID)
.with_args(gtk_args);
// Set global css
app.set_global_css(&GLOBAL_CSS);
// Show first run window
app.run::<FirstRunApp>(());
@ -240,7 +246,11 @@ fn main() -> anyhow::Result<()> {
}
// Create the app
let app = RelmApp::new(APP_ID);
let app = RelmApp::new(APP_ID)
.with_args(gtk_args);
// Set global css
app.set_global_css(&GLOBAL_CSS);
// Show main window
app.run::<App>(());

View file

@ -77,7 +77,9 @@ impl SimpleComponent for AboutDialog {
"日本語 — @zozonteq https://github.com/zozonteq",
"한국어 — @project-dy https://github.com/project-dy",
"Indonesia — @yumekarisu https://github.com/yumekarisu",
"Tiếng Việt — Nguyễn Hữu Chánh https://github.com/Chanhnh"
"Tiếng Việt — Nguyễn Hữu Chánh https://github.com/Chanhnh",
"Українська — Іван Потієнко https://github.com/xxanqw",
"ไทย — @thegooglerider https://github.com/TheGoogleRider2"
].join("\n"),
set_debug_info: &[
@ -92,10 +94,28 @@ impl SimpleComponent for AboutDialog {
set_release_notes_version: &APP_VERSION,
set_release_notes: &[
"<p>Added</p>",
"<ul>",
"<li>Bundle applications-system-symbolic icon to the app</li>",
"<li>Added force grab cursor option to the gamescope settings</li>",
"<li>Added Thai</li>",
"<li>Added Ukrainian</li>",
"</ul>",
"<p>Changed</p>",
"<ul>",
"<li>Replaced FPS unlocker by a custom one</li>",
"<li>Update wish url</li>",
"<li>Updated dependencies</li>",
"<li>Improved app args parsing</li>",
"<li>Updated locales</li>",
"</ul>",
"<p>Fixed</p>",
"<ul>",
"<li>Fixed GtkSwitch UI state representation</li>",
"</ul>"
].join("\n"),
@ -113,11 +133,7 @@ impl SimpleComponent for AboutDialog {
}
}
fn init(
_init: Self::Init,
root: &Self::Root,
sender: ComponentSender<Self>,
) -> ComponentParts<Self> {
fn init(_init: Self::Init, root: Self::Root, sender: ComponentSender<Self>) -> ComponentParts<Self> {
tracing::info!("Initializing about dialog");
let model = Self {

View file

@ -287,11 +287,7 @@ impl SimpleAsyncComponent for DefaultPathsApp {
}
}
async fn init(
init: Self::Init,
root: Self::Root,
_sender: AsyncComponentSender<Self>,
) -> AsyncComponentParts<Self> {
async fn init(init: Self::Init, root: Self::Root, _sender: AsyncComponentSender<Self>) -> AsyncComponentParts<Self> {
let model = Self {
progress_bar: ProgressBar::builder()
.launch(ProgressBarInit {

View file

@ -135,11 +135,7 @@ impl SimpleAsyncComponent for DependenciesApp {
}
}
async fn init(
_init: Self::Init,
root: Self::Root,
_sender: AsyncComponentSender<Self>,
) -> AsyncComponentParts<Self> {
async fn init(_init: Self::Init, root: Self::Root, _sender: AsyncComponentSender<Self>) -> AsyncComponentParts<Self> {
let distro = whatadistro::identify();
let model = Self {

View file

@ -264,11 +264,7 @@ impl SimpleAsyncComponent for DownloadComponentsApp {
}
}
async fn init(
_init: Self::Init,
root: Self::Root,
sender: AsyncComponentSender<Self>,
) -> AsyncComponentParts<Self> {
async fn init(_init: Self::Init, root: Self::Root, sender: AsyncComponentSender<Self>) -> AsyncComponentParts<Self> {
let model = Self {
progress_bar: ProgressBar::builder()
.launch(ProgressBarInit {

View file

@ -68,11 +68,7 @@ impl SimpleAsyncComponent for FinishApp {
}
}
async fn init(
_init: Self::Init,
root: Self::Root,
_sender: AsyncComponentSender<Self>,
) -> AsyncComponentParts<Self> {
async fn init(_init: Self::Init, root: Self::Root, _sender: AsyncComponentSender<Self>) -> AsyncComponentParts<Self> {
let model = Self;
let widgets = view_output!();

View file

@ -115,11 +115,7 @@ impl SimpleComponent for FirstRunApp {
}
}
fn init(
_parent: Self::Init,
root: &Self::Root,
sender: ComponentSender<Self>,
) -> ComponentParts<Self> {
fn init(_parent: Self::Init, root: Self::Root, sender: ComponentSender<Self>) -> ComponentParts<Self> {
tracing::info!("Initializing first run window");
let toast_overlay = adw::ToastOverlay::new();

View file

@ -51,7 +51,7 @@ impl SimpleAsyncComponent for SelectVoiceoversApp {
#[local_ref]
add_suffix = english -> gtk::Switch {
set_valign: gtk::Align::Center,
set_state: true
set_active: true
}
},
@ -110,11 +110,7 @@ impl SimpleAsyncComponent for SelectVoiceoversApp {
}
}
async fn init(
_init: Self::Init,
root: Self::Root,
_sender: AsyncComponentSender<Self>,
) -> AsyncComponentParts<Self> {
async fn init(_init: Self::Init, root: Self::Root, _sender: AsyncComponentSender<Self>) -> AsyncComponentParts<Self> {
let model = Self {
english: gtk::Switch::new(),
japanese: gtk::Switch::new(),

View file

@ -68,11 +68,7 @@ impl SimpleAsyncComponent for WelcomeApp {
}
}
async fn init(
_init: Self::Init,
root: Self::Root,
_sender: AsyncComponentSender<Self>,
) -> AsyncComponentParts<Self> {
async fn init(_init: Self::Init, root: Self::Root, _sender: AsyncComponentSender<Self>) -> AsyncComponentParts<Self> {
let model = Self;
let widgets = view_output!();

View file

@ -625,11 +625,7 @@ impl SimpleComponent for App {
}
}
fn init(
_init: Self::Init,
root: &Self::Root,
sender: ComponentSender<Self>,
) -> ComponentParts<Self> {
fn init(_init: Self::Init, root: Self::Root, sender: ComponentSender<Self>) -> ComponentParts<Self> {
tracing::info!("Initializing main window");
let model = App {
@ -763,7 +759,7 @@ impl SimpleComponent for App {
let web_cache = String::from_utf8_lossy(&web_cache);
// https://webstatic-sea.[ho-yo-ver-se].com/[ge-nsh-in]/event/e20190909gacha-v2/index.html?......
if let Some(url) = web_cache.lines().rev().find(|line| line.contains("gacha-v2/index.html")) {
if let Some(url) = web_cache.lines().rev().find(|line| line.contains("gacha-v3/index.html")) {
let url_begin_pos = url.find("https://").unwrap();
let url_end_pos = url_begin_pos + url[url_begin_pos..].find("\0\0\0\0").unwrap();

View file

@ -36,11 +36,7 @@ impl SimpleComponent for MigrateInstallationApp {
}
}
fn init(
_init: Self::Init,
root: &Self::Root,
_sender: ComponentSender<Self>,
) -> ComponentParts<Self> {
fn init(_init: Self::Init, root: Self::Root, _sender: ComponentSender<Self>) -> ComponentParts<Self> {
tracing::info!("Initializing migration window");
let model = Self {

View file

@ -71,21 +71,15 @@ impl SimpleAsyncComponent for EnvironmentPage {
type Output = EnhancementsAppMsg;
view! {
gtk::Box {
adw::NavigationPage {
#[wrap(Some)]
set_child = &gtk::Box {
set_orientation: gtk::Orientation::Vertical,
adw::HeaderBar {
#[wrap(Some)]
set_title_widget = &adw::WindowTitle {
set_title: &tr!("environment")
},
pack_start = &gtk::Button {
set_icon_name: "go-previous-symbolic",
connect_clicked[sender] => move |_| {
sender.output(EnhancementsAppMsg::OpenMainPage).unwrap();
}
}
},
@ -150,12 +144,9 @@ impl SimpleAsyncComponent for EnvironmentPage {
}
}
}
}
async fn init(
_init: Self::Init,
root: Self::Root,
sender: AsyncComponentSender<Self>,
) -> AsyncComponentParts<Self> {
async fn init(_init: Self::Init, root: Self::Root, sender: AsyncComponentSender<Self>) -> AsyncComponentParts<Self> {
tracing::info!("Initializing environment settings");
let mut model = Self {

View file

@ -74,11 +74,7 @@ impl AsyncFactoryComponent for GameSession {
}
}
async fn init_model(
init: Self::Init,
_index: &DynamicIndex,
_sender: AsyncFactorySender<Self>,
) -> Self {
async fn init_model(init: Self::Init, _index: &DynamicIndex, _sender: AsyncFactorySender<Self>) -> Self {
init
}
}
@ -105,21 +101,15 @@ impl SimpleAsyncComponent for GamePage {
type Output = EnhancementsAppMsg;
view! {
gtk::Box {
adw::NavigationPage {
#[wrap(Some)]
set_child = &gtk::Box {
set_orientation: gtk::Orientation::Vertical,
adw::HeaderBar {
#[wrap(Some)]
set_title_widget = &adw::WindowTitle {
set_title: &tr!("game")
},
pack_start = &gtk::Button {
set_icon_name: "go-previous-symbolic",
connect_clicked[sender] => move |_| {
sender.output(EnhancementsAppMsg::OpenMainPage).unwrap();
}
}
},
@ -150,12 +140,9 @@ impl SimpleAsyncComponent for GamePage {
}
}
}
}
async fn init(
_init: Self::Init,
root: Self::Root,
sender: AsyncComponentSender<Self>,
) -> AsyncComponentParts<Self> {
async fn init(_init: Self::Init, root: Self::Root, sender: AsyncComponentSender<Self>) -> AsyncComponentParts<Self> {
tracing::info!("Initializing game settings");
let mut model = Self {

View file

@ -17,6 +17,8 @@ use anime_launcher_sdk::anime_game_core::installer::downloader::Downloader;
use anime_launcher_sdk::discord_rpc::DiscordRpc;
use anime_launcher_sdk::is_available;
use enum_ordinalize::Ordinalize;
pub mod game;
pub mod sandbox;
pub mod environment;
@ -232,12 +234,12 @@ impl SimpleAsyncComponent for EnhancementsApp {
add_suffix = &gtk::Switch {
set_valign: gtk::Align::Center,
set_state: CONFIG.game.wine.borderless,
set_active: CONFIG.game.wine.borderless,
connect_state_notify => |switch| {
if is_ready() {
if let Ok(mut config) = Config::get() {
config.game.wine.borderless = switch.state();
config.game.wine.borderless = switch.is_active();
Config::update(config);
}
@ -277,12 +279,12 @@ impl SimpleAsyncComponent for EnhancementsApp {
add_suffix = &gtk::Switch {
set_valign: gtk::Align::Center,
set_state: CONFIG.game.wine.virtual_desktop.enabled,
set_active: CONFIG.game.wine.virtual_desktop.enabled,
connect_state_notify => |switch| {
if is_ready() {
if let Ok(mut config) = Config::get() {
config.game.wine.virtual_desktop.enabled = switch.state();
config.game.wine.virtual_desktop.enabled = switch.is_active();
Config::update(config);
}
@ -298,12 +300,12 @@ impl SimpleAsyncComponent for EnhancementsApp {
add_suffix = &gtk::Switch {
set_valign: gtk::Align::Center,
set_state: CONFIG.game.wine.drives.drive_c,
set_active: CONFIG.game.wine.drives.drive_c,
connect_state_notify => |switch| {
if is_ready() {
if let Ok(mut config) = Config::get() {
config.game.wine.drives.drive_c = switch.state();
config.game.wine.drives.drive_c = switch.is_active();
Config::update(config);
}
@ -343,12 +345,12 @@ impl SimpleAsyncComponent for EnhancementsApp {
add_suffix = &gtk::Switch {
set_valign: gtk::Align::Center,
set_state: CONFIG.game.wine.drives.game_folder.is_some(),
set_active: CONFIG.game.wine.drives.game_folder.is_some(),
connect_state_notify[map_game_folder_row] => move |switch| {
if is_ready() {
if let Ok(mut config) = Config::get() {
if switch.state() {
if switch.is_active() {
config.game.wine.drives.game_folder = Some(AllowedDrives::list()[map_game_folder_row.selected() as usize]);
} else {
config.game.wine.drives.game_folder = None;
@ -415,12 +417,12 @@ impl SimpleAsyncComponent for EnhancementsApp {
add_suffix = &gtk::Switch {
set_valign: gtk::Align::Center,
set_state: CONFIG.game.enhancements.fsr.enabled,
set_active: CONFIG.game.enhancements.fsr.enabled,
connect_state_notify => |switch| {
if is_ready() {
if let Ok(mut config) = Config::get() {
config.game.enhancements.fsr.enabled = switch.state();
config.game.enhancements.fsr.enabled = switch.is_active();
Config::update(config);
}
@ -438,12 +440,12 @@ impl SimpleAsyncComponent for EnhancementsApp {
add_suffix = &gtk::Switch {
set_valign: gtk::Align::Center,
set_state: CONFIG.game.enhancements.gamemode,
set_active: CONFIG.game.enhancements.gamemode,
connect_state_notify => |switch| {
if is_ready() {
if let Ok(mut config) = Config::get() {
config.game.enhancements.gamemode = switch.state();
config.game.enhancements.gamemode = switch.is_active();
Config::update(config);
}
@ -470,12 +472,12 @@ impl SimpleAsyncComponent for EnhancementsApp {
add_suffix = &gtk::Switch {
set_valign: gtk::Align::Center,
set_state: CONFIG.game.enhancements.gamescope.enabled,
set_active: CONFIG.game.enhancements.gamescope.enabled,
connect_state_notify => |switch| {
if is_ready() {
if let Ok(mut config) = Config::get() {
config.game.enhancements.gamescope.enabled = switch.state();
config.game.enhancements.gamescope.enabled = switch.is_active();
Config::update(config);
}
@ -494,12 +496,12 @@ impl SimpleAsyncComponent for EnhancementsApp {
add_suffix = &gtk::Switch {
set_valign: gtk::Align::Center,
set_state: CONFIG.launcher.discord_rpc.enabled,
set_active: CONFIG.launcher.discord_rpc.enabled,
connect_state_notify => |switch| {
if is_ready() {
if let Ok(mut config) = Config::get() {
config.launcher.discord_rpc.enabled = switch.state();
config.launcher.discord_rpc.enabled = switch.is_active();
Config::update(config);
}
@ -588,12 +590,12 @@ impl SimpleAsyncComponent for EnhancementsApp {
add_suffix = &gtk::Switch {
set_valign: gtk::Align::Center,
set_state: CONFIG.game.enhancements.fps_unlocker.enabled,
set_active: CONFIG.game.enhancements.fps_unlocker.enabled,
connect_state_notify => |switch| {
if is_ready() {
if let Ok(mut config) = Config::get() {
config.game.enhancements.fps_unlocker.enabled = switch.state();
config.game.enhancements.fps_unlocker.enabled = switch.is_active();
Config::update(config);
}
@ -627,13 +629,13 @@ impl SimpleAsyncComponent for EnhancementsApp {
},
#[local_ref]
game_page -> gtk::Box {},
game_page -> adw::NavigationPage,
#[local_ref]
sandbox_page -> gtk::Box {},
sandbox_page -> adw::NavigationPage,
#[local_ref]
environment_page -> gtk::Box {}
environment_page -> adw::NavigationPage,
}
async fn init(
@ -769,28 +771,28 @@ impl SimpleAsyncComponent for EnhancementsApp {
PREFERENCES_WINDOW.as_ref()
.unwrap_unchecked()
.widget()
.close_subpage();
.pop_subpage();
}
EnhancementsAppMsg::OpenGameSettingsPage => unsafe {
PREFERENCES_WINDOW.as_ref()
.unwrap_unchecked()
.widget()
.present_subpage(self.game_page.widget());
.push_subpage(self.game_page.widget());
}
EnhancementsAppMsg::OpenSandboxSettingsPage => unsafe {
PREFERENCES_WINDOW.as_ref()
.unwrap_unchecked()
.widget()
.present_subpage(self.sandbox_page.widget());
.push_subpage(self.sandbox_page.widget());
}
EnhancementsAppMsg::OpenEnvironmentSettingsPage => unsafe {
PREFERENCES_WINDOW.as_ref()
.unwrap_unchecked()
.widget()
.present_subpage(self.environment_page.widget());
.push_subpage(self.environment_page.widget());
}
EnhancementsAppMsg::Toast { title, description } => {

View file

@ -98,21 +98,15 @@ impl SimpleAsyncComponent for SandboxPage {
type Output = EnhancementsAppMsg;
view! {
gtk::Box {
adw::NavigationPage {
#[wrap(Some)]
set_child = &gtk::Box {
set_orientation: gtk::Orientation::Vertical,
adw::HeaderBar {
#[wrap(Some)]
set_title_widget = &adw::WindowTitle {
set_title: &tr!("sandbox")
},
pack_start = &gtk::Button {
set_icon_name: "go-previous-symbolic",
connect_clicked[sender] => move |_| {
sender.output(EnhancementsAppMsg::OpenMainPage).unwrap();
}
}
},
@ -133,12 +127,12 @@ impl SimpleAsyncComponent for SandboxPage {
add_suffix = &gtk::Switch {
set_valign: gtk::Align::Center,
set_state: CONFIG.sandbox.enabled,
set_active: CONFIG.sandbox.enabled,
connect_state_notify => |switch| {
if is_ready() {
if let Ok(mut config) = Config::get() {
config.sandbox.enabled = switch.state();
config.sandbox.enabled = switch.is_active();
Config::update(config);
}
@ -154,12 +148,12 @@ impl SimpleAsyncComponent for SandboxPage {
add_suffix = &gtk::Switch {
set_valign: gtk::Align::Center,
set_state: CONFIG.sandbox.isolate_home,
set_active: CONFIG.sandbox.isolate_home,
connect_state_notify => |switch| {
if is_ready() {
if let Ok(mut config) = Config::get() {
config.sandbox.isolate_home = switch.state();
config.sandbox.isolate_home = switch.is_active();
Config::update(config);
}
@ -321,12 +315,9 @@ impl SimpleAsyncComponent for SandboxPage {
}
}
}
}
async fn init(
_init: Self::Init,
root: Self::Root,
sender: AsyncComponentSender<Self>,
) -> AsyncComponentParts<Self> {
async fn init(_init: Self::Init, root: Self::Root, sender: AsyncComponentSender<Self>) -> AsyncComponentParts<Self> {
tracing::info!("Initializing sandbox settings");
let mut model = Self {

View file

@ -6,6 +6,8 @@ use anime_launcher_sdk::genshin::config::Config;
use anime_launcher_sdk::config::schema_blanks::prelude::*;
use enum_ordinalize::Ordinalize;
use crate::*;
pub struct GamescopeApp;
@ -128,12 +130,12 @@ impl SimpleAsyncComponent for GamescopeApp {
add_suffix = &gtk::Switch {
set_valign: gtk::Align::Center,
set_state: CONFIG.game.enhancements.gamescope.integer_scaling,
set_active: CONFIG.game.enhancements.gamescope.integer_scaling,
connect_state_notify => |switch| {
if is_ready() {
if let Ok(mut config) = Config::get() {
config.game.enhancements.gamescope.integer_scaling = switch.state();
config.game.enhancements.gamescope.integer_scaling = switch.is_active();
Config::update(config);
}
@ -148,12 +150,12 @@ impl SimpleAsyncComponent for GamescopeApp {
add_suffix = &gtk::Switch {
set_valign: gtk::Align::Center,
set_state: CONFIG.game.enhancements.gamescope.fsr,
set_active: CONFIG.game.enhancements.gamescope.fsr,
connect_state_notify => |switch| {
if is_ready() {
if let Ok(mut config) = Config::get() {
config.game.enhancements.gamescope.fsr = switch.state();
config.game.enhancements.gamescope.fsr = switch.is_active();
Config::update(config);
}
@ -168,12 +170,12 @@ impl SimpleAsyncComponent for GamescopeApp {
add_suffix = &gtk::Switch {
set_valign: gtk::Align::Center,
set_state: CONFIG.game.enhancements.gamescope.nis,
set_active: CONFIG.game.enhancements.gamescope.nis,
connect_state_notify => |switch| {
if is_ready() {
if let Ok(mut config) = Config::get() {
config.game.enhancements.gamescope.nis = switch.state();
config.game.enhancements.gamescope.nis = switch.is_active();
Config::update(config);
}
@ -250,17 +252,33 @@ impl SimpleAsyncComponent for GamescopeApp {
}
}
}
},
adw::ActionRow {
set_title: &tr!("force-grab-cursor"),
set_subtitle: &tr!("force-grab-cursor-description"),
add_suffix = &gtk::Switch {
set_valign: gtk::Align::Center,
set_active: CONFIG.game.enhancements.gamescope.force_grab_cursor,
connect_state_notify => |switch| {
if is_ready() {
if let Ok(mut config) = Config::get() {
config.game.enhancements.gamescope.force_grab_cursor = switch.is_active();
Config::update(config);
}
}
}
}
}
}
}
}
}
async fn init(
_init: Self::Init,
root: Self::Root,
_sender: AsyncComponentSender<Self>,
) -> AsyncComponentParts<Self> {
async fn init(_init: Self::Init, root: Self::Root, _sender: AsyncComponentSender<Self>) -> AsyncComponentParts<Self> {
tracing::info!("Initializing gamescope settings");
let model = Self;

View file

@ -49,21 +49,15 @@ impl SimpleAsyncComponent for ComponentsPage {
type Output = GeneralAppMsg;
view! {
gtk::Box {
adw::NavigationPage {
#[wrap(Some)]
set_child = &gtk::Box {
set_orientation: gtk::Orientation::Vertical,
adw::HeaderBar {
#[wrap(Some)]
set_title_widget = &adw::WindowTitle {
set_title: &tr!("components")
},
pack_start = &gtk::Button {
set_icon_name: "go-previous-symbolic",
connect_clicked[sender] => move |_| {
sender.output(GeneralAppMsg::OpenMainPage).unwrap();
}
}
},
@ -107,11 +101,11 @@ impl SimpleAsyncComponent for ComponentsPage {
set_valign: gtk::Align::Center,
#[block_signal(wine_recommended_notify)]
set_state: true,
set_active: true,
connect_state_notify[sender] => move |switch| {
if is_ready() {
sender.input(ComponentsPageMsg::WineRecommendedOnly(switch.state()));
sender.input(ComponentsPageMsg::WineRecommendedOnly(switch.is_active()));
}
} @wine_recommended_notify
}
@ -133,12 +127,12 @@ impl SimpleAsyncComponent for ComponentsPage {
set_valign: gtk::Align::Center,
#[block_signal(wine_shared_libraries_notify)]
set_state: CONFIG.game.wine.shared_libraries.wine,
set_active: CONFIG.game.wine.shared_libraries.wine,
connect_state_notify => |switch| {
if is_ready() {
if let Ok(mut config) = Config::get() {
config.game.wine.shared_libraries.wine = switch.state();
config.game.wine.shared_libraries.wine = switch.is_active();
Config::update(config);
}
@ -155,12 +149,12 @@ impl SimpleAsyncComponent for ComponentsPage {
set_valign: gtk::Align::Center,
#[block_signal(gstreamer_shared_libraries_notify)]
set_state: CONFIG.game.wine.shared_libraries.gstreamer,
set_active: CONFIG.game.wine.shared_libraries.gstreamer,
connect_state_notify => |switch| {
if is_ready() {
if let Ok(mut config) = Config::get() {
config.game.wine.shared_libraries.gstreamer = switch.state();
config.game.wine.shared_libraries.gstreamer = switch.is_active();
Config::update(config);
}
@ -219,11 +213,11 @@ impl SimpleAsyncComponent for ComponentsPage {
set_valign: gtk::Align::Center,
#[block_signal(dxvk_recommended_notify)]
set_state: true,
set_active: true,
connect_state_notify[sender] => move |switch| {
if is_ready() {
sender.input(ComponentsPageMsg::DxvkRecommendedOnly(switch.state()));
sender.input(ComponentsPageMsg::DxvkRecommendedOnly(switch.is_active()));
}
} @dxvk_recommended_notify
}
@ -239,12 +233,9 @@ impl SimpleAsyncComponent for ComponentsPage {
}
}
}
}
async fn init(
_init: Self::Init,
root: Self::Root,
sender: AsyncComponentSender<Self>,
) -> AsyncComponentParts<Self> {
async fn init(_init: Self::Init, root: Self::Root, sender: AsyncComponentSender<Self>) -> AsyncComponentParts<Self> {
tracing::info!("Initializing general settings -> components page");
let model = Self {

View file

@ -232,7 +232,7 @@ impl SimpleAsyncComponent for GeneralApp {
connect_state_notify => |switch| {
#[allow(unused_must_use)]
if switch.state() {
if switch.is_active() {
std::fs::remove_file(KEEP_BACKGROUND_FILE.as_path());
} else {
std::fs::write(KEEP_BACKGROUND_FILE.as_path(), "");
@ -528,7 +528,7 @@ impl SimpleAsyncComponent for GeneralApp {
},
#[local_ref]
components_page -> gtk::Box {}
components_page -> adw::NavigationPage,
}
async fn init(
@ -664,14 +664,14 @@ impl SimpleAsyncComponent for GeneralApp {
PREFERENCES_WINDOW.as_ref()
.unwrap_unchecked()
.widget()
.close_subpage();
.pop_subpage();
}
GeneralAppMsg::OpenComponentsPage => unsafe {
PREFERENCES_WINDOW.as_ref()
.unwrap_unchecked()
.widget()
.present_subpage(self.components_page.widget());
.push_subpage(self.components_page.widget());
}
#[allow(unused_must_use)]

View file

@ -68,11 +68,7 @@ impl SimpleAsyncComponent for PreferencesApp {
}
}
async fn init(
parent: Self::Init,
root: Self::Root,
sender: AsyncComponentSender<Self>,
) -> AsyncComponentParts<Self> {
async fn init(parent: Self::Init, root: Self::Root, sender: AsyncComponentSender<Self>) -> AsyncComponentParts<Self> {
tracing::info!("Initializing preferences window");
let model = Self {