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; |