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)