/** @brief copy a liststore or treestore This is for when reffing is not enough e.g. need independent sorting in attached views. Pointers to data are simply copied, so if the "source" data will be cleared before fhe new store, then all such data must be replicated or otherwise preserved by code elsewhere which understands what that data really is. Officially, the new store will be unsorted, though in practice it will be the same as the old store. @param model treemodel of the store being copied @param treetype TRUE for treestore, FALSE for liststore @param newstore store for pointer to new store @a return */ void e2_tree_store_copy (GtkTreeModel *model, gboolean treetype, gpointer *newstore) { GtkTreeIter src; gint i, ncols = gtk_tree_model_get_n_columns (model); gint colnums[ncols]; GType types[ncols]; GValue values[ncols]; for (i = 0; i < ncols; i++) { colnums[i] = i; types[i] = gtk_tree_model_get_column_type (model, i); memset (&values[i], 0, sizeof (GValue)); } if (treetype) { GtkTreeStore *newtstore = gtk_tree_store_newv (ncols, types); if (gtk_tree_model_get_iter_first (model, &src)) _e2_tree_copy_descendants (model, NULL, newtstore, NULL, ncols, colnums, types, values); *newstore = newtstore; } else { GtkListStore *newlstore = gtk_list_store_newv (ncols, types); if (gtk_tree_model_get_iter_first (model, &src)) { GtkTreeIter dest; do { for (i = 0; i < ncols; i++) gtk_tree_model_get_value (model, &src, i, &values[i]); gtk_list_store_insert_with_valuesv (newlstore, &dest, -1, colnums, values, ncols); for (i = 0; i < ncols; i++) g_value_unset (&values[i]); } while (gtk_tree_model_iter_next (model, &src)); } *newstore = newlstore; } }
static VALUE lstore_insert_body(VALUE value) { struct lstore_insert_args *args = (struct lstore_insert_args *)value; GtkTreeModel *model = GTK_TREE_MODEL(args->store); for (args->i = 0; args->i < args->n; args->i++) { VALUE ary = rb_ary_to_ary(RARRAY_PTR(args->ary)[args->i]); args->columns[args->i] = NUM2INT(RARRAY_PTR(ary)[1]); g_value_init(&args->values[args->i], gtk_tree_model_get_column_type(model, args->columns[args->i])); rbgobj_rvalue_to_gvalue(RARRAY_PTR(ary)[0], &args->values[args->i]); } gtk_list_store_insert_with_valuesv(args->store, &args->iter, args->position, args->columns, args->values, args->n); return Qnil; }
/****************************************************************************** * gtk_ListStoreInsertWithValuesV(list, @iter, position, aColumns, aValues, nValues) ******************************************************************************/ int clip_GTK_LISTSTOREINSERTWITHVALUESV(ClipMachine * cm) { C_object *cslist = _fetch_co_arg(cm); ClipVar *ci = _clip_spar(cm, 2); gint position = _clip_parni(cm, 3); ClipArrVar *ca = (ClipArrVar *)_clip_vptr(_clip_spar(cm, 4)); ClipArrVar *cv = (ClipArrVar *)_clip_vptr(_clip_spar(cm, 5)); gint nValues = _clip_parni(cm, 6); GtkTreeIter iter; C_object *citer; gint *columns; GValue *values; C_object *cobj; gchar *str; int i; CHECKARG2(1, MAP_t, NUMERIC_t);CHECKCOBJ(cslist, GTK_IS_LIST_STORE(cslist->object)); CHECKARG(3, NUMERIC_t); CHECKARG(4, ARRAY_t); CHECKARG(5, ARRAY_t); CHECKARG(6, NUMERIC_t); position --; columns = malloc(nValues*sizeof(int)); values = malloc(nValues*sizeof(GValue)); memset(columns, 0, nValues*sizeof(int)); memset(values, 0, nValues*sizeof(GValue)); for (i=0; i<nValues; i++) { ClipVar *c = ca->items+i; ClipVar *v = cv->items+i; if (c->t.type == NUMERIC_t) columns[i] = c->n.d - 1; switch ((int)v->t.type) { case NUMERIC_t: g_value_init(&values[i], G_TYPE_FLOAT); g_value_set_float(&values[i], v->n.d); break; case CHARACTER_t: str = v->s.str.buf; LOCALE_TO_UTF(str); g_value_init(&values[i], G_TYPE_STRING); g_value_set_string(&values[i], str); FREE_TEXT(str); break; case LOGICAL_t: g_value_init(&values[i], G_TYPE_BOOLEAN); g_value_set_boolean(&values[i], v->l.val); break; case DATE_t: g_value_init(&values[i], G_TYPE_STRING); str = _clip_date_to_str(v->lv.l, cm->date_format); g_value_set_string(&values[i], str); break; case MAP_t: g_value_init(&values[i], GDK_TYPE_PIXBUF); cobj = _fetch_cobject(cm, v); g_value_set_object(&values[i], cobj->object); break; } } gtk_list_store_insert_with_valuesv(GTK_LIST_STORE(cslist->object), &iter, position, columns, values, nValues); if (&iter) { citer = _list_get_cobject(cm, &iter); if (!citer) citer = _register_object(cm, &iter, GTK_TYPE_TREE_ITER, NULL, NULL); if (citer) _clip_mclone(cm, ci, &citer->obj); } return 0; err: return 1; }