From e0a266317e77ef9e19c391cf08ae416caeccc078 Mon Sep 17 00:00:00 2001 From: Jaby Date: Thu, 20 Mar 2025 20:57:10 +0100 Subject: [PATCH] Support saving palette information --- .../tim_tool/src/gui/file_tab/callbacks.rs | 21 +++++++++------- src/Tools/tim_tool/src/logic/project/mod.rs | 24 ++++++++++++++----- 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/src/Tools/tim_tool/src/gui/file_tab/callbacks.rs b/src/Tools/tim_tool/src/gui/file_tab/callbacks.rs index 7f689469..2481c0ce 100644 --- a/src/Tools/tim_tool/src/gui/file_tab/callbacks.rs +++ b/src/Tools/tim_tool/src/gui/file_tab/callbacks.rs @@ -4,7 +4,7 @@ use crate::{gui::{self, main_tab::MainTab, MutexTIMManager, VRAM_HEIGHT, VRAM_WI use super::FileTab; use rfd::FileDialog; use slint::SharedString; -use tim_tool::logic::{project::{Job, PaletteRect, Project}, tim::types::Encoding}; +use tim_tool::logic::{project::{ImagePosition, Job, PaletteRect, Project}, tim::types::Encoding}; use tool_helper::Error; pub(super) fn on_browse_file(tim_manager: MutexTIMManager) -> impl FnMut(&mut FileTab, &MainWindow) -> Result<(), Error> + 'static { @@ -81,10 +81,17 @@ pub(super) fn on_save_project_clicked(tim_manager: MutexTIMManager) -> impl FnMu return Err(Error::from_str("TIM and VRAM info not in sync! Please close program")); } - let mut cur_job = None; - let mut project = Project::new(tim_info.into_iter().zip(vram_info.into_iter()).filter_map(|(tim, (file_name, vram))| { + let mut cur_job:Option = None; + let mut cur_palette:Option = None; + let mut project = Project::new(tim_info.into_iter().zip(vram_info.into_iter()).filter_map(|(tim, (file_name, vram))| { if vram.is_palette { - // Add palette to cur_job + let cur_palette = std::mem::replace(&mut cur_palette, None); + if let Some(mut cur_palette) = cur_palette { + cur_palette.pos = ImagePosition::new(vram.x as u16, vram.y as u16); + if let Some(cur_job) = &mut cur_job { + cur_job.add_palette(cur_palette); + } + } None } @@ -93,12 +100,10 @@ pub(super) fn on_save_project_clicked(tim_manager: MutexTIMManager) -> impl FnMu let prev_job = std::mem::replace(&mut cur_job, None); if let Some(tim) = tim { - let mut job = Job::new(file_name, tim.get_path(), (vram.x as u16, vram.y as u16)); - if let Some((width, height)) = tim.get_palette_size() { - job.add_palette(PaletteRect::new(0, 0, width, height)); + cur_palette = Some(PaletteRect::new(0, 0, width, height)); } - cur_job = Some(job); + cur_job = Some(Job::new(file_name, tim.get_path(), (vram.x as u16, vram.y as u16))); } prev_job } diff --git a/src/Tools/tim_tool/src/logic/project/mod.rs b/src/Tools/tim_tool/src/logic/project/mod.rs index 240d080c..2dca49be 100644 --- a/src/Tools/tim_tool/src/logic/project/mod.rs +++ b/src/Tools/tim_tool/src/logic/project/mod.rs @@ -2,33 +2,45 @@ use serde::{Deserialize, Serialize}; use std::path::PathBuf; #[derive(Serialize, Deserialize)] -struct ImagePosition { +pub struct ImagePosition { pub x: u16, pub y: u16, } +impl ImagePosition { + pub fn new(x: u16, y: u16) -> ImagePosition { + ImagePosition{x, y} + } +} + impl std::default::Default for ImagePosition { fn default() -> Self { - ImagePosition{x: 0, y: 0} + ImagePosition::new(0, 0) } } #[derive(Serialize, Deserialize)] -struct ImageSize { +pub struct ImageSize { pub width: u16, pub height: u16, } +impl ImageSize { + pub fn new(width: u16, height: u16) -> ImageSize { + ImageSize{width, height} + } +} + impl std::default::Default for ImageSize { fn default() -> Self { - ImageSize{width: 0, height: 0} + ImageSize::new(0, 0) } } #[derive(Serialize, Deserialize)] pub struct PaletteRect { - pos: ImagePosition, - size: ImageSize, + pub pos: ImagePosition, + pub size: ImageSize, } impl PaletteRect {