use std::ffi::{c_char, c_int, c_void};
use std::ffi::CString;
+use ui_rs_derive::{UiModel};
use crate::ui::{event, toolkit, EventWrapper};
use crate::ui::ffi::*;
-use crate::ui::widget::widget_fn;
+use crate::ui::widget::*;
+
+pub struct Button {
+ ptr: *mut c_void
+}
+
+pub struct ToggleButton {
+ ptr: *mut c_void
+}
+
+impl Widget for Button {
+ fn get_widget(&self) -> *mut c_void {
+ self.ptr
+ }
+}
+
+impl Widget for ToggleButton {
+ fn get_widget(&self) -> *mut c_void {
+ self.ptr
+ }
+}
+
pub struct ButtonBuilder<'a, T> {
args: *mut UiButtonArgs,
TextIcon = 3,
}
-pub type ToggleButtonCreate = fn(*const UiObject, *const UiToggleArgs);
+pub type ToggleButtonCreate = fn(*const UiObject, *const UiToggleArgs) -> *mut c_void;
impl<T> toolkit::UiObject<T> {
widget_fn!(button, button_builder, ButtonBuilder);
}
}
-fn togglebutton_create<'a>(obj: *const UiObject, args: *const UiToggleArgs) {
+fn togglebutton_create<'a>(obj: *const UiObject, args: *const UiToggleArgs) -> *mut c_void {
unsafe {
- ui_togglebutton_create(obj, args);
+ ui_togglebutton_create(obj, args)
}
}
-fn checkbox_create(obj: *const UiObject, args: *const UiToggleArgs) {
+fn checkbox_create(obj: *const UiObject, args: *const UiToggleArgs) -> *mut c_void {
unsafe {
- ui_checkbox_create(obj, args);
+ ui_checkbox_create(obj, args)
}
}
-fn switch_create(obj: *const UiObject, args: *const UiToggleArgs) {
+fn switch_create(obj: *const UiObject, args: *const UiToggleArgs) -> *mut c_void {
unsafe {
- ui_switch_create(obj, args);
+ ui_switch_create(obj, args)
}
}
-fn radiobutton_create(obj: *const UiObject, args: *const UiToggleArgs) {
+fn radiobutton_create(obj: *const UiObject, args: *const UiToggleArgs) -> *mut c_void{
unsafe {
- ui_radiobutton_create(obj, args);
+ ui_radiobutton_create(obj, args)
}
}
}
impl<'a, T> ButtonBuilder<'a, T> {
- pub fn create(&mut self) {
+ pub fn create(&mut self) -> Button {
unsafe {
- ui_button_create(self.obj.ptr, self.args);
+ Button { ptr: ui_button_create(self.obj.ptr, self.args) }
}
}
}
impl<'a, T> ToggleBuilder<'a, T> {
- pub fn create(&mut self) {
- (self.create)(self.obj.ptr, self.args)
+ pub fn create(&mut self) -> ToggleButton {
+ ToggleButton { ptr: (self.create)(self.obj.ptr, self.args) }
}
pub fn fill(&mut self, fill: bool) -> &mut Self {
extern "C" {
- fn ui_button_create(obj: *const UiObject, args: *const UiButtonArgs);
- fn ui_togglebutton_create(obj: *const UiObject, args: *const UiToggleArgs);
- fn ui_checkbox_create(obj: *const UiObject, args: *const UiToggleArgs);
- fn ui_switch_create(obj: *const UiObject, args: *const UiToggleArgs);
- fn ui_radiobutton_create(obj: *const UiObject, args: *const UiToggleArgs);
- fn ui_linkbutton_create(obj: *const UiObject, args: *const UiLinkButtonArgs);
+ fn ui_button_create(obj: *const UiObject, args: *const UiButtonArgs) -> *mut c_void;
+ fn ui_togglebutton_create(obj: *const UiObject, args: *const UiToggleArgs) -> *mut c_void;
+ fn ui_checkbox_create(obj: *const UiObject, args: *const UiToggleArgs) -> *mut c_void;
+ fn ui_switch_create(obj: *const UiObject, args: *const UiToggleArgs) -> *mut c_void;
+ fn ui_radiobutton_create(obj: *const UiObject, args: *const UiToggleArgs) -> *mut c_void;
+ fn ui_linkbutton_create(obj: *const UiObject, args: *const UiLinkButtonArgs) -> *mut c_void;
fn ui_button_args_new() -> *mut UiButtonArgs;
fn ui_button_args_set_fill(args: *mut UiButtonArgs, fill: c_int);
* POSSIBILITY OF SUCH DAMAGE.
*/
+#![allow(dead_code)]
-/*
- * Create a closure-based widget creation function
- *
- * Example:
- * pub fn button_builder(&self) -> ButtonBuilder { ... }
- * widget_fn!(button, button_builder, ButtonBuilder);
- *
- * This creates a function
- * pub fn button(&self, build: F)
- *
- * That can be used like:
- * obj.button(|b| {
- * b.label("Hello");
- * }
- */
+pub trait Widget {
+ fn get_widget(&self) -> *mut c_void;
+
+ fn set_size(&mut self, width: i32, height: i32) {
+ unsafe {
+ ui_widget_set_size(self.get_widget(), width, height);
+ }
+ }
+
+ fn redraw(&mut self) {
+ unsafe {
+ ui_widget_redraw(self.get_widget());
+ }
+ }
+
+ fn set_enabled(&mut self, enabled: bool) {
+ unsafe {
+ ui_widget_set_enabled(self.get_widget(), enabled as c_int);
+ }
+ }
+
+ fn set_visible(&mut self, enabled: bool) {
+ unsafe {
+ ui_widget_set_visible(self.get_widget(), enabled as c_int);
+ }
+ }
+}
+
+
+/* ------------------------------ C functions ----------------------------- */
+
+extern "C" {
+ fn ui_widget_set_size(widget: *mut c_void, width: c_int, height: c_int);
+ fn ui_widget_redraw(widget: *mut c_void);
+ fn ui_widget_set_enabled(widget: *mut c_void, enable: c_int);
+ fn ui_widget_set_visible(widget: *mut c_void, enable: c_int);
+}
+
+/* ------------------------ internal helper macros ------------------------ */
+
+///
+/// Create a closure-based widget creation function
+///
+/// # Example:
+///
+/// pub fn button_builder(&self) -> ButtonBuilder { ... }
+/// widget_fn!(button, button_builder, ButtonBuilder);
+///
+/// This creates a function
+///
+/// pub fn button(&self, build: F)
+///
+/// That can be used like:
+///
+/// obj.button(|b| {
+/// b.label("Hello");
+/// }
+///
macro_rules! widget_fn {
($fn_name:ident, $builder_fn:ident, $builder_ty:ident) => {
pub fn $fn_name<F>(&mut self, build: F)
};
}
+use std::ffi::{c_int, c_void};
pub(super) use widget_fn;
-pub(super) use widget_typed_fn;
\ No newline at end of file
+pub(super) use widget_typed_fn;
+