From: Olaf Wintermann Date: Fri, 24 Apr 2026 07:10:34 +0000 (+0200) Subject: force a global type for app windows X-Git-Url: https://uap-core.de/gitweb/?a=commitdiff_plain;h=HEAD;p=note.git force a global type for app windows --- diff --git a/application/src/main.rs b/application/src/main.rs index db83377..bb42ca5 100644 --- a/application/src/main.rs +++ b/application/src/main.rs @@ -5,7 +5,7 @@ fn main() { ui::app_init("note"); let mut app = App; - ui::app_run(&mut app); + ui::app_run::(&mut app); } struct App; @@ -28,10 +28,10 @@ impl TestData { } } -fn create_window() { - let testdata = TestData::default(); +fn create_window(app: &AppContext) { + let testdata: TestData = Default::default(); - let window = ui::window("note", testdata, |obj, data| { + let window = app.window("note", testdata, |obj, data| { let list = data.list.data(); list.push(10); list.push(11); @@ -66,8 +66,8 @@ fn create_window() { window.show(); } -impl ui::Application for App { - fn on_startup(&mut self) { - create_window(); +impl Application for App { + fn on_startup(&mut self, app: &AppContext) { + create_window(app); } } diff --git a/ui-rs/src/ui/application.rs b/ui-rs/src/ui/application.rs index a339842..7b40e91 100644 --- a/ui-rs/src/ui/application.rs +++ b/ui-rs/src/ui/application.rs @@ -1,12 +1,18 @@ #[allow(unused_imports)] use std::ffi::{c_char, c_int, c_void, CString}; +use std::marker::PhantomData; use crate::ui::ffi::{UiCallback, UiEvent}; +use crate::ui::{UiActions, UiModel}; -pub trait Application { - fn on_startup(&mut self); +pub trait Application { + fn on_startup(&mut self, app: &AppContext); - fn on_exit(&mut self) { } + fn on_exit(&mut self, _app: &AppContext) { } +} + +pub struct AppContext { + _marker: PhantomData, } @@ -17,34 +23,40 @@ extern "C" { fn ui_onexit(callback: UiCallback, userdata: *mut c_void); } -extern "C" fn app_startup(_event: *const UiEvent, data: *mut c_void) { +extern "C" fn app_startup(_event: *const UiEvent, data: *mut c_void) { unsafe { - let app_ptr = data as *mut AppWrapper; - let app_ref: &mut AppWrapper = &mut *app_ptr; - app_ref.app.on_startup(); + let app_ptr = data as *mut AppWrapper; + let app_ref: &mut AppWrapper = &mut *app_ptr; + let ctx = AppContext:: { + _marker: PhantomData, + }; + app_ref.app.on_startup(&ctx); } } -extern "C" fn app_exit(_event: *const UiEvent, data: *mut c_void) { +extern "C" fn app_exit(_event: *const UiEvent, data: *mut c_void) { unsafe { - let app_ptr = data as *mut AppWrapper; - let app_ref: &mut AppWrapper = &mut *app_ptr; - app_ref.app.on_exit(); + let app_ptr = data as *mut AppWrapper; + let app_ref: &mut AppWrapper = &mut *app_ptr; + let ctx = AppContext:: { + _marker: PhantomData, + }; + app_ref.app.on_exit(&ctx); } } -pub fn app_run(app: &mut dyn Application) { +pub fn app_run(app: &mut dyn Application) { let mut wrapper = AppWrapper { app: app }; unsafe { - let ptr: *mut AppWrapper = &mut wrapper; + let ptr: *mut AppWrapper = &mut wrapper; let c_ptr: *mut c_void = ptr as *mut c_void; - ui_onstartup(Some(app_startup), c_ptr); - ui_onexit(Some(app_exit), c_ptr); + ui_onstartup(Some(app_startup::), c_ptr); + ui_onexit(Some(app_exit::), c_ptr); ui_main(); } } #[repr(C)] -struct AppWrapper<'a> { - app: &'a mut dyn Application, +struct AppWrapper<'a, T> { + app: &'a mut dyn Application, } \ No newline at end of file diff --git a/ui-rs/src/ui/window.rs b/ui-rs/src/ui/window.rs index d61df8a..b00494a 100644 --- a/ui-rs/src/ui/window.rs +++ b/ui-rs/src/ui/window.rs @@ -4,7 +4,7 @@ use std::ffi::{c_char, c_int, c_void}; use std::ffi::CString; use std::marker::PhantomData; -use crate::ui::{toolkit, UiActions, UiModel}; +use crate::ui::{toolkit, AppContext, UiActions, UiModel}; use crate::ui::ffi::{UiContext, UiDestructor, UiObject}; extern "C" { @@ -82,22 +82,24 @@ where F: FnOnce(&mut toolkit::UiObject, &mut T) { obj } -pub fn window(title: &str, data: T, create_ui: F) -> toolkit::UiObject -where F: FnOnce(&mut toolkit::UiObject, &mut T) -{ - window_create(title, WindowType::Standard, data, create_ui) -} +impl AppContext { + pub fn window(&self, title: &str, data: T, create_ui: F) -> toolkit::UiObject + where F: FnOnce(&mut toolkit::UiObject, &mut T) + { + window_create(title, WindowType::Standard, data, create_ui) + } -pub fn sidebar_window(title: &str, data: T, create_ui: F) -> toolkit::UiObject -where F: FnOnce(&mut toolkit::UiObject, &mut T) -{ - window_create(title, WindowType::Sidebar, data, create_ui) -} + pub fn sidebar_window(&self, title: &str, data: T, create_ui: F) -> toolkit::UiObject + where F: FnOnce(&mut toolkit::UiObject, &mut T) + { + window_create(title, WindowType::Sidebar, data, create_ui) + } -pub fn splitview_window(title: &str, sidebar: bool, data: T, create_ui: F) -> toolkit::UiObject -where F: FnOnce(&mut toolkit::UiObject, &mut T) -{ - window_create(title, WindowType::SplitView(sidebar), data, create_ui) + pub fn splitview_window(&self, title: &str, sidebar: bool, data: T, create_ui: F) -> toolkit::UiObject + where F: FnOnce(&mut toolkit::UiObject, &mut T) + { + window_create(title, WindowType::SplitView(sidebar), data, create_ui) + } } pub fn simple_window(title: &str, data: T, create_ui: F) -> toolkit::UiObject @@ -105,4 +107,3 @@ where F: FnOnce(&mut toolkit::UiObject, &mut T) { window_create(title, WindowType::Simple, data, create_ui) } -