static GtkListStore * get_enum_model_for_combo (PangoAttrType type) { static GtkListStore *style_store = NULL, *weight_store = NULL, *variant_store = NULL, *stretch_store = NULL, *gravity_store = NULL, *gravity_hint_store = NULL, *default_store = NULL; switch (type) { case PANGO_ATTR_STYLE: if (!style_store) style_store = glade_utils_liststore_from_enum_type (PANGO_TYPE_STYLE, TRUE); return style_store; case PANGO_ATTR_WEIGHT: if (!weight_store) weight_store = glade_utils_liststore_from_enum_type (PANGO_TYPE_WEIGHT, TRUE); return weight_store; case PANGO_ATTR_VARIANT: if (!variant_store) variant_store = glade_utils_liststore_from_enum_type (PANGO_TYPE_VARIANT, TRUE); return variant_store; case PANGO_ATTR_STRETCH: if (!stretch_store) stretch_store = glade_utils_liststore_from_enum_type (PANGO_TYPE_STRETCH, TRUE); return stretch_store; case PANGO_ATTR_GRAVITY: if (!gravity_store) gravity_store = glade_utils_liststore_from_enum_type (PANGO_TYPE_GRAVITY, TRUE); return gravity_store; case PANGO_ATTR_GRAVITY_HINT: if (!gravity_hint_store) gravity_hint_store = glade_utils_liststore_from_enum_type (PANGO_TYPE_GRAVITY_HINT, TRUE); return gravity_hint_store; default: if (!default_store) default_store = gtk_list_store_new (1, G_TYPE_STRING); return default_store; } }
static GtkTreeViewColumn * eprop_model_generate_column (GladeEditorProperty * eprop, gint colnum, GladeModelData * data) { GtkTreeViewColumn *column = gtk_tree_view_column_new (); GtkCellRenderer *renderer = NULL; GtkAdjustment *adjustment; GtkListStore *store; GType type = G_TYPE_INVALID; gtk_tree_view_column_set_title (column, data->name); gtk_tree_view_column_set_resizable (column, TRUE); gtk_tree_view_column_set_expand (column, TRUE); type = G_VALUE_TYPE (&data->value); /* Support enum and flag types, and a hardcoded list of fundamental types */ if (type == G_TYPE_CHAR || type == G_TYPE_UCHAR || type == G_TYPE_STRING || type == GDK_TYPE_PIXBUF) { /* Text renderer */ renderer = gtk_cell_renderer_text_new (); g_object_set (G_OBJECT (renderer), "editable", TRUE, "ellipsize", PANGO_ELLIPSIZE_END, "width", 90, NULL); gtk_tree_view_column_pack_start (column, renderer, FALSE); gtk_tree_view_column_set_attributes (column, renderer, "text", NUM_COLUMNS + colnum, NULL); if (type == G_TYPE_CHAR || type == G_TYPE_UCHAR) { /* XXX restrict to 1 char !! */ } g_signal_connect (G_OBJECT (renderer), "edited", G_CALLBACK (value_text_edited), eprop); /* Trigger i18n dialog from here */ if (type == G_TYPE_STRING) { GtkCellRenderer *icon_renderer = glade_cell_renderer_icon_new (); g_object_set (G_OBJECT (icon_renderer), "activatable", TRUE, "icon-name", "gtk-edit", NULL); gtk_tree_view_column_pack_start (column, icon_renderer, FALSE); g_object_set_data (G_OBJECT (icon_renderer), "column-number", GINT_TO_POINTER (colnum)); g_signal_connect (G_OBJECT (icon_renderer), "activate", G_CALLBACK (value_i18n_activate), eprop); } } else if (type == G_TYPE_BOOLEAN) { /* Toggle renderer */ renderer = gtk_cell_renderer_toggle_new (); g_object_set (G_OBJECT (renderer), "activatable", TRUE, NULL); gtk_tree_view_column_pack_start (column, renderer, FALSE); gtk_tree_view_column_set_attributes (column, renderer, "active", NUM_COLUMNS + colnum, NULL); g_signal_connect (G_OBJECT (renderer), "toggled", G_CALLBACK (value_toggled), eprop); } /* Check renderer */ else if (type == G_TYPE_INT || type == G_TYPE_UINT || type == G_TYPE_LONG || type == G_TYPE_ULONG || type == G_TYPE_INT64 || type == G_TYPE_UINT64 || type == G_TYPE_FLOAT || type == G_TYPE_DOUBLE) { /* Spin renderer */ renderer = gtk_cell_renderer_spin_new (); adjustment = (GtkAdjustment *) gtk_adjustment_new (0, -G_MAXDOUBLE, G_MAXDOUBLE, 100, 100, 0); g_object_set (G_OBJECT (renderer), "editable", TRUE, "adjustment", adjustment, NULL); gtk_tree_view_column_pack_start (column, renderer, TRUE); gtk_tree_view_column_set_attributes (column, renderer, "text", NUM_COLUMNS + colnum, NULL); if (type == G_TYPE_FLOAT || type == G_TYPE_DOUBLE) g_object_set (G_OBJECT (renderer), "digits", 2, NULL); g_signal_connect (G_OBJECT (renderer), "edited", G_CALLBACK (value_text_edited), eprop); } else if (G_TYPE_IS_ENUM (type)) { /* Combo renderer */ renderer = gtk_cell_renderer_combo_new (); store = glade_utils_liststore_from_enum_type (type, FALSE); g_object_set (G_OBJECT (renderer), "editable", TRUE, "text-column", 0, "has-entry", FALSE, "model", store, NULL); gtk_tree_view_column_pack_start (column, renderer, TRUE); gtk_tree_view_column_set_attributes (column, renderer, "text", NUM_COLUMNS + colnum, NULL); gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (column), renderer, (GtkCellLayoutDataFunc) enum_flags_format_cell_data, NULL, NULL); g_signal_connect (G_OBJECT (renderer), "edited", G_CALLBACK (value_text_edited), eprop); } else if (G_TYPE_IS_FLAGS (type)) { /* Export a flags dialog from glade-editor-property... */ renderer = gtk_cell_renderer_text_new (); g_object_set (G_OBJECT (renderer), "editable", FALSE, NULL); gtk_tree_view_column_pack_start (column, renderer, FALSE); gtk_tree_view_column_set_attributes (column, renderer, "text", NUM_COLUMNS + colnum, NULL); } else /* All uneditable types at this point (currently we dont do object data here, TODO) */ { /* text renderer and object dialog (or raw text for pixbuf) */ renderer = gtk_cell_renderer_text_new (); g_object_set (G_OBJECT (renderer), "editable", FALSE, NULL); gtk_tree_view_column_pack_start (column, renderer, FALSE); } g_signal_connect (G_OBJECT (renderer), "editing-started", G_CALLBACK (data_editing_started), eprop); g_signal_connect (G_OBJECT (renderer), "editing-canceled", G_CALLBACK (data_editing_canceled), eprop); g_object_set_data (G_OBJECT (renderer), "column-number", GINT_TO_POINTER (colnum)); g_object_set_data_full (G_OBJECT (column), "column-type", g_memdup (&type, sizeof (GType)), g_free); return column; }
static GtkTreeView * build_view (GladeEditorProperty * eprop) { GladeEPropIconSources *eprop_sources = GLADE_EPROP_ICON_SOURCES (eprop); static GtkListStore *direction_store = NULL, *size_store = NULL, *state_store = NULL; GtkTreeView *view = (GtkTreeView *) gtk_tree_view_new (); GtkCellRenderer *renderer; GtkTreeViewColumn *column; if (!direction_store) { direction_store = glade_utils_liststore_from_enum_type (GTK_TYPE_TEXT_DIRECTION, FALSE); size_store = glade_utils_liststore_from_enum_type (GTK_TYPE_ICON_SIZE, FALSE); state_store = glade_utils_liststore_from_enum_type (GTK_TYPE_STATE_TYPE, FALSE); } /* Filename / icon name column/renderer */ renderer = gtk_cell_renderer_text_new (); g_object_set (G_OBJECT (renderer), "editable", FALSE, NULL); g_signal_connect (G_OBJECT (renderer), "edited", G_CALLBACK (value_filename_edited), eprop); eprop_sources->filename_column = gtk_tree_view_column_new_with_attributes (_("File Name"), renderer, "text", COLUMN_TEXT, "weight", COLUMN_TEXT_WEIGHT, "editable", COLUMN_TEXT_EDITABLE, NULL); gtk_tree_view_column_set_expand (eprop_sources->filename_column, TRUE); gtk_tree_view_append_column (GTK_TREE_VIEW (view), eprop_sources->filename_column); g_object_set_data (G_OBJECT (eprop_sources->filename_column), "column-id", GINT_TO_POINTER (COLUMN_TEXT)); /********************* Size *********************/ /* Attribute active portion */ renderer = gtk_cell_renderer_toggle_new (); g_object_set (G_OBJECT (renderer), "activatable", TRUE, NULL); g_object_set_data (G_OBJECT (renderer), "attribute-column", GINT_TO_POINTER (COLUMN_SIZE_ACTIVE)); g_signal_connect (G_OBJECT (renderer), "toggled", G_CALLBACK (value_attribute_toggled), eprop); column = gtk_tree_view_column_new_with_attributes ("dummy", renderer, "visible", COLUMN_TEXT_EDITABLE, "active", COLUMN_SIZE_ACTIVE, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (view), column); g_object_set_data (G_OBJECT (column), "column-id", GINT_TO_POINTER (COLUMN_SIZE_ACTIVE)); /* Attribute portion */ renderer = gtk_cell_renderer_combo_new (); g_object_set (G_OBJECT (renderer), "editable", TRUE, "has-entry", FALSE, "text-column", 0, "model", size_store, NULL); g_object_set_data (G_OBJECT (renderer), "attribute-column", GINT_TO_POINTER (COLUMN_SIZE)); g_signal_connect (G_OBJECT (renderer), "edited", G_CALLBACK (value_attribute_edited), eprop); column = gtk_tree_view_column_new_with_attributes ("dummy", renderer, "visible", COLUMN_TEXT_EDITABLE, "editable", COLUMN_SIZE_ACTIVE, "text", COLUMN_SIZE, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (view), column); g_object_set_data (G_OBJECT (column), "column-id", GINT_TO_POINTER (COLUMN_SIZE)); /********************* State *********************/ /* Attribute active portion */ renderer = gtk_cell_renderer_toggle_new (); g_object_set (G_OBJECT (renderer), "activatable", TRUE, NULL); g_object_set_data (G_OBJECT (renderer), "attribute-column", GINT_TO_POINTER (COLUMN_STATE_ACTIVE)); g_signal_connect (G_OBJECT (renderer), "toggled", G_CALLBACK (value_attribute_toggled), eprop); column = gtk_tree_view_column_new_with_attributes ("dummy", renderer, "visible", COLUMN_TEXT_EDITABLE, "active", COLUMN_STATE_ACTIVE, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (view), column); g_object_set_data (G_OBJECT (column), "column-id", GINT_TO_POINTER (COLUMN_STATE_ACTIVE)); /* Attribute portion */ renderer = gtk_cell_renderer_combo_new (); g_object_set (G_OBJECT (renderer), "editable", TRUE, "has-entry", FALSE, "text-column", 0, "model", state_store, NULL); g_object_set_data (G_OBJECT (renderer), "attribute-column", GINT_TO_POINTER (COLUMN_STATE)); g_signal_connect (G_OBJECT (renderer), "edited", G_CALLBACK (value_attribute_edited), eprop); column = gtk_tree_view_column_new_with_attributes ("dummy", renderer, "visible", COLUMN_TEXT_EDITABLE, "editable", COLUMN_STATE_ACTIVE, "text", COLUMN_STATE, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (view), column); g_object_set_data (G_OBJECT (column), "column-id", GINT_TO_POINTER (COLUMN_STATE)); /********************* Direction *********************/ /* Attribute active portion */ renderer = gtk_cell_renderer_toggle_new (); g_object_set (G_OBJECT (renderer), "activatable", TRUE, NULL); g_object_set_data (G_OBJECT (renderer), "attribute-column", GINT_TO_POINTER (COLUMN_DIRECTION_ACTIVE)); g_signal_connect (G_OBJECT (renderer), "toggled", G_CALLBACK (value_attribute_toggled), eprop); column = gtk_tree_view_column_new_with_attributes ("dummy", renderer, "visible", COLUMN_TEXT_EDITABLE, "active", COLUMN_DIRECTION_ACTIVE, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (view), column); g_object_set_data (G_OBJECT (column), "column-id", GINT_TO_POINTER (COLUMN_DIRECTION_ACTIVE)); /* Attribute portion */ renderer = gtk_cell_renderer_combo_new (); g_object_set (G_OBJECT (renderer), "editable", TRUE, "has-entry", FALSE, "text-column", 0, "model", direction_store, NULL); g_object_set_data (G_OBJECT (renderer), "attribute-column", GINT_TO_POINTER (COLUMN_DIRECTION)); g_signal_connect (G_OBJECT (renderer), "edited", G_CALLBACK (value_attribute_edited), eprop); column = gtk_tree_view_column_new_with_attributes ("dummy", renderer, "visible", COLUMN_TEXT_EDITABLE, "editable", COLUMN_DIRECTION_ACTIVE, "text", COLUMN_DIRECTION, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (view), column); g_object_set_data (G_OBJECT (column), "column-id", GINT_TO_POINTER (COLUMN_DIRECTION)); /* Connect ::query-tooltip here for fancy tooltips... */ g_object_set (G_OBJECT (view), "has-tooltip", TRUE, NULL); g_signal_connect (G_OBJECT (view), "query-tooltip", G_CALLBACK (icon_sources_query_tooltip), eprop); gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (view), FALSE); gtk_tree_view_set_show_expanders (GTK_TREE_VIEW (view), FALSE); return view; }