com gtk/php-gtk: Implement GtkTreeModel::foreach(): TODO2 ext/gtk+/gtktreeview.overrides
| From: | David Soria Parra | 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