ui/gtk/tree.c

changeset 147
2e384acc89a6
parent 146
dd0ae1c62a72
child 150
5cee4cb5ad79
--- 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 <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <stdarg.h>
 
 #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;i<model->columns;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;i<nelm;i++) {
+        targets[i].target = str[i];
+    }
+    return targets;
+}
+
+void ui_table_dragsource(UIWIDGET tablewidget, int actions, char *target0, ...) { 
+    va_list ap;
+    int nelm;
+    char **targets = targets2array(target0, ap, &nelm);
+    va_end(ap);
+    ui_table_dragsource_a(tablewidget, actions, targets, nelm);
+    free(targets);
+}
+
+void ui_table_dragsource_a(UIWIDGET tablewidget, int actions, char **targets, int nelm) {
+    GtkTargetEntry* t = targetstr2gtktargets(targets, nelm);
+    gtk_tree_view_enable_model_drag_source(
+            GTK_TREE_VIEW(ui_get_tree_widget(tablewidget)),
+            GDK_BUTTON1_MASK,
+            t,
+            nelm,
+            GDK_ACTION_COPY|GDK_ACTION_MOVE|GDK_ACTION_LINK);
+    free(t);
+}
+
+void ui_table_dragdest(UIWIDGET tablewidget, int actions, char *target0, ...) {
+    va_list ap;
+    int nelm;
+    char **targets = targets2array(target0, ap, &nelm);
+    va_end(ap);
+    ui_table_dragdest_a(tablewidget, actions, targets, nelm);
+    free(targets);
+}
+
+void ui_table_dragdest_a(UIWIDGET tablewidget, int actions, char **targets, int nelm) {
+    GtkTargetEntry* t = targetstr2gtktargets(targets, nelm);
+    gtk_tree_view_enable_model_drag_dest(
+            GTK_TREE_VIEW(ui_get_tree_widget(tablewidget)),
+            t,
+            nelm,
+            GDK_ACTION_COPY|GDK_ACTION_MOVE|GDK_ACTION_LINK);
+    free(t);
+}
+
 void ui_listview_update(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_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));
 }
 

mercurial