From 02f11192547eac2da0683d0482334a9a921c1ade Mon Sep 17 00:00:00 2001 From: Wind-Explorer Date: Mon, 9 Mar 2026 19:04:53 +0800 Subject: [PATCH] user's own doll color scheme in neko --- src-tauri/src/commands/app_state.rs | 26 +++++++++++++++++++++++++- src-tauri/src/lib.rs | 3 ++- src/lib/bindings.ts | 3 +++ src/routes/scene/+page.svelte | 8 ++++++-- 4 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src-tauri/src/commands/app_state.rs b/src-tauri/src/commands/app_state.rs index a6838cd..56539e9 100644 --- a/src-tauri/src/commands/app_state.rs +++ b/src-tauri/src/commands/app_state.rs @@ -1,6 +1,6 @@ use crate::{ lock_r, - models::app_data::UserData, + models::{app_data::UserData, dolls::DollColorSchemeDto}, services::presence_modules::models::ModuleMetadata, state::{init_app_data_scoped, AppDataRefreshScope, FDOLL}, }; @@ -26,3 +26,27 @@ pub fn get_modules() -> Result, String> { let guard = lock_r!(FDOLL); Ok(guard.modules.metadatas.clone()) } + +#[tauri::command] +#[specta::specta] +pub fn get_active_doll_color_scheme() -> Result, String> { + let guard = lock_r!(FDOLL); + let active_doll_id = guard + .user_data + .user + .as_ref() + .and_then(|u| u.active_doll_id.as_deref()); + + match active_doll_id { + Some(active_doll_id) => { + let color_scheme = guard + .user_data + .dolls + .as_ref() + .and_then(|dolls| dolls.iter().find(|d| d.id == active_doll_id)) + .map(|d| d.configuration.color_scheme.clone()); + Ok(color_scheme) + } + None => Ok(None), + } +} diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index f72f268..ee3596c 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -6,7 +6,7 @@ use crate::{ }, }; use commands::app::{quit_app, restart_app, retry_connection}; -use commands::app_state::{get_app_data, refresh_app_data}; +use commands::app_state::{get_app_data, get_active_doll_color_scheme, refresh_app_data}; use commands::auth::{change_password, login, logout_and_restart, register, reset_password}; use commands::config::{get_client_config, open_client_config_manager, save_client_config}; use commands::dolls::{ @@ -65,6 +65,7 @@ pub fn run() { .error_handling(ErrorHandlingMode::Throw) .commands(collect_commands![ get_app_data, + get_active_doll_color_scheme, refresh_app_data, list_friends, search_users, diff --git a/src/lib/bindings.ts b/src/lib/bindings.ts index c300d90..d5e2063 100644 --- a/src/lib/bindings.ts +++ b/src/lib/bindings.ts @@ -8,6 +8,9 @@ export const commands = { async getAppData() : Promise { return await TAURI_INVOKE("get_app_data"); }, +async getActiveDollColorScheme() : Promise { + return await TAURI_INVOKE("get_active_doll_color_scheme"); +}, async refreshAppData() : Promise { return await TAURI_INVOKE("refresh_app_data"); }, diff --git a/src/routes/scene/+page.svelte b/src/routes/scene/+page.svelte index a73baf6..925b249 100644 --- a/src/routes/scene/+page.svelte +++ b/src/routes/scene/+page.svelte @@ -15,8 +15,12 @@ let spriteUrl = $state(""); $effect(() => { - getSpriteSheetUrl().then((url) => { - spriteUrl = url; + $appData; + if (!$appData) return; + commands.getActiveDollColorScheme().then((colorScheme) => { + getSpriteSheetUrl(colorScheme ?? undefined).then((url) => { + spriteUrl = url; + }); }); });