ui/gtk/list.c

changeset 117
b174e721663e
parent 115
e57ca2747782
equal deleted inserted replaced
116:376ef91111f6 117:b174e721663e
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,
1558 } 1605 }
1559 } 1606 }
1560 1607
1561 UiListSelection ui_listview_getselection(UiList *list) { 1608 UiListSelection ui_listview_getselection(UiList *list) {
1562 UiListView *view = list->obj; 1609 UiListView *view = list->obj;
1563 UiListSelection selection = ui_listview_selection( 1610 UiListSelection selection = ui_listview_get_selection(
1564 gtk_tree_view_get_selection(GTK_TREE_VIEW(view->widget)), 1611 gtk_tree_view_get_selection(GTK_TREE_VIEW(view->widget)),
1565 NULL); 1612 NULL);
1566 return selection; 1613 return selection;
1567 } 1614 }
1568 1615
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);

mercurial