From 9146bf94a549d5112af01187a9cbe54078601a71 Mon Sep 17 00:00:00 2001 From: Jaby Date: Wed, 12 Feb 2025 21:47:38 +0100 Subject: [PATCH] Restructure code a bit --- src/Tools/tim_tool/src/gui/gui_elements.rs | 78 +++++++++++++++++++++ src/Tools/tim_tool/src/gui/mod.rs | 4 ++ src/Tools/tim_tool/src/main.rs | 79 +--------------------- 3 files changed, 85 insertions(+), 76 deletions(-) create mode 100644 src/Tools/tim_tool/src/gui/gui_elements.rs diff --git a/src/Tools/tim_tool/src/gui/gui_elements.rs b/src/Tools/tim_tool/src/gui/gui_elements.rs new file mode 100644 index 00000000..d26ec7bd --- /dev/null +++ b/src/Tools/tim_tool/src/gui/gui_elements.rs @@ -0,0 +1,78 @@ +use crate::{gui::{VRAM_HEIGHT, VRAM_WIDTH, create_vram_bg}, MainWindow, VRAMImage}; + +use slint::Model; +use std::{cell::RefCell, ffi::OsStr, path::PathBuf, rc::Rc}; +use tool_helper::Error; + +pub struct GUIElements { + pub main_window: Rc>, + vram_file_list: Rc>, + vram_image_list: Rc>, +} + +impl GUIElements { + pub fn new(main_window: Rc>) -> GUIElements { + let vram_file_list:Vec = main_window.borrow().get_main_tab_vram_file_list().iter().collect(); + let vram_file_list = Rc::new(slint::VecModel::from(vram_file_list)); + + let vram_image_list = Rc::new(slint::VecModel::from(Vec::::new())); + + main_window.borrow().set_main_tab_vram_file_list(vram_file_list.clone().into()); + main_window.borrow().set_main_tab_vram_images(vram_image_list.clone().into()); + + GUIElements{main_window, vram_file_list, vram_image_list} + } + + pub fn add_new_vram_file(&mut self, file: PathBuf) -> Result<(), Error> { + let vram_image = VRAMImage{ + img: slint::Image::load_from_path(&file).or_else(|_| {Err(Error::from_str("Failed loading image"))})?, + x: 0, + y: 0 + }; + + let img_size = vram_image.img.size(); + if img_size.width > VRAM_WIDTH as u32 || img_size.height > VRAM_HEIGHT as u32 { + return Err(Error::from_text(format!("Image size ({}; {}) is to big for VRAM ({}, {})", img_size.width, img_size.height, VRAM_WIDTH, 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) { + self.vram_file_list.remove(idx); + self.vram_image_list.remove(idx); + } + + pub fn move_vram_image(&mut self, idx: usize, dx: i32, dy: i32) { + if let Some(mut vram_info) = self.vram_image_list.row_data(idx) { + vram_info.x += dx; + vram_info.y += dy; + + if vram_info.x < 0 { + vram_info.x = 0; + } + + if vram_info.y < 0 { + vram_info.y = 0; + } + + 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) > VRAM_WIDTH as i32 { + vram_info.x = VRAM_WIDTH as i32 - vram_img_width; + } + + if (vram_info.y + vram_img_height) > VRAM_HEIGHT as i32 { + vram_info.y = VRAM_HEIGHT as i32 - vram_img_height; + } + + self.vram_image_list.set_row_data(idx, vram_info); + } + } + + pub fn create_bg() -> Result { + Ok(slint::Image::from_rgba8_premultiplied(create_vram_bg(320, 256).ok_or(slint::PlatformError::Other("Failed creating VRAM background image".to_string()))?)) + } +} \ No newline at end of file diff --git a/src/Tools/tim_tool/src/gui/mod.rs b/src/Tools/tim_tool/src/gui/mod.rs index fe1dec0d..82b6483c 100644 --- a/src/Tools/tim_tool/src/gui/mod.rs +++ b/src/Tools/tim_tool/src/gui/mod.rs @@ -1,6 +1,10 @@ +mod gui_elements; + use slint::{Rgba8Pixel, SharedPixelBuffer}; use tiny_skia::{Rect, Transform}; +pub use gui_elements::GUIElements; + pub const VRAM_WIDTH:usize = 1024; pub const VRAM_HEIGHT:usize = 512; diff --git a/src/Tools/tim_tool/src/main.rs b/src/Tools/tim_tool/src/main.rs index 6e14a374..1464fb5b 100644 --- a/src/Tools/tim_tool/src/main.rs +++ b/src/Tools/tim_tool/src/main.rs @@ -2,86 +2,13 @@ #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] mod gui; -use slint::{Model, SharedString}; +use gui::GUIElements; use rfd::{FileDialog, MessageDialog}; -use std::{cell::RefCell, ffi::OsStr, path::PathBuf, rc::Rc}; -use tool_helper::Error; +use std::{cell::RefCell, rc::Rc}; +use slint::SharedString; slint::include_modules!(); -struct GUIElements { - pub main_window: Rc>, - vram_file_list: Rc>, - vram_image_list: Rc>, -} - -impl GUIElements { - pub fn new(main_window: Rc>) -> GUIElements { - let vram_file_list:Vec = main_window.borrow().get_main_tab_vram_file_list().iter().collect(); - let vram_file_list = Rc::new(slint::VecModel::from(vram_file_list)); - - let vram_image_list = Rc::new(slint::VecModel::from(Vec::::new())); - - main_window.borrow().set_main_tab_vram_file_list(vram_file_list.clone().into()); - main_window.borrow().set_main_tab_vram_images(vram_image_list.clone().into()); - - GUIElements{main_window, vram_file_list, vram_image_list} - } - - pub fn add_new_vram_file(&mut self, file: PathBuf) -> Result<(), Error> { - let vram_image = VRAMImage{ - img: slint::Image::load_from_path(&file).or_else(|_| {Err(Error::from_str("Failed loading image"))})?, - x: 0, - y: 0 - }; - - 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) { - self.vram_file_list.remove(idx); - self.vram_image_list.remove(idx); - } - - pub fn move_vram_image(&mut self, idx: usize, dx: i32, dy: i32) { - if let Some(mut vram_info) = self.vram_image_list.row_data(idx) { - vram_info.x += dx; - vram_info.y += dy; - - if vram_info.x < 0 { - vram_info.x = 0; - } - - if vram_info.y < 0 { - vram_info.y = 0; - } - - 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) > gui::VRAM_WIDTH as i32 { - vram_info.x = gui::VRAM_WIDTH as i32 - vram_img_width; - } - - 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); - } - } - - pub fn create_bg() -> Result { - Ok(slint::Image::from_rgba8_premultiplied(gui::create_vram_bg(320, 256).ok_or(slint::PlatformError::Other("Failed creating VRAM background image".to_string()))?)) - } -} - fn main() -> Result<(), slint::PlatformError> { let main_window = Rc::new(RefCell::new(MainWindow::new()?)); let gui_elements = Rc::new(RefCell::new(GUIElements::new(main_window.clone())));