com gtk/php-gtk: Implement GtkTreeModel::foreach(): TODO2 ext/gtk+/gtktreeview.overrides

From: Date: Sat, 01 Oct 2005 21:29:28 +0000
Subject: com gtk/php-gtk: Implement GtkTreeModel::foreach(): TODO2 ext/gtk+/gtktreeview.overrides
Groups: php.gtk.cvs 
Request: Send a blank email to php-gtk-cvs+get-4793@lists.php.net to get a copy of this message
Commit: 28dcb5bda4b38797e2c6dd1d9411546d87312dd3 Author: Andrei Zmievski <andrei@php.net> Sat, 1 Oct 2005 21:29:28 +0000 Parents: 4446e13c0bfc2649741ca43c1ae996c164c6451c Branches: master Link: http://git.php.net/?p=gtk/php-gtk.git;a=commitdiff;h=28dcb5bda4b38797e2c6dd1d9411546d87312dd3 Log: Implement GtkTreeModel::foreach() Changed paths: M TODO2 M ext/gtk+/gtktreeview.overrides Diff: 28dcb5bda4b38797e2c6dd1d9411546d87312dd3 diff --git a/TODO2 b/TODO2 index 61069c6..c41304e 100644 --- a/TODO2 +++ b/TODO2 @@ -26,7 +26,6 @@ Classes and Functions implement property access (read/write) * GtkListStore * GtkTreeModel - * foreach() * GtkTreeStore Some iterator functions as get_iter() are expecting a GBoxed parameter. * GtkTreeView diff --git a/ext/gtk+/gtktreeview.overrides b/ext/gtk+/gtktreeview.overrides index c78fd79..4ac6914 100644 --- a/ext/gtk+/gtktreeview.overrides +++ b/ext/gtk+/gtktreeview.overrides @@ -464,6 +464,76 @@ PHP_METHOD } } +%% +override gtk_tree_model_foreach + +gboolean phpg_tree_model_foreach_marshal(GtkTreeModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + gpointer data) +{ + phpg_cb_data_t *cbd = (phpg_cb_data_t *) data; + zval *retval = NULL; + zval ***args = NULL; + int n_args = 0; + char *callback_name; + zval *php_model = NULL, *php_path = NULL, *php_iter = NULL; + gboolean ret; + TSRMLS_FETCH(); + + if (!zend_is_callable(cbd->callback, 0, &callback_name)) { + php_error(E_WARNING, "Unable to invoke callback '%s' specified in %s on line %ld", callback_name, cbd->src_filename, cbd->src_lineno); + efree(callback_name); + return TRUE; + } + + phpg_gobject_new(&php_model, (GObject*)model TSRMLS_CC); + phpg_tree_path_to_zval(path, &php_path TSRMLS_CC); + phpg_gboxed_new(&php_iter, GTK_TYPE_TREE_ITER, iter, TRUE, TRUE TSRMLS_CC); + + args = php_gtk_hash_as_array_offset(cbd->user_args, 3, &n_args); + args[0] = &php_model; + args[1] = &php_path; + args[2] = &php_iter; + + call_user_function_ex(EG(function_table), NULL, cbd->callback, &retval, n_args, args, 0, NULL TSRMLS_CC); + + zval_ptr_dtor(&php_model); + zval_ptr_dtor(&php_path); + zval_ptr_dtor(&php_iter); + + if (retval) { + ret = zend_is_true(retval); + zval_ptr_dtor(&retval); + } else { + ret = TRUE; + } + + efree(callback_name); + efree(args); + + return ret; +} + +PHP_METHOD +{ + zval *callback, *extra; + phpg_cb_data_t *cb_data; + + NOT_STATIC_METHOD(); + + if (!php_gtk_parse_varargs(ZEND_NUM_ARGS(), 1, &extra, "V", &callback)) { + return; + } + + zval_add_ref(&callback); + cb_data = phpg_cb_data_new(callback, extra TSRMLS_CC); + + gtk_tree_model_foreach(GTK_TREE_MODEL(PHPG_GOBJECT(this_ptr)), + phpg_tree_model_foreach_marshal, cb_data); + phpg_cb_data_destroy(cb_data); +} + %% }}} %% {{{ GtkTreeSelection

« previous php.gtk.cvs (#4793) next »