| 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) { |
| 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]; |