diff -r b59935b2de79 -r 384f6d1f5784 ui/cocoa/menu.m --- a/ui/cocoa/menu.m Sat Nov 30 20:33:16 2024 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,319 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. - * - * Copyright 2014 Olaf Wintermann. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#import -#import -#import -#import - -#import "menu.h" -#import "window.h" -#import "stock.h" - -@implementation UiMenuDelegate - -- (UiMenuDelegate*) init { - items = NULL; - itemlists = NULL; - return self; -} - -- (void) menuNeedsUpdate:(NSMenu *) menu { - NSWindow *activeWindow = [NSApp keyWindow]; - [(UiCocoaWindow*)activeWindow updateMenu: menu]; -} - -- (void) addItem:(NSMenuItem*) item var: (char*)name { - UiStateItem *i = malloc(sizeof(UiStateItem)); - i->item = item; - i->var = name; - items = ucx_list_append(items, i); -} - -- (void) addList:(UiList*) list menu:(NSMenu*)menu index: (int)i callback: (ui_callback)f data:(void*) data { - UiMenuItemList *itemList = malloc(sizeof(UiMenuItemList)); - itemList->list = list; - itemList->menu = menu; - itemList->first = NULL; - itemList->index = i; - itemList->oldcount = 0; - itemList->callback = f; - itemList->data = data; - itemlists = ucx_list_append(itemlists, itemList); -} - -- (UcxList*) items { - return items; -} - -- (UcxList*) lists { - return itemlists; - -} - -@end - - -@implementation UiGroupMenuItem - -- (id)initWithTitle:(NSString*)title action:(SEL)action keyEquivalent:(NSString*)s { - [super initWithTitle:title action:action keyEquivalent:s]; - groups = [[NSMutableArray alloc]initWithCapacity: 8]; - 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;idata; - - NSMenu *menu = [[NSMenu alloc] initWithTitle: str]; - NSMenuItem *menuItem = [currentMenu addItemWithTitle:str - action:nil keyEquivalent:@""]; - [menu setDelegate: delegate]; - [menu setAutoenablesItems:NO]; - - [currentMenu setSubmenu:menu forItem:menuItem]; - //currentMenu = menu; - currentItemIndex = 0; - - current = ucx_list_prepend(current, menu); -} - -void ui_submenu_end() { - if(ucx_list_size(current) < 2) { - return; - } - current = ucx_list_remove(current, current); -} - -void ui_menuitem(char *label, ui_callback f, void *data) { - 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]; - - // add groups - va_list ap; - va_start(ap, userdata); - int group; - while((group = va_arg(ap, int)) != -1) { - [item addGroup: group]; - } - va_end(ap); - - NSMenu *currentMenu = current->data; - [currentMenu addItem:item]; - - currentItemIndex++; -} - -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]; - - // add groups - va_list ap; - va_start(ap, userdata); - int group; - while((group = va_arg(ap, int)) != -1) { - [item addGroup: group]; - } - va_end(ap); - - NSMenu *currentMenu = current->data; - [currentMenu addItem:item]; - - currentItemIndex++; -} - -void ui_checkitem(char *label, ui_callback f, void *data) { - EventWrapper *event = [[EventWrapper alloc]initWithData:data callback:f]; - NSString *str = [[NSString alloc] initWithUTF8String:label]; - - NSMenu *currentMenu = current->data; - NSMenuItem *item = [currentMenu addItemWithTitle:str - action:@selector(handleStateEvent:) keyEquivalent:@""]; - [item setTarget:event]; - - [delegate addItem: item var:NULL]; - currentItemIndex++; -} - -void ui_checkitem_nv(char *label, char *vname) { - EventWrapper *event = [[EventWrapper alloc]initWithData:NULL callback:NULL]; - NSString *str = [[NSString alloc] initWithUTF8String:label]; - - NSMenu *currentMenu = current->data; - NSMenuItem *item = [currentMenu addItemWithTitle:str - action:@selector(handleStateEvent:) keyEquivalent:@""]; - [item setTarget:event]; - - [delegate addItem: item var:vname]; - currentItemIndex++; -} - -void ui_menuseparator() { - NSMenu *currentMenu = current->data; - [currentMenu addItem: [NSMenuItem separatorItem]]; - currentItemIndex++; -} - -void ui_menuitem_list (UiList *items, ui_callback f, void *data) { - NSMenu *currentMenu = current->data; - [delegate addList:items menu:currentMenu index:currentItemIndex callback:f data:data]; -} - - - -int ui_menuitem_get(UiInteger *i) { - UiMenuItem *item = i->obj; - i->value = [item->item state]; - return i->value; -} - -void ui_menuitem_set(UiInteger *i, int value) { - UiMenuItem *item = i->obj; - [item->item setState: value]; - i->value = value; - item->state = value; -} - - -int ui_update_item(UiCocoaWindow *window, void *data) { - UiMenuItem *item = data; - [item->item setState: item->state]; - return 0; -} - -int ui_update_item_list(UiCocoaWindow *window, void *data) { - UiMenuItemList *itemList = data; - UiList *list = itemList->list; - - for(int r=0;roldcount;r++) { - [itemList->menu removeItemAtIndex:itemList->index]; - } - - char *str = ui_list_first(list); - int i = itemList->index; - [itemList->menu insertItem: [NSMenuItem separatorItem] atIndex: i]; - i++; - while(str) { - EventWrapper *event = [[EventWrapper alloc]initWithData:itemList->data callback:itemList->callback]; - [event setIntval: i - itemList->index - 1]; - - NSString *title = [[NSString alloc] initWithUTF8String:str]; - NSMenuItem *item = [[NSMenuItem alloc]initWithTitle:title action:@selector(handleEvent:) keyEquivalent:@""]; - [item setTarget:event]; - - [itemList->menu insertItem:item atIndex:i]; - - str = ui_list_next(list); - i++; - } - - itemList->oldcount = i - itemList->index; - - return 0; -}