Exemplo n.º 1
0
/**
@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;
	}
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
/******************************************************************************
* 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;
}