com gtk/php-gtk: Add override for GtkListStore::insert() (based on patch from Scott M): ext/gtk+/gtktreeview.overrides
[email protected] (David Soria Parra) Thu, 13 Oct 2005 05:26:49 +0000
| Newsgroups | php.gtk.cvs |
|---|---|
| Message-ID | <[email protected]> |
Commit: 7d647da01197c6c8b1852c2e080dc3b842f6fca3 Author: Andrei Zmievski <[email protected]> Thu, 13 Oct 2005 05:26:49 +0000 Parents: e32f476d518a542dcb1f666144a29df85cd1c001 Branches: master Link: http://git.php.net/?p=gtk/php-gtk.git;a=commitdiff;h=7d647da01197c6c8b1852c2e080dc3b842f6fca3 Log: Add override for GtkListStore::insert() (based on patch from Scott M) Changed paths: M ext/gtk+/gtktreeview.overrides Diff: 7d647da01197c6c8b1852c2e080dc3b842f6fca3 diff --git a/ext/gtk+/gtktreeview.overrides b/ext/gtk+/gtktreeview.overrides index 89a170b..e66af3d 100644 --- a/ext/gtk+/gtktreeview.overrides +++ b/ext/gtk+/gtktreeview.overrides @@ -161,6 +161,74 @@ PHP_METHOD } %% +override gtk_list_store_insert +PHP_METHOD +{ + GtkTreeIter iter; + GtkTreeModel *model; + gint position; + zval *items = NULL; + + NOT_STATIC_METHOD(); + + if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "i|a", &position, &items)) + return; + + if (position < 0) { + php_error(E_WARNING, "%s::%s() requires argument 1 to be greater than zero, %d given", + get_active_class_name(NULL TSRMLS_CC), get_active_function_name(TSRMLS_C), position); + return; + } + + model = GTK_TREE_MODEL(PHPG_GOBJECT(this_ptr)); + + if (items) { + gint n_cols, i; + gint *columns; + GValue *values; + zval **item; + + n_cols = gtk_tree_model_get_n_columns(model); + if (zend_hash_num_elements(Z_ARRVAL_P(items)) != n_cols) { + php_error(E_WARNING, "Cannot set row: number of row elements does not match the model"); + return; + } + + columns = safe_emalloc(n_cols, sizeof(gint), 0); + values = safe_emalloc(n_cols, sizeof(GValue), 0); + + for (zend_hash_internal_pointer_reset(Z_ARRVAL_P(items)), i = 0; + zend_hash_get_current_data(Z_ARRVAL_P(items), (void **)&item) == SUCCESS; + zend_hash_move_forward(Z_ARRVAL_P(items)), i++) { + g_value_init(&values[i], gtk_tree_model_get_column_type(model, i)); + + if (phpg_gvalue_from_zval(&values[i], *item TSRMLS_CC) == FAILURE) { + php_error(E_WARNING, "Cannot set row: type of element %d does not match the model", i); + for ( ; i >= 0; i--) { + g_value_unset(&values[i]); + } + efree(columns); + efree(values); + return; + } + columns[i] = i; + } + + gtk_list_store_insert_with_valuesv(GTK_LIST_STORE(model), &iter, position, + columns, values, n_cols); + + for (i = 0; i < n_cols; i++) { + g_value_unset(&values[i]); + } + efree(columns); + efree(values); + } else { + gtk_list_store_insert(GTK_LIST_STORE(model), &iter, position); + } + + phpg_gboxed_new(&return_value, GTK_TYPE_TREE_ITER, &iter, TRUE, TRUE TSRMLS_CC); +} +%% add-arginfo GtkListStore set static ZEND_BEGIN_ARG_INFO(ARGINFO_NAME, 0)