static void global_vars_view_type_data_func (GtkTreeViewColumn *col, GtkCellRenderer *cell, GtkTreeModel *global_vars_model, GtkTreeIter *iter, gpointer user_data) { gboolean is_command = FALSE, is_internal = TRUE; /* Assertions */ g_return_if_fail (GTK_IS_CELL_RENDERER_TOGGLE (cell)); /* Check if it's internal */ gtk_tree_model_get (global_vars_model, iter, GLOBAL_VARS_MODEL_COL_IS_INTERNAL, &is_internal, -1); if (is_internal) { g_object_set (cell, "sensitive", FALSE, NULL); gtk_cell_renderer_toggle_set_activatable (GTK_CELL_RENDERER_TOGGLE (cell), FALSE); gtk_cell_renderer_toggle_set_active (GTK_CELL_RENDERER_TOGGLE (cell), FALSE); } else { gtk_tree_model_get (global_vars_model, iter, GLOBAL_VARS_MODEL_COL_IS_COMMAND, &is_command, -1); g_object_set (cell, "sensitive", TRUE, NULL); gtk_cell_renderer_toggle_set_activatable (GTK_CELL_RENDERER_TOGGLE (cell), TRUE); gtk_cell_renderer_toggle_set_active (GTK_CELL_RENDERER_TOGGLE (cell), is_command); } }
GtkTreeView *view_connect(const char *name, ScpTreeStore **store, GtkTreeSelection **selection, const TreeCell *cell_info, const char *window, GObject **display_cell) { guint i; GtkScrolledWindow *scrolled = GTK_SCROLLED_WINDOW(get_widget(window)); GtkAdjustment *hadjustment = gtk_scrolled_window_get_hadjustment(scrolled); GtkTreeView *tree = view_create(name, store, selection); for (i = 0; cell_info->name; cell_info++, i++) { GtkCellRenderer *cell = GTK_CELL_RENDERER(get_object(cell_info->name)); const char *signame; const char *property; if (GTK_IS_CELL_RENDERER_TEXT(cell)) { signame = "edited"; property = "editable"; g_signal_connect(cell, "editing-started", G_CALLBACK(on_editing_started), hadjustment); if (display_cell && i == 0) { g_signal_connect(cell, "editing-started", G_CALLBACK(on_display_editing_started), *store); *display_cell = G_OBJECT(cell); } } else { g_assert(GTK_IS_CELL_RENDERER_TOGGLE(cell)); signame = "toggled"; property = "activatable"; } g_signal_connect(cell, signame, cell_info->callback, GINT_TO_POINTER(i)); g_object_set(cell, property, TRUE, NULL); } return tree; }
static void state_cell_func (GtkTreeViewColumn *column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { GActionGroup *group = data; gchar *name; GVariant *state; gtk_tree_model_get (model, iter, 0, &name, -1); state = g_action_group_get_action_state (group, name); g_free (name); gtk_cell_renderer_set_visible (cell, FALSE); g_object_set (cell, "mode", GTK_CELL_RENDERER_MODE_INERT, NULL); if (state == NULL) return; if (g_variant_is_of_type (state, G_VARIANT_TYPE_BOOLEAN) && GTK_IS_CELL_RENDERER_TOGGLE (cell)) { gtk_cell_renderer_set_visible (cell, TRUE); g_object_set (cell, "mode", GTK_CELL_RENDERER_MODE_ACTIVATABLE, NULL); gtk_cell_renderer_toggle_set_active (GTK_CELL_RENDERER_TOGGLE (cell), g_variant_get_boolean (state)); } else if (g_variant_is_of_type (state, G_VARIANT_TYPE_STRING) && GTK_IS_CELL_RENDERER_COMBO (cell)) { gtk_cell_renderer_set_visible (cell, TRUE); g_object_set (cell, "mode", GTK_CELL_RENDERER_MODE_EDITABLE, NULL); g_object_set (cell, "text", g_variant_get_string (state, NULL), NULL); } g_variant_unref (state); }
static void egg_property_cell_renderer_set_renderer (EggPropertyCellRenderer *renderer, const gchar *prop_name) { EggPropertyCellRendererPrivate *priv; GParamSpec *pspec; gchar *text = NULL; gdouble number; priv = EGG_PROPERTY_CELL_RENDERER_GET_PRIVATE (renderer); pspec = get_pspec_from_object (priv->object, prop_name); /* * Set this renderers mode, so that any actions can be forwarded to our * child renderers. */ switch (pspec->value_type) { /* toggle renderers */ case G_TYPE_BOOLEAN: priv->renderer = priv->toggle_renderer; g_object_set (renderer, "mode", GTK_CELL_RENDERER_MODE_ACTIVATABLE, NULL); break; /* spin renderers */ case G_TYPE_FLOAT: case G_TYPE_DOUBLE: priv->renderer = priv->spin_renderer; g_object_set (renderer, "mode", GTK_CELL_RENDERER_MODE_EDITABLE, NULL); g_object_set (priv->renderer, "digits", 5, NULL); break; case G_TYPE_INT: case G_TYPE_UINT: case G_TYPE_LONG: case G_TYPE_ULONG: case G_TYPE_INT64: case G_TYPE_UINT64: priv->renderer = priv->spin_renderer; g_object_set (renderer, "mode", GTK_CELL_RENDERER_MODE_EDITABLE, NULL); g_object_set (priv->renderer, "digits", 0, NULL); break; /* text renderers */ case G_TYPE_POINTER: case G_TYPE_STRING: priv->renderer = priv->text_renderer; g_object_set (renderer, "mode", GTK_CELL_RENDERER_MODE_EDITABLE, NULL); break; /* combo renderers */ default: if (G_TYPE_IS_ENUM (pspec->value_type)) { priv->renderer = priv->combo_renderer; g_object_set (renderer, "mode", GTK_CELL_RENDERER_MODE_EDITABLE, NULL); } break; } /* * Set the content from the objects property. */ switch (pspec->value_type) { case G_TYPE_BOOLEAN: { gboolean val; g_object_get (priv->object, prop_name, &val, NULL); g_object_set (priv->renderer, "active", val, "activatable", pspec->flags & G_PARAM_WRITABLE ? TRUE : FALSE, NULL); break; } case G_TYPE_INT: case G_TYPE_UINT: case G_TYPE_LONG: case G_TYPE_ULONG: case G_TYPE_INT64: case G_TYPE_UINT64: case G_TYPE_FLOAT: case G_TYPE_DOUBLE: get_string_double_repr (priv->object, prop_name, &text, &number); break; case G_TYPE_STRING: g_object_get (priv->object, prop_name, &text, NULL); break; case G_TYPE_POINTER: { gpointer val; g_object_get (priv->object, prop_name, &val, NULL); text = g_strdup_printf ("0x%x", GPOINTER_TO_INT (val)); } break; default: if (G_TYPE_IS_ENUM (pspec->value_type)) { GParamSpecEnum *pspec_enum; GEnumClass *enum_class; GtkTreeModel *combo_model; GtkTreeIter iter; gint value; g_object_get (priv->object, prop_name, &value, NULL); pspec_enum = G_PARAM_SPEC_ENUM (pspec); enum_class = pspec_enum->enum_class; combo_model = g_hash_table_lookup (priv->combo_models, prop_name); if (combo_model == NULL) { combo_model = GTK_TREE_MODEL (gtk_list_store_new (N_COMBO_COLUMNS, G_TYPE_STRING, G_TYPE_INT)); g_hash_table_insert (priv->combo_models, g_strdup (prop_name), combo_model); for (guint i = 0; i < enum_class->n_values; i++) { gtk_list_store_append (GTK_LIST_STORE (combo_model), &iter); gtk_list_store_set (GTK_LIST_STORE (combo_model), &iter, COMBO_COLUMN_VALUE_NAME, enum_class->values[i].value_name, COMBO_COLUMN_VALUE, enum_class->values[i].value, -1); } } for (guint i = 0; i < enum_class->n_values; i++) { if (enum_class->values[i].value == value) text = g_strdup (enum_class->values[i].value_name); } g_object_set (priv->renderer, "model", combo_model, "text-column", 0, NULL); } break; } if (pspec->flags & G_PARAM_WRITABLE) { if (GTK_IS_CELL_RENDERER_TOGGLE (priv->renderer)) g_object_set (priv->renderer, "mode", GTK_CELL_RENDERER_MODE_ACTIVATABLE, NULL); else g_object_set (priv->renderer, "foreground", "#000000", NULL); if (GTK_IS_CELL_RENDERER_TEXT (priv->renderer)) { g_object_set (priv->renderer, "editable", TRUE, "mode", GTK_CELL_RENDERER_MODE_EDITABLE, NULL); } if (GTK_IS_CELL_RENDERER_SPIN (priv->renderer)) { GtkObject *adjustment = NULL; #define gtk_typed_adjustment_new(type, pspec, val, step_inc, page_inc) \ gtk_adjustment_new (val, ((type *) pspec)->minimum, ((type *) pspec)->maximum, step_inc, page_inc, 0) switch (pspec->value_type) { case G_TYPE_INT: adjustment = gtk_typed_adjustment_new (GParamSpecInt, pspec, number, 1, 10); break; case G_TYPE_UINT: adjustment = gtk_typed_adjustment_new (GParamSpecUInt, pspec, number, 1, 10); break; case G_TYPE_LONG: adjustment = gtk_typed_adjustment_new (GParamSpecLong, pspec, number, 1, 10); break; case G_TYPE_ULONG: adjustment = gtk_typed_adjustment_new (GParamSpecULong, pspec, number, 1, 10); break; case G_TYPE_INT64: adjustment = gtk_typed_adjustment_new (GParamSpecInt64, pspec, number, 1, 10); break; case G_TYPE_UINT64: adjustment = gtk_typed_adjustment_new (GParamSpecUInt64, pspec, number, 1, 10); break; case G_TYPE_FLOAT: adjustment = gtk_typed_adjustment_new (GParamSpecFloat, pspec, number, 0.05, 10); break; case G_TYPE_DOUBLE: adjustment = gtk_typed_adjustment_new (GParamSpecDouble, pspec, number, 0.05, 10); break; } clear_adjustment (G_OBJECT (priv->renderer)); g_object_set (priv->renderer, "adjustment", adjustment, NULL); } } else { g_object_set (priv->renderer, "mode", GTK_CELL_RENDERER_MODE_INERT, NULL); if (!GTK_IS_CELL_RENDERER_TOGGLE (priv->renderer)) g_object_set (priv->renderer, "foreground", "#aaaaaa", NULL); } if (text != NULL) { g_object_set (priv->renderer, "text", text, NULL); g_free (text); } }