From 7f831bc09b49db307855eaaa9595025ca0f9a320 Mon Sep 17 00:00:00 2001 From: Jaby Date: Sun, 9 Feb 2025 19:31:42 +0100 Subject: [PATCH] Support loading image --- src/Tools/tim_tool/Cargo.toml | 6 +++-- src/Tools/tim_tool/src/gui/mod.rs | 5 +++- src/Tools/tim_tool/src/main.rs | 38 +++++++++++++++++++++++-------- 3 files changed, 37 insertions(+), 12 deletions(-) diff --git a/src/Tools/tim_tool/Cargo.toml b/src/Tools/tim_tool/Cargo.toml index c2eff597..f07694dc 100644 --- a/src/Tools/tim_tool/Cargo.toml +++ b/src/Tools/tim_tool/Cargo.toml @@ -7,8 +7,10 @@ edition = "2021" panic = "abort" [dependencies] -tiny-skia = "0.11.4" -slint = "1.9.2" +rfd = "0.15.2" +slint = "1.9.2" +tiny-skia = "0.11.4" +tool_helper = {path = "../tool_helper"} [build-dependencies] slint-build = "1.9.2" diff --git a/src/Tools/tim_tool/src/gui/mod.rs b/src/Tools/tim_tool/src/gui/mod.rs index ecf31581..fe1dec0d 100644 --- a/src/Tools/tim_tool/src/gui/mod.rs +++ b/src/Tools/tim_tool/src/gui/mod.rs @@ -1,8 +1,11 @@ use slint::{Rgba8Pixel, SharedPixelBuffer}; use tiny_skia::{Rect, Transform}; +pub const VRAM_WIDTH:usize = 1024; +pub const VRAM_HEIGHT:usize = 512; + pub fn create_vram_bg(rect_width: u32, rect_height: u32) -> Option> { - let mut pixel_buffer = SharedPixelBuffer::::new(1024, 512); + let mut pixel_buffer = SharedPixelBuffer::::new(VRAM_WIDTH as u32, VRAM_HEIGHT as u32); let width = pixel_buffer.width(); let height = pixel_buffer.height(); diff --git a/src/Tools/tim_tool/src/main.rs b/src/Tools/tim_tool/src/main.rs index 6793aeed..3a2723f8 100644 --- a/src/Tools/tim_tool/src/main.rs +++ b/src/Tools/tim_tool/src/main.rs @@ -3,7 +3,9 @@ mod gui; use slint::Model; -use std::{cell::RefCell, path::Path, rc::Rc}; +use rfd::{FileDialog, MessageDialog}; +use std::{cell::RefCell, ffi::OsStr, path::PathBuf, rc::Rc}; +use tool_helper::Error; slint::include_modules!(); @@ -24,15 +26,22 @@ impl GUIElements { GUIElements{vram_file_list, vram_image_list} } - pub fn add_new_vram_file(&mut self, file: &str) { + pub fn add_new_vram_file(&mut self, file: PathBuf) -> Result<(), Error> { let vram_image = VRAMImage{ - img: slint::Image::load_from_path(Path::new("/home/jaby/Desktop/PSX_Dev/jabyengine/examples/PoolBox/assets/IMG_6921.png")).unwrap(), + img: slint::Image::load_from_path(&file).or_else(|_| {Err(Error::from_str("Failed loading image"))})?, x: 0, y: 0 }; - self.vram_file_list.push(slint::StandardListViewItem::from(file)); + let img_size = vram_image.img.size(); + if img_size.width > gui::VRAM_WIDTH as u32 || img_size.height > gui::VRAM_HEIGHT as u32 { + return Err(Error::from_text(format!("Image size ({}; {}) is to big for VRAM ({}, {})", img_size.width, img_size.height, gui::VRAM_WIDTH, gui::VRAM_HEIGHT))); + } + + let file_name = file.file_name().get_or_insert(OsStr::new("")).to_string_lossy().to_string(); + self.vram_file_list.push(slint::StandardListViewItem::from(file_name.as_str())); self.vram_image_list.push(vram_image); + Ok(()) } pub fn remove_vram_file(&mut self, idx: usize) { @@ -54,12 +63,12 @@ impl GUIElements { } let (vram_img_width, vram_img_height) = (vram_info.img.size().width as i32, vram_info.img.size().height as i32); - if (vram_info.x + vram_img_width) > 1024 { - vram_info.x = 1024 - vram_img_width; + if (vram_info.x + vram_img_width) > gui::VRAM_WIDTH as i32 { + vram_info.x = gui::VRAM_WIDTH as i32 - vram_img_width; } - if (vram_info.y + vram_img_width) > 512 { - vram_info.y = 512 - vram_img_height; + if (vram_info.y + vram_img_height) > gui::VRAM_HEIGHT as i32 { + vram_info.y = gui::VRAM_HEIGHT as i32 - vram_img_height; } self.vram_image_list.set_row_data(idx, vram_info); @@ -79,7 +88,18 @@ fn main() -> Result<(), slint::PlatformError> { let gui_elements_cloned = gui_elements.clone(); main_window.on_main_tab_add_file_clicked(move || { - gui_elements_cloned.borrow_mut().add_new_vram_file("Planschi"); + let file = FileDialog::new() + .add_filter("Images", &["png", "bmp", "jpeg"]) + .add_filter("All", &[""]) + .set_title("Add image") + //.set_directory("/") + .pick_file(); + + if let Some(file) = file { + if let Result::Err(error) = gui_elements_cloned.borrow_mut().add_new_vram_file(file) { + MessageDialog::new().set_title("Loading Image failed").set_level(rfd::MessageLevel::Error).set_description(error.to_string()).show(); + } + } }); let gui_elements_cloned = gui_elements.clone(); main_window.on_main_tab_remove_file_clicked(move |idx: i32| {