ui::app_init("note");
let mut app = App;
- ui::app_run(&mut app);
+ ui::app_run::<TestData>(&mut app);
}
struct App;
}
}
-fn create_window() {
- let testdata = TestData::default();
+fn create_window(app: &AppContext<TestData>) {
+ 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);
window.show();
}
-impl ui::Application for App {
- fn on_startup(&mut self) {
- create_window();
+impl Application<TestData> for App {
+ fn on_startup(&mut self, app: &AppContext<TestData>) {
+ create_window(app);
}
}
#[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<T: UiModel + UiActions> {
+ fn on_startup(&mut self, app: &AppContext<T>);
- fn on_exit(&mut self) { }
+ fn on_exit(&mut self, _app: &AppContext<T>) { }
+}
+
+pub struct AppContext<T: UiModel + UiActions> {
+ _marker: PhantomData<T>,
}
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<T: UiModel + UiActions>(_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<T>;
+ let app_ref: &mut AppWrapper<T> = &mut *app_ptr;
+ let ctx = AppContext::<T> {
+ _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<T: UiModel + UiActions>(_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<T>;
+ let app_ref: &mut AppWrapper<T> = &mut *app_ptr;
+ let ctx = AppContext::<T> {
+ _marker: PhantomData,
+ };
+ app_ref.app.on_exit(&ctx);
}
}
-pub fn app_run(app: &mut dyn Application) {
+pub fn app_run<T: UiModel + UiActions>(app: &mut dyn Application<T>) {
let mut wrapper = AppWrapper { app: app };
unsafe {
- let ptr: *mut AppWrapper = &mut wrapper;
+ let ptr: *mut AppWrapper<T> = &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::<T>), c_ptr);
+ ui_onexit(Some(app_exit::<T>), c_ptr);
ui_main();
}
}
#[repr(C)]
-struct AppWrapper<'a> {
- app: &'a mut dyn Application,
+struct AppWrapper<'a, T> {
+ app: &'a mut dyn Application<T>,
}
\ No newline at end of file
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" {
obj
}
-pub fn window<T: UiModel + UiActions, F>(title: &str, data: T, create_ui: F) -> toolkit::UiObject<T>
-where F: FnOnce(&mut toolkit::UiObject<T>, &mut T)
-{
- window_create(title, WindowType::Standard, data, create_ui)
-}
+impl<T: UiModel + UiActions> AppContext<T> {
+ pub fn window<F>(&self, title: &str, data: T, create_ui: F) -> toolkit::UiObject<T>
+ where F: FnOnce(&mut toolkit::UiObject<T>, &mut T)
+ {
+ window_create(title, WindowType::Standard, data, create_ui)
+ }
-pub fn sidebar_window<T: UiModel + UiActions, F>(title: &str, data: T, create_ui: F) -> toolkit::UiObject<T>
-where F: FnOnce(&mut toolkit::UiObject<T>, &mut T)
-{
- window_create(title, WindowType::Sidebar, data, create_ui)
-}
+ pub fn sidebar_window<F>(&self, title: &str, data: T, create_ui: F) -> toolkit::UiObject<T>
+ where F: FnOnce(&mut toolkit::UiObject<T>, &mut T)
+ {
+ window_create(title, WindowType::Sidebar, data, create_ui)
+ }
-pub fn splitview_window<T: UiModel + UiActions, F>(title: &str, sidebar: bool, data: T, create_ui: F) -> toolkit::UiObject<T>
-where F: FnOnce(&mut toolkit::UiObject<T>, &mut T)
-{
- window_create(title, WindowType::SplitView(sidebar), data, create_ui)
+ pub fn splitview_window<F>(&self, title: &str, sidebar: bool, data: T, create_ui: F) -> toolkit::UiObject<T>
+ where F: FnOnce(&mut toolkit::UiObject<T>, &mut T)
+ {
+ window_create(title, WindowType::SplitView(sidebar), data, create_ui)
+ }
}
pub fn simple_window<T: UiModel + UiActions, F>(title: &str, data: T, create_ui: F) -> toolkit::UiObject<T>
{
window_create(title, WindowType::Simple, data, create_ui)
}
-