}
+// SubList implementation
+
+impl<E> SubList<E> {
+ pub fn new() -> Self {
+ unsafe {
+ SubList {
+ handle: ui_sublist_new(),
+ list: toolkit::UiList::new()
+ }
+ }
+ }
+
+ pub fn set_header(&mut self, title: &str) {
+ let cstr = CString::new(title).unwrap();
+ unsafe {
+ ui_sublist_set_header(self.handle, cstr.as_ptr());
+ }
+ }
+}
+
+impl<E> Drop for SubList<E> {
+ fn drop(&mut self) {
+ unsafe {
+ ui_sublist_free(self.handle);
+ }
+ }
+}
+
+
/* ------------------------------- 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;
fn ui_sourcelist_args_set_states(args: *mut UiSourceListArgs, states: *const c_int, numstates: c_int);
fn ui_sourcelist_args_set_visibility_states(args: *mut UiSourceListArgs, states: *const c_int, numstates: c_int);
fn ui_sourcelist_args_free(args: *mut UiSourceListArgs);
+
+ fn ui_sublist_new() -> *mut ffi::UiSubList;
+ fn ui_sublist_set_value(list: *mut ffi::UiSubList, value: *mut ffi::UiList);
+ fn ui_sublist_set_header(list: *mut ffi::UiSubList, header: *const c_char);
+ fn ui_sublist_free(list: *mut ffi::UiSubList);
}
\ No newline at end of file
impl<T> UiList<T> {
+ pub fn new() -> UiList<T> {
+ let mut list: UiList<T> = Self::default();
+ let ctx = UiContext {
+ ptr: std::ptr::null_mut(),
+ };
+ list.init(&ctx, None);
+ list
+ }
+
pub fn data(&mut self) -> &mut Vec<T> {
self.data.as_mut()
}
@property int vartype;
@property ui_callback callback;
@property void *userdata;
+@property NSString *action;
@property void *data;
@property int value;
@property get_eventdata_func get_eventdata;
-- (EventData*)init:(ui_callback)cb userdata:(void*)userdata;
+- (EventData*)init:(ui_callback)cb userdata:(void*)userdata action:(const char*)action;
- (void)handleEvent:(id)sender;
*/
#import "EventData.h"
+#import "action.h"
#import <objc/runtime.h>
@implementation EventData
-- (EventData*)init:(ui_callback)cb userdata:(void*)userdata {
+- (EventData*)init:(ui_callback)cb userdata:(void*)userdata action:(const char*)action {
_callback = cb;
_userdata = userdata;
+ if(action != nil) {
+ _action = [[NSString alloc]initWithUTF8String:action];
+ }
return self;
}
- (void)handleEvent:(id)sender {
- if(_callback) {
- UiEvent event;
- event.obj = self.obj;
- event.window = event.obj->window;
- event.document = event.obj->ctx->document;
- event.eventdata = self.data;
- event.intval = self.value;
- event.set = ui_get_setop();
+ UiEvent event;
+ event.obj = self.obj;
+ event.window = event.obj->window;
+ event.document = event.obj->ctx->document;
+ event.eventdata = self.data;
+ event.intval = self.value;
+ event.set = ui_get_setop();
+
+ if(_callback != nil) {
self.callback(&event, self.userdata);
}
+
+ if(_action != nil) {
+ uic_action_callback(&event, self.action.UTF8String);
+ }
}
- (void)handleEventWithEventData:(id)sender {
}
if(item->args.onclick) {
- EventData *event = [[EventData alloc] init:item->args.onclick userdata:item->args.onclickdata];
+ EventData *event = [[EventData alloc] init:item->args.onclick userdata:item->args.onclickdata action:item->args.action];
event.obj = obj;
button.target = event;
button.action = @selector(handleEvent:);
#include "../ui/toolkit.h"
#include "../common/action.h"
+
+#import "widget.h"
+
+void ui_cocoa_view_bind_action(UiContext *ctx, NSView *view, const char *action);
// TODO: accelerator
}
+
+
+void ui_cocoa_view_bind_action(UiContext *ctx, NSView *view, const char *action) {
+ if(action) {
+ void *widget = (__bridge void*)view;
+ uic_bind_action(ctx, action, widget, (ui_enablefunc)ui_set_enabled);
+ UiAction *ui_action = uic_resolve_action(ctx, action);
+ if(!ui_action) {
+ ui_set_enabled(widget, FALSE);
+ }
+ }
+}
#import "EventData.h"
#import "container.h"
#import "image.h"
+#import "action.h"
#import <objc/runtime.h>
#import <cx/buffer.h>
}
if(args->onclick) {
- EventData *event = [[EventData alloc] init:args->onclick userdata:args->onclickdata];
+ EventData *event = [[EventData alloc] init:args->onclick userdata:args->onclickdata action:args->action];
event.obj = obj;
button.target = event;
button.action = @selector(handleEvent:);
i->set = ui_togglebutton_set;
}
- if(args->onchange) {
- EventData *event = [[EventData alloc] init:args->onchange userdata:args->onchangedata];
+ if(args->onchange || args->action) {
+ EventData *event = [[EventData alloc] init:args->onchange userdata:args->onchangedata action:args->action];
event.get_eventdata = togglebutton_eventdata;
event.obj = obj;
event.var = var;
button.target = event;
button.action = @selector(handleEventWithEventData:);
objc_setAssociatedObject(button, "eventdata", event, OBJC_ASSOCIATION_RETAIN);
+
+ ui_cocoa_view_bind_action(obj->ctx, button, args->action);
}
UiLayout layout = UI_INIT_LAYOUT(args);
i->set = ui_switch_set;
}
- if(args->onchange) {
- EventData *event = [[EventData alloc] init:args->onchange userdata:args->onchangedata];
+ if(args->onchange || args->action) {
+ EventData *event = [[EventData alloc] init:args->onchange userdata:args->onchangedata action:args->action];
event.get_eventdata = switch_eventdata;
event.obj = obj;
event.var = var;
button.target = event;
button.action = @selector(handleEventWithEventData:);
objc_setAssociatedObject(button, "eventdata", event, OBJC_ASSOCIATION_RETAIN);
+ ui_cocoa_view_bind_action(obj->ctx, button, args->action);
}
UiLayout layout = UI_INIT_LAYOUT(args);
objc_setAssociatedObject(button, "radiogroup", buttons, OBJC_ASSOCIATION_RETAIN);
}
- if(args->onchange || var) {
- EventData *event = [[EventData alloc] init:args->onchange userdata:args->onchangedata];
+ if(args->onchange || args->action || var) {
+ EventData *event = [[EventData alloc] init:args->onchange userdata:args->onchangedata action:args->action];
event.get_eventdata = radiobutton_eventdata;
event.obj = obj;
event.var = var;
event.vartype = UI_VAR_INTEGER;
button.target = event;
-
button.action = @selector(handleEventWithEventData:);
objc_setAssociatedObject(button, "eventdata", event, OBJC_ASSOCIATION_RETAIN);
+
+ ui_cocoa_view_bind_action(obj->ctx, button, args->action);
}
UiLayout layout = UI_INIT_LAYOUT(args);
NSMenuItem *menuItem = [parent addItemWithTitle:str action:@selector(menuItemAction) keyEquivalent:@""];
if(it->callback) {
- EventData *event = [[EventData alloc] init:it->callback userdata:it->userdata];
+ EventData *event = [[EventData alloc] init:it->callback userdata:it->userdata action:it->action];
if(obj) {
event.obj = obj;
menuItem.target = event;
[lbutton1.leadingAnchor constraintEqualToAnchor:buttonArea.leadingAnchor constant:0]
]];
- EventData *event = [[EventData alloc] init:args->onclick userdata:args->onclickdata];
+ EventData *event = [[EventData alloc] init:args->onclick userdata:args->onclickdata action:nil];
event.obj = obj;
event.value = 1;
lbutton1.target = event;
[lbutton2.leadingAnchor constraintEqualToAnchor:anchor constant:off]
]];
- EventData *event = [[EventData alloc] init:args->onclick userdata:args->onclickdata];
+ EventData *event = [[EventData alloc] init:args->onclick userdata:args->onclickdata action:nil];
event.obj = obj;
event.value = 2;
lbutton2.target = event;
[rbutton4.trailingAnchor constraintEqualToAnchor:buttonArea.trailingAnchor constant:0]
]];
- EventData *event = [[EventData alloc] init:args->onclick userdata:args->onclickdata];
+ EventData *event = [[EventData alloc] init:args->onclick userdata:args->onclickdata action:nil];
event.obj = obj;
event.value = 2;
rbutton4.target = event;
[rbutton3.trailingAnchor constraintEqualToAnchor:anchor constant:off]
]];
- EventData *event = [[EventData alloc] init:args->onclick userdata:args->onclickdata];
+ EventData *event = [[EventData alloc] init:args->onclick userdata:args->onclickdata action:nil];
event.obj = obj;
event.value = 2;
rbutton3.target = event;
void uic_ucx_list_destroy(UiContext *ctx, UiList *list, void *unused) {
cxListFree(list->data);
- ui_free(ctx, list);
}
UiList* ui_list_new(UiContext *ctx, const char *name) {
}
UiList* ui_list_new2(UiContext *ctx, const char *name, ui_list_init_func listinit, void *userdata) {
- UiList *list = cxMalloc(ctx->mp->allocator, sizeof(UiList));
+ UiList *list = ui_malloc(ctx, sizeof(UiList));
memset(list, 0, sizeof(UiList));
listinit(ctx, list, userdata);
- if(name) {
+ if(name && ctx) {
uic_reg_var(ctx, name, UI_VAR_LIST, list);
}
} else {
default_list_destroy(ctx, list, default_list_destroy_userdata);
}
-
+ ui_free(ctx, list);
}
void* ui_list_first(UiList *list) {