ui/cocoa/container.m

changeset 846
ffa983c223c1
parent 811
1391ba7e533f
child 847
50de0f36973f
--- a/ui/cocoa/container.m	Mon Oct 13 21:31:58 2025 +0200
+++ b/ui/cocoa/container.m	Tue Oct 14 09:45:44 2025 +0200
@@ -30,81 +30,20 @@
 #import "GridLayout.h"
 #import "BoxContainer.h"
 
-/* ------------------------- container classes ------------------------- */
-
-/*
-@implementation BoxContainer
-
-@synthesize label=_label;
-@synthesize uilayout=_uilayout;
-@synthesize newline=_newline;
-
-- (BoxContainer*)init:(NSUserInterfaceLayoutOrientation)orientation spacing:(int)spacing {
-    self = [super init];
-    _label = NULL;
-    _uilayout = (UiLayout){ 0 };
-    _newline = false;
-    
-    self.distribution = NSStackViewDistributionFillProportionally;
-    self.spacing = spacing;
-    
-    self.orientation = orientation;
-    if(orientation == NSUserInterfaceLayoutOrientationHorizontal) {
-        self.alignment = NSLayoutAttributeHeight;
-    } else {
-        self.alignment = NSLayoutAttributeWidth;
-    }
-    
-    
-    return self;
-}
-
-- (void) addView:(NSView*)view {
-    UiBool fill = _uilayout.fill;
-    
-    [self addArrangedSubview:view];
-    
-    if(self.orientation == NSUserInterfaceLayoutOrientationHorizontal) {
-        [view.heightAnchor constraintEqualToAnchor:self.heightAnchor].active = YES;
-        if(!fill) {
-            NSSize isize = view.intrinsicContentSize;
-            [view.widthAnchor constraintEqualToConstant:isize.width].active = YES;
-        }
-    } else {
-        [view.widthAnchor constraintEqualToAnchor:self.widthAnchor].active = YES;
-        if(!fill) {
-            NSSize isize = view.intrinsicContentSize;
-            NSRect frame = view.frame;
-            CGFloat height = isize.height > 0 ? isize.height : frame.size.height;
-            if(height == 0) {
-                printf("debug");
-            }
-            if(height > 0) {
-                [view.heightAnchor constraintEqualToConstant:height].active = YES;
-            }
-        }
-    }
-    
-    // at the moment, only the fill layout option needs to be reset
-    _uilayout.fill = UI_DEFAULT;
-}
-
-@end
-*/
-
-
 /* -------------------- public container functions --------------------- */
 
 static UIWIDGET ui_box_create(UiObject *obj, UiContainerArgs *args, NSUserInterfaceLayoutOrientation orientation) {
     BoxContainer *box = [[BoxContainer alloc] init:orientation spacing:args->spacing];
     box.translatesAutoresizingMaskIntoConstraints = false;
+    UiContainerX *container = ui_create_container(obj, box);
+    box.container = container;
     
     // add box to the parent
     UiLayout layout = UI_INIT_LAYOUT(args);
     ui_container_add(obj, box, &layout);
     
     // add new box to the obj container chain
-    uic_object_push_container(obj, ui_create_container(obj, box));
+    uic_object_push_container(obj, container);
     
     return (__bridge void*)box;
 }
@@ -122,17 +61,63 @@
     grid.translatesAutoresizingMaskIntoConstraints = false;
     grid.columnspacing = args->columnspacing;
     grid.rowspacing = args->rowspacing;
+    UiContainerX *container = ui_create_container(obj, grid);
+    grid.container = container;
     
     // add box to the parent
     UiLayout layout = UI_INIT_LAYOUT(args);
     ui_container_add(obj, grid, &layout);
     
     // add new box to the obj container chain
-    uic_object_push_container(obj, ui_create_container(obj, grid));
+    uic_object_push_container(obj, container);
     
     return (__bridge void*)grid;
 }
 
+UIWIDGET ui_frame_create(UiObject *obj, UiFrameArgs *args) {
+    NSString *title = args->label ? [[NSString alloc]initWithUTF8String:args->label] : nil;
+    FrameContainer *frame = [[FrameContainer alloc] init:title];    UiLayout layout = UI_ARGS2LAYOUT(args);
+    ui_container_add(obj, frame, &layout);
+    
+    // add container to the chain
+    UiContainerX *container;
+    UiLayout subLayout = {0};
+    switch(args->subcontainer) {
+        default: {
+            // UI_CONTAINER_NO_SUB
+            container = ui_create_container(obj, frame);
+            break;
+        }
+        case UI_CONTAINER_VBOX: {
+            BoxContainer *box = [[BoxContainer alloc]init:NSUserInterfaceLayoutOrientationVertical spacing:args->spacing];
+            box.translatesAutoresizingMaskIntoConstraints = false;
+            [frame addView:box layout:&subLayout];
+            container = ui_create_container(obj, box);
+            break;
+        }
+        case UI_CONTAINER_HBOX: {
+            BoxContainer *box = [[BoxContainer alloc]init:NSUserInterfaceLayoutOrientationHorizontal spacing:args->spacing];
+            box.translatesAutoresizingMaskIntoConstraints = false;
+            [frame addView:box layout:&subLayout];
+            container = ui_create_container(obj, box);
+            break;
+        }
+        case UI_CONTAINER_GRID: {
+            GridLayout *grid = [[GridLayout alloc] init];
+            grid.translatesAutoresizingMaskIntoConstraints = false;
+            grid.columnspacing = args->columnspacing;
+            grid.rowspacing = args->rowspacing;
+            [frame addView:grid layout:&subLayout];
+            container = ui_create_container(obj, grid);
+            break;
+        }
+    }
+    
+    uic_object_push_container(obj, container);
+    
+    return NULL;
+}
+
 void ui_container_begin_close(UiObject *obj) {
     UiContainerX *ct = obj->container_end;
     ct->close = 1;
@@ -147,6 +132,35 @@
     return 1;
 }
 
+/* -------------------------- Frame Container -------------------------- */
+
+@implementation FrameContainer
+
+@synthesize container = _container;
+
+- (id)init:(NSString*)title {
+    self = [super init];
+    self.title = title;
+    self.boxType = NSBoxPrimary;
+    if(title != nil) {
+        self.titlePosition = NSAtTop;
+    }
+    return self;
+}
+
+- (void) addView:(NSView*)view layout:(UiLayout*)layout {
+    [self.contentView addSubview:view];
+    view.translatesAutoresizingMaskIntoConstraints = NO;
+    [NSLayoutConstraint activateConstraints:@[
+        [view.topAnchor constraintEqualToAnchor:self.contentView.topAnchor constant:0],
+        [view.leadingAnchor constraintEqualToAnchor:self.contentView.leadingAnchor constant:0],
+        [view.bottomAnchor constraintEqualToAnchor:self.contentView.bottomAnchor constant:-0],
+        [view.trailingAnchor constraintEqualToAnchor:self.contentView.trailingAnchor constant:-0]
+    ]];
+}
+
+@end
+
 /* ------------------------- private functions ------------------------- */
 
 UiContainerX* ui_create_container(UiObject *obj, id<Container> container) {
@@ -162,19 +176,13 @@
 void ui_container_add(UiObject *obj, NSView *view, UiLayout *layout) {
     UiContainerX *ctn = obj->container_end;
     id<Container> container = (__bridge id<Container>)ctn->container;
-    container.uilayout = *layout;
-    NSEdgeInsets margin = {0};
-    if(layout->margin > 0) {
-        margin.left = layout->margin;
-        margin.right = layout->margin;
-        margin.top = layout->margin;
-        margin.bottom = layout->margin;
-    } else {
-        margin.left = layout->margin_left;
-        margin.right = layout->margin_right;
-        margin.top = layout->margin_top;
-        margin.bottom = layout->margin_bottom;
+    UiLayout adjustedLayout = *layout;
+    if(adjustedLayout.margin > 0) {
+        adjustedLayout.margin_left = adjustedLayout.margin;
+        adjustedLayout.margin_right = adjustedLayout.margin;
+        adjustedLayout.margin_top = adjustedLayout.margin;
+        adjustedLayout.margin_bottom = adjustedLayout.margin;
     }
-    [container addView:view margin:margin];
+    [container addView:view layout:layout];
 }
 

mercurial