implement custom sourcelist row layout (Cocoa)

Fri, 10 Oct 2025 15:30:56 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Fri, 10 Oct 2025 15:30:56 +0200
changeset 829
0980245646b4
parent 828
a952337ae325
child 830
13896bdaa151

implement custom sourcelist row layout (Cocoa)

ui/cocoa/list.h file | annotate | diff | comparison | revisions
ui/cocoa/list.m file | annotate | diff | comparison | revisions
--- a/ui/cocoa/list.h	Fri Oct 10 14:13:52 2025 +0200
+++ b/ui/cocoa/list.h	Fri Oct 10 15:30:56 2025 +0200
@@ -101,4 +101,9 @@
 
 @end
 
+@interface UiSourceListRow : NSTableRowView
+
+
+@end
+
 void ui_sourcelist_update(UiList *list, int row);
--- a/ui/cocoa/list.m	Fri Oct 10 14:13:52 2025 +0200
+++ b/ui/cocoa/list.m	Fri Oct 10 15:30:56 2025 +0200
@@ -413,6 +413,18 @@
     [outline addTableColumn:column];
     outline.outlineTableColumn = column;
     outline.headerView = NULL;
+    outline.rowSizeStyle = NSTableViewRowSizeStyleDefault;
+    outline.usesAutomaticRowHeights = YES;
+    outline.indentationPerLevel = 0;
+    outline.indentationMarkerFollowsCell = NO;
+    
+    outline.floatsGroupRows = NO;
+    outline.indentationPerLevel = 0.0;
+    outline.indentationMarkerFollowsCell = NO;
+    outline.selectionHighlightStyle = NSTableViewSelectionHighlightStyleRegular;
+
+    // Hide the disclosure triangle
+    //outline.disclosureButtonImage = nil;
     
     outline.style = NSTableViewStyleSourceList;
 
@@ -444,7 +456,7 @@
     [data update:-1];
  
     outline.dataSource = data;
-    //outline.delegate = data;
+    outline.delegate = data;
     
     objc_setAssociatedObject(outline, "ui_datasource", data, OBJC_ASSOCIATION_RETAIN);
     
@@ -521,6 +533,50 @@
     
 }
 
+// NSOutlineViewDelegate implementation
+
+- (NSView *)outlineView:(NSOutlineView *)outlineView
+     viewForTableColumn:(NSTableColumn *)tableColumn
+                   item:(id)item {
+    UiSourceListItem *i = item;
+    
+    NSTableCellView *cell = [[NSTableCellView alloc] init];
+    cell.identifier = @"cell";
+    // Icon
+    NSImageView *iconView = [[NSImageView alloc] initWithFrame:NSZeroRect];
+    iconView.translatesAutoresizingMaskIntoConstraints = NO;
+    //[cell addSubview:iconView];
+    //cell.imageView = iconView;
+
+    // Label
+    NSTextField *textField = [NSTextField labelWithString:@""];
+    textField.translatesAutoresizingMaskIntoConstraints = NO;
+    [cell addSubview:textField];
+    cell.textField = textField;
+
+    // Layout constraints
+    [NSLayoutConstraint activateConstraints:@[
+        //[iconView.leadingAnchor constraintEqualToAnchor:cell.leadingAnchor constant:0],
+        //[iconView.centerYAnchor constraintEqualToAnchor:cell.centerYAnchor],
+        //[iconView.widthAnchor constraintEqualToConstant:0],
+        //[iconView.heightAnchor constraintEqualToConstant:0],
+
+        [textField.leadingAnchor constraintEqualToAnchor:cell.leadingAnchor constant:0],
+        [textField.centerYAnchor constraintEqualToAnchor:cell.centerYAnchor],
+        [textField.trailingAnchor constraintEqualToAnchor:cell.trailingAnchor constant:0],
+    ]];
+    
+    textField.stringValue = i.label;
+    
+    return cell;
+}
+
+- (NSTableRowView *) outlineView:(NSOutlineView *) outlineView
+                  rowViewForItem:(id) item {
+    UiSourceListRow *row = [[UiSourceListRow alloc]init];
+    return row;
+}
+
 @end
 
 @implementation UiSourceListItem
@@ -577,3 +633,24 @@
 
 @end
 
+@implementation UiSourceListRow
+
+- (void)layout {
+    [super layout];
+
+    for (NSView *subview in self.subviews) {
+        if ([subview.identifier isEqualToString:NSOutlineViewDisclosureButtonKey] ||
+            [subview.identifier isEqualToString:NSOutlineViewShowHideButtonKey])
+        {
+            NSRect frame = subview.frame;
+            frame.origin.x = self.bounds.size.width - frame.size.width - 16.0;
+            subview.frame = frame;
+        } else if ([subview.identifier isEqualToString:@"cell"]) {
+            NSRect frame = subview.frame;
+            frame.origin.x = 16;
+            subview.frame = frame;
+        }
+    }
+}
+
+@end

mercurial