implement all toolbar item positions (Cocoa)

Sun, 26 Oct 2025 13:10:46 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sun, 26 Oct 2025 13:10:46 +0100
changeset 877
aff9ad6a54a1
parent 876
2131c806440d
child 878
862a57990eb8

implement all toolbar item positions (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.h file | annotate | diff | comparison | revisions
ui/cocoa/Toolbar.m file | annotate | diff | comparison | revisions
--- a/make/xcode/toolkit/toolkit/main.m	Sun Oct 26 10:30:02 2025 +0100
+++ b/make/xcode/toolkit/toolkit/main.m	Sun Oct 26 13:10:46 2025 +0100
@@ -250,6 +250,8 @@
         }
     }
     
+    ui_toolbar_item("itemz", .label = "Test Z", .icon = "NSImageNameActionTemplate");
+    ui_toolbar_item("item0", .label = "Test 0", .icon = "NSImageNameActionTemplate");
     ui_toolbar_item("item1", .label = "Test 1", .icon = "NSImageNameGoBackTemplate", .onclick = toolbar_action);
     ui_toolbar_item("item2", .label = "Test 2", .icon = "NSImageNameGoForwardTemplate", .onclick = toolbar_action);
     ui_toolbar_toggleitem("item3", .label = "Toggle", .icon = "NSImageNameActionTemplate", .varname = "tbtoggle", .onchange = toolbar_toggle);
@@ -258,12 +260,16 @@
         ui_menu_toggleitem(.label = "Check");
     }
     ui_toolbar_item("item5", .label = "Dialog Window", .icon = "NSImageNameAddTemplate", .onclick = toolbar_action2);
+    ui_toolbar_item("item6", .label = "Test", .icon = "NSImageNameGoBackTemplate");
     
-    ui_toolbar_add_default("item4", UI_TOOLBAR_LEFT);
-    ui_toolbar_add_default("item3", UI_TOOLBAR_LEFT);
+    ui_toolbar_add_default("itemz", UI_TOOLBAR_SIDEBAR_LEFT);
+    ui_toolbar_add_default("item0", UI_TOOLBAR_SIDEBAR_RIGHT);
     ui_toolbar_add_default("item1", UI_TOOLBAR_LEFT);
-    ui_toolbar_add_default("item2", UI_TOOLBAR_RIGHT);
-    ui_toolbar_add_default("item5", UI_TOOLBAR_RIGHT);
+    ui_toolbar_add_default("item2", UI_TOOLBAR_LEFT);
+    ui_toolbar_add_default("item3", UI_TOOLBAR_CENTER);
+    ui_toolbar_add_default("item4", UI_TOOLBAR_RIGHT);
+    ui_toolbar_add_default("item5", UI_TOOLBAR_RIGHTPANEL_LEFT);
+    ui_toolbar_add_default("item6", UI_TOOLBAR_RIGHTPANEL_RIGHT);
     
     
     ui_main();
--- a/ui/cocoa/MainWindow.h	Sun Oct 26 10:30:02 2025 +0100
+++ b/ui/cocoa/MainWindow.h	Sun Oct 26 13:10:46 2025 +0100
@@ -31,6 +31,8 @@
 
 @interface MainWindow : NSWindow<UiToplevelObject>
 
+@property UiObject *obj;
+@property (strong) NSSplitView *splitview;
 @property (strong) NSView *sidebar;
 @property (strong) NSView *leftPanel;
 @property (strong) NSView *rightPanel;
--- a/ui/cocoa/MainWindow.m	Sun Oct 26 10:30:02 2025 +0100
+++ b/ui/cocoa/MainWindow.m	Sun Oct 26 13:10:46 2025 +0100
@@ -50,12 +50,8 @@
             NSWindowStyleMaskMiniaturizable
                              backing:NSBackingStoreBuffered
                                defer:false];
-    
+    _obj = obj;
     
-    if(uic_toolbar_isenabled()) {
-        UiToolbar *toolbar = [[UiToolbar alloc]initWithObject:obj];
-        [self setToolbar:toolbar];
-    }
     
     int top = 4;
     NSView *content = self.contentView;
@@ -72,6 +68,7 @@
         splitview.dividerStyle = NSSplitViewDividerStyleThin;
         splitview.translatesAutoresizingMaskIntoConstraints = false;
         [self.contentView addSubview:splitview];
+        _splitview = splitview;
         
         [NSLayoutConstraint activateConstraints:@[
             [splitview.topAnchor constraintEqualToAnchor:self.contentView.topAnchor constant:0],
@@ -135,6 +132,12 @@
     }
     _topOffset = top;
     
+    if(uic_toolbar_isenabled()) {
+        UiToolbar *toolbar = [[UiToolbar alloc]initWithWindow:self];
+        [self setToolbar:toolbar];
+    }
+    
+    
     return self;
 }
 
--- a/ui/cocoa/Toolbar.h	Sun Oct 26 10:30:02 2025 +0100
+++ b/ui/cocoa/Toolbar.h	Sun Oct 26 13:10:46 2025 +0100
@@ -28,6 +28,7 @@
 
 #import "toolkit.h"
 #import "../common/toolbar.h"
+#import "MainWindow.h"
 
 /*
  * UiToolbarDelegate
@@ -49,9 +50,10 @@
     NSMutableArray<NSString*> *defaultItems;
 }
 
+@property MainWindow *window;
 @property UiObject *obj;
 
-- (UiToolbar*) initWithObject:(UiObject*)object;
+- (UiToolbar*) initWithWindow:(MainWindow*)window;
 
 @end
 
--- a/ui/cocoa/Toolbar.m	Sun Oct 26 10:30:02 2025 +0100
+++ b/ui/cocoa/Toolbar.m	Sun Oct 26 13:10:46 2025 +0100
@@ -45,13 +45,21 @@
 
 @implementation UiToolbar
 
-- (UiToolbar*) initWithObject:(UiObject*)object {
+- (UiToolbar*) initWithWindow:(MainWindow*)window {
     self = [super initWithIdentifier:@"UiToolbar"];
-    _obj = object;
+    _window = window;
+    _obj = window.obj;
     
     allowedItems = [[NSMutableArray alloc]initWithCapacity:16];
     defaultItems = [[NSMutableArray alloc]initWithCapacity:16];
     
+    if(window.sidebar) {
+        [allowedItems addObject:@"sidebar_separator"];
+    }
+    if(window.leftPanel) {
+        [allowedItems addObject:@"splitview_separator"];
+    }
+    
     CxMap *toolbarItems = uic_get_toolbar_items();
     CxMapIterator i = cxMapIteratorKeys(toolbarItems);
     cx_foreach(CxHashKey *, key, i) {
@@ -61,18 +69,59 @@
     [allowedItems addObject: NSToolbarFlexibleSpaceItemIdentifier];
     [allowedItems addObject: NSToolbarSpaceItemIdentifier];
     
-    CxList *tbitems[3];
-    tbitems[0] =  uic_get_toolbar_defaults(UI_TOOLBAR_LEFT);
-    tbitems[1] =  uic_get_toolbar_defaults(UI_TOOLBAR_CENTER);
-    tbitems[2] =  uic_get_toolbar_defaults(UI_TOOLBAR_RIGHT);
-    for(int t=0;t<3;t++) {
-        CxIterator iter = cxListIterator(tbitems[t]);
+    // UI_TOOLBAR_LEFT = 0,
+    // UI_TOOLBAR_CENTER,
+    // UI_TOOLBAR_RIGHT,
+    // UI_TOOLBAR_SIDEBAR_LEFT,
+    // UI_TOOLBAR_SIDEBAR_RIGHT,
+    // UI_TOOLBAR_RIGHTPANEL_LEFT,
+    // UI_TOOLBAR_RIGHTPANEL_CENTER,
+    // UI_TOOLBAR_RIGHTPANEL_RIGHT
+    CxList *tbitems[8];
+    for(int i=0;i<8;i++) {
+        tbitems[i] = uic_get_toolbar_defaults(i);
+    }
+    
+    if(window.sidebar) {
+        CxIterator iter = cxListIterator(tbitems[UI_TOOLBAR_SIDEBAR_LEFT]);
         cx_foreach(char *, name, iter) {
             NSString *s = [[NSString alloc] initWithUTF8String:name];
             [defaultItems addObject:s];
         }
+        
+        CxList *sidebarRight = tbitems[UI_TOOLBAR_SIDEBAR_RIGHT];
+        if(cxListSize(sidebarRight) > 0) {
+            [defaultItems addObject:NSToolbarFlexibleSpaceItemIdentifier];
+            iter = cxListIterator(sidebarRight);
+            cx_foreach(char *, name, iter) {
+                NSString *s = [[NSString alloc] initWithUTF8String:name];
+                [defaultItems addObject:s];
+            }
+        }
+        
+        [defaultItems addObject:@"sidebar_separator"];
     }
     
+    int start_pos = UI_TOOLBAR_LEFT;
+    for(int x=0;x<2;x++) {
+        for(int t=start_pos;t<start_pos+3;t++) {
+            CxIterator iter = cxListIterator(tbitems[t]);
+            cx_foreach(char *, name, iter) {
+                NSString *s = [[NSString alloc] initWithUTF8String:name];
+                [defaultItems addObject:s];
+            }
+            if(t < start_pos+2 && cxListSize(tbitems[t+1]) > 0) {
+                [defaultItems addObject:NSToolbarFlexibleSpaceItemIdentifier];
+            }
+        }
+        
+        if(x == 0 && window.rightPanel) {
+            [defaultItems addObject:@"splitview_separator"];
+        }
+        start_pos = UI_TOOLBAR_RIGHTPANEL_LEFT;
+    }
+    
+    
     [self setDelegate:self];
     [self setAllowsUserCustomization:YES];
     return self;
@@ -94,6 +143,18 @@
     CxMap *items = uic_get_toolbar_items();
     UiToolbarItemI *item = cxMapGet(items, itemIdentifier.UTF8String);
     if(!item) {
+        if([itemIdentifier isEqualToString:@"sidebar_separator"]) {
+            NSTrackingSeparatorToolbarItem *sep = [NSTrackingSeparatorToolbarItem trackingSeparatorToolbarItemWithIdentifier:itemIdentifier
+                                                                                                                   splitView:_window.splitview
+                                                                                                                dividerIndex:0];
+            return sep;
+        } else if([itemIdentifier isEqualToString:@"splitview_separator"]) {
+            int dividerIndex = _window.sidebar != nil ? 1 : 0;
+            NSTrackingSeparatorToolbarItem *sep = [NSTrackingSeparatorToolbarItem trackingSeparatorToolbarItemWithIdentifier:itemIdentifier
+                                                                                                                   splitView:_window.splitview
+                                                                                                                dividerIndex:dividerIndex];
+            return sep;
+        }
         return nil;
     }
     

mercurial