| 436 |
436 |
| 437 UiLayout layout = UI_ARGS2LAYOUT(args); |
437 UiLayout layout = UI_ARGS2LAYOUT(args); |
| 438 ui_container_add(obj, scrollview, &layout); |
438 ui_container_add(obj, scrollview, &layout); |
| 439 |
439 |
| 440 // datasource and delegate |
440 // datasource and delegate |
| 441 UiSourceList *data = [[UiSourceList alloc] init:obj]; |
441 UiSourceList *data = [[UiSourceList alloc] init:obj outline:outline]; |
| 442 data.sublists = copy_sublists(obj->ctx->allocator, args); |
442 data.sublists = copy_sublists(obj->ctx->allocator, args); |
| 443 UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->dynamic_sublist, args->varname, UI_VAR_LIST); |
443 UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->dynamic_sublist, args->varname, UI_VAR_LIST); |
| 444 if(var) { |
444 if(var) { |
| 445 UiList *list = var->value; |
445 UiList *list = var->value; |
| 446 list->obj = (__bridge void*)data; |
446 list->obj = (__bridge void*)data; |
| 485 // TODO: check row |
486 // TODO: check row |
| 486 |
487 |
| 487 [_sections removeAllObjects]; |
488 [_sections removeAllObjects]; |
| 488 |
489 |
| 489 CxIterator i = cxListIterator(_sublists); |
490 CxIterator i = cxListIterator(_sublists); |
| |
491 int index = 0; |
| 490 cx_foreach(UiSubList *, sl, i) { |
492 cx_foreach(UiSubList *, sl, i) { |
| 491 UiSourceListItem *section = [[UiSourceListItem alloc] init:self sublist:sl]; |
493 UiSourceListItem *section = [[UiSourceListItem alloc] init:self sublist:sl]; |
| |
494 section.index = index; |
| 492 [section update:-1]; |
495 [section update:-1]; |
| 493 [_sections addObject:section]; |
496 [_sections addObject:section]; |
| 494 } |
497 index++; |
| |
498 } |
| |
499 |
| |
500 [_outlineView reloadData]; |
| 495 } |
501 } |
| 496 |
502 |
| 497 // NSOutlineViewDataSource implementation |
503 // NSOutlineViewDataSource implementation |
| 498 |
504 |
| 499 - (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item { |
505 - (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item { |
| 527 } |
533 } |
| 528 |
534 |
| 529 - (void)outlineView:(NSOutlineView *)outlineView |
535 - (void)outlineView:(NSOutlineView *)outlineView |
| 530 setObjectValue:(id)object |
536 setObjectValue:(id)object |
| 531 forTableColumn:(NSTableColumn *)tableColumn |
537 forTableColumn:(NSTableColumn *)tableColumn |
| 532 byItem:(id)item { |
538 byItem:(id)item |
| |
539 { |
| 533 |
540 |
| 534 } |
541 } |
| 535 |
542 |
| 536 // NSOutlineViewDelegate implementation |
543 // NSOutlineViewDelegate implementation |
| 537 |
544 |
| 538 - (NSView *)outlineView:(NSOutlineView *)outlineView |
545 - (NSView *)outlineView:(NSOutlineView *)outlineView |
| 539 viewForTableColumn:(NSTableColumn *)tableColumn |
546 viewForTableColumn:(NSTableColumn *)tableColumn |
| 540 item:(id)item { |
547 item:(id)item |
| |
548 { |
| 541 UiSourceListItem *i = item; |
549 UiSourceListItem *i = item; |
| 542 |
550 |
| 543 NSTableCellView *cell = [[NSTableCellView alloc] init]; |
551 NSTableCellView *cell = [[NSTableCellView alloc] init]; |
| 544 cell.identifier = @"cell"; |
552 cell.identifier = @"cell"; |
| 545 // Icon |
553 // Icon |
| 546 NSImageView *iconView = [[NSImageView alloc] initWithFrame:NSZeroRect]; |
554 NSImageView *iconView = [[NSImageView alloc] initWithFrame:NSZeroRect]; |
| 547 iconView.translatesAutoresizingMaskIntoConstraints = NO; |
555 iconView.translatesAutoresizingMaskIntoConstraints = NO; |
| 548 //[cell addSubview:iconView]; |
556 [cell addSubview:iconView]; |
| 549 //cell.imageView = iconView; |
557 cell.imageView = iconView; |
| 550 |
558 |
| 551 // Label |
559 // Label |
| 552 NSTextField *textField = [NSTextField labelWithString:@""]; |
560 NSTextField *textField = [NSTextField labelWithString:@""]; |
| 553 textField.translatesAutoresizingMaskIntoConstraints = NO; |
561 textField.translatesAutoresizingMaskIntoConstraints = NO; |
| 554 [cell addSubview:textField]; |
562 [cell addSubview:textField]; |
| 555 cell.textField = textField; |
563 cell.textField = textField; |
| 556 |
564 |
| 557 // Layout constraints |
565 // Layout constraints |
| 558 [NSLayoutConstraint activateConstraints:@[ |
566 [NSLayoutConstraint activateConstraints:@[ |
| 559 //[iconView.leadingAnchor constraintEqualToAnchor:cell.leadingAnchor constant:0], |
567 [iconView.leadingAnchor constraintEqualToAnchor:cell.leadingAnchor constant:0], |
| 560 //[iconView.centerYAnchor constraintEqualToAnchor:cell.centerYAnchor], |
568 [iconView.centerYAnchor constraintEqualToAnchor:cell.centerYAnchor], |
| 561 //[iconView.widthAnchor constraintEqualToConstant:0], |
|
| 562 //[iconView.heightAnchor constraintEqualToConstant:0], |
|
| 563 |
569 |
| 564 [textField.leadingAnchor constraintEqualToAnchor:cell.leadingAnchor constant:0], |
570 [textField.leadingAnchor constraintEqualToAnchor:cell.leadingAnchor constant:0], |
| 565 [textField.centerYAnchor constraintEqualToAnchor:cell.centerYAnchor], |
571 [textField.centerYAnchor constraintEqualToAnchor:cell.centerYAnchor], |
| 566 [textField.trailingAnchor constraintEqualToAnchor:cell.trailingAnchor constant:0], |
572 [textField.trailingAnchor constraintEqualToAnchor:cell.trailingAnchor constant:0], |
| 567 ]]; |
573 ]]; |
| 573 |
579 |
| 574 - (NSTableRowView *) outlineView:(NSOutlineView *) outlineView |
580 - (NSTableRowView *) outlineView:(NSOutlineView *) outlineView |
| 575 rowViewForItem:(id) item { |
581 rowViewForItem:(id) item { |
| 576 UiSourceListRow *row = [[UiSourceListRow alloc]init]; |
582 UiSourceListRow *row = [[UiSourceListRow alloc]init]; |
| 577 return row; |
583 return row; |
| |
584 } |
| |
585 |
| |
586 - (BOOL) outlineView:(NSOutlineView *) outlineView |
| |
587 shouldSelectItem:(id)item |
| |
588 { |
| |
589 UiSourceListItem *i = item; |
| |
590 return [i isSection] ? NO : YES; |
| |
591 } |
| |
592 |
| |
593 - (void) outlineViewSelectionDidChange:(NSNotification *) notification { |
| |
594 UiEvent event; |
| |
595 event.obj = _obj; |
| |
596 event.window = event.obj->window; |
| |
597 event.document = event.obj->ctx->document; |
| |
598 event.eventdata = NULL; // TODO |
| |
599 event.eventdatatype = 0; // TODO |
| |
600 event.intval = 0; |
| |
601 event.set = ui_get_setop(); |
| |
602 |
| |
603 UiSubListEventData sublistEvent; |
| |
604 |
| |
605 NSInteger selectedRow = _outlineView.selectedRow; |
| |
606 if(selectedRow >= 0) { |
| |
607 UiSourceListItem *item = [_outlineView itemAtRow:selectedRow]; |
| |
608 UiSourceListItem *parent = item.parent; |
| |
609 UiVar *var = parent != nil ? parent.var : item.var; |
| |
610 if(item && var) { |
| |
611 sublistEvent.list = var->value; |
| |
612 sublistEvent.sublist_index = parent.index; |
| |
613 // TODO |
| |
614 |
| |
615 event.eventdata = &sublistEvent; |
| |
616 } |
| |
617 } |
| |
618 |
| |
619 if(_onactivate) { |
| |
620 _onactivate(&event, _onactivatedata); |
| |
621 } |
| 578 } |
622 } |
| 579 |
623 |
| 580 @end |
624 @end |
| 581 |
625 |
| 582 @implementation UiSourceListItem |
626 @implementation UiSourceListItem |
| 622 _sourcelist.getvalue(list, _sublist->userdata, elm, index, &item, _sourcelist.getvaluedata); |
667 _sourcelist.getvalue(list, _sublist->userdata, elm, index, &item, _sourcelist.getvaluedata); |
| 623 } else { |
668 } else { |
| 624 item.label = strdup(elm); |
669 item.label = strdup(elm); |
| 625 } |
670 } |
| 626 |
671 |
| 627 [_items addObject:[[UiSourceListItem alloc] init:&item]]; |
672 [_items addObject:[[UiSourceListItem alloc] init:&item parent:self]]; |
| 628 |
673 |
| 629 elm = list->next(list); |
674 elm = list->next(list); |
| 630 index++; |
675 index++; |
| 631 } |
676 } |
| 632 } |
677 } |