com gtk/php-gtk: Implement a bunch of GtkTreeModel methods.: ext/gtk+/gtktreeview.overrides

[email protected] (David Soria Parra)
Newsgroups php.gtk.cvs
Message-ID <[email protected]>
Commit:    457d72dcf768d497f4f47049a8b1ed4c6dd545f5
Author:    Andrei Zmievski <[email protected]>         Wed, 26 Apr 2006 21:09:47 +0000
Parents:   f0042b2d88e91af0d735a4999415bac0350dffca
Branches:  master

Link:       http://git.php.net/?p=gtk/php-gtk.git;a=commitdiff;h=457d72dcf768d497f4f47049a8b1ed4c6dd545f5

Log:
Implement a bunch of GtkTreeModel methods.

Changed paths:
  M  ext/gtk+/gtktreeview.overrides


Diff:
457d72dcf768d497f4f47049a8b1ed4c6dd545f5
diff --git a/ext/gtk+/gtktreeview.overrides b/ext/gtk+/gtktreeview.overrides
index ff5777f..05f7623 100644
--- a/ext/gtk+/gtktreeview.overrides
+++ b/ext/gtk+/gtktreeview.overrides
@@ -34,6 +34,7 @@ ignore
     gtk_cell_renderer_get_size
     gtk_list_store_newv
     gtk_list_store_set_valist
+    gtk_tree_model_get_valist
     gtk_tree_row_reference_new_proxy
     gtk_tree_row_reference_inserted
     gtk_tree_row_reference_deleted
@@ -1106,6 +1107,55 @@ PHP_METHOD
 }
 
 %%
+override gtk_tree_model_iter_nth_child
+PHP_METHOD
+{
+    GtkTreeIter iter;
+    zval *php_parent_iter = NULL;
+    GtkTreeIter *parent_iter = NULL;
+    int n;
+
+    NOT_STATIC_METHOD();
+
+    if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "Ni", &php_parent_iter, gtktreeiter_ce, &n))
+        return;
+
+    if (php_parent_iter && IS_OBJECT == Z_TYPE_P(php_parent_iter)) {
+        parent_iter = (GtkTreeIter *) PHPG_GBOXED(php_parent_iter);
+    }
+
+    if (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(PHPG_GOBJECT(this_ptr)), &iter, parent_iter, n)) {
+        phpg_gboxed_new(&return_value, GTK_TYPE_TREE_ITER, &iter, TRUE, TRUE TSRMLS_CC);
+    } else {
+        RETURN_NULL();
+    }
+}
+
+%%
+override gtk_tree_model_iter_parent
+PHP_METHOD
+{
+    GtkTreeIter iter;
+    zval *php_child_iter = NULL;
+    GtkTreeIter *child_iter = NULL;
+
+    NOT_STATIC_METHOD();
+
+    if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "|N", &php_child_iter, gtktreeiter_ce))
+        return;
+
+    if (php_child_iter && IS_OBJECT == Z_TYPE_P(php_child_iter)) {
+        child_iter = (GtkTreeIter *) PHPG_GBOXED(php_child_iter);
+    }
+
+    if (gtk_tree_model_iter_parent(GTK_TREE_MODEL(PHPG_GOBJECT(this_ptr)), &iter, child_iter)) {
+        phpg_gboxed_new(&return_value, GTK_TYPE_TREE_ITER, &iter, TRUE, TRUE TSRMLS_CC);
+    } else {
+        RETURN_NULL();
+    }
+}
+
+%%
 add-arginfo GtkTreeModel iter_next
 static
 ZEND_BEGIN_ARG_INFO(ARGINFO_NAME, 0)
@@ -1212,6 +1262,64 @@ PHP_METHOD
     phpg_cb_data_destroy(cb_data);
 }
 
+%%
+override gtk_tree_model_get
+PHP_METHOD
+{
+    GtkTreeModel *model;
+    GtkTreeIter *iter;
+    zval *columns = NULL, *php_iter, **item;
+    int n_columns;
+    zend_bool varargs = false;
+
+    NOT_STATIC_METHOD();
+
+    if (php_gtk_parse_args_quiet(ZEND_NUM_ARGS(), "Oa", &php_iter, gtktreeiter_ce, &columns)) {
+        varargs = false;
+    } else if (php_gtk_parse_varargs(ZEND_NUM_ARGS(), 1, &columns, "O", &php_iter, gtktreeiter_ce)) {
+        varargs = true;
+    }  else {
+        return;
+    }
+
+    model = GTK_TREE_MODEL(PHPG_GOBJECT(this_ptr));
+    iter = (GtkTreeIter *) PHPG_GBOXED(php_iter);
+
+    array_init(return_value);
+    n_columns = gtk_tree_model_get_n_columns(model);
+
+    if (columns) {
+        for (zend_hash_internal_pointer_reset(Z_ARRVAL_P(columns));
+             zend_hash_get_current_data(Z_ARRVAL_P(columns), (void**)&item) == SUCCESS;
+             zend_hash_move_forward(Z_ARRVAL_P(columns))) {
+
+            GValue value = { 0, };
+            zval *zv = NULL;
+            int column;
+
+            convert_to_long_ex(item);
+            if (Z_LVAL_PP(item) < 0 || Z_LVAL_PP(item) >= n_columns) {
+                php_error(E_WARNING, "%s::%s(): column number is out of range - model has %d columns", get_active_class_name(NULL TSRMLS_CC), get_active_function_name(TSRMLS_C), n_columns);
+                if (varargs) zval_ptr_dtor(&columns);
+                zval_dtor(return_value);
+                RETURN_NULL();
+            }
+
+            gtk_tree_model_get_value(model, iter, Z_LVAL_PP(item), &value);
+            if (phpg_gvalue_to_zval(&value, &zv, TRUE, TRUE TSRMLS_CC) == FAILURE) {
+                g_value_unset(&value);
+                if (varargs) zval_ptr_dtor(&columns);
+                zval_dtor(return_value);
+                RETURN_NULL();
+            }
+            add_next_index_zval(return_value, zv);
+            g_value_unset(&value);
+        }
+
+        if (varargs) zval_ptr_dtor(&columns);
+    }
+}
+
 %% }}}
 
 %% {{{ GtkTreeSelection
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.