ui/cocoa/list.m

changeset 715
2082c80fb010
parent 714
3905f542e150
child 716
99386f34efc9
equal deleted inserted replaced
714:3905f542e150 715:2082c80fb010
37 37
38 static void* str_getvalue(UiList *list, void *elm, int row, int col, void *userdata, UiBool *freeResult) { 38 static void* str_getvalue(UiList *list, void *elm, int row, int col, void *userdata, UiBool *freeResult) {
39 return elm; 39 return elm;
40 } 40 }
41 41
42 UIWIDGET ui_listview_create(UiObject* obj, UiListArgs *args) { 42 /* --------------------------- ListView --------------------------- */
43 NSScrollView *scrollview = [[NSScrollView alloc] init]; 43
44 44 /*
45 NSTableView *tableview = [[NSTableView alloc] init]; 45 * adds a NSTableViewDelegate that handles all events and calls
46 tableview.autoresizingMask = NSViewWidthSizable; 46 * callbacks specified in the UiListArgs
47 tableview.headerView = nil; 47 */
48 48 static void add_listdelegate(UiObject *obj, NSTableView *tableview, UiListArgs *args) {
49 if(args->multiselection) {
50 tableview.allowsMultipleSelection = YES;
51 }
52
53 scrollview.documentView = tableview;
54
55 UiLayout layout = UI_INIT_LAYOUT(args);
56 ui_container_add(obj, scrollview, &layout, TRUE);
57
58 ListDelegate *delegate = [[ListDelegate alloc] init:tableview obj:obj]; 49 ListDelegate *delegate = [[ListDelegate alloc] init:tableview obj:obj];
59 delegate.onactivate = args->onactivate; 50 delegate.onactivate = args->onactivate;
60 delegate.onactivatedata = args->onactivatedata; 51 delegate.onactivatedata = args->onactivatedata;
61 delegate.onselection = args->onselection; 52 delegate.onselection = args->onselection;
62 delegate.onselectiondata = args->onselectiondata; 53 delegate.onselectiondata = args->onselectiondata;
63 tableview.delegate = delegate; 54 tableview.delegate = delegate;
64 objc_setAssociatedObject(tableview, "ui_listdelegate", delegate, OBJC_ASSOCIATION_RETAIN); 55 objc_setAssociatedObject(tableview, "ui_listdelegate", delegate, OBJC_ASSOCIATION_RETAIN);
65 tableview.doubleAction = @selector(activateEvent:); 56 tableview.doubleAction = @selector(activateEvent:);
66 tableview.target = delegate; 57 tableview.target = delegate;
58 }
59
60 static void bind_list_to_tableview(UiList *list, NSTableView *tableview) {
61 list->obj = (__bridge void*)tableview;
62 list->update = ui_tableview_update;
63 list->getselection = ui_tableview_getselection;
64 list->setselection = ui_tableview_setselection;
65 }
66
67 UIWIDGET ui_listview_create(UiObject* obj, UiListArgs *args) {
68 NSScrollView *scrollview = [[NSScrollView alloc] init];
69
70 NSTableView *tableview = [[NSTableView alloc] init];
71 tableview.autoresizingMask = NSViewWidthSizable;
72 tableview.headerView = nil;
73
74 if(args->multiselection) {
75 tableview.allowsMultipleSelection = YES;
76 }
77
78 scrollview.documentView = tableview;
79
80 UiLayout layout = UI_INIT_LAYOUT(args);
81 ui_container_add(obj, scrollview, &layout, TRUE);
82
83 add_listdelegate(obj, tableview, args);
67 84
68 UiVar *var = uic_widget_var(obj->ctx, obj->ctx, args->list, args->varname, UI_VAR_LIST); 85 UiVar *var = uic_widget_var(obj->ctx, obj->ctx, args->list, args->varname, UI_VAR_LIST);
69 if(var) { 86 if(var) {
70 UiList *list = var->value; 87 UiList *list = var->value;
71 list->obj = (__bridge void*)tableview; 88 bind_list_to_tableview(list, tableview);
72 list->update = ui_tableview_update;
73 list->getselection = ui_tableview_getselection;
74 list->setselection = ui_tableview_setselection;
75 89
76 ui_getvaluefunc2 getvalue = args->getvalue2; 90 ui_getvaluefunc2 getvalue = args->getvalue2;
77 void *getvaluedata = args->getvalue2data; 91 void *getvaluedata = args->getvalue2data;
78 if(!getvalue) { 92 if(!getvalue) {
79 if(args->getvalue) { 93 if(args->getvalue) {
83 getvalue = str_getvalue; // by default list values are interpreted as strings 97 getvalue = str_getvalue; // by default list values are interpreted as strings
84 } 98 }
85 } 99 }
86 100
87 NSTableColumn *column = [[NSTableColumn alloc] initWithIdentifier:@"column"]; 101 NSTableColumn *column = [[NSTableColumn alloc] initWithIdentifier:@"column"];
88 column.width = 400;
89 [tableview addTableColumn:column]; 102 [tableview addTableColumn:column];
90 103
91 ListDataSource *dataSource = [[ListDataSource alloc] init:tableview.tableColumns var:var getvalue:getvalue getvaluedata:getvaluedata]; 104 ListDataSource *dataSource = [[ListDataSource alloc] init:tableview.tableColumns var:var getvalue:getvalue getvaluedata:getvaluedata];
92 105
93 tableview.dataSource = dataSource; 106 tableview.dataSource = dataSource;
96 objc_setAssociatedObject(tableview, "ui_datasource", dataSource, OBJC_ASSOCIATION_RETAIN); 109 objc_setAssociatedObject(tableview, "ui_datasource", dataSource, OBJC_ASSOCIATION_RETAIN);
97 } 110 }
98 111
99 return (__bridge void*)scrollview; 112 return (__bridge void*)scrollview;
100 } 113 }
114
115 /* --------------------------- TableView --------------------------- */
116
117 UIWIDGET ui_table_create(UiObject* obj, UiListArgs *args) {
118 NSScrollView *scrollview = [[NSScrollView alloc] init];
119
120 NSTableView *tableview = [[NSTableView alloc] init];
121 tableview.autoresizingMask = NSViewWidthSizable;
122
123 if(args->multiselection) {
124 tableview.allowsMultipleSelection = YES;
125 }
126
127 UiLayout layout = UI_INIT_LAYOUT(args);
128 ui_container_add(obj, scrollview, &layout, TRUE);
129
130 add_listdelegate(obj, tableview, args);
131
132 // convert model
133 NSMutableArray<NSTableColumn*> *cols = [[NSMutableArray alloc] init];
134 UiModel *model = args->model;
135 if(model) {
136 for(int i=0;i<model->columns;i++) {
137 char *title = model->titles[i];
138 UiModelType type = model->types[i];
139 int width = model->columnsize[i];
140 NSString *identifier = [[NSString alloc] initWithUTF8String:title];
141 NSTableColumn *column = [[NSTableColumn alloc] initWithIdentifier:identifier];
142 column.title = identifier;
143 if(width > 0) {
144 column.width = width;
145 }
146 if(type >= UI_ICON) {
147 // TODO
148 }
149 [tableview addTableColumn:column];
150 [cols addObject:column];
151 }
152 }
153
154 UiVar *var = uic_widget_var(obj->ctx, obj->ctx, args->list, args->varname, UI_VAR_LIST);
155 if(var) {
156 UiList *list = var->value;
157 bind_list_to_tableview(list, tableview);
158
159 ui_getvaluefunc2 getvalue = args->getvalue2;
160 void *getvaluedata = args->getvalue2data;
161 if(!getvalue) {
162 if(args->getvalue) {
163 getvalue = getvalue_wrapper;
164 getvaluedata = (void*)args->getvalue;
165 } else {
166 fprintf(stderr, "Error: tableview requires getvalue or getvalue2 func\n");
167 return (__bridge void*)scrollview;
168 }
169 }
170
171 ListDataSource *dataSource = [[ListDataSource alloc] init:cols var:var getvalue:getvalue getvaluedata:getvaluedata];
172 if(model) {
173 dataSource.model = ui_model_copy(obj->ctx, model);
174 }
175
176 tableview.dataSource = dataSource;
177 [tableview reloadData];
178
179 objc_setAssociatedObject(tableview, "ui_datasource", dataSource, OBJC_ASSOCIATION_RETAIN);
180 }
181
182 scrollview.documentView = tableview;
183
184 return (__bridge void*)scrollview;
185 }
186
187 /* ------ common functions ------ */
101 188
102 void ui_tableview_update(UiList *list, int i) { 189 void ui_tableview_update(UiList *list, int i) {
103 NSTableView *tableview = (__bridge NSTableView*)list->obj; 190 NSTableView *tableview = (__bridge NSTableView*)list->obj;
104 if(i < 0) { 191 if(i < 0) {
105 [tableview reloadData]; 192 [tableview reloadData];
119 for(int i=0;i<selection.count;i++) { 206 for(int i=0;i<selection.count;i++) {
120 [indexSet addIndex:selection.rows[i]]; 207 [indexSet addIndex:selection.rows[i]];
121 } 208 }
122 [tableview selectRowIndexes:indexSet byExtendingSelection:NO]; 209 [tableview selectRowIndexes:indexSet byExtendingSelection:NO];
123 } 210 }
211
212

mercurial