static VALUE rbclt_model_iter_do_get (VALUE arg) { GetData *data = (GetData *) arg; clutter_model_iter_get_value (data->iter, data->column, &data->value); data->rvalue = GVAL2RVAL (&data->value); return Qnil; }
static void gmc_video_model_iter_set_value (ClutterModelIter *iter, guint column, const GValue *value) { ClutterModel *model; GmcVideoModelPrivate *priv_model; const gchar *name; gchar *query, *str_value; sqlite3_stmt *statement; gint error_code; GType type; GValue title_value = {0, }; model = clutter_model_iter_get_model (iter); priv_model = GMC_VIDEO_MODEL_GET_PRIVATE (model); name = clutter_model_get_column_name (model, column); type = clutter_model_get_column_type (model, column); switch (type) { case G_TYPE_STRING: str_value = g_strdup (g_value_get_string (value)); break; case G_TYPE_UINT: str_value = g_strdup_printf ("%u", g_value_get_uint (value)); break; default: g_warning ("%s : Invalid type", G_STRFUNC); break; } clutter_model_iter_get_value (iter, 0, &title_value); query = g_strdup_printf ("UPDATE %s SET %s = '%s' WHERE Title = '%s'", TABLE, name, str_value, g_value_get_string (&title_value)); error_code = sqlite3_prepare_v2 (priv_model->sql, query, strlen (query), &statement, NULL); g_free (query); if (error_code != SQLITE_OK) { g_critical ("%s [prepare] : %d - %s", G_STRFUNC, error_code, sqlite3_errmsg (priv_model->sql)); return; } error_code = sqlite3_step (statement); if (error_code != SQLITE_DONE) { g_critical ("%s [step] : %d - %s", G_STRFUNC, error_code, sqlite3_errmsg (priv_model->sql)); return; } sqlite3_finalize (statement); }
/* model monitors */ static void model_changed_cb (ClutterModel *model, MxListView *list_view) { GSList *p; GList *l, *children; MxListViewPrivate *priv = list_view->priv; ClutterModelIter *iter = NULL; gint model_n = 0, child_n = 0; /* bail out if we don't yet have an item type or a factory */ if (!priv->item_type && !priv->factory) return; if (priv->is_frozen) return; if (priv->item_type) { /* check the item-type is an descendant of ClutterActor */ if (!g_type_is_a (priv->item_type, CLUTTER_TYPE_ACTOR)) { g_warning ("%s is not a subclass of ClutterActor and therefore" " cannot be used as items in an MxListView", g_type_name (priv->item_type)); return; } } children = clutter_actor_get_children (CLUTTER_ACTOR (list_view)); child_n = g_list_length (children); if (model) model_n = clutter_model_get_n_rows (priv->model); else model_n = 0; /* add children as needed */ while (model_n > child_n) { ClutterActor *new_child; if (priv->item_type) { new_child = g_object_new (priv->item_type, NULL); } else { new_child = mx_item_factory_create (priv->factory); } clutter_actor_add_child (CLUTTER_ACTOR (list_view), new_child); child_n++; } /* remove children as needed */ l = g_list_last (children); while (child_n > model_n) { clutter_actor_remove_child (CLUTTER_ACTOR (list_view), l->data); l = g_list_previous (l); child_n--; } g_list_free (children); if (!priv->model) return; children = clutter_actor_get_children (CLUTTER_ACTOR (list_view)); /* set the properties on the children */ iter = clutter_model_get_first_iter (priv->model); l = children; while (iter && !clutter_model_iter_is_last (iter)) { GObject *child; child = G_OBJECT (l->data); g_object_freeze_notify (child); for (p = priv->attributes; p; p = p->next) { GValue value = { 0, }; AttributeData *attr = p->data; clutter_model_iter_get_value (iter, attr->col, &value); g_object_set_property (child, attr->name, &value); g_value_unset (&value); } g_object_thaw_notify (child); l = g_list_next (l); clutter_model_iter_next (iter); } g_list_free (children); if (iter) g_object_unref (iter); }