ui/gtk/list.c

changeset 102
64ded9f6a6c6
parent 101
7b3a3130be44
equal deleted inserted replaced
101:7b3a3130be44 102:64ded9f6a6c6
386 g_signal_connect(factory, "bind", G_CALLBACK(column_factory_bind), col); 386 g_signal_connect(factory, "bind", G_CALLBACK(column_factory_bind), col);
387 387
388 GtkColumnViewColumn *column = gtk_column_view_column_new(model->titles[i], factory); 388 GtkColumnViewColumn *column = gtk_column_view_column_new(model->titles[i], factory);
389 gtk_column_view_column_set_resizable(column, true); 389 gtk_column_view_column_set_resizable(column, true);
390 gtk_column_view_append_column(GTK_COLUMN_VIEW(view), column); 390 gtk_column_view_append_column(GTK_COLUMN_VIEW(view), column);
391
392 int size = model->columnsize[i];
393 if(size > 0) {
394 gtk_column_view_column_set_fixed_width(column, size);
395 } else if(size < 0) {
396 gtk_column_view_column_set_expand(column, TRUE);
397 }
391 } 398 }
392 399
393 // bind listview to list 400 // bind listview to list
394 if(var && var->value) { 401 if(var && var->value) {
395 UiList *list = var->value; 402 UiList *list = var->value;
445 if(cb) { 452 if(cb) {
446 cb(&event, cbdata); 453 cb(&event, cbdata);
447 } 454 }
448 } 455 }
449 456
450 void ui_columnview_activate(void *ignore, guint position, gpointer userdata) { 457 static void listview_update_selection(UiListView *view) {
451 UiListView *view = userdata;
452 listview_event(view->onactivate, view->onactivatedata, view);
453 }
454
455 void ui_listview_selection_changed(GtkSelectionModel* self, guint position, guint n_items, gpointer userdata) {
456 UiListView *view = userdata;
457 free(view->selection.rows); 458 free(view->selection.rows);
458 view->selection.count = 0; 459 view->selection.count = 0;
459 view->selection.rows = NULL; 460 view->selection.rows = NULL;
460 461
461 CX_ARRAY_DECLARE(int, newselection); 462 CX_ARRAY_DECLARE(int, newselection);
474 view->selection.count = newselection_size; 475 view->selection.count = newselection_size;
475 view->selection.rows = newselection; 476 view->selection.rows = newselection;
476 } else { 477 } else {
477 free(newselection); 478 free(newselection);
478 } 479 }
479 480 }
481
482 void ui_columnview_activate(void *ignore, guint position, gpointer userdata) {
483 UiListView *view = userdata;
484 if(view->selection.count == 0) {
485 listview_update_selection(view);
486 }
487 listview_event(view->onactivate, view->onactivatedata, view);
488 }
489
490 void ui_listview_selection_changed(GtkSelectionModel* self, guint position, guint n_items, gpointer userdata) {
491 UiListView *view = userdata;
492 listview_update_selection(view);
480 listview_event(view->onselection, view->onselectiondata, view); 493 listview_event(view->onselection, view->onselectiondata, view);
481 } 494 }
482 495
483 void ui_dropdown_activate(GtkDropDown* self, gpointer userdata) { 496 void ui_dropdown_activate(GtkDropDown* self, gpointer userdata) {
484 UiListView *view = userdata; 497 UiListView *view = userdata;
511 } 524 }
512 } 525 }
513 526
514 void ui_listview_update2(UiList *list, int i) { 527 void ui_listview_update2(UiList *list, int i) {
515 UiListView *view = list->obj; 528 UiListView *view = list->obj;
516 ui_update_liststore(view->liststore, view->var->value); 529 ui_update_liststore(view->liststore, list);
517 } 530 }
518 531
519 UiListSelection ui_listview_getselection2(UiList *list) { 532 UiListSelection ui_listview_getselection2(UiList *list) {
520 UiListView *view = list->obj; 533 UiListView *view = list->obj;
521 UiListSelection selection; 534 UiListSelection selection;
612 } 625 }
613 break; 626 break;
614 } 627 }
615 case UI_INTEGER: { 628 case UI_INTEGER: {
616 g_value_init(&value, G_TYPE_INT); 629 g_value_init(&value, G_TYPE_INT);
617 int *intptr = data; 630 intptr_t intptr = (intptr_t)data;
618 g_value_set_int(&value, *intptr); 631 g_value_set_int(&value, (int)intptr);
619 break; 632 break;
620 } 633 }
621 case UI_ICON: { 634 case UI_ICON: {
622 g_value_init(&value, G_TYPE_OBJECT); 635 g_value_init(&value, G_TYPE_OBJECT);
623 UiIcon *icon = data; 636 UiIcon *icon = data;
1557 static void ui_sidebar_list_box_init(UiSidebarListBox *self) { 1570 static void ui_sidebar_list_box_init(UiSidebarListBox *self) {
1558 1571
1559 } 1572 }
1560 #endif 1573 #endif
1561 1574
1575
1576 static void add_sublist(UiListBox *uilistbox, CxList *sublists, UiSubList *sublist) {
1577 UiListBoxSubList uisublist;
1578 uisublist.var = uic_widget_var(
1579 uilistbox->obj->ctx,
1580 uilistbox->obj->ctx,
1581 sublist->value,
1582 sublist->varname,
1583 UI_VAR_LIST);
1584 uisublist.numitems = 0;
1585 uisublist.header = sublist->header ? strdup(sublist->header) : NULL;
1586 uisublist.separator = sublist->separator;
1587 uisublist.widgets = cxLinkedListCreateSimple(CX_STORE_POINTERS);
1588 uisublist.listbox = uilistbox;
1589 uisublist.userdata = sublist->userdata;
1590 uisublist.index = cxListSize(sublists);
1591
1592 // bind UiList
1593 UiListBoxSubList *sublist_ptr = cxListAt(uilistbox->sublists, cxListSize(sublists)-1);
1594 UiList *list = uisublist.var->value;
1595 if(list) {
1596 list->obj = sublist_ptr;
1597 list->update = ui_listbox_list_update;
1598 }
1599
1600 cxListAdd(sublists, &uisublist);
1601 }
1602
1562 UIEXPORT UIWIDGET ui_sourcelist_create(UiObject *obj, UiSourceListArgs args) { 1603 UIEXPORT UIWIDGET ui_sourcelist_create(UiObject *obj, UiSourceListArgs args) {
1563 UiObject* current = uic_current_obj(obj); 1604 UiObject* current = uic_current_obj(obj);
1564 1605
1565 #ifdef UI_GTK3 1606 #ifdef UI_GTK3
1566 GtkWidget *listbox = g_object_new(ui_sidebar_list_box_get_type(), NULL); 1607 GtkWidget *listbox = g_object_new(ui_sidebar_list_box_get_type(), NULL);
1594 uilistbox->sublists = cxArrayListCreateSimple(sizeof(UiListBoxSubList), 4); 1635 uilistbox->sublists = cxArrayListCreateSimple(sizeof(UiListBoxSubList), 4);
1595 uilistbox->sublists->collection.advanced_destructor = (cx_destructor_func2)sublist_destroy; 1636 uilistbox->sublists->collection.advanced_destructor = (cx_destructor_func2)sublist_destroy;
1596 uilistbox->sublists->collection.destructor_data = obj; 1637 uilistbox->sublists->collection.destructor_data = obj;
1597 uilistbox->first_row = NULL; 1638 uilistbox->first_row = NULL;
1598 1639
1599 if(args.numsublists == 0 && args.sublists) { 1640 if(args.sublists) {
1600 args.numsublists = INT_MAX; 1641 // static sublist initalization
1601 } 1642 if(args.numsublists == 0 && args.sublists) {
1602 for(int i=0;i<args.numsublists;i++) { 1643 args.numsublists = INT_MAX;
1603 UiSubList sublist = args.sublists[i]; 1644 }
1604 if(!sublist.varname && !sublist.value) { 1645 for(int i=0;i<args.numsublists;i++) {
1605 break; 1646 UiSubList sublist = args.sublists[i];
1647 if(!sublist.varname && !sublist.value) {
1648 break;
1649 }
1650
1651 add_sublist(uilistbox, uilistbox->sublists, &sublist);
1606 } 1652 }
1607 1653
1608 UiListBoxSubList uisublist; 1654 // fill items
1609 uisublist.var = uic_widget_var( 1655 ui_listbox_update(uilistbox, 0, cxListSize(uilistbox->sublists));
1610 obj->ctx, 1656 } else {
1611 current->ctx, 1657 UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.dynamic_sublist, args.varname, UI_VAR_LIST);
1612 sublist.value, 1658 if(var) {
1613 sublist.varname, 1659 UiList *list = var->value;
1614 UI_VAR_LIST); 1660 list->obj = uilistbox;
1615 uisublist.numitems = 0; 1661 list->update = ui_listbox_dynamic_update;
1616 uisublist.header = sublist.header ? strdup(sublist.header) : NULL; 1662
1617 uisublist.separator = sublist.separator; 1663 ui_listbox_dynamic_update(list, 0);
1618 uisublist.widgets = cxLinkedListCreateSimple(CX_STORE_POINTERS); 1664 }
1619 uisublist.listbox = uilistbox; 1665 }
1620 uisublist.userdata = sublist.userdata;
1621 uisublist.index = i;
1622
1623 cxListAdd(uilistbox->sublists, &uisublist);
1624
1625 // bind UiList
1626 UiListBoxSubList *sublist_ptr = cxListAt(uilistbox->sublists, cxListSize(uilistbox->sublists)-1);
1627 UiList *list = uisublist.var->value;
1628 if(list) {
1629 list->obj = sublist_ptr;
1630 list->update = ui_listbox_list_update;
1631 }
1632 }
1633 // fill items
1634 ui_listbox_update(uilistbox, 0, cxListSize(uilistbox->sublists));
1635 1666
1636 // register uilistbox for both widgets, so it doesn't matter which 1667 // register uilistbox for both widgets, so it doesn't matter which
1637 // widget is used later 1668 // widget is used later
1638 g_object_set_data(G_OBJECT(scroll_area), "ui_listbox", uilistbox); 1669 g_object_set_data(G_OBJECT(scroll_area), "ui_listbox", uilistbox);
1639 g_object_set_data(G_OBJECT(listbox), "ui_listbox", uilistbox); 1670 g_object_set_data(G_OBJECT(listbox), "ui_listbox", uilistbox);
1652 G_CALLBACK(ui_listbox_row_activate), 1683 G_CALLBACK(ui_listbox_row_activate),
1653 NULL); 1684 NULL);
1654 } 1685 }
1655 1686
1656 return scroll_area; 1687 return scroll_area;
1688 }
1689
1690 void ui_listbox_dynamic_update(UiList *list, int x) {
1691 UiListBox *uilistbox = list->obj;
1692
1693 // unbind/free previous list vars
1694 CxIterator i = cxListIterator(uilistbox->sublists);
1695 cx_foreach(UiListBoxSubList *, s, i) {
1696 if(s->var) {
1697 UiList *sl = s->var->value;
1698 sl->obj = NULL;
1699 sl->update = NULL;
1700 if(s->var->type == UI_VAR_SPECIAL) {
1701 ui_free(s->var->from_ctx, s->var);
1702 }
1703 }
1704 }
1705
1706 cxListFree(uilistbox->sublists);
1707 CxList *new_sublists = cxArrayListCreateSimple(sizeof(UiListBoxSubList), list->count(list));
1708 uilistbox->sublists = new_sublists;
1709
1710 UiSubList *sublist = list->first(list);
1711 while(sublist) {
1712 add_sublist(uilistbox, new_sublists, sublist);
1713 sublist = list->next(list);
1714 }
1715
1716 ui_listbox_update(uilistbox, 0, cxListSize(uilistbox->sublists));
1657 } 1717 }
1658 1718
1659 void ui_listbox_update(UiListBox *listbox, int from, int to) { 1719 void ui_listbox_update(UiListBox *listbox, int from, int to) {
1660 CxIterator i = cxListIterator(listbox->sublists); 1720 CxIterator i = cxListIterator(listbox->sublists);
1661 size_t pos = 0; 1721 size_t pos = 0;
1775 if(!data) { 1835 if(!data) {
1776 return; 1836 return;
1777 } 1837 }
1778 UiListBoxSubList *sublist = data->customdata0; 1838 UiListBoxSubList *sublist = data->customdata0;
1779 1839
1840 UiSubListEventData eventdata;
1841 eventdata.list = sublist->var->value;
1842 eventdata.sublist_index = sublist->index;
1843 eventdata.row_index = data->value0;
1844 eventdata.sublist_userdata = sublist->userdata;
1845 eventdata.row_data = ui_list_get(eventdata.list, eventdata.row_index);
1846 eventdata.event_data = data->customdata2;
1847
1780 UiEvent event; 1848 UiEvent event;
1781 event.obj = data->obj; 1849 event.obj = data->obj;
1782 event.window = event.obj->window; 1850 event.window = event.obj->window;
1783 event.document = event.obj->ctx->document; 1851 event.document = event.obj->ctx->document;
1784 event.eventdata = data->customdata2; 1852 event.eventdata = &eventdata;
1785 event.intval = data->value0; 1853 event.intval = data->value0;
1786 1854
1787 if(data->callback) { 1855 if(data->callback) {
1788 data->callback(&event, data->userdata); 1856 data->callback(&event, data->userdata);
1789 } 1857 }

mercurial