Projects: Inital support for saving and loading projects #22

Merged
cody merged 17 commits from topic/jb/project-files into main 2025-04-05 19:56:33 +00:00
2 changed files with 31 additions and 14 deletions
Showing only changes of commit e0a266317e - Show all commits

View File

@ -4,7 +4,7 @@ use crate::{gui::{self, main_tab::MainTab, MutexTIMManager, VRAM_HEIGHT, VRAM_WI
use super::FileTab; use super::FileTab;
use rfd::FileDialog; use rfd::FileDialog;
use slint::SharedString; 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; use tool_helper::Error;
pub(super) fn on_browse_file(tim_manager: MutexTIMManager) -> impl FnMut(&mut FileTab, &MainWindow) -> Result<(), Error> + 'static { 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")); return Err(Error::from_str("TIM and VRAM info not in sync! Please close program"));
} }
let mut cur_job = None; let mut cur_job:Option<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_palette:Option<PaletteRect> = 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 { 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 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); let prev_job = std::mem::replace(&mut cur_job, None);
if let Some(tim) = tim { 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() { 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 prev_job
} }

View File

@ -2,33 +2,45 @@ use serde::{Deserialize, Serialize};
use std::path::PathBuf; use std::path::PathBuf;
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
struct ImagePosition { pub struct ImagePosition {
pub x: u16, pub x: u16,
pub y: u16, pub y: u16,
} }
impl ImagePosition {
pub fn new(x: u16, y: u16) -> ImagePosition {
ImagePosition{x, y}
}
}
impl std::default::Default for ImagePosition { impl std::default::Default for ImagePosition {
fn default() -> Self { fn default() -> Self {
ImagePosition{x: 0, y: 0} ImagePosition::new(0, 0)
} }
} }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
struct ImageSize { pub struct ImageSize {
pub width: u16, pub width: u16,
pub height: u16, pub height: u16,
} }
impl ImageSize {
pub fn new(width: u16, height: u16) -> ImageSize {
ImageSize{width, height}
}
}
impl std::default::Default for ImageSize { impl std::default::Default for ImageSize {
fn default() -> Self { fn default() -> Self {
ImageSize{width: 0, height: 0} ImageSize::new(0, 0)
} }
} }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
pub struct PaletteRect { pub struct PaletteRect {
pos: ImagePosition, pub pos: ImagePosition,
size: ImageSize, pub size: ImageSize,
} }
impl PaletteRect { impl PaletteRect {