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