Sun, 07 Sep 2025 11:57:01 +0200
implement sidebar window (Cocoa)
--- 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 --------------------------------- */