| 820 static void listview_update_selection(UiListView *view) { |
820 static void listview_update_selection(UiListView *view) { |
| 821 free(view->selection.rows); |
821 free(view->selection.rows); |
| 822 view->selection.count = 0; |
822 view->selection.count = 0; |
| 823 view->selection.rows = NULL; |
823 view->selection.rows = NULL; |
| 824 |
824 |
| 825 CX_ARRAY_DECLARE(int, newselection); |
|
| 826 cx_array_initialize(newselection, 8); |
|
| 827 |
|
| 828 size_t nitems = g_list_model_get_n_items(G_LIST_MODEL(view->liststore)); |
825 size_t nitems = g_list_model_get_n_items(G_LIST_MODEL(view->liststore)); |
| |
826 int *newselection = calloc(nitems, sizeof(int)); |
| |
827 int selection_size = 0; |
| 829 |
828 |
| 830 for(size_t i=0;i<nitems;i++) { |
829 for(size_t i=0;i<nitems;i++) { |
| 831 if(gtk_selection_model_is_selected(view->selectionmodel, i)) { |
830 if(gtk_selection_model_is_selected(view->selectionmodel, i)) { |
| 832 int s = (int)i; |
831 int s = (int)i; |
| 833 cx_array_simple_add(newselection, s); |
832 newselection[selection_size++] = s; |
| 834 } |
833 } |
| 835 } |
834 } |
| 836 |
835 |
| 837 if(newselection_size > 0) { |
836 if(selection_size > 0) { |
| 838 view->selection.count = newselection_size; |
837 view->selection.count = selection_size; |
| 839 view->selection.rows = newselection; |
838 view->selection.rows = newselection; |
| 840 } else { |
839 } else { |
| 841 free(newselection); |
840 free(newselection); |
| 842 } |
841 } |
| 843 } |
842 } |
| 1107 if(model->types[i] == UI_ICON_TEXT_FREE || freevalue) { |
1106 if(model->types[i] == UI_ICON_TEXT_FREE || freevalue) { |
| 1108 free(str); |
1107 free(str); |
| 1109 } |
1108 } |
| 1110 break; |
1109 break; |
| 1111 } |
1110 } |
| |
1111 case UI_STRING_EDITABLE: { |
| |
1112 g_value_init(&value, G_TYPE_STRING); |
| |
1113 g_value_set_string(&value, data); |
| |
1114 if(freevalue) { |
| |
1115 free(data); |
| |
1116 } |
| |
1117 break; |
| |
1118 } |
| |
1119 case UI_BOOL_EDITABLE: { |
| |
1120 g_value_init(&value, G_TYPE_BOOLEAN); |
| |
1121 intptr_t b = (intptr_t)data; |
| |
1122 g_value_set_boolean(&value, b != 0 ? TRUE : FALSE); |
| |
1123 if(freevalue) { |
| |
1124 free(data); |
| |
1125 } |
| |
1126 break; |
| |
1127 } |
| 1112 } |
1128 } |
| 1113 |
1129 |
| 1114 gtk_list_store_set_value(store, iter, c, &value); |
1130 gtk_list_store_set_value(store, iter, c, &value); |
| 1115 |
1131 |
| 1116 if(style_set) { |
1132 if(style_set) { |
| 1180 case UI_ICON_TEXT: |
1196 case UI_ICON_TEXT: |
| 1181 case UI_ICON_TEXT_FREE: { |
1197 case UI_ICON_TEXT_FREE: { |
| 1182 types[c] = G_TYPE_OBJECT; |
1198 types[c] = G_TYPE_OBJECT; |
| 1183 types[++c] = G_TYPE_STRING; |
1199 types[++c] = G_TYPE_STRING; |
| 1184 } |
1200 } |
| |
1201 case UI_STRING_EDITABLE: types[c] = G_TYPE_STRING; break; |
| |
1202 case UI_BOOL_EDITABLE: types[c] = G_TYPE_BOOLEAN; break; |
| 1185 } |
1203 } |
| 1186 } |
1204 } |
| 1187 int s = 0; |
1205 int s = 0; |
| 1188 for(int i=0;i<columns;i++) { |
1206 for(int i=0;i<columns;i++) { |
| 1189 types[listview->style_offset+s] = G_TYPE_BOOLEAN; s++; // *-set |
1207 types[listview->style_offset+s] = G_TYPE_BOOLEAN; s++; // *-set |
| 1336 //g_object_unref(path); |
1354 //g_object_unref(path); |
| 1337 } |
1355 } |
| 1338 |
1356 |
| 1339 void ui_dropdown_select(UIWIDGET dropdown, int index) { |
1357 void ui_dropdown_select(UIWIDGET dropdown, int index) { |
| 1340 gtk_combo_box_set_active(GTK_COMBO_BOX(dropdown), index); |
1358 gtk_combo_box_set_active(GTK_COMBO_BOX(dropdown), index); |
| |
1359 } |
| |
1360 |
| |
1361 static void table_cell_toggled( |
| |
1362 GtkCellRendererToggle *renderer, |
| |
1363 gchar *path, |
| |
1364 gpointer user_data) |
| |
1365 { |
| |
1366 printf("cell toggled\n"); |
| |
1367 } |
| |
1368 |
| |
1369 static void table_cell_edited( |
| |
1370 GtkCellRendererText *renderer, |
| |
1371 gchar *path, |
| |
1372 gchar *new_text, |
| |
1373 gpointer user_data) |
| |
1374 { |
| |
1375 printf("cell edited\n"); |
| 1341 } |
1376 } |
| 1342 |
1377 |
| 1343 UIWIDGET ui_table_create(UiObject *obj, UiListArgs *args) { |
1378 UIWIDGET ui_table_create(UiObject *obj, UiListArgs *args) { |
| 1344 // create treeview |
1379 // create treeview |
| 1345 GtkWidget *view = gtk_tree_view_new(); |
1380 GtkWidget *view = gtk_tree_view_new(); |
| 1396 model->titles[i], |
1431 model->titles[i], |
| 1397 iconrenderer, |
1432 iconrenderer, |
| 1398 "pixbuf", |
1433 "pixbuf", |
| 1399 i + addi, |
1434 i + addi, |
| 1400 NULL); |
1435 NULL); |
| |
1436 } else if (model->types[i] == UI_BOOL_EDITABLE) { |
| |
1437 GtkCellRenderer *renderer = gtk_cell_renderer_toggle_new(); |
| |
1438 column = gtk_tree_view_column_new_with_attributes( |
| |
1439 model->titles[i], |
| |
1440 renderer, |
| |
1441 "active", |
| |
1442 i + addi, |
| |
1443 NULL); |
| |
1444 g_signal_connect(renderer, "toggled", G_CALLBACK(table_cell_toggled), NULL); |
| 1401 } else { |
1445 } else { |
| 1402 GtkCellRenderer *textrenderer = gtk_cell_renderer_text_new(); |
1446 GtkCellRenderer *textrenderer = gtk_cell_renderer_text_new(); |
| |
1447 if(model->types[i] == UI_STRING_EDITABLE) { |
| |
1448 g_object_set(textrenderer, "editable", TRUE, NULL); |
| |
1449 } |
| 1403 column = gtk_tree_view_column_new_with_attributes( |
1450 column = gtk_tree_view_column_new_with_attributes( |
| 1404 model->titles[i], |
1451 model->titles[i], |
| 1405 textrenderer, |
1452 textrenderer, |
| 1406 "text", |
1453 "text", |
| 1407 i + addi, |
1454 i + addi, |
| 1711 GtkTreeView *treeview, |
1758 GtkTreeView *treeview, |
| 1712 GtkTreePath *path, |
1759 GtkTreePath *path, |
| 1713 GtkTreeViewColumn *column, |
1760 GtkTreeViewColumn *column, |
| 1714 UiTreeEventData *event) |
1761 UiTreeEventData *event) |
| 1715 { |
1762 { |
| 1716 UiListSelection selection = ui_listview_selection( |
1763 UiListSelection selection = ui_listview_get_selection( |
| 1717 gtk_tree_view_get_selection(treeview), |
1764 gtk_tree_view_get_selection(treeview), |
| 1718 event); |
1765 event); |
| 1719 |
1766 |
| 1720 UiEvent e; |
1767 UiEvent e; |
| 1721 e.obj = event->obj; |
1768 e.obj = event->obj; |
| 1733 |
1780 |
| 1734 void ui_listview_selection_event( |
1781 void ui_listview_selection_event( |
| 1735 GtkTreeSelection *treeselection, |
1782 GtkTreeSelection *treeselection, |
| 1736 UiTreeEventData *event) |
1783 UiTreeEventData *event) |
| 1737 { |
1784 { |
| 1738 UiListSelection selection = ui_listview_selection(treeselection, event); |
1785 UiListSelection selection = ui_listview_get_selection(treeselection, event); |
| 1739 |
1786 |
| 1740 UiEvent e; |
1787 UiEvent e; |
| 1741 e.obj = event->obj; |
1788 e.obj = event->obj; |
| 1742 e.window = event->obj->window; |
1789 e.window = event->obj->window; |
| 1743 e.document = event->obj->ctx->document; |
1790 e.document = event->obj->ctx->document; |
| 1749 if(selection.count > 0) { |
1796 if(selection.count > 0) { |
| 1750 free(selection.rows); |
1797 free(selection.rows); |
| 1751 } |
1798 } |
| 1752 } |
1799 } |
| 1753 |
1800 |
| 1754 UiListSelection ui_listview_selection( |
1801 UiListSelection ui_listview_get_selection( |
| 1755 GtkTreeSelection *selection, |
1802 GtkTreeSelection *selection, |
| 1756 UiTreeEventData *event) |
1803 UiTreeEventData *event) |
| 1757 { |
1804 { |
| 1758 GList *rows = gtk_tree_selection_get_selected_rows(selection, NULL); |
1805 GList *rows = gtk_tree_selection_get_selected_rows(selection, NULL); |
| 1759 |
1806 |
| 2213 sublist->varname, |
2260 sublist->varname, |
| 2214 UI_VAR_LIST); |
2261 UI_VAR_LIST); |
| 2215 uisublist.numitems = 0; |
2262 uisublist.numitems = 0; |
| 2216 uisublist.header = sublist->header ? strdup(sublist->header) : NULL; |
2263 uisublist.header = sublist->header ? strdup(sublist->header) : NULL; |
| 2217 uisublist.separator = sublist->separator; |
2264 uisublist.separator = sublist->separator; |
| 2218 uisublist.widgets = cxLinkedListCreateSimple(CX_STORE_POINTERS); |
2265 uisublist.widgets = cxLinkedListCreate(NULL, CX_STORE_POINTERS); |
| 2219 uisublist.listbox = uilistbox; |
2266 uisublist.listbox = uilistbox; |
| 2220 uisublist.userdata = sublist->userdata; |
2267 uisublist.userdata = sublist->userdata; |
| 2221 uisublist.index = cxListSize(sublists); |
2268 uisublist.index = cxListSize(sublists); |
| 2222 uisublist.startpos = 0; |
2269 uisublist.startpos = 0; |
| 2223 cxListAdd(sublists, &uisublist); |
2270 cxListAdd(sublists, &uisublist); |
| 2264 uilistbox->getvaluedata = args->getvaluedata; |
2311 uilistbox->getvaluedata = args->getvaluedata; |
| 2265 uilistbox->onactivate = args->onactivate; |
2312 uilistbox->onactivate = args->onactivate; |
| 2266 uilistbox->onactivatedata = args->onactivatedata; |
2313 uilistbox->onactivatedata = args->onactivatedata; |
| 2267 uilistbox->onbuttonclick = args->onbuttonclick; |
2314 uilistbox->onbuttonclick = args->onbuttonclick; |
| 2268 uilistbox->onbuttonclickdata = args->onbuttonclickdata; |
2315 uilistbox->onbuttonclickdata = args->onbuttonclickdata; |
| 2269 uilistbox->sublists = cxArrayListCreateSimple(sizeof(UiListBoxSubList), 4); |
2316 uilistbox->sublists = cxArrayListCreate(NULL, sizeof(UiListBoxSubList), 4); |
| 2270 uilistbox->sublists->collection.advanced_destructor = (cx_destructor_func2)sublist_destroy; |
2317 uilistbox->sublists->collection.advanced_destructor = (cx_destructor_func2)sublist_destroy; |
| 2271 uilistbox->sublists->collection.destructor_data = obj; |
2318 uilistbox->sublists->collection.destructor_data = obj; |
| 2272 uilistbox->first_row = NULL; |
2319 uilistbox->first_row = NULL; |
| 2273 |
2320 |
| 2274 if(args->sublists) { |
2321 if(args->sublists) { |
| 2352 } |
2399 } |
| 2353 } |
2400 } |
| 2354 } |
2401 } |
| 2355 |
2402 |
| 2356 cxListFree(uilistbox->sublists); |
2403 cxListFree(uilistbox->sublists); |
| 2357 CxList *new_sublists = cxArrayListCreateSimple(sizeof(UiListBoxSubList), list->count(list)); |
2404 CxList *new_sublists = cxArrayListCreate(NULL, sizeof(UiListBoxSubList), list->count(list)); |
| 2358 uilistbox->sublists = new_sublists; |
2405 uilistbox->sublists = new_sublists; |
| 2359 |
2406 |
| 2360 UiSubList *sublist = list->first(list); |
2407 UiSubList *sublist = list->first(list); |
| 2361 while(sublist) { |
2408 while(sublist) { |
| 2362 add_sublist(uilistbox, new_sublists, sublist); |
2409 add_sublist(uilistbox, new_sublists, sublist); |