ui/cocoa/menu.m

changeset 20
2dda1ad6dc7a
parent 19
f8f22eb0b575
child 21
012418e7dc90
--- 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 <stdio.h>
 #import <stdlib.h>
 #import <string.h>
+#import <stdarg.h>
 
 #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;i<n;i++) {
+        for(int k=0;k<c;k++) {
+            NSNumber *groupNumber = [groups objectAtIndex:k];
+            if([groupNumber intValue] == g[i]) {
+                check[k] = 1;
+                break;
+            }
+        }
+    }
+    
+    for(int j=0;j<c;j++) {
+        if(check[j] == 0) {
+            [self setEnabled:NO];
+            return;
+        }
+    }
+    [self setEnabled:YES];
+}
+
+@end
 
 
 static NSMenu *currentMenu = NULL;
@@ -100,6 +138,7 @@
     NSMenuItem *menuItem = [[NSApp mainMenu] addItemWithTitle:str
                                                        action:nil keyEquivalent:@""];
     [menu setDelegate: delegate];
+    [menu setAutoenablesItems:NO];
     
     [[NSApp mainMenu] setSubmenu:menu forItem:menuItem];
     currentMenu = menu;
@@ -107,23 +146,53 @@
 }
 
 void ui_menuitem(char *label, ui_callback f, void *data) {
-    EventWrapper *event = [[EventWrapper alloc]initWithData:data callback:f];
-    NSString *str = [[NSString alloc] initWithUTF8String:label];
+    ui_menuitem_gr(label, f, data, -1);
+}
+
+void ui_menuitem_st(char *stockid, ui_callback f, void *data) {
+    ui_menuitem_stgr(stockid, f, data, -1);
+}
+
+void ui_menuitem_gr(char *label, ui_callback f, void *userdata, ...) {
+    // create menu item
+    EventWrapper *event = [[EventWrapper alloc]initWithData:userdata callback:f];
+    NSString *title = [[NSString alloc] initWithUTF8String:label];
+    UiGroupMenuItem *item = [[UiGroupMenuItem alloc]initWithTitle:title action:@selector(handleEvent:) keyEquivalent:@""];
+    [item setTarget:event];
     
-    NSMenuItem *item = [currentMenu addItemWithTitle:str
-                                              action:@selector(handleEvent:) 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++;
 }
 
-void ui_menuitem_st(char *stockid, ui_callback f, void *data) {
-    EventWrapper *event = [[EventWrapper alloc]initWithData:data callback:f];
+void ui_menuitem_stgr(char *stockid, ui_callback f, void *userdata, ...) {
+    // create menu item
+    EventWrapper *event = [[EventWrapper alloc]initWithData:userdata callback:f];
     UiStockItem *si = ui_get_stock_item(stockid);
+    UiGroupMenuItem *item = [[UiGroupMenuItem alloc]initWithTitle:si->label
+                                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++;
 }

mercurial