implement sidebar window (Cocoa)

Sun, 07 Sep 2025 11:57:01 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sun, 07 Sep 2025 11:57:01 +0200
changeset 751
41286f7f8433
parent 750
7b627710c155
child 752
08a2421957f1
child 784
2fded9495930

implement sidebar window (Cocoa)

make/xcode/toolkit/toolkit/main.m file | annotate | diff | comparison | revisions
ui/cocoa/MainWindow.h file | annotate | diff | comparison | revisions
ui/cocoa/MainWindow.m file | annotate | diff | comparison | revisions
ui/cocoa/Toolbar.m file | annotate | diff | comparison | revisions
ui/cocoa/container.m file | annotate | diff | comparison | revisions
ui/cocoa/window.m file | annotate | diff | comparison | revisions
--- a/make/xcode/toolkit/toolkit/main.m	Sun Sep 07 08:28:30 2025 +0200
+++ b/make/xcode/toolkit/toolkit/main.m	Sun Sep 07 11:57:01 2025 +0200
@@ -93,13 +93,25 @@
 }
 
 void application_startup(UiEvent *event, void *data) {
-    UiObject *obj = ui_window("My Window", NULL);
+    UiObject *obj = ui_sidebar_window("My Window", NULL);
     //WindowData *wdata = ui_malloc(obj->ctx, sizeof(WindowData));
     //wdata->tbtoggle = ui_int_new(obj->ctx, "tbtoggle");
     //obj->window = wdata;
     MyDocument *doc = create_doc();
     ui_attach_document(obj->ctx, doc);
     
+    ui_sidebar(obj) {
+        ui_button(obj, .label = "Sidebar Button");
+        ui_textarea(obj, .varname = "todo: fix layout", .fill = TRUE);
+    }
+    
+    UiModel *model = ui_model(obj->ctx, UI_STRING, "Column 0", UI_STRING, "Column 1", UI_STRING, "Column 2", -1);
+    model->columnsize[1] = -1;
+    ui_grid(obj, .columnspacing = 10, .rowspacing = 10) {
+        ui_table(obj, .fill = UI_ON, .varname = "list1", .model = model, .getvalue = table_getvalue, .onactivate = action_list_activate, .onselection = action_list_selection, .multiselection = TRUE);
+    }
+    
+    /*
     UiModel *model = ui_model(obj->ctx, UI_STRING, "Column 0", UI_STRING, "Column 1", UI_STRING, "Column 2", -1);
     model->columnsize[1] = -1;
     ui_grid(obj, .columnspacing = 10, .rowspacing = 10) {
@@ -122,6 +134,7 @@
         ui_radiobutton(obj, .label = "V Button 2 R2", .varname = "radio2");
         ui_radiobutton(obj, .label = "V Button 3 R2", .varname = "radio2");
     }
+    */
     
     ui_show(obj);
 }
--- a/ui/cocoa/MainWindow.h	Sun Sep 07 08:28:30 2025 +0200
+++ b/ui/cocoa/MainWindow.h	Sun Sep 07 11:57:01 2025 +0200
@@ -31,7 +31,9 @@
 
 @interface MainWindow : NSWindow
 
-- (MainWindow*)init:(UiObject*)obj;
+@property (strong) NSView *sidebar;
+
+- (MainWindow*)init:(UiObject*)obj withSidebar:(BOOL)sidebar;
 
 @end
 
--- a/ui/cocoa/MainWindow.m	Sun Sep 07 08:28:30 2025 +0200
+++ b/ui/cocoa/MainWindow.m	Sun Sep 07 11:57:01 2025 +0200
@@ -38,7 +38,7 @@
 
 @implementation MainWindow
 
-- (MainWindow*)init:(UiObject*)obj {
+- (MainWindow*)init:(UiObject*)obj withSidebar:(BOOL)sidebar {
     NSRect frame = NSMakeRect(300, 200, 600, 500);
     
     self = [self initWithContentRect:frame
@@ -49,24 +49,52 @@
                              backing:NSBackingStoreBuffered
                                defer:false];
     
+    
     if(uic_toolbar_isenabled()) {
         UiToolbar *toolbar = [[UiToolbar alloc]initWithObject:obj];
         [self setToolbar:toolbar];
     }
     
+    int top = 4;
+    NSView *content = self.contentView;
+    if(sidebar) {
+        self.styleMask |= NSWindowStyleMaskFullSizeContentView;
+        self.titleVisibility = NSWindowTitleHidden;
+        self.titlebarAppearsTransparent = YES;
+        
+        NSSplitView *splitview = [[NSSplitView alloc]init];
+        splitview.vertical = YES;
+        splitview.dividerStyle = NSSplitViewDividerStyleThin;
+        splitview.translatesAutoresizingMaskIntoConstraints = false;
+        [self.contentView addSubview:splitview];
+        
+        [NSLayoutConstraint activateConstraints:@[
+            [splitview.topAnchor constraintEqualToAnchor:self.contentView.topAnchor constant:0],
+            [splitview.leadingAnchor constraintEqualToAnchor:self.contentView.leadingAnchor],
+            [splitview.trailingAnchor constraintEqualToAnchor:self.contentView.trailingAnchor],
+            [splitview.bottomAnchor constraintEqualToAnchor:self.contentView.bottomAnchor]
+        ]];
+        
+        _sidebar = [[NSView alloc]initWithFrame:NSMakeRect(0,0,100,100)];
+        [splitview addArrangedSubview:_sidebar];
+        
+        content = [[NSView alloc]initWithFrame:NSMakeRect(0,0,100,100)];
+        [splitview addArrangedSubview:content];
+        
+        top = 34;
+    }
     
     // create a vertical stackview as default container
     BoxContainer *vbox = [[BoxContainer alloc] init:NSUserInterfaceLayoutOrientationVertical spacing:0];
     //GridLayout *vbox = [[GridLayout alloc] init];
     vbox.translatesAutoresizingMaskIntoConstraints = false;
-    [self.contentView addSubview:vbox];
+    [content addSubview:vbox];
     [NSLayoutConstraint activateConstraints:@[
-        [vbox.topAnchor constraintEqualToAnchor:self.contentView.topAnchor constant:4],
-        [vbox.leadingAnchor constraintEqualToAnchor:self.contentView.leadingAnchor],
-        [vbox.trailingAnchor constraintEqualToAnchor:self.contentView.trailingAnchor],
-        [vbox.bottomAnchor constraintEqualToAnchor:self.contentView.bottomAnchor]
+        [vbox.topAnchor constraintEqualToAnchor:content.topAnchor constant:top],
+        [vbox.leadingAnchor constraintEqualToAnchor:content.leadingAnchor],
+        [vbox.trailingAnchor constraintEqualToAnchor:content.trailingAnchor],
+        [vbox.bottomAnchor constraintEqualToAnchor:content.bottomAnchor]
     ]];
-    
     uic_object_push_container(obj, ui_create_container(obj, vbox));
     
     return self;
@@ -75,7 +103,6 @@
 @end
 
 
-
 @implementation MainWindowController
 
 - (MainWindowController*)initWithWindow:(UiObject*)obj window:(NSWindow*)window {
@@ -273,3 +300,27 @@
         index++;
     }
 }
+
+
+UIWIDGET ui_sidebar_create(UiObject *obj, UiSidebarArgs *args) {
+    MainWindow *window = (__bridge MainWindow*)obj->wobj;
+    if(window.sidebar == nil) {
+        return NULL;
+    }
+    NSView *sidebar = window.sidebar;
+    
+    // create a vertical stackview as default container
+    BoxContainer *vbox = [[BoxContainer alloc] init:NSUserInterfaceLayoutOrientationVertical spacing:args->spacing];
+    //GridLayout *vbox = [[GridLayout alloc] init];
+    vbox.translatesAutoresizingMaskIntoConstraints = false;
+    [sidebar addSubview:vbox];
+    [NSLayoutConstraint activateConstraints:@[
+        [vbox.topAnchor constraintEqualToAnchor:sidebar.topAnchor constant:34],
+        [vbox.leadingAnchor constraintEqualToAnchor:sidebar.leadingAnchor],
+        [vbox.trailingAnchor constraintEqualToAnchor:sidebar.trailingAnchor],
+        [vbox.bottomAnchor constraintEqualToAnchor:sidebar.bottomAnchor]
+    ]];
+    uic_object_push_container(obj, ui_create_container(obj, vbox));
+    
+    return NULL;
+}
--- a/ui/cocoa/Toolbar.m	Sun Sep 07 08:28:30 2025 +0200
+++ b/ui/cocoa/Toolbar.m	Sun Sep 07 11:57:01 2025 +0200
@@ -204,6 +204,7 @@
             
         }
         i->obj = (__bridge void*)seg;
+        printf("seg: %p\n", seg);
         i->get = ui_toolbar_seg_toggleitem_get;
         i->set = ui_toolbar_seg_toggleitem_set;
     }
--- a/ui/cocoa/container.m	Sun Sep 07 08:28:30 2025 +0200
+++ b/ui/cocoa/container.m	Sun Sep 07 11:57:01 2025 +0200
@@ -129,7 +129,6 @@
     return (__bridge void*)grid;
 }
 
-
 void ui_container_begin_close(UiObject *obj) {
     UiContainerX *ct = obj->container_end;
     ct->close = 1;
--- a/ui/cocoa/window.m	Sun Sep 07 08:28:30 2025 +0200
+++ b/ui/cocoa/window.m	Sun Sep 07 11:57:01 2025 +0200
@@ -42,14 +42,14 @@
 #include <cx/mempool.h>
 
 
-static UiObject* create_window(const char *title, BOOL simple) {
+static UiObject* create_window(const char *title, BOOL simple, BOOL sidebar) {
     CxMempool *mp = cxMempoolCreateSimple(256);
     UiObject *obj = cxCalloc(mp->allocator, 1, sizeof(UiObject));
     obj->ref = 0;
     
     obj->ctx = uic_context(obj, mp);
     
-    MainWindow *window = [[MainWindow alloc] init:obj];
+    MainWindow *window = [[MainWindow alloc] init:obj withSidebar:sidebar];
     [[WindowManager sharedWindowManager] addWindow:window];
     window.releasedWhenClosed = false;
     
@@ -64,17 +64,22 @@
 }
 
 UiObject* ui_window(const char *title, void *window_data) {
-    UiObject *obj = create_window(title, FALSE);
+    UiObject *obj = create_window(title, FALSE, FALSE);
     obj->window = window_data;
     return obj;
 }
 
 UiObject* ui_simple_window(const char *title, void *window_data) {
-    UiObject *obj = create_window(title, TRUE);
+    UiObject *obj = create_window(title, TRUE, FALSE);
     obj->window = window_data;
     return obj;
 }
 
+UiObject* ui_sidebar_window(const char *title, void *window_data) {
+    UiObject *obj = create_window(title, FALSE, TRUE);
+    obj->window = window_data;
+    return obj;
+}
 
 /* --------------------------------- File Dialogs --------------------------------- */
 

mercurial