ui/cocoa/window.m

changeset 100
d2bd73d28ff1
parent 0
2483f517c562
--- 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 <stdio.h>
-#include <stdlib.h>
-#include <string.h>
+#import "window.h"
 
-#import "window.h"
-#import "menu.h"
-#import "toolbar.h"
-#import "container.h"
-#import <ucx/mempool.h>
-#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 <cx/mempool.h>
 
-- (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;i<count;i++) {
-        id item = [groupItems objectAtIndex:i];
-        if([item class] == [UiGroupMenuItem class]) {
-            [item checkGroups: groups count:ngroups];
-        }
-    }
-    free(groups);
-}
-
-@end
-
-
-/* ------------------------------ public API ------------------------------ */
-
-UiObject* ui_window(char *title, void *window_data) {
-    UcxMempool *mp = ucx_mempool_new(256);
-    UiObject *obj = ucx_mempool_calloc(mp, 1, sizeof(UiObject));
     obj->ctx = 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;
-}

mercurial