diff --git a/src/Tools/tim_tool/src/main.rs b/src/Tools/tim_tool/src/main.rs index bf454cd4..fb352245 100644 --- a/src/Tools/tim_tool/src/main.rs +++ b/src/Tools/tim_tool/src/main.rs @@ -1,10 +1,46 @@ // Prevent console window in addition to Slint window in Windows release builds when, e.g., starting the app via file manager. Ignored on other platforms. #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] +use slint::Model; +use std::{cell::RefCell, rc::Rc}; + slint::include_modules!(); -fn main() -> Result<(), slint::PlatformError> { - let main_window = MainWindow::new()?; +struct GUIElements { + tab_vram_file_list: Rc> +} +impl GUIElements { + pub fn new(main_window: &MainWindow) -> GUIElements { + let tab_vram_file_list:Vec = main_window.get_main_tab_vram_file_list().iter().collect(); + let tab_vram_file_list = Rc::new(slint::VecModel::from(tab_vram_file_list)); + + main_window.set_main_tab_vram_file_list(tab_vram_file_list.clone().into()); + GUIElements{tab_vram_file_list} + } + + pub fn add_new_vram_file(&mut self, file: &str) { + self.tab_vram_file_list.push(slint::StandardListViewItem::from(file)); + } + + pub fn remove_vram_file(&mut self, idx: usize) { + self.tab_vram_file_list.remove(idx); + } +} + +fn main() -> Result<(), slint::PlatformError> { + let main_window = MainWindow::new()?; + let gui_elements = Rc::new(RefCell::new(GUIElements::new(&main_window))); + + 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 gui_elements_cloned = gui_elements.clone(); + main_window.on_main_tab_remove_file_clicked(move |idx: i32| { + if idx >= 0 { + gui_elements_cloned.borrow_mut().remove_vram_file(idx as usize); + } + }); main_window.run() } \ No newline at end of file diff --git a/src/Tools/tim_tool/ui/app-window.slint b/src/Tools/tim_tool/ui/app-window.slint index aee785d0..060a7444 100644 --- a/src/Tools/tim_tool/ui/app-window.slint +++ b/src/Tools/tim_tool/ui/app-window.slint @@ -4,6 +4,11 @@ import { MainTab } from "./tab/main-tab.slint"; import { TabWidget } from "std-widgets.slint"; export component MainWindow inherits Window { + in-out property main_tab_vram_file_list <=> tab.vram_files; + + callback main_tab_add_file_clicked <=> tab.add_file_clicked; + callback main_tab_remove_file_clicked <=> tab.remove_file_clicked; + title: "TIM Tool 0.1.0"; width: tab_widget.width; height: tab_widget.height; diff --git a/src/Tools/tim_tool/ui/tab/main-tab.slint b/src/Tools/tim_tool/ui/tab/main-tab.slint index 33367df1..76a1c739 100644 --- a/src/Tools/tim_tool/ui/tab/main-tab.slint +++ b/src/Tools/tim_tool/ui/tab/main-tab.slint @@ -8,8 +8,11 @@ struct VRAMImage { } export component MainTab inherits Rectangle { - in property <[StandardListViewItem]> vram_file_list: []; - in property <[VRAMImage]> vram_images: []; + in-out property <[StandardListViewItem]> vram_files: []; + in-out property <[VRAMImage]> vram_images: []; + + callback add_file_clicked(); + callback remove_file_clicked(int); width: group.width + group.x*2; height: group.height + group.y*2 + 32px; @@ -49,19 +52,23 @@ export component MainTab inherits Rectangle { VerticalLayout { alignment: start; padding: 4px; - StandardListView { - width: background_image.width/2; + vram_files_list := StandardListView { + width: background_image.width/2; height: 128px; - - model: root.vram_file_list; + model: root.vram_files; } HorizontalLayout { padding: 4px; Button { text: "Add File"; + clicked => {root.add_file_clicked();} } Button { text: "Remove File"; + clicked => { + root.remove_file_clicked(vram_files_list.current_item); + vram_files_list.current-item = -1; + } } } }