# HG changeset patch # User Olaf Wintermann # Date 1396463507 -7200 # Node ID 2dda1ad6dc7a9d4d30c470e51aa1576c6685846e # Parent f8f22eb0b575b7a74c7e293011c6f4252802013f added groups for menu items (Cocoa) diff -r f8f22eb0b575 -r 2dda1ad6dc7a application/main.c --- a/application/main.c Wed Apr 02 13:21:11 2014 +0200 +++ b/application/main.c Wed Apr 02 20:31:47 2014 +0200 @@ -114,6 +114,7 @@ ui_menu("File"); ui_menuitem_st(UI_STOCK_NEW, action_new, NULL); ui_menuitem_st(UI_STOCK_OPEN, action_open, NULL); + ui_menuitem_stgr(UI_STOCK_SAVE, action_save, NULL, 1, -1); ui_menuseparator(); ui_menuitem("Dokument 1", action_doc1, NULL); ui_menuitem("Dokument 2", action_doc2, NULL); @@ -121,15 +122,11 @@ ui_checkitem_nv("Check", "check1"); //ui_checkitem("Check", action_open, NULL); -<<<<<<< local -======= - ui_menuitem_st(UI_STOCK_CLOSE, action_close, NULL); ->>>>>>> other void ui_menuseparator(); ui_menuitem_list(list, action_document, list); ui_menuseparator(); - ui_menuitem("Close", action_close, NULL); + ui_menuitem_st(UI_STOCK_CLOSE, action_close, NULL); ui_toolitem_st("new", UI_STOCK_NEW, action_new, NULL); diff -r f8f22eb0b575 -r 2dda1ad6dc7a ui/cocoa/menu.h --- a/ui/cocoa/menu.h Wed Apr 02 13:21:11 2014 +0200 +++ b/ui/cocoa/menu.h Wed Apr 02 20:31:47 2014 +0200 @@ -72,6 +72,17 @@ @end +@interface UiGroupMenuItem : NSMenuItem { + NSMutableArray *groups; +} + +- (id)initWithTitle:(NSString*)title action:(SEL)action keyEquivalent:(NSString*)s; + +- (void) addGroup:(int)group; + +- (void) checkGroups:(int*)g count:(int)n; + +@end void ui_menu_init(); UiMenuDelegate* ui_menu_delegate(); diff -r f8f22eb0b575 -r 2dda1ad6dc7a ui/cocoa/menu.m --- a/ui/cocoa/menu.m Wed Apr 02 13:21:11 2014 +0200 +++ b/ui/cocoa/menu.m Wed Apr 02 20:31:47 2014 +0200 @@ -29,6 +29,7 @@ #import #import #import +#import #import "menu.h" #import "window.h" @@ -78,6 +79,43 @@ @end +@implementation UiGroupMenuItem + +- (id)initWithTitle:(NSString*)title action:(SEL)action keyEquivalent:(NSString*)s { + [super initWithTitle:title action:action keyEquivalent:s]; + groups = [[NSMutableArray alloc]initWithCapacity: 16]; + return self; +} + +- (void) addGroup:(int)group { + NSNumber *groupNumber = [NSNumber numberWithInteger:group]; + [groups addObject:groupNumber]; +} + +- (void) checkGroups:(int*)g count:(int)n { + int c = [groups count]; + + char *check = calloc(1, c); + for(int i=0;ilabel + action:@selector(handleEvent:) + keyEquivalent:si->keyEquivalent]; + [item setTarget:event]; - NSMenuItem *item = [currentMenu addItemWithTitle:si->label - action:@selector(handleEvent:) keyEquivalent:si->keyEquivalent]; - [item setTarget:event]; + // add groups + va_list ap; + va_start(ap, userdata); + int group; + while((group = va_arg(ap, int)) != -1) { + [item addGroup: group]; + } + + + [currentMenu addItem:item]; currentItemIndex++; } diff -r f8f22eb0b575 -r 2dda1ad6dc7a ui/cocoa/window.m --- a/ui/cocoa/window.m Wed Apr 02 13:21:11 2014 +0200 +++ b/ui/cocoa/window.m Wed Apr 02 20:31:47 2014 +0200 @@ -129,6 +129,20 @@ UiAbstractMenuItem *item = elm->data; item->update(self, item->item_data); } + + // update group items + // TODO: use only one loop for all items + int ngroups = 0; + int *groups = ui_active_groups(uiobj->ctx, &ngroups); + + NSArray *groupItems = [menu itemArray]; + int count = [groupItems count]; + for(int i=0;i #include #include +#include #include "context.h" #include "../ui/window.h" @@ -41,6 +42,7 @@ ctx->toplevel = toplevel; ctx->vars = ucx_map_new_a(mp->allocator, 16); + ctx->groups = NULL; #ifdef UI_GTK ctx->accel_group = gtk_accel_group_new(); @@ -149,3 +151,32 @@ return 0; } + + + +void ui_set_group(UiContext *ctx, int group) { + if(ucx_list_find(ctx->groups, (void*)(intptr_t)group, NULL, NULL) == -1) { + ctx->groups = ucx_list_append_a(ctx->mempool->allocator, ctx->groups, (void*)(intptr_t)group); + } +} + +void ui_unset_group(UiContext *ctx, int group) { + int i = ucx_list_find(ctx->groups, (void*)(intptr_t)group, NULL, NULL); + if(i != -1) { + UcxList *elm = ucx_list_get(ctx->groups, i); + ctx->groups = ucx_list_remove_a(ctx->mempool->allocator, ctx->groups, elm); + } +} + +int* ui_active_groups(UiContext *ctx, int *ngroups) { + int nelm = ucx_list_size(ctx->groups); + int *groups = calloc(sizeof(int), nelm); + + int i = 0; + UCX_FOREACH(elm, ctx->groups) { + groups[i++] = (int)elm->data; + } + + *ngroups = nelm; + return groups; +} diff -r f8f22eb0b575 -r 2dda1ad6dc7a ui/common/context.h --- a/ui/common/context.h Wed Apr 02 13:21:11 2014 +0200 +++ b/ui/common/context.h Wed Apr 02 20:31:47 2014 +0200 @@ -32,6 +32,7 @@ #include "../ui/toolkit.h" #include "../../ucx/map.h" #include "../../ucx/mempool.h" +#include "../../ucx/list.h" #ifdef __cplusplus extern "C" { @@ -43,6 +44,7 @@ UiObject *toplevel; UcxMempool *mempool; UcxMap *vars; // key: char* value: UiVar* + UcxList *groups; // int list #ifdef UI_GTK GtkAccelGroup *accel_group; @@ -67,6 +69,7 @@ void* uic_create_value(UcxAllocator *a, int type); + #ifdef __cplusplus } #endif diff -r f8f22eb0b575 -r 2dda1ad6dc7a ui/ui/menu.h --- a/ui/ui/menu.h Wed Apr 02 13:21:11 2014 +0200 +++ b/ui/ui/menu.h Wed Apr 02 20:31:47 2014 +0200 @@ -41,6 +41,9 @@ void ui_menuitem(char *label, ui_callback f, void *userdata); void ui_menuitem_st(char *stockid, ui_callback f, void *userdata); +void ui_menuitem_gr(char *label, ui_callback f, void *userdata, ...); +void ui_menuitem_stgr(char *stockid, ui_callback f, void *userdata, ...); + void ui_menuseparator(); void ui_checkitem(char *label, ui_callback f, void *userdata); diff -r f8f22eb0b575 -r 2dda1ad6dc7a ui/ui/toolkit.h --- a/ui/ui/toolkit.h Wed Apr 02 13:21:11 2014 +0200 +++ b/ui/ui/toolkit.h Wed Apr 02 20:31:47 2014 +0200 @@ -195,8 +195,9 @@ int ui_getint(UiObject *obj, char *name); - - +void ui_set_group(UiContext *ctx, int group); +void ui_unset_group(UiContext *ctx, int group); +int* ui_active_groups(UiContext *ctx, int *ngroups); // types UiObserver* ui_observer_new(ui_callback f, void *data);