Fri, 10 Oct 2025 15:30:56 +0200
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