use std::ffi::{c_char, c_int, c_void};
use std::ffi::CString;
use std::marker::PhantomData;
-use crate::ui::{toolkit, AppContext, UiActions, UiModel};
-use crate::ui::ffi::{UiContext, UiDestructor, UiObject};
-
-extern "C" {
- fn ui_window(title: *const c_char) -> *mut UiObject;
- fn ui_sidebar_window(title: *const c_char) -> *mut UiObject;
- fn ui_splitview_window(title: *const c_char, sidebar: c_int) -> *mut UiObject;
- fn ui_simple_window(title: *const c_char) -> *mut UiObject;
-
-
- fn ui_show(ui: *const UiObject);
-
- pub fn ui_object_get_windowdata(obj: *const UiObject) -> *mut c_void;
- pub fn ui_object_set_windowdata(obj: *mut UiObject, data: *mut c_void);
- pub fn ui_object_get_context(obj: *const UiObject) -> *mut UiContext;
-
- pub fn ui_reg_destructor(ctx: *mut UiContext, data: *mut c_void, destructor: UiDestructor);
-}
-
+use crate::ui::{event, ffi, toolkit, AppContext, EventWrapper, UiActions, UiModel};
+use crate::ui::ffi::{UiButtonArgs, UiCallback, UiContext, UiDestructor, UiDialogArgs, UiObject};
+use crate::ui::widget::widget_fn;
impl<T> toolkit::UiObject<T> {
pub fn show(&self) {
}
}
+/* ---------------------------------- main windows ---------------------------------- */
+
enum WindowType {
Standard,
SplitView(bool),
{
window_create(title, WindowType::Simple, data, create_ui)
}
+
+/* ---------------------------------- dialogs ---------------------------------- */
+
+pub struct DialogBuilder<T> {
+ args: *mut UiDialogArgs,
+ parent: *mut ffi::UiObject,
+ _marker: PhantomData<T>
+}
+
+impl<T> Drop for DialogBuilder<T> {
+ fn drop(&mut self) {
+ unsafe {
+ ui_dialog_args_free(self.args);
+ }
+ }
+}
+
+impl<T> DialogBuilder<T> {
+ pub fn create(&mut self) {
+ unsafe {
+ ui_dialog_create(self.parent, self.args);
+ }
+ }
+
+ pub fn title(&mut self, val: &str) -> &mut Self {
+ let cstr = CString::new(val).unwrap();
+ unsafe {
+ ui_dialog_args_set_title(self.args, cstr.as_ptr());
+ }
+ self
+ }
+
+ pub fn content(&mut self, val: &str) -> &mut Self {
+ let cstr = CString::new(val).unwrap();
+ unsafe {
+ ui_dialog_args_set_content(self.args, cstr.as_ptr());
+ }
+ self
+ }
+
+ pub fn button1_label(&mut self, val: &str) -> &mut Self {
+ let cstr = CString::new(val).unwrap();
+ unsafe {
+ ui_dialog_args_set_button1_label(self.args, cstr.as_ptr());
+ }
+ self
+ }
+
+ pub fn button2_label(&mut self, val: &str) -> &mut Self {
+ let cstr = CString::new(val).unwrap();
+ unsafe {
+ ui_dialog_args_set_button2_label(self.args, cstr.as_ptr());
+ }
+ self
+ }
+
+ pub fn closebutton_label(&mut self, val: &str) -> &mut Self {
+ let cstr = CString::new(val).unwrap();
+ unsafe {
+ ui_dialog_args_set_closebutton_label(self.args, cstr.as_ptr());
+ }
+ self
+ }
+
+ pub fn input_value(&mut self, val: &str) -> &mut Self {
+ let cstr = CString::new(val).unwrap();
+ unsafe {
+ ui_dialog_args_set_input_value(self.args, cstr.as_ptr());
+ }
+ self
+ }
+
+ pub fn input(&mut self, enable: bool) -> &mut Self {
+ unsafe {
+ ui_dialog_args_set_input(self.args, enable as c_int);
+ }
+ self
+ }
+
+ pub fn password(&mut self, enable: bool) -> &mut Self {
+ unsafe {
+ ui_dialog_args_set_password(self.args, enable as c_int);
+ }
+ self
+ }
+
+ pub fn result<F>(&mut self, f: F) -> &mut Self
+ where F: FnMut(&mut event::Event<T>) + 'static {
+ let wrapper = Box::new(EventWrapper { callback: Box::new(f) });
+ let ptr = Box::into_raw(wrapper);
+ unsafe {
+ ui_dialog_args_set_result(self.args, Some(event::event_wrapper::<T>));
+ ui_dialog_args_set_resultdata(self.args, ptr as *mut c_void);
+ }
+ self
+ }
+}
+
+impl<T> toolkit::UiObject<T> {
+ pub fn dialog_builder(&self) -> DialogBuilder<T> {
+ DialogBuilder {
+ args: unsafe { ui_dialog_args_new() },
+ parent: self.ptr,
+ _marker: PhantomData,
+ }
+ }
+
+ widget_fn!(dialog, dialog_builder, DialogBuilder);
+}
+
+
+/* ---------------------------------- C functions ---------------------------------- */
+
+extern "C" {
+ fn ui_window(title: *const c_char) -> *mut UiObject;
+ fn ui_sidebar_window(title: *const c_char) -> *mut UiObject;
+ fn ui_splitview_window(title: *const c_char, sidebar: c_int) -> *mut UiObject;
+ fn ui_simple_window(title: *const c_char) -> *mut UiObject;
+
+ fn ui_dialog_create(parent: *mut UiObject, args: *mut UiDialogArgs);
+
+
+
+ fn ui_show(ui: *const UiObject);
+
+ pub fn ui_object_get_windowdata(obj: *const UiObject) -> *mut c_void;
+ pub fn ui_object_set_windowdata(obj: *mut UiObject, data: *mut c_void);
+ pub fn ui_object_get_context(obj: *const UiObject) -> *mut UiContext;
+
+ pub fn ui_reg_destructor(ctx: *mut UiContext, data: *mut c_void, destructor: UiDestructor);
+
+ fn ui_dialog_args_new() -> *mut UiDialogArgs;
+ fn ui_dialog_args_set_title(args: *mut UiDialogArgs, title: *const c_char);
+ fn ui_dialog_args_set_content(args: *mut UiDialogArgs, content: *const c_char);
+ fn ui_dialog_args_set_button1_label(args: *mut UiDialogArgs, label: *const c_char);
+ fn ui_dialog_args_set_button2_label(args: *mut UiDialogArgs, label: *const c_char);
+ fn ui_dialog_args_set_closebutton_label(args: *mut UiDialogArgs, label: *const c_char);
+ fn ui_dialog_args_set_input_value(args: *mut UiDialogArgs, value: *const c_char);
+ fn ui_dialog_args_set_input(args: *mut UiDialogArgs, input: c_int);
+ fn ui_dialog_args_set_password(args: *mut UiDialogArgs, password: c_int);
+ fn ui_dialog_args_set_result(args: *mut UiDialogArgs, callback: UiCallback);
+ fn ui_dialog_args_set_resultdata(args: *mut UiDialogArgs, data: *mut c_void);
+ fn ui_dialog_args_free(args: *mut UiDialogArgs);
+}