/* Gtk::ListStore#insert(pos, val1 => 0, val2 => 2, ... ) */ static VALUE lstore_insert(int argc, VALUE *argv, VALUE self) { VALUE position, values, result; struct lstore_insert_args args = { _SELF(self) }; rb_scan_args(argc, argv, "11", &position, &values); args.position = NUM2INT(position); if (NIL_P(values)){ gtk_list_store_insert(args.store, &args.iter, args.position); } else { #if GTK_CHECK_VERSION(2,6,0) args.ary = rb_funcall(values, id_to_a, 0); args.n = RARRAY_LEN(args.ary); args.columns = g_new(gint, args.n); args.values = g_new0(GValue, args.n); rb_ensure(lstore_insert_body, (VALUE)&args, lstore_insert_ensure, (VALUE)&args); #else gtk_list_store_insert(args.store, &args.iter, args.position); rb_warn("Ignored 2nd argument under this environment, as it has been supported since GTK+-2.6."); #endif } args.iter.user_data3 = args.store; result = GTKTREEITER2RVAL(&args.iter); G_CHILD_ADD(self, result); return result; }
static gboolean entryc_match_func(GtkEntryCompletion *completion, const gchar *key, GtkTreeIter *iter, gpointer func) { iter->user_data3 = gtk_entry_completion_get_model(completion); return RVAL2CBOOL(rb_funcall((VALUE)func, id_call, 3, GOBJ2RVAL(completion), CSTR2RVAL(key), GTKTREEITER2RVAL(iter))); }
static void layout_data_func(GtkCellLayout *layout, GtkCellRenderer *cell, GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer func) { iter->user_data3 = tree_model; rb_funcall((VALUE)func, id_call, 4, GOBJ2RVAL(layout), GOBJ2RVAL(cell), GOBJ2RVAL(tree_model), GTKTREEITER2RVAL(iter)); }
static gboolean row_separator_func(GtkTreeModel *model, GtkTreeIter *iter, gpointer *func) { iter->user_data3 = model; return RVAL2CBOOL(rb_funcall((VALUE)func, id_call, 2, GOBJ2RVAL(model), GTKTREEITER2RVAL(iter))); }
/* Gtk::ListStore#insert(pos, val1 => 0, val2 => 2, ... ) */ static VALUE rg_insert(int argc, VALUE *argv, VALUE self) { VALUE position, values, result; struct lstore_insert_args args; args.store = _SELF(self); rb_scan_args(argc, argv, "11", &position, &values); args.position = NUM2INT(position); if (NIL_P(values)){ gtk_list_store_insert(args.store, &args.iter, args.position); } else { args.ary = rb_funcall(values, id_to_a, 0); args.n = RARRAY_LEN(args.ary); args.columns = g_new(gint, args.n); args.values = g_new0(GValue, args.n); rb_ensure(lstore_insert_body, (VALUE)&args, lstore_insert_ensure, (VALUE)&args); } args.iter.user_data3 = args.store; result = GTKTREEITER2RVAL(&args.iter); return result; }
static void cell_data_func(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer func) { iter->user_data3 = model; rb_funcall((VALUE)func, id_call, 4, GOBJ2RVAL(tree_column), GOBJ2RVAL(cell), GOBJ2RVAL(model), GTKTREEITER2RVAL(iter)); }
static gboolean search_equal_func(GtkTreeModel *model, gint column, const gchar *key, GtkTreeIter *iter, gpointer func) { iter->user_data3 = model; return RVAL2CBOOL(rb_funcall((VALUE)func, id_call, 4, GOBJ2RVAL(model), INT2NUM(column), CSTR2RVAL(key), GTKTREEITER2RVAL(iter))); }
static gboolean visible_func(GtkTreeModel *model, GtkTreeIter *iter, gpointer func) { VALUE ret; iter->user_data3 = model; ret = rb_funcall((VALUE)func, id_call, 2, GOBJ2RVAL(model), GTKTREEITER2RVAL(iter)); return RVAL2CBOOL(ret); }
static void modify_func(GtkTreeModel *model, GtkTreeIter *iter, GValue *value, gint column, gpointer func) { VALUE ret; iter->user_data3 = model; ret = rb_funcall((VALUE)func, id_call, 3, GOBJ2RVAL(model), GTKTREEITER2RVAL(iter), INT2NUM(column)); rbgobj_rvalue_to_gvalue(ret, value); }
/* * Optional Signals */ static VALUE treeview_signal_func(G_GNUC_UNUSED guint num, const GValue *values) { GtkTreeView* view = g_value_get_object(&values[0]); GtkTreeIter* iter = g_value_get_boxed(&values[1]); iter->user_data3 = gtk_tree_view_get_model(view); return rb_ary_new3(3, GOBJ2RVAL(view), GTKTREEITER2RVAL(iter), GVAL2RVAL(&values[2])); }
static VALUE rg_convert_iter_to_child_iter(VALUE self, VALUE filtered_iter) { GtkTreeIter child_iter; GtkTreeModelFilter* modelfilter = _SELF(self); gtk_tree_model_filter_convert_iter_to_child_iter(modelfilter, &child_iter, RVAL2GTKTREEITER(filtered_iter)); child_iter.user_data3 = gtk_tree_model_filter_get_model(modelfilter); return GTKTREEITER2RVAL(&child_iter); }
static VALUE rg_first_child(VALUE self) { GtkTreeIter child; GtkTreeIter* iter = _SELF(self); GtkTreeModel* model = (GtkTreeModel*)iter->user_data3; gboolean ret = gtk_tree_model_iter_children(model, &child, iter); child.user_data3 = model; return ret ? GTKTREEITER2RVAL(&child) : Qnil; }
static gboolean treemodel_foreach_func(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, G_GNUC_UNUSED gpointer func) { iter->user_data3 = model; rb_yield(rb_ary_new3(3, GOBJ2RVAL(model), GTKTREEPATH2RVAL(path), GTKTREEITER2RVAL(iter))); return FALSE; }
static VALUE rg_nth_child(VALUE self, VALUE n) { GtkTreeIter child; GtkTreeIter* iter = _SELF(self); GtkTreeModel* model = (GtkTreeModel*)iter->user_data3; gboolean ret = gtk_tree_model_iter_nth_child(model, &child, iter, NUM2INT(n)); child.user_data3 = model; return ret ? GTKTREEITER2RVAL(&child) : Qnil; }
static VALUE rg_parent(VALUE self) { GtkTreeIter parent; GtkTreeIter* iter = _SELF(self); GtkTreeModel* model = (GtkTreeModel*)iter->user_data3; gboolean ret = gtk_tree_model_iter_parent(model, &parent, iter); parent.user_data3 = model; return ret ? GTKTREEITER2RVAL(&parent) : Qnil; }
static VALUE signal_func(G_GNUC_UNUSED guint num, const GValue *values) { GtkTreeModel* model = g_value_get_object(&values[0]); GtkTreePath* path = g_value_get_boxed(&values[1]); GtkTreeIter* iter = g_value_get_boxed(&values[2]); iter->user_data3 = model; return rb_ary_new3(3, GOBJ2RVAL(model), GTKTREEPATH2RVAL(path), GTKTREEITER2RVAL(iter)); }
static VALUE rg_insert_after(VALUE self, VALUE sibling) { VALUE ret; GtkTreeIter iter; GtkListStore* model = _SELF(self); gtk_list_store_insert_after(model, &iter, NIL_P(sibling) ? NULL : RVAL2GTKTREEITER(sibling)); iter.user_data3 = model; ret = GTKTREEITER2RVAL(&iter); return ret; }
static VALUE rg_append(VALUE self) { VALUE ret; GtkTreeIter iter; GtkListStore* model = _SELF(self); gtk_list_store_append(model, &iter); iter.user_data3 = model; ret = GTKTREEITER2RVAL(&iter); return ret; }
static VALUE rg_append(VALUE self, VALUE parent) { VALUE ret; GtkTreeIter iter; GtkTreeStore* model = _SELF(self); gtk_tree_store_append(model, &iter, NIL_P(parent)?NULL:RVAL2GTKTREEITER(parent)); iter.user_data3 = model; ret = GTKTREEITER2RVAL(&iter); G_CHILD_ADD(self, ret); return ret; }
static VALUE rg_insert_before(VALUE self, VALUE parent, VALUE sibling) { VALUE ret; GtkTreeIter iter; GtkTreeStore* model = _SELF(self); gtk_tree_store_insert_before(model, &iter, NIL_P(parent) ? NULL : RVAL2GTKTREEITER(parent), NIL_P(sibling) ? NULL : RVAL2GTKTREEITER(sibling)); iter.user_data3 = model; ret = GTKTREEITER2RVAL(&iter); G_CHILD_ADD(self, ret); return ret; }
static VALUE rg_iter_first(VALUE self) { VALUE val = Qnil; GtkTreeIter iter; GtkTreeModel* model = _SELF(self); gboolean ret = (gtk_tree_model_get_iter_first(model, &iter)); iter.user_data3 = model; if (ret) { val = GTKTREEITER2RVAL(&iter); G_CHILD_ADD(self, val); } return val; }
static VALUE signal_rows_reordered_func(G_GNUC_UNUSED guint num, const GValue *values) { GtkTreeModel* model = g_value_get_object(&values[0]); GtkTreePath* path = g_value_get_boxed(&values[1]); GtkTreeIter* iter = g_value_get_boxed(&values[2]); gint* new_orders = (gint*)g_value_get_pointer(&values[3]); gint len = gtk_tree_model_iter_n_children(model, iter); VALUE orders = Qnil; int i; iter->user_data3 = model; orders = rb_ary_new2(len); for (i = 0; i < len; i++, new_orders++) { rb_ary_push(orders, INT2NUM(*new_orders)); } return rb_ary_new3(4, GOBJ2RVAL(model), GTKTREEPATH2RVAL(path), GTKTREEITER2RVAL(iter), orders); }
static VALUE rg_get_iter(VALUE self, VALUE path) { VALUE val = Qnil; GtkTreeIter iter; gboolean ret; GtkTreeModel* model = _SELF(self); if (TYPE(path) == T_STRING){ ret = gtk_tree_model_get_iter_from_string(model, &iter, RVAL2CSTR(path)); } else { ret = gtk_tree_model_get_iter(model, &iter, RVAL2GTKTREEPATH(path)); } iter.user_data3 = model; if (ret) { val = GTKTREEITER2RVAL(&iter); G_CHILD_ADD(self, val); } return val; }
static VALUE rg_insert(int argc, VALUE *argv, VALUE self) { VALUE parent, position, values, ret; GtkTreeIter iter; GtkTreeStore* model = _SELF(self); rb_scan_args(argc, argv, "21", &parent, &position, &values); if (NIL_P(values)){ gtk_tree_store_insert(model, &iter, NIL_P(parent) ? NULL : RVAL2GTKTREEITER(parent), NUM2INT(position)); iter.user_data3 = model; ret = GTKTREEITER2RVAL(&iter); G_CHILD_ADD(self, ret); } else { #if GTK_CHECK_VERSION(2,10,0) gint *c_columns; GValue *c_values; long size, i; size = NUM2INT(rb_funcall(values, rb_intern("size"), 0)); c_columns = ALLOCA_N(gint, size); c_values = ALLOCA_N(GValue, size); if(TYPE(values)==T_ARRAY) { for(i=0; i<size; i++) { GType gtype; GValue gval = G_VALUE_INIT; c_columns[i] = i; gtype = gtk_tree_model_get_column_type(GTK_TREE_MODEL(RVAL2GOBJ(self)), c_columns[i]); g_value_init(&gval, gtype); rbgobj_rvalue_to_gvalue(rb_ary_shift(values), &gval); c_values[i] = gval; } } else if(TYPE(values)==T_HASH) { VALUE r_columns; r_columns = rb_funcall(values, rb_intern("keys"), 0); for(i=0; i<size; i++) { GType gtype; GValue gval = G_VALUE_INIT; c_columns[i] = NUM2INT (rb_ary_entry(r_columns, i)); gtype = gtk_tree_model_get_column_type(GTK_TREE_MODEL(RVAL2GOBJ(self)), c_columns[i]); g_value_init(&gval, gtype); rbgobj_rvalue_to_gvalue(rb_hash_aref(values, INT2NUM(c_columns[i])), &gval); c_values[i] = gval; } } else { rb_raise(rb_eArgError, "values must be of type Hash or Array"); } gtk_tree_store_insert_with_valuesv(model, &iter, NIL_P(parent) ? NULL : RVAL2GTKTREEITER(parent), NUM2INT(position), c_columns, c_values, size); iter.user_data3 = model; ret = GTKTREEITER2RVAL(&iter); G_CHILD_ADD(self, ret); for(i=0; i<size; i++) { G_CHILD_ADD(ret, rbgobj_gvalue_to_rvalue(&(c_values[i]))); g_value_unset(&(c_values[i])); } #else rb_warn("Gtk::TreeStore#insert(parent, position, values) requires GTK+-2.10.0 or later"); gtk_tree_store_insert(model, &iter, NIL_P(parent) ? NULL : RVAL2GTKTREEITER(parent), NUM2INT(position)); iter.user_data3 = model; ret = GTKTREEITER2RVAL(&iter); G_CHILD_ADD(self, ret); #endif } return ret; }