diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index eb35d5a..3bc92e4 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -565,6 +565,18 @@ fn set_instance_title_image(app: AppHandle, instance_id: String) -> Result Result<(), String> { + let safe_id = sanitize_path_component(&instance_id)?; + let stub_dir = get_app_dir(&app).join("instances").join(&safe_id); + let title_path = stub_dir.join("title_image.png"); + if title_path.exists() { + fs::remove_file(&title_path).map_err(|e| e.to_string())?; + } + Ok(()) +} + #[tauri::command] #[allow(non_snake_case)] fn get_instance_title_image(app: AppHandle, instance_id: String) -> Result { @@ -1609,7 +1621,7 @@ pub fn run() { .plugin(tauri_plugin_gamepad::init()) .plugin(tauri_plugin_opener::init()) .plugin(tauri_plugin_drpc::init()) - .invoke_handler(tauri::generate_handler![setup_macos_runtime, launch_game, stop_game, check_game_installed, save_config, load_config, download_and_install, open_instance_folder, cancel_download, get_available_runners, get_external_palettes, import_theme, download_runner, delete_instance, update_tray_icon, sync_dlc, fetch_skin, check_for_game_update, open_skins_folder, save_skin_file, import_instance_folder, set_instance_title_image, get_instance_title_image]) + .invoke_handler(tauri::generate_handler![setup_macos_runtime, launch_game, stop_game, check_game_installed, save_config, load_config, download_and_install, open_instance_folder, cancel_download, get_available_runners, get_external_palettes, import_theme, download_runner, delete_instance, update_tray_icon, sync_dlc, fetch_skin, check_for_game_update, open_skins_folder, save_skin_file, import_instance_folder, set_instance_title_image, get_instance_title_image, remove_instance_title_image]) .setup(|app| { let config = load_config(app.handle().clone()); let visible = config.enable_tray_icon.unwrap_or(true); diff --git a/src/components/views/VersionsView.tsx b/src/components/views/VersionsView.tsx index 6512061..89add6b 100644 --- a/src/components/views/VersionsView.tsx +++ b/src/components/views/VersionsView.tsx @@ -9,7 +9,7 @@ const VersionsView = memo(function VersionsView() { const { setActiveView } = useUI(); const { profile: selectedProfile, setProfile: setSelectedProfile } = useConfig(); const { playClickSound, playBackSound, playSfx } = useAudio(); - const { editions, installs: installedVersions, toggleInstall, handleUninstall: onUninstall, deleteCustomEdition: onDeleteEdition, addCustomEdition: onAddEdition, updateCustomEdition: onUpdateEdition, downloadingId, updateAvailable, importInstance, setTitleImage } = useGame(); + const { editions, installs: installedVersions, toggleInstall, handleUninstall: onUninstall, deleteCustomEdition: onDeleteEdition, addCustomEdition: onAddEdition, updateCustomEdition: onUpdateEdition, downloadingId, updateAvailable, importInstance, setTitleImage, removeTitleImage } = useGame(); const [focusRow, setFocusRow] = useState(0); const [focusCol, setFocusCol] = useState(0); @@ -101,8 +101,14 @@ const VersionsView = memo(function VersionsView() { } } else if (focusCol === 4) { if (isCustom) { - playClickSound(); - setTitleImage(edition.id); + const hasCustomImage = typeof edition.titleImage === "string" && edition.titleImage.startsWith("data:"); + if (hasCustomImage) { + playBackSound(); + removeTitleImage(edition.id); + } else { + playClickSound(); + setTitleImage(edition.id); + } } } else if (focusCol === 5) { if (isCustom) { @@ -437,6 +443,9 @@ const VersionsView = memo(function VersionsView() { )} {isCustom && ( <> + {(() => { + const hasCustomImage = typeof edition.titleImage === "string" && edition.titleImage.startsWith("data:"); + return ( + ); + })()}