| 212 } |
212 } |
| 213 [tableview selectRowIndexes:indexSet byExtendingSelection:NO]; |
213 [tableview selectRowIndexes:indexSet byExtendingSelection:NO]; |
| 214 } |
214 } |
| 215 |
215 |
| 216 |
216 |
| |
217 /* --------------------------- DropDown --------------------------- */ |
| |
218 |
| |
219 @implementation UiDropDown |
| |
220 |
| |
221 - (id)init:(UiObject*)obj { |
| |
222 _obj = obj; |
| |
223 return self; |
| |
224 } |
| |
225 |
| |
226 - (void) comboBoxSelectionDidChange:(NSNotification *) notification { |
| |
227 int index = (int)_combobox.indexOfSelectedItem; |
| |
228 |
| |
229 void *eventdata = NULL; |
| |
230 if(_var) { |
| |
231 UiList *list = _var->value; |
| |
232 if(index >= 0) { |
| |
233 eventdata = list->get(list, index); |
| |
234 } |
| |
235 } else { |
| |
236 NSString *str = _combobox.objectValueOfSelectedItem; |
| |
237 if(str) { |
| |
238 eventdata = (void*)str.UTF8String; |
| |
239 } |
| |
240 } |
| |
241 |
| |
242 UiEvent event; |
| |
243 event.obj = _obj; |
| |
244 event.window = event.obj->window; |
| |
245 event.document = event.obj->ctx->document; |
| |
246 event.eventdata = eventdata; |
| |
247 event.eventdatatype = UI_EVENT_DATA_LIST_ELM; |
| |
248 event.intval = index; |
| |
249 |
| |
250 if(_onselection) { |
| |
251 _onselection(&event, _onselectiondata); |
| |
252 } |
| |
253 |
| |
254 if(_onactivate) { |
| |
255 _onactivate(&event, _onactivatedata); |
| |
256 } |
| |
257 } |
| |
258 |
| |
259 @end |
| |
260 |
| |
261 UIWIDGET ui_combobox_create(UiObject* obj, UiListArgs *args) { |
| |
262 NSComboBox *dropdown = [[NSComboBox alloc] init]; |
| |
263 dropdown.editable = NO; |
| |
264 |
| |
265 UiDropDown *uidropdown = [[UiDropDown alloc] init:obj]; |
| |
266 objc_setAssociatedObject(dropdown, "ui_dropdown", uidropdown, OBJC_ASSOCIATION_RETAIN); |
| |
267 uidropdown.onactivate = args->onactivate; |
| |
268 uidropdown.onactivatedata = args->onactivatedata; |
| |
269 uidropdown.onselection = args->onselection; |
| |
270 uidropdown.onselectiondata = args->onselectiondata; |
| |
271 uidropdown.combobox = dropdown; |
| |
272 |
| |
273 if(!args->getvalue2) { |
| |
274 if(args->getvalue) { |
| |
275 args->getvalue2 = getvalue_wrapper; |
| |
276 args->getvalue2data = (void*)args->getvalue; |
| |
277 } else { |
| |
278 args->getvalue2 = str_getvalue; |
| |
279 } |
| |
280 } |
| |
281 uidropdown.getvalue = args->getvalue2; |
| |
282 uidropdown.getvaluedata = args->getvalue2data; |
| |
283 |
| |
284 UiLayout layout = UI_INIT_LAYOUT(args); |
| |
285 ui_container_add(obj, dropdown, &layout, FALSE); |
| |
286 |
| |
287 UiVar *var = uic_widget_var(obj->ctx, obj->ctx, args->list, args->varname, UI_VAR_LIST); |
| |
288 if(var) { |
| |
289 UiList *list = var->value; |
| |
290 list->obj = (__bridge void*)dropdown; |
| |
291 list->update = ui_dropdown_update; |
| |
292 list->getselection = ui_dropdown_getselection; |
| |
293 list->setselection = ui_dropdown_setselection; |
| |
294 ui_dropdown_update(list, -1); |
| |
295 } else { |
| |
296 for(int i=0;i<args->static_nelm;i++) { |
| |
297 char *str = args->static_elements[i]; |
| |
298 NSString *item = [[NSString alloc] initWithUTF8String:str]; |
| |
299 [dropdown addItemWithObjectValue:item]; |
| |
300 } |
| |
301 } |
| |
302 |
| |
303 uidropdown.var = var; |
| |
304 |
| |
305 return (__bridge void*)dropdown; |
| |
306 } |
| |
307 |
| |
308 void ui_dropdown_update(UiList *list, int i) { |
| |
309 NSComboBox *combobox = (__bridge NSComboBox*)list->obj; |
| |
310 UiDropDown *dropdown = objc_getAssociatedObject(combobox, "ui_dropdown"); |
| |
311 if(dropdown) { |
| |
312 [combobox removeAllItems]; |
| |
313 |
| |
314 ui_getvaluefunc2 getvalue = dropdown.getvalue; |
| |
315 void *getvaluedata = dropdown.getvaluedata; |
| |
316 |
| |
317 int index = 0; |
| |
318 void *elm = list->first(list); |
| |
319 while(elm) { |
| |
320 UiBool freeResult = FALSE; |
| |
321 char *str = getvalue(list, elm, index, 0, getvaluedata, &freeResult); |
| |
322 if(str) { |
| |
323 NSString *item = [[NSString alloc] initWithUTF8String:str]; |
| |
324 [combobox addItemWithObjectValue:item]; |
| |
325 } |
| |
326 if(freeResult) { |
| |
327 free(str); |
| |
328 } |
| |
329 elm = list->next(list); |
| |
330 index++; |
| |
331 } |
| |
332 } else { |
| |
333 fprintf(stderr, "Error: obj is not a dropdown\n"); |
| |
334 } |
| |
335 } |
| |
336 |
| |
337 UiListSelection ui_dropdown_getselection(UiList *list) { |
| |
338 UiListSelection sel = { 0, NULL }; |
| |
339 NSComboBox *combobox = (__bridge NSComboBox*)list->obj; |
| |
340 NSInteger index = combobox.indexOfSelectedItem; |
| |
341 if(index >= 0) { |
| |
342 sel.rows = malloc(sizeof(int)); |
| |
343 sel.count = 1; |
| |
344 sel.rows[0] = (int)index; |
| |
345 } |
| |
346 return sel; |
| |
347 } |
| |
348 |
| |
349 void ui_dropdown_setselection(UiList *list, UiListSelection selection) { |
| |
350 NSComboBox *combobox = (__bridge NSComboBox*)list->obj; |
| |
351 if(selection.count > 0) { |
| |
352 [combobox selectItemAtIndex:selection.rows[0]]; |
| |
353 } else { |
| |
354 [combobox selectItemAtIndex: -1]; |
| |
355 } |
| |
356 } |