ui/gtk/list.c

changeset 466
7c78b0b8b77d
parent 453
abe2c7bf2246
child 470
118e2386d5b4
equal deleted inserted replaced
465:00735562b25b 466:7c78b0b8b77d
1564 static void ui_sidebar_list_box_init(UiSidebarListBox *self) { 1564 static void ui_sidebar_list_box_init(UiSidebarListBox *self) {
1565 1565
1566 } 1566 }
1567 #endif 1567 #endif
1568 1568
1569
1570 static void add_sublist(UiListBox *uilistbox, CxList *sublists, UiSubList *sublist) {
1571 UiListBoxSubList uisublist;
1572 uisublist.var = uic_widget_var(
1573 uilistbox->obj->ctx,
1574 uilistbox->obj->ctx,
1575 sublist->value,
1576 sublist->varname,
1577 UI_VAR_LIST);
1578 uisublist.numitems = 0;
1579 uisublist.header = sublist->header ? strdup(sublist->header) : NULL;
1580 uisublist.separator = sublist->separator;
1581 uisublist.widgets = cxLinkedListCreateSimple(CX_STORE_POINTERS);
1582 uisublist.listbox = uilistbox;
1583 uisublist.userdata = sublist->userdata;
1584 uisublist.index = cxListSize(sublists);
1585
1586 // bind UiList
1587 UiListBoxSubList *sublist_ptr = cxListAt(uilistbox->sublists, cxListSize(sublists)-1);
1588 UiList *list = uisublist.var->value;
1589 if(list) {
1590 list->obj = sublist_ptr;
1591 list->update = ui_listbox_list_update;
1592 }
1593
1594 cxListAdd(sublists, &uisublist);
1595 }
1596
1569 UIEXPORT UIWIDGET ui_sourcelist_create(UiObject *obj, UiSourceListArgs args) { 1597 UIEXPORT UIWIDGET ui_sourcelist_create(UiObject *obj, UiSourceListArgs args) {
1570 UiObject* current = uic_current_obj(obj); 1598 UiObject* current = uic_current_obj(obj);
1571 1599
1572 #ifdef UI_GTK3 1600 #ifdef UI_GTK3
1573 GtkWidget *listbox = g_object_new(ui_sidebar_list_box_get_type(), NULL); 1601 GtkWidget *listbox = g_object_new(ui_sidebar_list_box_get_type(), NULL);
1601 uilistbox->sublists = cxArrayListCreateSimple(sizeof(UiListBoxSubList), 4); 1629 uilistbox->sublists = cxArrayListCreateSimple(sizeof(UiListBoxSubList), 4);
1602 uilistbox->sublists->collection.advanced_destructor = (cx_destructor_func2)sublist_destroy; 1630 uilistbox->sublists->collection.advanced_destructor = (cx_destructor_func2)sublist_destroy;
1603 uilistbox->sublists->collection.destructor_data = obj; 1631 uilistbox->sublists->collection.destructor_data = obj;
1604 uilistbox->first_row = NULL; 1632 uilistbox->first_row = NULL;
1605 1633
1606 if(args.numsublists == 0 && args.sublists) { 1634 if(args.sublists) {
1607 args.numsublists = INT_MAX; 1635 // static sublist initalization
1608 } 1636 if(args.numsublists == 0 && args.sublists) {
1609 for(int i=0;i<args.numsublists;i++) { 1637 args.numsublists = INT_MAX;
1610 UiSubList sublist = args.sublists[i]; 1638 }
1611 if(!sublist.varname && !sublist.value) { 1639 for(int i=0;i<args.numsublists;i++) {
1612 break; 1640 UiSubList sublist = args.sublists[i];
1641 if(!sublist.varname && !sublist.value) {
1642 break;
1643 }
1644
1645 add_sublist(uilistbox, uilistbox->sublists, &sublist);
1613 } 1646 }
1614 1647
1615 UiListBoxSubList uisublist; 1648 // fill items
1616 uisublist.var = uic_widget_var( 1649 ui_listbox_update(uilistbox, 0, cxListSize(uilistbox->sublists));
1617 obj->ctx, 1650 } else {
1618 current->ctx, 1651 UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.dynamic_sublist, args.varname, UI_VAR_LIST);
1619 sublist.value, 1652 if(var) {
1620 sublist.varname, 1653 UiList *list = var->value;
1621 UI_VAR_LIST); 1654 list->obj = uilistbox;
1622 uisublist.numitems = 0; 1655 list->update = ui_listbox_dynamic_update;
1623 uisublist.header = sublist.header ? strdup(sublist.header) : NULL; 1656
1624 uisublist.separator = sublist.separator; 1657 ui_listbox_dynamic_update(list, 0);
1625 uisublist.widgets = cxLinkedListCreateSimple(CX_STORE_POINTERS); 1658 }
1626 uisublist.listbox = uilistbox; 1659 }
1627 uisublist.userdata = sublist.userdata;
1628 uisublist.index = i;
1629
1630 cxListAdd(uilistbox->sublists, &uisublist);
1631
1632 // bind UiList
1633 UiListBoxSubList *sublist_ptr = cxListAt(uilistbox->sublists, cxListSize(uilistbox->sublists)-1);
1634 UiList *list = uisublist.var->value;
1635 if(list) {
1636 list->obj = sublist_ptr;
1637 list->update = ui_listbox_list_update;
1638 }
1639 }
1640 // fill items
1641 ui_listbox_update(uilistbox, 0, cxListSize(uilistbox->sublists));
1642 1660
1643 // register uilistbox for both widgets, so it doesn't matter which 1661 // register uilistbox for both widgets, so it doesn't matter which
1644 // widget is used later 1662 // widget is used later
1645 g_object_set_data(G_OBJECT(scroll_area), "ui_listbox", uilistbox); 1663 g_object_set_data(G_OBJECT(scroll_area), "ui_listbox", uilistbox);
1646 g_object_set_data(G_OBJECT(listbox), "ui_listbox", uilistbox); 1664 g_object_set_data(G_OBJECT(listbox), "ui_listbox", uilistbox);
1659 G_CALLBACK(ui_listbox_row_activate), 1677 G_CALLBACK(ui_listbox_row_activate),
1660 NULL); 1678 NULL);
1661 } 1679 }
1662 1680
1663 return scroll_area; 1681 return scroll_area;
1682 }
1683
1684 void ui_listbox_dynamic_update(UiList *list, int x) {
1685 UiListBox *uilistbox = list->obj;
1686
1687 // unbind/free previous list vars
1688 CxIterator i = cxListIterator(uilistbox->sublists);
1689 cx_foreach(UiListBoxSubList *, s, i) {
1690 if(s->var) {
1691 UiList *sl = s->var->value;
1692 sl->obj = NULL;
1693 sl->update = NULL;
1694 if(s->var->type == UI_VAR_SPECIAL) {
1695 ui_free(s->var->from_ctx, s->var);
1696 }
1697 }
1698 }
1699
1700 cxListFree(uilistbox->sublists);
1701 CxList *new_sublists = cxArrayListCreateSimple(sizeof(UiListBoxSubList), list->count(list));
1702 uilistbox->sublists = new_sublists;
1703
1704 UiSubList *sublist = list->first(list);
1705 while(sublist) {
1706 add_sublist(uilistbox, new_sublists, sublist);
1707 sublist = list->next(list);
1708 }
1709
1710 ui_listbox_update(uilistbox, 0, cxListSize(uilistbox->sublists));
1664 } 1711 }
1665 1712
1666 void ui_listbox_update(UiListBox *listbox, int from, int to) { 1713 void ui_listbox_update(UiListBox *listbox, int from, int to) {
1667 CxIterator i = cxListIterator(listbox->sublists); 1714 CxIterator i = cxListIterator(listbox->sublists);
1668 size_t pos = 0; 1715 size_t pos = 0;

mercurial