impl Application<TestData> for App {
fn on_startup(&mut self, app: &AppContext<TestData>) {
+ app.menu("File", |menu| {
+ menu.item("Open").create();
+ });
+
create_window(app);
}
}
#[repr(C)]
pub struct UiSubList {
_private: [u8; 0],
-}
\ No newline at end of file
+}
+
+#[repr(C)]
+pub struct UiMenuItemArgs {
+ _private: [u8; 0],
+}
+
+#[repr(C)]
+pub struct UiMenuToggleItemArgs {
+ _private: [u8; 0],
+}
+
+#[repr(C)]
+pub struct UiMenuItemListArgs {
+ _private: [u8; 0],
+}
/* ------------------------------- getvalue func wrapper -------------------------------- */
-type GetValueFunc = extern "C" fn(list: *const ffi::UiList, elm_ptr: *const c_void, row: i32, col: i32, wrapper: *const c_void, free: *mut bool) -> *mut c_void;
+pub type GetValueFunc = extern "C" fn(list: *const ffi::UiList, elm_ptr: *const c_void, row: i32, col: i32, wrapper: *const c_void, free: *mut bool) -> *mut c_void;
-struct GetValueWrapper<'a, T> {
+pub struct GetValueWrapper<'a, T> {
callback: Box<dyn Fn(&T, i32, i32) -> ListValue<'a>>,
is_table: bool
}
--- /dev/null
+#![allow(dead_code)]
+
+use std::ffi::{c_char, c_int, c_void, CString};
+use std::marker::PhantomData;
+use crate::ui::{event, ffi, toolkit, AppContext, EventWrapper, GetValueFunc, ToggleButtonCreate, UiActions, UiContext, UiModel};
+use crate::ui::ffi::{UiCallback, UiMenuItemArgs, UiMenuItemListArgs, UiMenuToggleItemArgs, UiObject, UiToggleArgs};
+
+impl<T: UiModel + UiActions> AppContext<T> {
+ pub fn menu<F>(&self, title: &str, f: F)
+ where F: FnOnce(&mut Menu<T>) {
+ let cstr = CString::new(title).unwrap();
+ unsafe {
+ ui_menu_create(cstr.as_ptr());
+ let mut menu = Menu::<T> {
+ ctx: toolkit::ui_global_context(),
+ _marker: PhantomData
+ };
+ f(&mut menu);
+ ui_menu_end();
+ }
+ }
+}
+
+pub struct Menu<T: UiModel + UiActions> {
+ ctx: *mut ffi::UiContext,
+ _marker: PhantomData<T>,
+}
+
+impl<T: UiModel + UiActions> Menu<T> {
+ pub fn item(&self, label: &str) -> MenuItemBuilder<T> {
+ let args = unsafe {
+ let a = ui_menuitem_args_new();
+ let cstr = CString::new(label).unwrap();
+ ui_menuitem_args_set_label(a, cstr.as_ptr());
+ a
+ };
+ MenuItemBuilder::<T> {
+ args: args,
+ ctx: self.ctx,
+ _marker: PhantomData,
+ }
+ }
+
+ pub fn toggleitem(&self, label: &str) -> MenuToggleItemBuilder<T> {
+ let args = unsafe {
+ let a = ui_menutoggleitem_args_new();
+ let cstr = CString::new(label).unwrap();
+ ui_menutoggleitem_args_set_label(a, cstr.as_ptr());
+ a
+ };
+ MenuToggleItemBuilder::<T> {
+ args: args,
+ ctx: self.ctx,
+ create: ui_menu_toggleitem_create,
+ _marker: PhantomData,
+ }
+ }
+
+ pub fn radioitem(&self, label: &str) -> MenuToggleItemBuilder<T> {
+ let args = unsafe {
+ let a = ui_menutoggleitem_args_new();
+ let cstr = CString::new(label).unwrap();
+ ui_menutoggleitem_args_set_label(a, cstr.as_ptr());
+ a
+ };
+ MenuToggleItemBuilder::<T> {
+ args: args,
+ ctx: self.ctx,
+ create: ui_menu_radioitem_create,
+ _marker: PhantomData,
+ }
+ }
+
+ pub fn separator(&self) {
+ unsafe {
+ ui_menuseparator();
+ }
+ }
+
+ pub fn menu<F>(&self, title: &str, f: F)
+ where F: FnOnce(&mut Menu<T>) {
+ let cstr = CString::new(title).unwrap();
+ unsafe {
+ ui_menu_create(cstr.as_ptr());
+ let mut menu = Menu::<T> {
+ ctx: toolkit::ui_global_context(),
+ _marker: PhantomData
+ };
+ f(&mut menu);
+ ui_menu_end();
+ }
+ }
+}
+
+pub struct MenuItemBuilder<T: UiModel + UiActions> {
+ args: *mut UiMenuItemArgs,
+ ctx: *mut ffi::UiContext,
+ _marker: PhantomData<T>,
+}
+
+pub struct MenuToggleItemBuilder<T: UiModel + UiActions> {
+ args: *mut UiMenuToggleItemArgs,
+ ctx: *mut ffi::UiContext,
+ create: ToggleItemCreate,
+ _marker: PhantomData<T>,
+}
+
+pub type ToggleItemCreate = unsafe extern "C" fn(*const UiMenuToggleItemArgs);
+
+impl<T: UiModel + UiActions> MenuItemBuilder<T> {
+ pub fn create(&mut self) {
+ unsafe {
+ ui_menuitem_create(self.args);
+ }
+ }
+ pub fn icon(&mut self, icon: &str) -> &mut Self {
+ unsafe {
+ let cstr = CString::new(icon).unwrap();
+ ui_menuitem_args_set_icon(self.args, cstr.as_ptr());
+ }
+ self
+ }
+
+ pub fn action(&mut self, action: &str) -> &mut Self {
+ unsafe {
+ let cstr = CString::new(action).unwrap();
+ ui_menuitem_args_set_action(self.args, cstr.as_ptr());
+ }
+ self
+ }
+
+ pub fn onclick<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 mut ctx = UiContext { ptr: self.ctx };
+ let ptr = ctx.reg_box(wrapper);
+ unsafe {
+ ui_menuitem_args_set_onclick(self.args, Some(event::event_wrapper::<T>));
+ ui_menuitem_args_set_onclickdata(self.args, ptr as *mut c_void);
+ }
+ self
+ }
+}
+
+impl<T: UiModel + UiActions> Drop for MenuItemBuilder<T> {
+ fn drop(&mut self) {
+ unsafe {
+ ui_menuitem_args_free(self.args);
+ }
+ }
+}
+
+impl<T: UiModel + UiActions> MenuToggleItemBuilder<T> {
+ pub fn create(&mut self) {
+ unsafe {
+ (self.create)(self.args);
+ }
+ }
+ pub fn icon(&mut self, icon: &str) -> &mut Self {
+ unsafe {
+ let cstr = CString::new(icon).unwrap();
+ ui_menutoggleitem_args_set_icon(self.args, cstr.as_ptr());
+ }
+ self
+ }
+
+ pub fn varname(&mut self, varname: &str) -> &mut Self {
+ unsafe {
+ let cstr = CString::new(varname).unwrap();
+ ui_menutoggleitem_args_set_varname(self.args, cstr.as_ptr());
+ }
+ self
+ }
+
+ pub fn action(&mut self, action: &str) -> &mut Self {
+ unsafe {
+ let cstr = CString::new(action).unwrap();
+ ui_menutoggleitem_args_set_action(self.args, cstr.as_ptr());
+ }
+ self
+ }
+
+ pub fn onchange<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 mut ctx = UiContext { ptr: self.ctx };
+ let ptr = ctx.reg_box(wrapper);
+ unsafe {
+ ui_menutoggleitem_args_set_onchange(self.args, Some(event::event_wrapper::<T>));
+ ui_menutoggleitem_args_set_onchangedata(self.args, ptr as *mut c_void);
+ }
+ self
+ }
+}
+
+impl<T: UiModel + UiActions> Drop for MenuToggleItemBuilder<T> {
+ fn drop(&mut self) {
+ unsafe {
+ ui_menutoggleitem_args_free(self.args);
+ }
+ }
+}
+
+extern "C" {
+ fn ui_menu_create(label: *const c_char);
+ fn ui_menuitem_create(args: *const UiMenuItemArgs);
+ fn ui_menu_toggleitem_create(args: *const UiMenuToggleItemArgs);
+ fn ui_menu_radioitem_create(args: *const UiMenuToggleItemArgs);
+ fn ui_menuseparator();
+ fn ui_menu_itemlist_create(args: *const UiMenuItemListArgs);
+ fn ui_menu_toggleitemlist_create(args: *const UiMenuItemListArgs);
+ fn ui_menu_radioitemlist_create(args: *const UiMenuItemListArgs);
+ fn ui_menu_end();
+
+ fn ui_menuitem_args_new() -> *mut UiMenuItemArgs;
+ fn ui_menuitem_args_set_label(args: *mut UiMenuItemArgs, label: *const c_char);
+ fn ui_menuitem_args_set_icon(args: *mut UiMenuItemArgs, icon: *const c_char);
+ fn ui_menuitem_args_set_action(args: *mut UiMenuItemArgs, action: *const c_char);
+ fn ui_menuitem_args_set_onclick(args: *mut UiMenuItemArgs, onclick: UiCallback);
+ fn ui_menuitem_args_set_onclickdata(args: *mut UiMenuItemArgs, data: *mut c_void);
+ fn ui_menuitem_args_free(args: *mut UiMenuItemArgs);
+
+ fn ui_menutoggleitem_args_new() -> *mut UiMenuToggleItemArgs;
+ fn ui_menutoggleitem_args_set_label(args: *mut UiMenuToggleItemArgs, label: *const c_char);
+ fn ui_menutoggleitem_args_set_icon(args: *mut UiMenuToggleItemArgs, icon: *const c_char);
+ fn ui_menutoggleitem_args_set_varname(args: *mut UiMenuToggleItemArgs, varname: *const c_char);
+ fn ui_menutoggleitem_args_set_action(args: *mut UiMenuToggleItemArgs, action: *const c_char);
+ fn ui_menutoggleitem_args_set_onchange(args: *mut UiMenuToggleItemArgs, onclick: UiCallback);
+ fn ui_menutoggleitem_args_set_onchangedata(args: *mut UiMenuToggleItemArgs, data: *mut c_void);
+ fn ui_menutoggleitem_args_free(args: *mut UiMenuToggleItemArgs);
+
+ fn ui_menuitemlist_args_new() -> *mut UiMenuItemListArgs;
+ fn ui_menuitemlist_args_set_varname(args: *mut UiMenuItemListArgs, varname: *const c_char);
+ fn ui_menuitemlist_args_set_getvalue2(args: *mut UiMenuItemListArgs, f: GetValueFunc);
+ fn ui_menuitemlist_args_set_getvaluedata(args: *mut UiMenuItemListArgs, data: *mut c_void);
+
+ fn ui_menuitemlist_args_set_onselect(args: *mut UiMenuItemListArgs, onclick: UiCallback);
+ fn ui_menuitemlist_args_set_onselectdata(args: *mut UiMenuItemListArgs, data: *mut c_void);
+ fn ui_menuitemlist_args_set_addseparator(args: *mut UiMenuItemListArgs, value: c_int);
+ fn ui_menuitemlist_args_free(args: *mut UiMenuItemListArgs);
+}
mod text;
pub mod event;
pub mod list;
+mod menu;
pub use toolkit::*;
pub use event::*;
extern "C" {
fn ui_init(appname: *const c_char, argc: c_int, argv: *const *const c_char);
+ pub fn ui_global_context() -> *mut ffi::UiContext;
fn ui_document_new(size: usize) -> *mut c_void;
fn ui_document_ref(doc: *mut c_void);
args->getvalue = func;
}
+void ui_menuitemlist_args_set_getvalue2(UiMenuItemListArgs *args, ui_getvaluefunc2 func) {
+ args->getvalue2 = func;
+}
+
+void ui_menuitemlist_args_set_getvaluedata(UiMenuItemListArgs *args, void *data) {
+ args->getvaluedata = data;
+}
+
void ui_menuitemlist_args_set_onselect(UiMenuItemListArgs *args, ui_callback callback) {
args->onselect = callback;
}
UIEXPORT UiMenuItemListArgs* ui_menuitemlist_args_new(void);
UIEXPORT void ui_menuitemlist_args_set_varname(UiMenuItemListArgs *args, const char *varname);
UIEXPORT void ui_menuitemlist_args_set_getvalue(UiMenuItemListArgs *args, ui_getvaluefunc func);
+UIEXPORT void ui_menuitemlist_args_set_getvalue2(UiMenuItemListArgs *args, ui_getvaluefunc2 func);
+UIEXPORT void ui_menuitemlist_args_set_getvaluedata(UiMenuItemListArgs *args, void *data);
UIEXPORT void ui_menuitemlist_args_set_onselect(UiMenuItemListArgs *args, ui_callback callback);
UIEXPORT void ui_menuitemlist_args_set_onselectdata(UiMenuItemListArgs *args, void *data);
UIEXPORT void ui_menuitemlist_args_set_addseparator(UiMenuItemListArgs *args, UiBool value);
static void *tmp_eventdata;
static int tmp_eventdata_type;
+
+static void* getvalue_wrapper(UiList *list, void *elm, int row, int col, void *userdata, UiBool *freeResult) {
+ ui_getvaluefunc getvalue = (ui_getvaluefunc)userdata;
+ return getvalue(elm, col);
+}
+
+static void* str_getvalue(UiList *list, void *elm, int row, int col, void *userdata, UiBool *freeResult) {
+ return elm;
+}
+
+
void uic_set_tmp_eventdata(void *eventdata, int type) {
tmp_eventdata = eventdata;
tmp_eventdata_type = type;
item->item.prev = NULL;
item->item.next = NULL;
item->item.type = UI_MENU_ITEM_LIST;
- item->getvalue = args->getvalue;
+ if(args->getvalue2) {
+ item->getvalue = args->getvalue2;
+ item->getvaluedata = args->getvaluedata;
+ } else if(args->getvalue) {
+ item->getvalue = getvalue_wrapper;
+ item->getvaluedata = (void*)args->getvalue;
+ } else {
+ item->getvalue = str_getvalue;
+ }
item->callback = args->onselect;
item->userdata = args->onselectdata;
item->varname = nl_strdup(args->varname);
item->item.prev = NULL;
item->item.next = NULL;
item->item.type = UI_MENU_CHECKITEM_LIST;
+ if(args->getvalue2) {
+ item->getvalue = args->getvalue2;
+ item->getvaluedata = args->getvaluedata;
+ } else if(args->getvalue) {
+ item->getvalue = getvalue_wrapper;
+ item->getvaluedata = (void*)args->getvalue;
+ } else {
+ item->getvalue = str_getvalue;
+ }
item->callback = args->onselect;
item->userdata = args->onselectdata;
item->varname = nl_strdup(args->varname);
item->item.prev = NULL;
item->item.next = NULL;
item->item.type = UI_MENU_RADIOITEM_LIST;
+ if(args->getvalue2) {
+ item->getvalue = args->getvalue2;
+ item->getvaluedata = args->getvaluedata;
+ } else if(args->getvalue) {
+ item->getvalue = getvalue_wrapper;
+ item->getvaluedata = (void*)args->getvalue;
+ } else {
+ item->getvalue = str_getvalue;
+ }
item->callback = args->onselect;
item->userdata = args->onselectdata;
item->varname = nl_strdup(args->varname);
};
struct UiMenuItemList {
- UiMenuItemI item;
- ui_getvaluefunc getvalue;
- ui_callback callback;
- void *userdata;
- char *varname;
- UiBool addseparator;
+ UiMenuItemI item;
+ ui_getvaluefunc2 getvalue;
+ void *getvaluedata;
+ ui_callback callback;
+ void *userdata;
+ char *varname;
+ UiBool addseparator;
};
ls->index = index;
ls->oldcount = 0;
ls->getvalue = il->getvalue;
+ ls->getvaluedata = il->getvaluedata;
UiVar* var = uic_create_var(ui_global_context(), il->varname, UI_VAR_LIST);
//UiVar* var = uic_create_var(obj->ctx, il->varname, UI_VAR_LIST);
gtk_widget_show(widget);
}
- ui_getvaluefunc getvalue = list->getvalue;
+ ui_getvaluefunc2 getvalue = list->getvalue;
+ void *getvaluedata = list->getvaluedata;
int i = 1;
+ int row = 0;
while(elm) {
- char *label = (char*) (getvalue ? getvalue(elm, 0) : elm);
+ UiBool freeResult = FALSE;
+ char *label = (char*) (getvalue ? getvalue(ls, elm, row, 0, getvaluedata, &freeResult) : elm);
GtkWidget *widget = gtk_menu_item_new_with_label(label);
gtk_menu_shell_insert(list->menu, widget, list->index + i);
elm = ui_list_next(ls);
i++;
+ row++;
+
+ if(freeResult) {
+ free(label);
+ }
}
list->oldcount = i;
ls->index = index;
ls->oldcount = 0;
ls->getvalue = il->getvalue;
+ ls->getvaluedata = il->getvalue;
GSimpleAction *action = g_simple_action_new(item->id, g_variant_type_new("i"));
g_action_map_add_action(obj->ctx->action_map, G_ACTION(action));
UiList *ls = list->var->value;
// add list items
- ui_getvaluefunc getvalue = list->getvalue;
+ ui_getvaluefunc2 getvalue = list->getvalue;
+ void *getvaluedata = list->getvaluedata;
int i = 0;
void* elm = ui_list_first(ls);
while(elm) {
- char *label = (char*) (getvalue ? getvalue(elm, 0) : elm);
+ UiBool freeResult = FALSE;
+ char *label = (char*) (getvalue ? getvalue(ls, elm, i, 0, getvaluedata, &freeResult) : elm);
GMenuItem *item = g_menu_item_new(label, NULL);
GVariant *v = g_variant_new("i", i);
elm = ui_list_next(ls);
i++;
+
+ if(freeResult) {
+ free(label);
+ }
}
list->oldcount = i;
int index;
int oldcount;
UiVar *var;
- ui_getvaluefunc getvalue;
+ ui_getvaluefunc2 getvalue;
+ void *getvaluedata;
ui_callback callback;
void *userdata;
};
int index;
int oldcount;
UiVar *var;
- ui_getvaluefunc getvalue;
+ ui_getvaluefunc2 getvalue;
+ void *getvaluedata;
ui_callback callback;
void *userdata;
};
i++;
}
- ui_getvaluefunc getvalue = list->getvalue;
+ int row = 0;
+ ui_getvaluefunc2 getvalue = list->getvalue;
+ void *getvaluedata = list->getvaluedata;
int pos = list->index;
while(elm) {
n = 0;
- char *label = (char*) (getvalue ? getvalue(elm, 0) : elm);
+ UiBool freeResult = FALSE;
+ char *label = (char*) (getvalue ? getvalue(ls, elm, row, 0, getvaluedata, &freeResult) : elm);
if(label) {
s = XmStringCreateLocalized(label);
XtSetArg(args[n], XmNlabelString, s); n++;
eventdata);
}
+ if(freeResult) {
+ free(label);
+ }
+
elm = ui_list_next(ls);
+ row++;
i++;
}
int index;
int oldcount;
UiVar *var;
- ui_getvaluefunc getvalue;
+ ui_getvaluefunc2 getvalue;
+ void *getvaluedata;
ui_callback callback;
void *userdata;
bool addseparator;
add_menu_items(menu, i, m, obj);
}
-static UiAction* create_action(
+static UiQAction* create_action(
UiObject *obj,
const char *icon,
const char *label,
int *states)
{
QString str = QString::fromUtf8(label);
- UiAction *action = new UiAction(obj, str, callback, userdata);
+ UiQAction *action = new UiQAction(obj, str, callback, userdata);
if(icon) {
action->setIcon(QIcon::fromTheme(icon));
action->setIconVisibleInMenu(true);
void add_menuitem_widget(QMenu *parent, int i, UiMenuItemI *item, UiObject *obj) {
UiMenuItem *it = (UiMenuItem*)item;
- UiAction *action = create_action(obj, it->icon, it->label, it->callback, it->userdata, it->states);
+ UiQAction *action = create_action(obj, it->icon, it->label, it->callback, it->userdata, it->states);
parent->addAction(action);
QObject::connect(action, SIGNAL(triggered()), action, SLOT(trigger()));
}
void add_checkitem_widget(QMenu *parent, int i, UiMenuItemI *item, UiObject *obj) {
UiMenuCheckItem *it = (UiMenuCheckItem*)item;
- UiAction *action = create_action(obj, it->icon, it->label, it->callback, it->userdata, it->states);
+ UiQAction *action = create_action(obj, it->icon, it->label, it->callback, it->userdata, it->states);
parent->addAction(action);
action->setCheckable(true);
action->prepare_event = ui_checkableaction_prepare_event;
void add_radioitem_widget(QMenu *parent, int index, UiMenuItemI *item, UiObject *obj) {
UiMenuRadioItem *it = (UiMenuRadioItem*)item;
- UiAction *action = create_action(obj, it->icon, it->label, it->callback, it->userdata, it->states);
+ UiQAction *action = create_action(obj, it->icon, it->label, it->callback, it->userdata, it->states);
parent->addAction(action);
action->setCheckable(true);
action->prepare_event = ui_actiongroup_prepare_event;
action->var;
}
-void ui_actiongroup_prepare_event(UiEvent *event, UiAction *action) {
+void ui_actiongroup_prepare_event(UiEvent *event, UiQAction *action) {
if(action->var) {
UiInteger *value = (UiInteger*)action->var->value;
event->eventdata = value;
}
}
-void ui_checkableaction_prepare_event(UiEvent *event, UiAction *action) {
+void ui_checkableaction_prepare_event(UiEvent *event, UiQAction *action) {
if(action->var) {
event->eventdata = action->var->value;
event->eventdatatype = UI_EVENT_DATA_INTEGER_VALUE;
}
int64_t ui_checkableaction_get(UiInteger *value) {
- UiAction *action= (UiAction*)value->obj;
+ UiQAction *action= (UiQAction*)value->obj;
value->value = action->isChecked();
return value->value;
}
void ui_checkableaction_set(UiInteger *value, int64_t i) {
- UiAction *action = (UiAction*)value->obj;
+ UiQAction *action = (UiQAction*)value->obj;
value->value = i;
if(i != 0) {
action->setChecked((bool)i);
void add_checkitemnv_widget(QMenu *parent, int i, UiMenuItemI *item, UiObject *obj);
void add_menuitem_list_widget(QMenu *parent, int i, UiMenuItemI *item, UiObject *obj);
-void ui_checkableaction_prepare_event(UiEvent *event, UiAction *action);
+void ui_checkableaction_prepare_event(UiEvent *event, UiQAction *action);
int64_t ui_checkableaction_get(UiInteger *value);
void ui_checkableaction_set(UiInteger *value, int64_t i);
-void ui_actiongroup_prepare_event(UiEvent *event, UiAction *action);
+void ui_actiongroup_prepare_event(UiEvent *event, UiQAction *action);
int64_t ui_actiongroup_get(UiInteger *value);
void ui_actiongroup_set(UiInteger *value, int64_t i);
/* --------------------- Implemtation UiAction --------------------- */
-UiAction::UiAction(UiObject *obj, QString &label, ui_callback f, void *userdata) : QAction(label, NULL) {
+UiQAction::UiQAction(UiObject *obj, QString &label, ui_callback f, void *userdata) : QAction(label, NULL) {
this->obj = obj;
this->callback = f;
this->userdata = userdata;
}
-UiAction::~UiAction() {
+UiQAction::~UiQAction() {
// TODO: unbind var
}
-void UiAction::trigger() {
+void UiQAction::trigger() {
if(!callback) {
return;
}
}
// ui_enablefunc for UiAction
-void ui_action_enable(UiAction *action, int enable) {
+void ui_action_enable(UiQAction *action, int enable) {
action->setEnabled((bool)enable);
}
void destroy();
};
-class UiAction;
+class UiQAction;
-typedef void (*ui_prepare_action_event_func)(UiEvent *event, UiAction *action);
+typedef void (*ui_prepare_action_event_func)(UiEvent *event, UiQAction *action);
-class UiAction : public QAction {
+class UiQAction : public QAction {
Q_OBJECT
UiObject *obj;
int customvalue1 = 0;
int customvalue2 = 0;
- UiAction(UiObject *obj, QString &label, ui_callback f, void *userdata);
- ~UiAction();
+ UiQAction(UiObject *obj, QString &label, ui_callback f, void *userdata);
+ ~UiQAction();
private slots:
void trigger();
};
-void ui_action_enable(UiAction *action, int enable);
+void ui_action_enable(UiQAction *action, int enable);
#endif /* TOOLKIT_H */
typedef struct UiMenuItemListArgs {
const char *varname;
ui_getvaluefunc getvalue;
+ ui_getvaluefunc2 getvalue2;
+ void *getvaluedata;
ui_callback onselect;
void *onselectdata;
const char *action;