| 118 ct->container.add = ui_box_container_add; |
118 ct->container.add = ui_box_container_add; |
| 119 ct->type = type; |
119 ct->type = type; |
| 120 return (UiContainer*)ct; |
120 return (UiContainer*)ct; |
| 121 } |
121 } |
| 122 |
122 |
| 123 void ui_box_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill) { |
123 void ui_box_container_add(UiContainer *ct, GtkWidget *widget) { |
| 124 UiBoxContainer *bc = (UiBoxContainer*)ct; |
124 UiBoxContainer *bc = (UiBoxContainer*)ct; |
| 125 if(ct->layout.fill != UI_LAYOUT_UNDEFINED) { |
125 UiBool fill = ct->layout.fill; |
| 126 fill = ui_lb2bool(ct->layout.fill); |
|
| 127 } |
|
| 128 |
|
| 129 if(bc->has_fill && fill) { |
126 if(bc->has_fill && fill) { |
| 130 fprintf(stderr, "UiError: container has 2 filled widgets"); |
127 fprintf(stderr, "UiError: container has 2 filled widgets"); |
| 131 fill = FALSE; |
128 fill = FALSE; |
| 132 } |
129 } |
| 133 if(fill) { |
130 if(fill) { |
| 178 UI_GTK_V2(ct->height = 1); |
175 UI_GTK_V2(ct->height = 1); |
| 179 return (UiContainer*)ct; |
176 return (UiContainer*)ct; |
| 180 } |
177 } |
| 181 |
178 |
| 182 #if GTK_MAJOR_VERSION >= 3 |
179 #if GTK_MAJOR_VERSION >= 3 |
| 183 void ui_grid_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill) { |
180 void ui_grid_container_add(UiContainer *ct, GtkWidget *widget) { |
| 184 UiGridContainer *grid = (UiGridContainer*)ct; |
181 UiGridContainer *grid = (UiGridContainer*)ct; |
| 185 |
182 |
| 186 if(ct->layout.newline) { |
183 if(ct->layout.newline) { |
| 187 grid->x = 0; |
184 grid->x = 0; |
| 188 grid->y++; |
185 grid->y++; |
| 247 ui_reset_layout(ct->layout); |
242 ui_reset_layout(ct->layout); |
| 248 ct->current = widget; |
243 ct->current = widget; |
| 249 } |
244 } |
| 250 #endif |
245 #endif |
| 251 #ifdef UI_GTK2 |
246 #ifdef UI_GTK2 |
| 252 void ui_grid_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill) { |
247 void ui_grid_container_add(UiContainer *ct, GtkWidget *widget) { |
| 253 UiGridContainer *grid = (UiGridContainer*)ct; |
248 UiGridContainer *grid = (UiGridContainer*)ct; |
| 254 |
249 |
| 255 if(ct->layout.newline) { |
250 if(ct->layout.newline) { |
| 256 grid->x = 0; |
251 grid->x = 0; |
| 257 grid->y++; |
252 grid->y++; |
| 338 ct->widget = frame; |
331 ct->widget = frame; |
| 339 ct->add = ui_frame_container_add; |
332 ct->add = ui_frame_container_add; |
| 340 return ct; |
333 return ct; |
| 341 } |
334 } |
| 342 |
335 |
| 343 void ui_frame_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill) { |
336 void ui_frame_container_add(UiContainer *ct, GtkWidget *widget) { |
| 344 FRAME_SET_CHILD(ct->widget, widget); |
337 FRAME_SET_CHILD(ct->widget, widget); |
| 345 } |
338 } |
| 346 |
339 |
| 347 UiContainer* ui_expander_container(UiObject *obj, GtkWidget *expander) { |
340 UiContainer* ui_expander_container(UiObject *obj, GtkWidget *expander) { |
| 348 UiContainer *ct = cxCalloc( |
341 UiContainer *ct = cxCalloc( |
| 352 ct->widget = expander; |
345 ct->widget = expander; |
| 353 ct->add = ui_expander_container_add; |
346 ct->add = ui_expander_container_add; |
| 354 return ct; |
347 return ct; |
| 355 } |
348 } |
| 356 |
349 |
| 357 void ui_expander_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill) { |
350 void ui_expander_container_add(UiContainer *ct, GtkWidget *widget) { |
| 358 EXPANDER_SET_CHILD(ct->widget, widget); |
351 EXPANDER_SET_CHILD(ct->widget, widget); |
| 359 } |
352 } |
| 360 |
353 |
| 361 void ui_scrolledwindow_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill) { |
354 void ui_scrolledwindow_container_add(UiContainer *ct, GtkWidget *widget) { |
| 362 // TODO: check if the widget implements GtkScrollable |
355 // TODO: check if the widget implements GtkScrollable |
| 363 SCROLLEDWINDOW_SET_CHILD(ct->widget, widget); |
356 SCROLLEDWINDOW_SET_CHILD(ct->widget, widget); |
| 364 ui_reset_layout(ct->layout); |
357 ui_reset_layout(ct->layout); |
| 365 ct->current = widget; |
358 ct->current = widget; |
| 366 } |
359 } |
| 383 ct->container.widget = tabview; |
376 ct->container.widget = tabview; |
| 384 ct->container.add = ui_tabview_container_add; |
377 ct->container.add = ui_tabview_container_add; |
| 385 return (UiContainer*)ct; |
378 return (UiContainer*)ct; |
| 386 } |
379 } |
| 387 |
380 |
| 388 void ui_tabview_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill) { |
381 void ui_tabview_container_add(UiContainer *ct, GtkWidget *widget) { |
| 389 UiGtkTabView *data = ui_widget_get_tabview_data(ct->widget); |
382 UiGtkTabView *data = ui_widget_get_tabview_data(ct->widget); |
| 390 if(!data) { |
383 if(!data) { |
| 391 fprintf(stderr, "UI Error: widget is not a tabview"); |
384 fprintf(stderr, "UI Error: widget is not a tabview"); |
| 392 return; |
385 return; |
| 393 } |
386 } |
| 426 UI_APPLY_LAYOUT2(current, args); |
419 UI_APPLY_LAYOUT2(current, args); |
| 427 |
420 |
| 428 GtkWidget *box = type == UI_CONTAINER_VBOX ? ui_gtk_vbox_new(args->spacing) : ui_gtk_hbox_new(args->spacing); |
421 GtkWidget *box = type == UI_CONTAINER_VBOX ? ui_gtk_vbox_new(args->spacing) : ui_gtk_hbox_new(args->spacing); |
| 429 ui_set_name_and_style(box, args->name, args->style_class); |
422 ui_set_name_and_style(box, args->name, args->style_class); |
| 430 GtkWidget *widget = args->margin > 0 ? ui_box_set_margin(box, args->margin) : box; |
423 GtkWidget *widget = args->margin > 0 ? ui_box_set_margin(box, args->margin) : box; |
| 431 ct->add(ct, widget, TRUE); |
424 ct->add(ct, widget); |
| 432 |
425 |
| 433 UiObject *newobj = uic_object_new(obj, box); |
426 UiObject *newobj = uic_object_new(obj, box); |
| 434 newobj->container = ui_box_container(obj, box, type); |
427 newobj->container = ui_box_container(obj, box, type); |
| 435 uic_obj_add(obj, newobj); |
428 uic_obj_add(obj, newobj); |
| 436 |
429 |
| 464 GtkWidget *widget; |
457 GtkWidget *widget; |
| 465 |
458 |
| 466 GtkWidget *grid = ui_create_grid_widget(args->columnspacing, args->rowspacing); |
459 GtkWidget *grid = ui_create_grid_widget(args->columnspacing, args->rowspacing); |
| 467 ui_set_name_and_style(grid, args->name, args->style_class); |
460 ui_set_name_and_style(grid, args->name, args->style_class); |
| 468 widget = ui_box_set_margin(grid, args->margin); |
461 widget = ui_box_set_margin(grid, args->margin); |
| 469 current->container->add(current->container, widget, TRUE); |
462 current->container->add(current->container, widget); |
| 470 |
463 |
| 471 UiObject *newobj = uic_object_new(obj, grid); |
464 UiObject *newobj = uic_object_new(obj, grid); |
| 472 newobj->container = ui_grid_container(obj, grid, args->def_hexpand, args->def_vexpand, args->def_hfill, args->def_vfill); |
465 newobj->container = ui_grid_container(obj, grid, args->def_hexpand, args->def_vexpand, args->def_hfill, args->def_vfill); |
| 473 uic_obj_add(obj, newobj); |
466 uic_obj_add(obj, newobj); |
| 474 |
467 |
| 486 FRAME_SET_CHILD(frame, sub); |
479 FRAME_SET_CHILD(frame, sub); |
| 487 } else { |
480 } else { |
| 488 newobj->widget = frame; |
481 newobj->widget = frame; |
| 489 newobj->container = ui_frame_container(obj, frame); |
482 newobj->container = ui_frame_container(obj, frame); |
| 490 } |
483 } |
| 491 current->container->add(current->container, frame, FALSE); |
484 current->container->add(current->container, frame); |
| 492 uic_obj_add(obj, newobj); |
485 uic_obj_add(obj, newobj); |
| 493 |
486 |
| 494 return frame; |
487 return frame; |
| 495 } |
488 } |
| 496 |
489 |
| 506 EXPANDER_SET_CHILD(expander, sub); |
499 EXPANDER_SET_CHILD(expander, sub); |
| 507 } else { |
500 } else { |
| 508 newobj->widget = expander; |
501 newobj->widget = expander; |
| 509 newobj->container = ui_expander_container(obj, expander); |
502 newobj->container = ui_expander_container(obj, expander); |
| 510 } |
503 } |
| 511 current->container->add(current->container, expander, FALSE); |
504 current->container->add(current->container, expander); |
| 512 uic_obj_add(obj, newobj); |
505 uic_obj_add(obj, newobj); |
| 513 |
506 |
| 514 return expander; |
507 return expander; |
| 515 } |
508 } |
| 516 |
509 |
| 520 UI_APPLY_LAYOUT2(current, args); |
513 UI_APPLY_LAYOUT2(current, args); |
| 521 |
514 |
| 522 GtkWidget *sw = SCROLLEDWINDOW_NEW(); |
515 GtkWidget *sw = SCROLLEDWINDOW_NEW(); |
| 523 ui_set_name_and_style(sw, args->name, args->style_class); |
516 ui_set_name_and_style(sw, args->name, args->style_class); |
| 524 GtkWidget *widget = ui_box_set_margin(sw, args->margin); |
517 GtkWidget *widget = ui_box_set_margin(sw, args->margin); |
| 525 current->container->add(current->container, widget, TRUE); |
518 current->container->add(current->container, widget); |
| 526 |
519 |
| 527 UiObject *newobj = uic_object_new(obj, sw); |
520 UiObject *newobj = uic_object_new(obj, sw); |
| 528 GtkWidget *sub = ui_subcontainer_create(args->subcontainer, newobj, args->spacing, args->columnspacing, args->rowspacing, args->margin); |
521 GtkWidget *sub = ui_subcontainer_create(args->subcontainer, newobj, args->spacing, args->columnspacing, args->rowspacing, args->margin); |
| 529 if(sub) { |
522 if(sub) { |
| 530 SCROLLEDWINDOW_SET_CHILD(sw, sub); |
523 SCROLLEDWINDOW_SET_CHILD(sw, sub); |
| 815 g_object_set_data(G_OBJECT(widget), "ui_tabview", data); |
808 g_object_set_data(G_OBJECT(widget), "ui_tabview", data); |
| 816 data->widget = data_widget; |
809 data->widget = data_widget; |
| 817 data->subcontainer = args->subcontainer; |
810 data->subcontainer = args->subcontainer; |
| 818 |
811 |
| 819 UI_APPLY_LAYOUT2(current, args); |
812 UI_APPLY_LAYOUT2(current, args); |
| 820 current->container->add(current->container, widget, TRUE); |
813 current->container->add(current->container, widget); |
| 821 |
814 |
| 822 UiObject *newobj = uic_object_new(obj, widget); |
815 UiObject *newobj = uic_object_new(obj, widget); |
| 823 newobj->container = ui_tabview_container(obj, widget); |
816 newobj->container = ui_tabview_container(obj, widget); |
| 824 uic_obj_add(obj, newobj); |
817 uic_obj_add(obj, newobj); |
| 825 data->obj = newobj; |
818 data->obj = newobj; |
| 932 UiContainer *ct = current->container; |
925 UiContainer *ct = current->container; |
| 933 UI_APPLY_LAYOUT2(current, args); |
926 UI_APPLY_LAYOUT2(current, args); |
| 934 |
927 |
| 935 GtkWidget *box = ui_gtk_hbox_new(args->alt_spacing); |
928 GtkWidget *box = ui_gtk_hbox_new(args->alt_spacing); |
| 936 ui_set_name_and_style(box, args->name, args->style_class); |
929 ui_set_name_and_style(box, args->name, args->style_class); |
| 937 ct->add(ct, box, FALSE); |
930 ct->add(ct, box); |
| 938 |
931 |
| 939 UiObject *newobj = uic_object_new(obj, box); |
932 UiObject *newobj = uic_object_new(obj, box); |
| 940 newobj->container = ui_headerbar_fallback_container(obj, box); |
933 newobj->container = ui_headerbar_fallback_container(obj, box); |
| 941 uic_obj_add(obj, newobj); |
934 uic_obj_add(obj, newobj); |
| 942 |
935 |
| 963 ct->container.widget = headerbar; |
956 ct->container.widget = headerbar; |
| 964 ct->container.add = ui_headerbar_fallback_container_add; |
957 ct->container.add = ui_headerbar_fallback_container_add; |
| 965 return (UiContainer*)ct; |
958 return (UiContainer*)ct; |
| 966 } |
959 } |
| 967 |
960 |
| 968 void ui_headerbar_fallback_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill) { |
961 void ui_headerbar_fallback_container_add(UiContainer *ct, GtkWidget *widget) { |
| 969 UiHeaderbarContainer *hb = (UiHeaderbarContainer*)ct; |
962 UiHeaderbarContainer *hb = (UiHeaderbarContainer*)ct; |
| 970 BOX_ADD(ct->widget, widget); |
963 BOX_ADD(ct->widget, widget); |
| 971 } |
964 } |
| 972 |
965 |
| 973 #if GTK_CHECK_VERSION(3, 10, 0) |
966 #if GTK_CHECK_VERSION(3, 10, 0) |
| 993 ct->container.widget = headerbar; |
986 ct->container.widget = headerbar; |
| 994 ct->container.add = ui_headerbar_container_add; |
987 ct->container.add = ui_headerbar_container_add; |
| 995 return (UiContainer*)ct; |
988 return (UiContainer*)ct; |
| 996 } |
989 } |
| 997 |
990 |
| 998 void ui_headerbar_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill) { |
991 void ui_headerbar_container_add(UiContainer *ct, GtkWidget *widget) { |
| 999 UiHeaderbarContainer *hb = (UiHeaderbarContainer*)ct; |
992 UiHeaderbarContainer *hb = (UiHeaderbarContainer*)ct; |
| 1000 if(hb->part == 0) { |
993 if(hb->part == 0) { |
| 1001 UI_HEADERBAR_PACK_START(ct->widget, widget); |
994 UI_HEADERBAR_PACK_START(ct->widget, widget); |
| 1002 } else if(hb->part == 1) { |
995 } else if(hb->part == 1) { |
| 1003 UI_HEADERBAR_PACK_END(ct->widget, widget); |
996 UI_HEADERBAR_PACK_END(ct->widget, widget); |
| 1078 UiObject* current = uic_current_obj(obj); |
1071 UiObject* current = uic_current_obj(obj); |
| 1079 |
1072 |
| 1080 GtkWidget *pane0 = create_paned(orientation); |
1073 GtkWidget *pane0 = create_paned(orientation); |
| 1081 |
1074 |
| 1082 UI_APPLY_LAYOUT2(current, args); |
1075 UI_APPLY_LAYOUT2(current, args); |
| 1083 current->container->add(current->container, pane0, TRUE); |
1076 current->container->add(current->container, pane0); |
| 1084 |
1077 |
| 1085 int max = args->max_panes == 0 ? 2 : args->max_panes; |
1078 int max = args->max_panes == 0 ? 2 : args->max_panes; |
| 1086 |
1079 |
| 1087 UiObject *newobj = uic_object_new(obj, pane0); |
1080 UiObject *newobj = uic_object_new(obj, pane0); |
| 1088 newobj->container = ui_splitpane_container(obj, pane0, orientation, max, args->initial_position); |
1081 newobj->container = ui_splitpane_container(obj, pane0, orientation, max, args->initial_position); |
| 1111 ct->initial_position = init; |
1104 ct->initial_position = init; |
| 1112 ct->children = cxArrayListCreateSimple(CX_STORE_POINTERS, 4); |
1105 ct->children = cxArrayListCreateSimple(CX_STORE_POINTERS, 4); |
| 1113 return (UiContainer*)ct; |
1106 return (UiContainer*)ct; |
| 1114 } |
1107 } |
| 1115 |
1108 |
| 1116 void ui_splitpane_container_add(UiContainer *ct, GtkWidget *widget, UiBool fill) { |
1109 void ui_splitpane_container_add(UiContainer *ct, GtkWidget *widget) { |
| 1117 UiSplitPaneContainer *s = (UiSplitPaneContainer*)ct; |
1110 UiSplitPaneContainer *s = (UiSplitPaneContainer*)ct; |
| 1118 |
1111 |
| 1119 if(s->nchildren >= s->max) { |
1112 if(s->nchildren >= s->max) { |
| 1120 fprintf(stderr, "splitpane: maximum number of children reached\n"); |
1113 fprintf(stderr, "splitpane: maximum number of children reached\n"); |
| 1121 return; |
1114 return; |
| 1204 while(elm) { |
1197 while(elm) { |
| 1205 CxHashKey key = cx_hash_key(&elm, sizeof(void*)); |
1198 CxHashKey key = cx_hash_key(&elm, sizeof(void*)); |
| 1206 UiObject *item_obj = cxMapGet(ct->current_items, key); |
1199 UiObject *item_obj = cxMapGet(ct->current_items, key); |
| 1207 if(item_obj) { |
1200 if(item_obj) { |
| 1208 // re-add previously created widget |
1201 // re-add previously created widget |
| 1209 ui_box_container_add(ct->container, item_obj->widget, FALSE); |
1202 ui_box_container_add(ct->container, item_obj->widget); |
| 1210 } else { |
1203 } else { |
| 1211 // create new widget and object for this list element |
1204 // create new widget and object for this list element |
| 1212 CxMempool *mp = cxMempoolCreateSimple(256); |
1205 CxMempool *mp = cxMempoolCreateSimple(256); |
| 1213 const CxAllocator *a = mp->allocator; |
1206 const CxAllocator *a = mp->allocator; |
| 1214 UiObject *obj = cxCalloc(a, 1, sizeof(UiObject)); |
1207 UiObject *obj = cxCalloc(a, 1, sizeof(UiObject)); |
| 1219 obj, |
1212 obj, |
| 1220 ct->spacing, |
1213 ct->spacing, |
| 1221 ct->columnspacing, |
1214 ct->columnspacing, |
| 1222 ct->rowspacing, |
1215 ct->rowspacing, |
| 1223 ct->margin); |
1216 ct->margin); |
| 1224 ui_box_container_add(ct->container, obj->widget, FALSE); |
1217 ui_box_container_add(ct->container, obj->widget); |
| 1225 if(ct->create_ui) { |
1218 if(ct->create_ui) { |
| 1226 ct->create_ui(obj, index, elm, ct->userdata); |
1219 ct->create_ui(obj, index, elm, ct->userdata); |
| 1227 } |
1220 } |
| 1228 cxMapPut(new_items, key, obj); |
1221 cxMapPut(new_items, key, obj); |
| 1229 } |
1222 } |
| 1248 UI_APPLY_LAYOUT2(current, args); |
1241 UI_APPLY_LAYOUT2(current, args); |
| 1249 |
1242 |
| 1250 GtkWidget *box = args->container == UI_CONTAINER_VBOX ? ui_gtk_vbox_new(args->spacing) : ui_gtk_hbox_new(args->spacing); |
1243 GtkWidget *box = args->container == UI_CONTAINER_VBOX ? ui_gtk_vbox_new(args->spacing) : ui_gtk_hbox_new(args->spacing); |
| 1251 ui_set_name_and_style(box, args->name, args->style_class); |
1244 ui_set_name_and_style(box, args->name, args->style_class); |
| 1252 GtkWidget *widget = args->margin > 0 ? ui_box_set_margin(box, args->margin) : box; |
1245 GtkWidget *widget = args->margin > 0 ? ui_box_set_margin(box, args->margin) : box; |
| 1253 ct->add(ct, widget, TRUE); |
1246 ct->add(ct, widget); |
| 1254 |
1247 |
| 1255 UiGtkItemListContainer *container = malloc(sizeof(UiGtkItemListContainer)); |
1248 UiGtkItemListContainer *container = malloc(sizeof(UiGtkItemListContainer)); |
| 1256 container->parent = obj; |
1249 container->parent = obj; |
| 1257 container->widget = box; |
1250 container->widget = box; |
| 1258 container->container = ui_box_container(current, box, args->container); |
1251 container->container = ui_box_container(current, box, args->container); |
| 1293 * |
1286 * |
| 1294 */ |
1287 */ |
| 1295 |
1288 |
| 1296 void ui_layout_fill(UiObject *obj, UiBool fill) { |
1289 void ui_layout_fill(UiObject *obj, UiBool fill) { |
| 1297 UiContainer *ct = uic_get_current_container(obj); |
1290 UiContainer *ct = uic_get_current_container(obj); |
| 1298 ct->layout.fill = ui_bool2lb(fill); |
1291 ct->layout.fill = fill; |
| 1299 } |
1292 } |
| 1300 |
1293 |
| 1301 void ui_layout_hexpand(UiObject *obj, UiBool expand) { |
1294 void ui_layout_hexpand(UiObject *obj, UiBool expand) { |
| 1302 UiContainer *ct = uic_get_current_container(obj); |
1295 UiContainer *ct = uic_get_current_container(obj); |
| 1303 ct->layout.hexpand = expand; |
1296 ct->layout.hexpand = expand; |