ui/cocoa/list.m

changeset 717
c35b2f18841c
parent 716
99386f34efc9
child 718
06eec75a6fd5
equal deleted inserted replaced
716:99386f34efc9 717:c35b2f18841c
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 }

mercurial