mirror of
https://github.com/php/php-gtk-src.git
synced 2026-03-26 18:22:09 +01:00
- Register some fundamental GTypes as constants.
- Implement GtkListStore::append(), GtkListStore::set(), and
GtkTreeModel::get_value().
All this allows things like:
class mine {
var $a = 5;
var $b;
function __construct($b) {
$this->b = $b;
}
}
$store = new GtkListStore(Gtk::TYPE_PHP_VALUE);
$iter = $store->append();
$o = new Mine(99);
$store->set($iter, 0, $o);
var_dump($store->get_value($iter, 0));
This commit is contained in:
@@ -38,6 +38,7 @@ ignore
|
||||
gtk_init
|
||||
gtk_init_check
|
||||
gtk_list_store_newv
|
||||
gtk_list_store_set_valist
|
||||
gtk_true
|
||||
%% }}}
|
||||
|
||||
@@ -201,6 +202,23 @@ constants
|
||||
phpg_register_int_constant(gtk_ce, "PRIORITY_HIGH_IDLE", sizeof("PRIORITY_HIGH_IDLE")-1, G_PRIORITY_HIGH_IDLE);
|
||||
phpg_register_int_constant(gtk_ce, "PRIORITY_DEFAULT_IDLE", sizeof("PRIORITY_DEFAULT_IDLE")-1, G_PRIORITY_DEFAULT_IDLE);
|
||||
phpg_register_int_constant(gtk_ce, "PRIORITY_LOW", sizeof("PRIORITY_LOW")-1, G_PRIORITY_LOW);
|
||||
|
||||
/* Fundamental GTypes */
|
||||
phpg_register_int_constant(gtk_ce, "TYPE_INVALID", sizeof("TYPE_INVALID")-1, G_TYPE_INVALID);
|
||||
phpg_register_int_constant(gtk_ce, "TYPE_NONE", sizeof("TYPE_NONE")-1, G_TYPE_NONE);
|
||||
phpg_register_int_constant(gtk_ce, "TYPE_INTERFACE", sizeof("TYPE_INTERFACE")-1, G_TYPE_INTERFACE);
|
||||
phpg_register_int_constant(gtk_ce, "TYPE_CHAR", sizeof("TYPE_CHAR")-1, G_TYPE_CHAR);
|
||||
phpg_register_int_constant(gtk_ce, "TYPE_BOOLEAN", sizeof("TYPE_BOOLEAN")-1, G_TYPE_BOOLEAN);
|
||||
phpg_register_int_constant(gtk_ce, "TYPE_LONG", sizeof("TYPE_LONG")-1, G_TYPE_LONG);
|
||||
phpg_register_int_constant(gtk_ce, "TYPE_ENUM", sizeof("TYPE_ENUM")-1, G_TYPE_ENUM);
|
||||
phpg_register_int_constant(gtk_ce, "TYPE_FLAGS", sizeof("TYPE_FLAGS")-1, G_TYPE_FLAGS);
|
||||
phpg_register_int_constant(gtk_ce, "TYPE_DOUBLE", sizeof("TYPE_DOUBLE")-1, G_TYPE_DOUBLE);
|
||||
phpg_register_int_constant(gtk_ce, "TYPE_STRING", sizeof("TYPE_STRING")-1, G_TYPE_STRING);
|
||||
phpg_register_int_constant(gtk_ce, "TYPE_POINTER", sizeof("TYPE_POINTER")-1, G_TYPE_POINTER);
|
||||
phpg_register_int_constant(gtk_ce, "TYPE_BOXED", sizeof("TYPE_BOXED")-1, G_TYPE_BOXED);
|
||||
phpg_register_int_constant(gtk_ce, "TYPE_PARAM", sizeof("TYPE_PARAM")-1, G_TYPE_PARAM);
|
||||
phpg_register_int_constant(gtk_ce, "TYPE_OBJECT", sizeof("TYPE_OBJECT")-1, G_TYPE_OBJECT);
|
||||
phpg_register_int_constant(gtk_ce, "TYPE_PHP_VALUE", sizeof("TYPE_PHP_VALUE")-1, G_TYPE_PHP_VALUE);
|
||||
%% }}}
|
||||
|
||||
%% {{{ main loop
|
||||
@@ -608,6 +626,7 @@ PHP_METHOD
|
||||
}
|
||||
%% }}}
|
||||
|
||||
%% {{{ GtkListStore
|
||||
%%
|
||||
override gtk_list_store_new
|
||||
PHP_METHOD
|
||||
@@ -644,6 +663,98 @@ PHP_METHOD
|
||||
phpg_gobject_set_wrapper(this_ptr, wrapped_obj TSRMLS_CC);
|
||||
}
|
||||
|
||||
%%
|
||||
override gtk_list_store_append
|
||||
PHP_METHOD
|
||||
{
|
||||
GtkTreeIter iter;
|
||||
zval *items = NULL;
|
||||
|
||||
NOT_STATIC_METHOD();
|
||||
|
||||
if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "|a", &items))
|
||||
return;
|
||||
|
||||
gtk_list_store_append(GTK_LIST_STORE(PHPG_GOBJECT(this_ptr)), &iter);
|
||||
|
||||
/* TODO optionally set items */
|
||||
|
||||
phpg_gboxed_new(&return_value, GTK_TYPE_TREE_ITER, &iter, TRUE, TRUE TSRMLS_CC);
|
||||
}
|
||||
|
||||
%%
|
||||
override gtk_list_store_set
|
||||
PHP_METHOD
|
||||
{
|
||||
zval ***items;
|
||||
zval *php_iter;
|
||||
GtkTreeIter *iter = NULL;
|
||||
GtkTreeModel *model;
|
||||
int i, argc = ZEND_NUM_ARGS();
|
||||
|
||||
NOT_STATIC_METHOD();
|
||||
|
||||
if (argc < 3) {
|
||||
php_error(E_WARNING, "%s::%s() requires at least 3 arguments, %d given",
|
||||
get_active_class_name(NULL TSRMLS_CC), get_active_function_name(TSRMLS_C), argc);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!php_gtk_parse_args(1, "O", &php_iter, gtktreeiter_ce))
|
||||
return;
|
||||
|
||||
iter = (GtkTreeIter *) PHPG_GBOXED(php_iter);
|
||||
|
||||
if ((argc-1) % 2) {
|
||||
php_error(E_WARNING, "%s::%s() requires arguments 2-n to be column/value pairs",
|
||||
get_active_class_name(NULL TSRMLS_CC), get_active_function_name(TSRMLS_C));
|
||||
return;
|
||||
}
|
||||
|
||||
model = GTK_TREE_MODEL(PHPG_GOBJECT(this_ptr));
|
||||
items = php_gtk_func_args(argc);
|
||||
for (i = 1; i < argc; i += 2) {
|
||||
zval *zcolumn = *items[i];
|
||||
zval *zvalue = *items[i+1];
|
||||
gint column;
|
||||
GValue value = { 0 };
|
||||
|
||||
if (Z_TYPE_P(zcolumn) != IS_LONG) {
|
||||
php_error(E_WARNING, "%s::%s() requires arguments %d to be an integer, %s given",
|
||||
get_active_class_name(NULL TSRMLS_CC), get_active_function_name(TSRMLS_C),
|
||||
i, zend_zval_type_name(zcolumn));
|
||||
efree(items);
|
||||
return;
|
||||
}
|
||||
|
||||
column = Z_LVAL_P(zcolumn);
|
||||
if (column < 0 || column >= gtk_tree_model_get_n_columns(model)) {
|
||||
php_error(E_WARNING, "%s::%s(): argument %d is out of range - model has %d column(s)",
|
||||
get_active_class_name(NULL TSRMLS_CC), get_active_function_name(TSRMLS_C),
|
||||
i, gtk_tree_model_get_n_columns(model));
|
||||
efree(items);
|
||||
return;
|
||||
}
|
||||
|
||||
g_value_init(&value, gtk_tree_model_get_column_type(model, column));
|
||||
|
||||
if (phpg_gvalue_from_zval(&value, zvalue TSRMLS_CC) == FAILURE) {
|
||||
php_error(E_WARNING, "%s::%s(): argument %d is of the wrong type for column %d",
|
||||
get_active_class_name(NULL TSRMLS_CC), get_active_function_name(TSRMLS_C),
|
||||
i+1, column);
|
||||
efree(items);
|
||||
return;
|
||||
}
|
||||
|
||||
gtk_list_store_set_value(GTK_LIST_STORE(PHPG_GOBJECT(this_ptr)), iter, column, &value);
|
||||
|
||||
g_value_unset(&value);
|
||||
}
|
||||
|
||||
efree(items);
|
||||
}
|
||||
%% }}}
|
||||
|
||||
%% {{{ GtkMessageDialog
|
||||
%%
|
||||
override gtk_message_dialog_new
|
||||
@@ -902,6 +1013,36 @@ PHP_METHOD
|
||||
}
|
||||
%% }}}
|
||||
|
||||
|
||||
%%
|
||||
override gtk_tree_model_get_value
|
||||
PHP_METHOD
|
||||
{
|
||||
zval *php_iter;
|
||||
GtkTreeIter *iter;
|
||||
GtkTreeModel *model;
|
||||
gint column;
|
||||
GValue value = { 0 };
|
||||
|
||||
NOT_STATIC_METHOD();
|
||||
|
||||
if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "Oi", &php_iter, gtktreeiter_ce, &column))
|
||||
return;
|
||||
|
||||
model = GTK_TREE_MODEL(PHPG_GOBJECT(this_ptr));
|
||||
iter = (GtkTreeIter *) PHPG_GBOXED(php_iter);
|
||||
|
||||
if (column < 0 || column >= gtk_tree_model_get_n_columns(model)) {
|
||||
php_error(E_WARNING, "%s::%s(): column is out of range - model has %d column(s)",
|
||||
get_active_class_name(NULL TSRMLS_CC), get_active_function_name(TSRMLS_C),
|
||||
gtk_tree_model_get_n_columns(model));
|
||||
return;
|
||||
}
|
||||
|
||||
gtk_tree_model_get_value(model, iter, column, &value);
|
||||
phpg_gvalue_to_zval(&value, &return_value, TRUE TSRMLS_CC);
|
||||
}
|
||||
|
||||
%% {{{ GtkWidget
|
||||
%%
|
||||
override gtk_widget_intersect
|
||||
|
||||
Reference in New Issue
Block a user