diff -r b9767cb5b06b -r d2bd73d28ff1 ui/cocoa/window.m --- a/ui/cocoa/window.m Fri Nov 29 22:21:36 2024 +0100 +++ b/ui/cocoa/window.m Thu Dec 12 20:01:43 2024 +0100 @@ -1,7 +1,7 @@ /* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * - * Copyright 2012 Olaf Wintermann. All rights reserved. + * Copyright 2024 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: @@ -26,195 +26,43 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#include -#include -#include +#import "window.h" -#import "window.h" -#import "menu.h" -#import "toolbar.h" -#import "container.h" -#import -#import "../common/context.h" - -static int window_default_width = 600; -static int window_default_height = 500; - -@implementation UiCocoaWindow +#import "MainWindow.h" +#import "WindowManager.h" -- (UiCocoaWindow*) init: (NSRect)frame object: (UiObject*)obj { - self = [self initWithContentRect:frame - styleMask:NSTitledWindowMask | - NSResizableWindowMask | - NSClosableWindowMask | - NSMiniaturizableWindowMask - backing:NSBackingStoreBuffered - defer:false]; - - uiobj = obj; - UcxAllocator *allocator = uiobj->ctx->mempool->allocator; - menus = ucx_map_new_a(allocator, 8); - items = ucx_map_new_a(allocator, 64); - - return self; -} +#include "../ui/window.h" +#include "../ui/properties.h" +#include "../common/context.h" +#include "../common/menu.h" +#include "../common/toolbar.h" -- (UiObject*) object { - return uiobj; -} +#include -- (void) setObject:(UiObject*)obj { - uiobj = obj; -} - -- (void) setMenuItems:(UcxList*)menuItems { - UcxAllocator *allocator = uiobj->ctx->mempool->allocator; +static UiObject* create_window(const char *title, BOOL simple) { + CxMempool *mp = cxBasicMempoolCreate(256); + UiObject *obj = cxCalloc(mp->allocator, 1, sizeof(UiObject)); + obj->ref = 0; - UCX_FOREACH(elm, menuItems) { - UiStateItem *item = elm->data; - NSMenu *menu = [item->item menu]; - - // create UiMenuItem which represents an NSMenuItem for a Window - UiMenuItem *windowItem = ucx_mempool_malloc(uiobj->ctx->mempool, sizeof(UiMenuItem)); - windowItem->item = item->item; - windowItem->state = 0; - if(item->var) { - // bind value - UiVar *var = uic_connect_var(uiobj->ctx, item->var, UI_VAR_INTEGER); - if(var) { - UiInteger *value = var->value; - value->obj = windowItem; - value->get = ui_menuitem_get; - value->set = ui_menuitem_set; - value = 0; - } else { - // TODO: error - } - } - - // add item - UiAbstractMenuItem *abstractItem = malloc(sizeof(UiAbstractMenuItem)); - abstractItem->update = ui_update_item; - abstractItem->item_data = windowItem; - UcxList *itemList = ucx_map_get(menus, ucx_key(&menu, sizeof(void*))); - itemList = ucx_list_append_a(allocator, itemList, abstractItem); - ucx_map_put(menus, ucx_key(&menu, sizeof(void*)), itemList); - - ucx_map_put(items, ucx_key(&windowItem->item, sizeof(void*)), windowItem); - } -} - -- (void) setMenuItemLists:(UcxList*)itemLists { - UcxAllocator *allocator = uiobj->ctx->mempool->allocator; - - UCX_FOREACH(elm, itemLists) { - UiMenuItemList *list = elm->data; - - UiAbstractMenuItem *abstractItem = malloc(sizeof(UiAbstractMenuItem)); - abstractItem->update = ui_update_item_list; - abstractItem->item_data = list; - - UcxList *itemList = ucx_map_get(menus, ucx_key(&list->menu, sizeof(void*))); - itemList = ucx_list_append_a(allocator, itemList, abstractItem); - ucx_map_put(menus, ucx_key(&list->menu, sizeof(void*)), itemList); - - } -} - -- (UiMenuItem*) getMenuItem:(NSMenuItem*)item { - return ucx_map_get(items, ucx_key(&item, sizeof(void*))); -} - -- (void) updateMenu:(NSMenu*)menu { - UcxList *itemList = ucx_map_get(menus, ucx_key(&menu, sizeof(void*))); - UCX_FOREACH(elm, itemList) { - 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;ictx = uic_context(obj, mp); - // create native window - NSRect frame = NSMakeRect( - 300, - 200, - window_default_width, - window_default_height); + MainWindow *window = [[MainWindow alloc] init:obj]; + [[WindowManager sharedWindowManager] addWindow:window]; + window.releasedWhenClosed = false; - /* - UiCocoaWindow *window = [[UiCocoaWindow alloc] initWithContentRect:frame - styleMask:NSTitledWindowMask | NSResizableWindowMask | - NSClosableWindowMask | NSMiniaturizableWindowMask - backing:NSBackingStoreBuffered - defer:false]; - */ - UiCocoaWindow *window = [[UiCocoaWindow alloc] init:frame object:obj]; - - NSString *titleStr = [[NSString alloc] initWithUTF8String:title]; - [window setTitle:titleStr]; - - UiMenuDelegate *menuDelegate = ui_menu_delegate(); - [window setMenuItems: [menuDelegate items]]; - [window setMenuItemLists: [menuDelegate lists]]; - - NSToolbar *toolbar = ui_create_toolbar(obj); - [window setToolbar: toolbar]; - - obj->widget = (NSView*)window; - obj->window = window_data; - obj->container = ui_window_container(obj, window); - + obj->wobj = (__bridge void*)window; return obj; } -void ui_close(UiObject *obj) { - // TODO +UiObject* ui_window(const char *title, void *window_data) { + UiObject *obj = create_window(title, FALSE); + obj->window = window_data; + return obj; } -char* ui_openfiledialog(UiObject *obj) { - NSOpenPanel* op = [NSOpenPanel openPanel]; - if ([op runModal] == NSOKButton) { - NSArray *urls = [op URLs]; - NSURL *url = [urls objectAtIndex:0]; - - const char *str = [[url path] UTF8String]; - return (char*)strdup(str); - } - return NULL; +UiObject* ui_simple_window(const char *title, void *window_data) { + UiObject *obj = create_window(title, TRUE); + obj->window = window_data; + return obj; } - -char* ui_savefiledialog(UiObject *obj) { - NSSavePanel* sp = [NSSavePanel savePanel]; - if ([sp runModal] == NSOKButton) { - NSURL *url = [sp URL]; - - const char *str = [[url path] UTF8String]; - return (char*)strdup(str); - } - return NULL; -}