diff -r dd0ae1c62a72 -r 2e384acc89a6 ui/gtk/tree.c --- a/ui/gtk/tree.c Thu Nov 16 12:04:10 2017 +0100 +++ b/ui/gtk/tree.c Sun Nov 19 09:00:16 2017 +0100 @@ -29,6 +29,7 @@ #include #include #include +#include #include "../common/context.h" #include "../common/object.h" @@ -67,11 +68,11 @@ UiModel *model = ui_model(obj->ctx, UI_STRING, "", -1); model->getvalue = getvalue; UiList *list = var->value; - UiListModel *listmodel = ui_list_model_new(var, model); + UiListModel *listmodel = ui_list_model_new(obj, var, model); gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL(listmodel)); UiListView *listview = malloc(sizeof(UiListView)); - listview->ctx = obj->ctx; + listview->obj = obj; listview->widget = view; listview->var = var; listview->model = model; @@ -135,10 +136,42 @@ return NULL; } +static void drag_begin(GtkWidget *widget, GdkDragContext *context, gpointer udata) { + printf("drag begin\n"); + +} + +static void drag_end( + GtkWidget *widget, + GdkDragContext *context, + guint time, + gpointer udata) +{ + printf("drag end\n"); + +} + +static gboolean drag_failed( + GtkWidget *widget, + GdkDragContext *context, + GtkDragResult result, + gpointer udata) +{ + printf("drag failed: %d\n", result); + +} + +static GtkTargetEntry targetentries[] = + { + { "STRING", 0, 0 }, + { "text/plain", 0, 1 }, + { "text/uri-list", 0, 2 }, + }; UIWIDGET ui_table_var(UiObject *obj, UiVar *var, UiModel *model, UiListCallbacks cb) { // create treeview GtkWidget *view = gtk_tree_view_new(); + int addi = 0; for(int i=0;icolumns;i++) { GtkTreeViewColumn *column = NULL; @@ -178,13 +211,17 @@ #endif UiList *list = var->value; - UiListModel *listmodel = ui_list_model_new(var, model); + UiListModel *listmodel = ui_list_model_new(obj, var, model); gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL(listmodel)); + //g_signal_connect(view, "drag-begin", G_CALLBACK(drag_begin), NULL); + //g_signal_connect(view, "drag-end", G_CALLBACK(drag_end), NULL); + //g_signal_connect(view, "drag-failed", G_CALLBACK(drag_failed), NULL); + // add TreeView as observer to the UiList to update the TreeView if the // data changes UiListView *tableview = malloc(sizeof(UiListView)); - tableview->ctx = obj->ctx; + tableview->obj = obj; tableview->widget = view; tableview->var = var; tableview->model = model; @@ -260,15 +297,90 @@ return NULL; } +GtkWidget* ui_get_tree_widget(UIWIDGET widget) { + GList *c = gtk_container_get_children(GTK_CONTAINER(widget)); + if(c) { + return c->data; + } + return NULL; +} + +static char** targets2array(char *target0, va_list ap, int *nelm) { + int al = 16; + char **targets = calloc(16, sizeof(char*)); + targets[0] = target0; + + int i = 1; + char *target; + while((target = va_arg(ap, char*)) != NULL) { + if(i >= al) { + al *= 2; + targets = realloc(targets, al*sizeof(char*)); + } + targets[i] = target; + i++; + } + + *nelm = i; + return targets; +} + +static GtkTargetEntry* targetstr2gtktargets(char **str, int nelm) { + GtkTargetEntry *targets = calloc(nelm, sizeof(GtkTargetEntry)); + for(int i=0;iobj; - UiListModel *model = ui_list_model_new(view->var, view->model); + UiListModel *model = ui_list_model_new(view->obj, view->var, view->model); gtk_tree_view_set_model(GTK_TREE_VIEW(view->widget), GTK_TREE_MODEL(model)); // TODO: free old model } void ui_listview_destroy(GtkWidget *w, UiListView *v) { - ui_destroy_boundvar(v->ctx, v->var); + ui_destroy_boundvar(v->obj->ctx, v->var); // TODO: destroy model? free(v); } @@ -375,7 +487,7 @@ UIWIDGET ui_combobox_var(UiObject *obj, UiVar *var, ui_getvaluefunc getvalue, ui_callback f, void *udata) { UiModel *model = ui_model(obj->ctx, UI_STRING, "", -1); model->getvalue = getvalue; - UiListModel *listmodel = ui_list_model_new(var, model); + UiListModel *listmodel = ui_list_model_new(obj, var, model); GtkWidget *combobox = ui_create_combobox(obj, listmodel, f, udata); UiContainer *ct = uic_get_current_container(obj); @@ -386,10 +498,10 @@ GtkWidget *combobox = gtk_combo_box_new_with_model(GTK_TREE_MODEL(model)); UiListView *uicbox = malloc(sizeof(UiListView)); - uicbox->ctx = obj->ctx; + uicbox->obj = obj; uicbox->widget = combobox; uicbox->var = model->var; - uicbox->model = model->info; + uicbox->model = model->model; g_signal_connect( combobox, @@ -442,7 +554,7 @@ void ui_combobox_modelupdate(UiList *list, int i) { UiListView *view = list->obj; - UiListModel *model = ui_list_model_new(view->var, view->model); + UiListModel *model = ui_list_model_new(view->obj, view->var, view->model); gtk_combo_box_set_model(GTK_COMBO_BOX(view->widget), GTK_TREE_MODEL(model)); }