# HG changeset patch # User Olaf Wintermann # Date 1760104441 -7200 # Node ID 13896bdaa151d30ae9713fadef7825597158d268 # Parent 0980245646b48f7a8f856d7251ddc68d71df1488 add sourcelist event selection handler (Cocoa) diff -r 0980245646b4 -r 13896bdaa151 ui/cocoa/list.h --- a/ui/cocoa/list.h Fri Oct 10 15:30:56 2025 +0200 +++ b/ui/cocoa/list.h Fri Oct 10 15:54:01 2025 +0200 @@ -60,6 +60,7 @@ @interface UiSourceListItem : NSObject @property (weak) UiSourceList *sourcelist; +@property (weak) UiSourceListItem *parent; @property (strong) NSString *label; @property (strong) NSString *badge; @@ -67,10 +68,12 @@ @property UiVar *var; @property UiSubList *sublist; +@property int index; + /* * Initialize a section item */ -- (id)init:(UiSubListItem*)item; +- (id)init:(UiSubListItem*)item parent:(UiSourceListItem*)parent; /* * Initialize a child item */ @@ -84,6 +87,7 @@ @interface UiSourceList : NSObject @property UiObject *obj; +@property (weak) NSOutlineView *outlineView; @property CxList *sublists; @property UiVar *dynamic_sublists; @property ui_sublist_getvalue_func getvalue; @@ -95,7 +99,7 @@ @property (strong) NSMutableArray *sections; -- (id)init:(UiObject*)obj; +- (id)init:(UiObject*)obj outline:(NSOutlineView*)view; - (void)update:(int)row; diff -r 0980245646b4 -r 13896bdaa151 ui/cocoa/list.m --- a/ui/cocoa/list.m Fri Oct 10 15:30:56 2025 +0200 +++ b/ui/cocoa/list.m Fri Oct 10 15:54:01 2025 +0200 @@ -438,7 +438,7 @@ ui_container_add(obj, scrollview, &layout); // datasource and delegate - UiSourceList *data = [[UiSourceList alloc] init:obj]; + UiSourceList *data = [[UiSourceList alloc] init:obj outline:outline]; data.sublists = copy_sublists(obj->ctx->allocator, args); UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->dynamic_sublist, args->varname, UI_VAR_LIST); if(var) { @@ -471,8 +471,9 @@ @implementation UiSourceList -- (id)init:(UiObject*)obj { +- (id)init:(UiObject*)obj outline:(NSOutlineView*)view { _obj = obj; + _outlineView = view; _sections = [[NSMutableArray alloc] initWithCapacity:16]; return self; } @@ -487,11 +488,16 @@ [_sections removeAllObjects]; CxIterator i = cxListIterator(_sublists); + int index = 0; cx_foreach(UiSubList *, sl, i) { UiSourceListItem *section = [[UiSourceListItem alloc] init:self sublist:sl]; + section.index = index; [section update:-1]; [_sections addObject:section]; + index++; } + + [_outlineView reloadData]; } // NSOutlineViewDataSource implementation @@ -529,7 +535,8 @@ - (void)outlineView:(NSOutlineView *)outlineView setObjectValue:(id)object forTableColumn:(NSTableColumn *)tableColumn - byItem:(id)item { + byItem:(id)item +{ } @@ -537,7 +544,8 @@ - (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn - item:(id)item { + item:(id)item +{ UiSourceListItem *i = item; NSTableCellView *cell = [[NSTableCellView alloc] init]; @@ -545,8 +553,8 @@ // Icon NSImageView *iconView = [[NSImageView alloc] initWithFrame:NSZeroRect]; iconView.translatesAutoresizingMaskIntoConstraints = NO; - //[cell addSubview:iconView]; - //cell.imageView = iconView; + [cell addSubview:iconView]; + cell.imageView = iconView; // Label NSTextField *textField = [NSTextField labelWithString:@""]; @@ -556,10 +564,8 @@ // Layout constraints [NSLayoutConstraint activateConstraints:@[ - //[iconView.leadingAnchor constraintEqualToAnchor:cell.leadingAnchor constant:0], - //[iconView.centerYAnchor constraintEqualToAnchor:cell.centerYAnchor], - //[iconView.widthAnchor constraintEqualToConstant:0], - //[iconView.heightAnchor constraintEqualToConstant:0], + [iconView.leadingAnchor constraintEqualToAnchor:cell.leadingAnchor constant:0], + [iconView.centerYAnchor constraintEqualToAnchor:cell.centerYAnchor], [textField.leadingAnchor constraintEqualToAnchor:cell.leadingAnchor constant:0], [textField.centerYAnchor constraintEqualToAnchor:cell.centerYAnchor], @@ -577,6 +583,44 @@ return row; } +- (BOOL) outlineView:(NSOutlineView *) outlineView + shouldSelectItem:(id)item +{ + UiSourceListItem *i = item; + return [i isSection] ? NO : YES; +} + +- (void) outlineViewSelectionDidChange:(NSNotification *) notification { + UiEvent event; + event.obj = _obj; + event.window = event.obj->window; + event.document = event.obj->ctx->document; + event.eventdata = NULL; // TODO + event.eventdatatype = 0; // TODO + event.intval = 0; + event.set = ui_get_setop(); + + UiSubListEventData sublistEvent; + + NSInteger selectedRow = _outlineView.selectedRow; + if(selectedRow >= 0) { + UiSourceListItem *item = [_outlineView itemAtRow:selectedRow]; + UiSourceListItem *parent = item.parent; + UiVar *var = parent != nil ? parent.var : item.var; + if(item && var) { + sublistEvent.list = var->value; + sublistEvent.sublist_index = parent.index; + // TODO + + event.eventdata = &sublistEvent; + } + } + + if(_onactivate) { + _onactivate(&event, _onactivatedata); + } +} + @end @implementation UiSourceListItem @@ -597,7 +641,8 @@ return self; } -- (id)init:(UiSubListItem*)item { +- (id)init:(UiSubListItem*)item parent:(UiSourceListItem*)parent { + _parent = parent; if(item->label) { _label = [[NSString alloc]initWithUTF8String:item->label]; } @@ -624,7 +669,7 @@ item.label = strdup(elm); } - [_items addObject:[[UiSourceListItem alloc] init:&item]]; + [_items addObject:[[UiSourceListItem alloc] init:&item parent:self]]; elm = list->next(list); index++;