diff options
author | Tristan Van Berkom <tvb@src.gnome.org> | 2008-10-21 02:16:28 +0000 |
---|---|---|
committer | Tristan Van Berkom <tvb@src.gnome.org> | 2008-10-21 02:16:28 +0000 |
commit | 5baf9db1fb47ddf9cb092bb2ad7add80e99a4cab (patch) | |
tree | 3b09c62dfc6ba20368c713109f7ab6766f86297e | |
parent | 98169f37d93d676e59d5c4f4ba58dc3f5bc266be (diff) | |
download | glade-5baf9db1fb47ddf9cb092bb2ad7add80e99a4cab.tar.gz |
Now can optionally make the entry non editable.
* plugins/gtk+/glade-cell-renderer-button.[ch], plugins/gtk+/glade-text-button.[ch]:
Now can optionally make the entry non editable.
* plugins/gtk+/glade-model-data.c: Added pixbuf editing support.
* doc/widgetclasses.sgml, doc/properties.sgml: Clarified docs.
* gladeui/glade-editor-property.[ch]: Removed resource editor, edit pixbuf with
string editor.
* gladeui/glade-widget-adaptor.c, gladeui/glade-property-class.c,
gladeui/glade-project.[ch]: Completely removed concept of resources, glade
no longer copies along pixbufs, pixbuf properties can include full paths
or relative paths, in the glade runtime; any pixbufs are only ever loaded
from the glade project directory (only the basename is used).
svn path=/trunk/; revision=1982
-rw-r--r-- | ChangeLog | 20 | ||||
-rw-r--r-- | doc/properties.sgml | 11 | ||||
-rw-r--r-- | doc/widgetclasses.sgml | 3 | ||||
-rw-r--r-- | gladeui/glade-editor-property.c | 175 | ||||
-rw-r--r-- | gladeui/glade-editor-property.h | 2 | ||||
-rw-r--r-- | gladeui/glade-project.c | 357 | ||||
-rw-r--r-- | gladeui/glade-project.h | 10 | ||||
-rw-r--r-- | gladeui/glade-property-class.c | 40 | ||||
-rw-r--r-- | gladeui/glade-property-class.h | 7 | ||||
-rw-r--r-- | gladeui/glade-widget-adaptor.c | 6 | ||||
-rw-r--r-- | plugins/gtk+/glade-cell-renderer-button.c | 24 | ||||
-rw-r--r-- | plugins/gtk+/glade-gtk.c | 13 | ||||
-rw-r--r-- | plugins/gtk+/glade-model-data.c | 73 | ||||
-rw-r--r-- | plugins/gtk+/glade-text-button.c | 25 |
14 files changed, 146 insertions, 620 deletions
@@ -1,4 +1,22 @@ -2008-10-18 Tristan Van Berkom <tvb@gnome.org> +2008-10-20 Tristan Van Berkom <tvb@gnome.org> + + * plugins/gtk+/glade-cell-renderer-button.[ch], plugins/gtk+/glade-text-button.[ch]: + Now can optionally make the entry non editable. + + * plugins/gtk+/glade-model-data.c: Added pixbuf editing support. + + * doc/widgetclasses.sgml, doc/properties.sgml: Clarified docs. + + * gladeui/glade-editor-property.[ch]: Removed resource editor, edit pixbuf with + string editor. + + * gladeui/glade-widget-adaptor.c, gladeui/glade-property-class.c, + gladeui/glade-project.[ch]: Completely removed concept of resources, glade + no longer copies along pixbufs, pixbuf properties can include full paths + or relative paths, in the glade runtime; any pixbufs are only ever loaded + from the glade project directory (only the basename is used). + +2008-10-19 Tristan Van Berkom <tvb@gnome.org> * plugins/gtk+/glade-cell-renderer-button.[ch], plugins/gtk+/glade-text-button.[ch], plugins/gtk+/glade-model-data.c: Added i18n support to string values in datastores. diff --git a/doc/properties.sgml b/doc/properties.sgml index 4d2be078..465968da 100644 --- a/doc/properties.sgml +++ b/doc/properties.sgml @@ -168,17 +168,6 @@ is the value saved). </varlistentry> <varlistentry> - <term>resource</term> - <listitem> - <para> -Depicts string properties that represent filenames that are packaged with -the glade file (like pixbufs); you can set this to "True" and the string -property will be treated like a resource. - </para> - </listitem> - </varlistentry> - - <varlistentry> <term>themed-icon</term> <listitem> <para> diff --git a/doc/widgetclasses.sgml b/doc/widgetclasses.sgml index 793e5f97..4a1156b9 100644 --- a/doc/widgetclasses.sgml +++ b/doc/widgetclasses.sgml @@ -445,7 +445,8 @@ A #GladeCreateEPropFunc to create widgets to be used in Glade's property editor. <term>string-from-value-function</term> <listitem> <para> -A #GladeStringFromValueFunc to create a string from a #GValue. +A #GladeStringFromValueFunc to create a string from a #GValue, these strings must +be unique and comparable for undo/redo to work properly. </para> </listitem> </varlistentry> diff --git a/gladeui/glade-editor-property.c b/gladeui/glade-editor-property.c index a1ad9723..68dd2bc8 100644 --- a/gladeui/glade-editor-property.c +++ b/gladeui/glade-editor-property.c @@ -1558,10 +1558,17 @@ glade_eprop_text_load (GladeEditorProperty *eprop, GladeProperty *property) if (GTK_IS_ENTRY (eprop_text->text_entry)) { GtkEntry *entry = GTK_ENTRY (eprop_text->text_entry); - const gchar *text = g_value_get_string (property->value); + const gchar *text = NULL; + if (G_VALUE_TYPE (property->value) == G_TYPE_STRING) + text = g_value_get_string (property->value); + else if (G_VALUE_TYPE (property->value) == GDK_TYPE_PIXBUF) + { + GObject *object = g_value_get_object (property->value); + if (object) + text = g_object_get_data (object, "GladeFileName"); + } gtk_entry_set_text (entry, text ? text : ""); - } else if (GTK_IS_TEXT_VIEW (eprop_text->text_entry)) { @@ -1599,10 +1606,12 @@ glade_eprop_text_changed_common (GladeEditorProperty *eprop, gchar *prop_text; if (eprop->property->klass->pspec->value_type == G_TYPE_STRV || - eprop->property->klass->pspec->value_type == G_TYPE_VALUE_ARRAY) + eprop->property->klass->pspec->value_type == G_TYPE_VALUE_ARRAY || + eprop->property->klass->pspec->value_type == GDK_TYPE_PIXBUF) { val = glade_property_class_make_gvalue_from_string - (eprop->property->klass, text, NULL, NULL); + (eprop->property->klass, text, + eprop->property->widget->project, eprop->property->widget); } else { @@ -2202,164 +2211,6 @@ glade_eprop_unichar_create_input (GladeEditorProperty *eprop) } /******************************************************************************* - GladeEditorPropertyResourceClass - *******************************************************************************/ -typedef struct { - GladeEditorProperty parent_instance; - - GtkWidget *entry, *button; -} GladeEPropResource; - -GLADE_MAKE_EPROP (GladeEPropResource, glade_eprop_resource) -#define GLADE_EPROP_RESOURCE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GLADE_TYPE_EPROP_RESOURCE, GladeEPropResource)) -#define GLADE_EPROP_RESOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GLADE_TYPE_EPROP_RESOURCE, GladeEPropResourceClass)) -#define GLADE_IS_EPROP_RESOURCE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GLADE_TYPE_EPROP_RESOURCE)) -#define GLADE_IS_EPROP_RESOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GLADE_TYPE_EPROP_RESOURCE)) -#define GLADE_EPROP_RESOURCE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GLADE_EPROP_RESOURCE, GladeEPropResourceClass)) - -static void -glade_eprop_resource_finalize (GObject *object) -{ - /* Chain up */ - G_OBJECT_CLASS (editor_property_class)->finalize (object); -} - -static void -glade_eprop_resource_entry_activate (GtkEntry *entry, GladeEditorProperty *eprop) -{ - GladeProject *project = glade_widget_get_project (eprop->property->widget); - GValue *value = glade_property_class_make_gvalue_from_string - (eprop->klass, gtk_entry_get_text(entry), project, eprop->property->widget); - - /* Set project resource here where we still have the fullpath. - */ - glade_project_set_resource (project, eprop->property, - gtk_entry_get_text(entry)); - - glade_editor_property_commit (eprop, value); - - g_value_unset (value); - g_free (value); -} - -static gboolean -glade_eprop_resource_entry_focus_out (GtkWidget *entry, - GdkEventFocus *event, - GladeEditorProperty *eprop) -{ - glade_eprop_resource_entry_activate (GTK_ENTRY (entry), eprop); - return FALSE; -} - -static void -glade_eprop_resource_select_file (GtkButton *button, GladeEditorProperty *eprop) -{ - GladeProject *project = glade_widget_get_project (eprop->property->widget); - GtkWidget *dialog; - GtkFileFilter *filter; - GValue *value; - gchar *file, *basename; - - if (eprop->loading) return; - - dialog = gtk_file_chooser_dialog_new ("Select a File", - NULL, - GTK_FILE_CHOOSER_ACTION_OPEN, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, - NULL); - - gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (dialog), TRUE); - - if (eprop->klass->pspec->value_type == GDK_TYPE_PIXBUF) - { - filter = gtk_file_filter_new (); - gtk_file_filter_add_pixbuf_formats (filter); - gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (dialog), filter); - } - - if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) - { - file = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); - - /* Set project resource here where we still have the fullpath. - */ - glade_project_set_resource (project, eprop->property, file); - basename = g_path_get_basename (file); - - value = glade_property_class_make_gvalue_from_string - (eprop->klass, basename, project, eprop->property->widget); - - glade_editor_property_commit (eprop, value); - - g_value_unset (value); - g_free (value); - g_free (file); - g_free (basename); - } - gtk_widget_destroy (dialog); -} - -static void -glade_eprop_resource_load (GladeEditorProperty *eprop, GladeProperty *property) -{ - GladeProjectFormat fmt; - GladeEPropResource *eprop_resource = GLADE_EPROP_RESOURCE (eprop); - gchar *file; - - /* Chain up first */ - editor_property_class->load (eprop, property); - - if (property == NULL) return; - - fmt = glade_project_get_format (property->widget->project); - - file = glade_widget_adaptor_string_from_value - (GLADE_WIDGET_ADAPTOR (eprop->klass->handle), - eprop->klass, property->value, fmt); - if (file) - { - gtk_entry_set_text (GTK_ENTRY (eprop_resource->entry), file); - g_free (file); - } - else - { - gtk_entry_set_text (GTK_ENTRY (eprop_resource->entry), ""); - } -} - -static GtkWidget * -glade_eprop_resource_create_input (GladeEditorProperty *eprop) -{ - GladeEPropResource *eprop_resource = GLADE_EPROP_RESOURCE (eprop); - GtkWidget *hbox; - - hbox = gtk_hbox_new (FALSE, 0); - - eprop_resource->entry = gtk_entry_new (); - gtk_widget_show (eprop_resource->entry); - - eprop_resource->button = gtk_button_new_with_label ("..."); - gtk_widget_show (eprop_resource->button); - - gtk_box_pack_start (GTK_BOX (hbox), eprop_resource->entry, TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (hbox), eprop_resource->button, FALSE, FALSE, 0); - - g_signal_connect (G_OBJECT (eprop_resource->entry), "activate", - G_CALLBACK (glade_eprop_resource_entry_activate), - eprop); - g_signal_connect (G_OBJECT (eprop_resource->entry), "focus-out-event", - G_CALLBACK (glade_eprop_resource_entry_focus_out), - eprop); - g_signal_connect (G_OBJECT (eprop_resource->button), "clicked", - G_CALLBACK (glade_eprop_resource_select_file), - eprop); - - return hbox; -} - - -/******************************************************************************* GladeEditorPropertyObjectClass *******************************************************************************/ enum { diff --git a/gladeui/glade-editor-property.h b/gladeui/glade-editor-property.h index 4c5d4595..078f89ce 100644 --- a/gladeui/glade-editor-property.h +++ b/gladeui/glade-editor-property.h @@ -174,7 +174,6 @@ gboolean glade_editor_property_show_i18n_dialog (GtkWidget #define GLADE_TYPE_EPROP_TEXT (glade_eprop_text_get_type()) #define GLADE_TYPE_EPROP_BOOL (glade_eprop_bool_get_type()) #define GLADE_TYPE_EPROP_UNICHAR (glade_eprop_unichar_get_type()) -#define GLADE_TYPE_EPROP_RESOURCE (glade_eprop_resource_get_type()) #define GLADE_TYPE_EPROP_OBJECT (glade_eprop_object_get_type()) #define GLADE_TYPE_EPROP_OBJECTS (glade_eprop_objects_get_type()) #define GLADE_TYPE_EPROP_ADJUSTMENT (glade_eprop_adjustment_get_type()) @@ -186,7 +185,6 @@ GType glade_eprop_named_icon_get_type (void) G_GNUC_CONST; GType glade_eprop_text_get_type (void) G_GNUC_CONST; GType glade_eprop_bool_get_type (void) G_GNUC_CONST; GType glade_eprop_unichar_get_type (void) G_GNUC_CONST; -GType glade_eprop_resource_get_type (void) G_GNUC_CONST; GType glade_eprop_object_get_type (void) G_GNUC_CONST; GType glade_eprop_objects_get_type (void) G_GNUC_CONST; GType glade_eprop_adjustment_get_type (void) G_GNUC_CONST; diff --git a/gladeui/glade-project.c b/gladeui/glade-project.c index 73cf9106..b3c508de 100644 --- a/gladeui/glade-project.c +++ b/gladeui/glade-project.c @@ -59,8 +59,6 @@ enum WIDGET_NAME_CHANGED, SELECTION_CHANGED, CLOSE, - RESOURCE_ADDED, - RESOURCE_REMOVED, CHANGED, PARSE_FINISHED, CONVERT_FINISHED, @@ -123,8 +121,6 @@ struct _GladeProjectPrivate */ GtkAccelGroup *accel_group; - - GHashTable *resources; /* resource filenames & thier associated properties */ gchar *comment; /* XML comment, Glade will preserve whatever comment was * in file, so users can delete or change it. @@ -190,16 +186,7 @@ static void glade_project_verify_adaptor (GladeProject * gboolean forwidget, GladeSupportMask *mask); -static void glade_project_move_resources (GladeProject *project, - const gchar *old_dir, - const gchar *new_dir); - -static void glade_project_sync_resources_for_widget (GladeProject *project, - GladeProject *prev_project, - GladeWidget *gwidget, - gboolean remove); - -GladeWidget *search_ancestry_by_name (GladeWidget *toplevel, +static GladeWidget *search_ancestry_by_name (GladeWidget *toplevel, const gchar *name); static GtkWidget *glade_project_build_prefs_dialog (GladeProject *project); @@ -311,7 +298,6 @@ glade_project_finalize (GObject *object) if (project->priv->unsaved_number > 0) glade_id_allocator_release (get_unsaved_number_allocator (), project->priv->unsaved_number); - g_hash_table_destroy (project->priv->resources); g_hash_table_destroy (project->priv->target_versions_major); g_hash_table_destroy (project->priv->target_versions_minor); g_hash_table_destroy (project->priv->target_radios); @@ -605,10 +591,6 @@ glade_project_init (GladeProject *project) priv->accel_group = NULL; - priv->resources = g_hash_table_new_full (g_direct_hash, - g_direct_equal, - NULL, g_free); - priv->unsaved_number = glade_id_allocator_allocate (get_unsaved_number_allocator ()); priv->format = GLADE_PROJECT_FORMAT_GTKBUILDER; @@ -662,8 +644,6 @@ glade_project_class_init (GladeProjectClass *klass) klass->widget_name_changed = NULL; klass->selection_changed = NULL; klass->close = NULL; - klass->resource_added = NULL; - klass->resource_removed = NULL; klass->changed = glade_project_changed_impl; /** @@ -756,45 +736,6 @@ glade_project_class_init (GladeProjectClass *klass) G_TYPE_NONE, 0); - - /** - * GladeProject::resource-added: - * @gladeproject: the #GladeProject which received the signal. - * @arg1: the file's basename (in the project path). - * - * Emitted when a resource file required by a #GladeProperty is - * added to @gladeproject - */ - glade_project_signals[RESOURCE_ADDED] = - g_signal_new ("resource-added", - G_TYPE_FROM_CLASS (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GladeProjectClass, resource_added), - NULL, NULL, - g_cclosure_marshal_VOID__STRING, - G_TYPE_NONE, - 1, - G_TYPE_STRING); - - /** - * GladeProject::resource-removed: - * @gladeproject: the #GladeProject which received the signal. - * @arg1: the file's basename - * - * Emitted when a resource file is removed from @gladeproject - */ - glade_project_signals[RESOURCE_REMOVED] = - g_signal_new ("resource-removed", - G_TYPE_FROM_CLASS (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GladeProjectClass, resource_removed), - NULL, NULL, - g_cclosure_marshal_VOID__STRING, - G_TYPE_NONE, - 1, - G_TYPE_STRING); - - /** * GladeProject::changed: * @gladeproject: the #GladeProject which received the signal. @@ -1662,19 +1603,8 @@ glade_project_save (GladeProject *project, const gchar *path, GError **error) if (project->priv->path == NULL || strcmp (canonical_path, project->priv->path)) { - gchar *old_dir, *new_dir, *name, *title; + gchar *name, *title; - if (project->priv->path) - { - old_dir = g_path_get_dirname (project->priv->path); - new_dir = g_path_get_dirname (canonical_path); - - glade_project_move_resources (project, - old_dir, - new_dir); - g_free (old_dir); - g_free (new_dir); - } project->priv->path = (g_free (project->priv->path), g_strdup (canonical_path)); @@ -2203,7 +2133,7 @@ glade_project_verify_project_for_ui (GladeProject *project) } /******************************************************************* - Project object tracking code, name exclusivity, resources etc... + Project object tracking code, name exclusivity etc... *******************************************************************/ static GladeNameContext * name_context_by_widget (GladeProject *project, @@ -2225,7 +2155,7 @@ name_context_by_widget (GladeProject *project, return NULL; } -GladeWidget * +static GladeWidget * search_ancestry_by_name (GladeWidget *toplevel, const gchar *name) { GladeWidget *widget = NULL, *iter; @@ -2475,7 +2405,6 @@ glade_project_add_object (GladeProject *project, GladeNameContext *context; GladeWidget *gwidget; GList *list, *children; - static gint reentrancy_count = 0; gchar *name; g_return_if_fail (GLADE_IS_PROJECT (project)); @@ -2519,9 +2448,6 @@ glade_project_add_object (GladeProject *project, glade_name_context_add_name (context, gwidget->name); if (!gwidget->parent) glade_name_context_add_name (project->priv->toplevel_names, gwidget->name); - - /* Code body starts here */ - reentrancy_count++; if ((children = glade_widget_adaptor_get_children (gwidget->adaptor, gwidget->object)) != NULL) @@ -2542,13 +2468,6 @@ glade_project_add_object (GladeProject *project, /* Update user visible compatability info */ glade_project_verify_properties (gwidget); - - /* Run this once at the end for every recursive call */ - if (--reentrancy_count == 0) - { - glade_project_sync_resources_for_widget - (project, old_project, gwidget, FALSE); - } } /** @@ -2583,7 +2502,6 @@ glade_project_remove_object (GladeProject *project, GObject *object) { GladeWidget *gwidget; GList *link, *list, *children; - static gint reentrancy_count = 0; g_return_if_fail (GLADE_IS_PROJECT (project)); g_return_if_fail (G_IS_OBJECT (object)); @@ -2593,9 +2511,6 @@ glade_project_remove_object (GladeProject *project, GObject *object) if ((gwidget = glade_widget_get_from_gobject (object)) == NULL) return; - - /* Code body starts here */ - reentrancy_count++; if ((children = glade_widget_adaptor_get_children (gwidget->adaptor, @@ -2620,10 +2535,6 @@ glade_project_remove_object (GladeProject *project, GObject *object) glade_project_signals [REMOVE_WIDGET], 0, gwidget); - - /* Call this once at the end for every recursive call */ - if (--reentrancy_count == 0) - glade_project_sync_resources_for_widget (project, NULL, gwidget, TRUE); } static void @@ -3294,269 +3205,41 @@ glade_project_set_accel_group (GladeProject *project, GtkAccelGroup *accel_group project->priv->accel_group = accel_group; } - - - -static void -gp_sync_resources (GladeProject *project, - GladeProject *prev_project, - GladeWidget *gwidget, - gboolean remove) -{ - GList *prop_list, *l; - GladeProperty *property; - gchar *resource, *full_resource; - - prop_list = g_list_copy (gwidget->properties); - prop_list = g_list_concat - (prop_list, g_list_copy (gwidget->packing_properties)); - - for (l = prop_list; l; l = l->next) - { - property = l->data; - if (property->klass->resource) - { - GValue value = { 0, }; - - if (remove) - { - glade_project_set_resource (project, property, NULL); - continue; - } - - glade_property_get_value (property, &value); - - if ((resource = glade_widget_adaptor_string_from_value - (GLADE_WIDGET_ADAPTOR (property->klass->handle), - property->klass, &value, project->priv->format)) != NULL) - { - full_resource = glade_project_resource_fullpath - (prev_project ? prev_project : project, resource); - - /* Use a full path here so that the current - * working directory isnt used. - */ - glade_project_set_resource (project, - property, - full_resource); - - g_free (full_resource); - g_free (resource); - } - g_value_unset (&value); - } - } - g_list_free (prop_list); -} - -static void -glade_project_sync_resources_for_widget (GladeProject *project, - GladeProject *prev_project, - GladeWidget *gwidget, - gboolean remove) -{ - GList *children, *l; - GladeWidget *gchild; - - children = glade_widget_adaptor_get_children - (gwidget->adaptor, gwidget->object); - - for (l = children; l; l = l->next) - if ((gchild = - glade_widget_get_from_gobject (l->data)) != NULL) - glade_project_sync_resources_for_widget - (project, prev_project, gchild, remove); - if (children) - g_list_free (children); - - gp_sync_resources (project, prev_project, gwidget, remove); -} - -static void -glade_project_move_resources (GladeProject *project, - const gchar *old_dir, - const gchar *new_dir) -{ - GList *list, *resources; - gchar *old_name, *new_name; - - if (old_dir == NULL || /* <-- Cant help you :( */ - new_dir == NULL) /* <-- Unlikely */ - return; - - if ((resources = /* Nothing to do here */ - glade_project_list_resources (project)) == NULL) - return; - - for (list = resources; list; list = list->next) - { - old_name = g_build_filename - (old_dir, (gchar *)list->data, NULL); - new_name = g_build_filename - (new_dir, (gchar *)list->data, NULL); - glade_util_copy_file (old_name, new_name); - g_free (old_name); - g_free (new_name); - } - g_list_free (resources); -} - /** * glade_project_resource_fullpath: * @project: The #GladeProject. * @resource: The resource basename * + * Project resource strings may be relative or fullpaths, but glade + * always expects a copy in the glade file directory, this function + * is used to make a local path to the file. + * * Returns: A newly allocated string holding the - * full path the the project resource. + * local path the the project resource. */ gchar * glade_project_resource_fullpath (GladeProject *project, const gchar *resource) { - gchar *fullpath, *project_dir; + gchar *fullpath, *project_dir = NULL, *basename; g_return_val_if_fail (GLADE_IS_PROJECT (project), NULL); - if (project->priv->path == NULL) - return g_strdup (resource); - - project_dir = g_path_get_dirname (project->priv->path); - fullpath = g_build_filename (project_dir, resource, NULL); - g_free (project_dir); - - return fullpath; -} - - -static gboolean -find_resource_by_resource (GladeProperty *key, - const gchar *resource, - const gchar *resource_cmp) -{ - g_assert (resource); - g_assert (resource_cmp); - return (!strcmp (resource, resource_cmp)); -} + basename = g_path_get_basename (resource); - - -/** - * glade_project_set_resource: - * @project: A #GladeProject - * @property: The #GladeProperty this resource is required by - * @resource: The resource file basename to be found in the same - * directory as the glade file. - * - * Adds/Modifies/Removes a resource from a project; any project resources - * will be copied when using "Save As...", when moving widgets across projects - * and will be copied into the project's directory when selected. - */ -void -glade_project_set_resource (GladeProject *project, - GladeProperty *property, - const gchar *resource) -{ - gchar *last_resource, *last_resource_dup = NULL, *base_resource = NULL; - gchar *fullpath, *dirname; - - g_return_if_fail (GLADE_IS_PROJECT (project)); - g_return_if_fail (GLADE_IS_PROPERTY (property)); - - if ((last_resource = - g_hash_table_lookup (project->priv->resources, property)) != NULL) - last_resource_dup = g_strdup (last_resource); - - /* Get dependable input */ - if (resource && resource[0] != '\0' && strcmp (resource, ".")) - base_resource = g_path_get_basename (resource); - - /* If the resource has been removed or the base name has changed - * then remove from hash and emit removed. - */ - if (last_resource_dup && - (base_resource == NULL || strcmp (last_resource_dup, base_resource))) - { - g_hash_table_remove (project->priv->resources, property); - - if (g_hash_table_find (project->priv->resources, - (GHRFunc)find_resource_by_resource, - last_resource_dup) == NULL) - g_signal_emit (G_OBJECT (project), - glade_project_signals [RESOURCE_REMOVED], - 0, last_resource_dup); - } - - /* Copy files when importing widgets with resources. - */ - if (project->priv->path) - { - dirname = g_path_get_dirname (project->priv->path); - fullpath = g_build_filename (dirname, base_resource, NULL); - - if (resource && project->priv->path && - g_file_test (resource, G_FILE_TEST_IS_REGULAR) && - strcmp (fullpath, resource)) - { - /* FIXME: In the case of copy/pasting widgets - * across projects we should ask the user about - * copying any resources. - */ - glade_util_copy_file (resource, fullpath); - } - g_free (fullpath); - g_free (dirname); - } - - if (base_resource) + if (project->priv->path == NULL) { - - /* If the resource has been added or the base name has - * changed then emit added. - */ - if ((last_resource_dup == NULL || - strcmp (last_resource_dup, base_resource)) && - g_hash_table_find (project->priv->resources, - (GHRFunc)find_resource_by_resource, - base_resource) == NULL) - g_signal_emit (G_OBJECT (project), - glade_project_signals [RESOURCE_ADDED], - 0, base_resource); - - g_hash_table_insert (project->priv->resources, property, base_resource); - + project_dir = g_path_get_dirname (project->priv->path); + fullpath = g_build_filename (project_dir, basename, NULL); } - g_free (last_resource_dup); -} - -static void -list_resources_accum (GladeProperty *key, - gchar *value, - GList **list) -{ - *list = g_list_prepend (*list, value); -} - + else + fullpath = g_strdup (basename); + if (project_dir) + g_free (project_dir); + g_free (basename); -/** - * glade_project_list_resources: - * @project: A #GladeProject - * - * Returns: A newly allocated #GList of file basenames - * of resources in this project, note that the - * strings are not allocated and are unsafe to - * use once the projects state changes. - * The returned list should be freed with g_list_free. - */ -GList * -glade_project_list_resources (GladeProject *project) -{ - GList *list = NULL; - g_return_val_if_fail (GLADE_IS_PROJECT (project), NULL); - - g_hash_table_foreach (project->priv->resources, - (GHFunc)list_resources_accum, &list); - return list; + return fullpath; } const gchar * diff --git a/gladeui/glade-project.h b/gladeui/glade-project.h index 904d1562..5a39cd21 100644 --- a/gladeui/glade-project.h +++ b/gladeui/glade-project.h @@ -61,10 +61,6 @@ struct _GladeProjectClass void (*selection_changed) (GladeProject *project); void (*close) (GladeProject *project); - void (*resource_added) (GladeProject *project, - const gchar *resource); - void (*resource_removed) (GladeProject *project, - const gchar *resource); void (*parse_finished) (GladeProject *project); }; @@ -161,12 +157,6 @@ gboolean glade_project_get_has_selection (GladeProject *project); void glade_project_set_accel_group (GladeProject *project, GtkAccelGroup *accel_group); -void glade_project_set_resource (GladeProject *project, - GladeProperty *property, - const gchar *resource); - -GList *glade_project_list_resources (GladeProject *project); - gchar *glade_project_resource_fullpath (GladeProject *project, const gchar *resource); diff --git a/gladeui/glade-property-class.c b/gladeui/glade-property-class.c index 7a49a101..7cfedf5e 100644 --- a/gladeui/glade-property-class.c +++ b/gladeui/glade-property-class.c @@ -86,7 +86,6 @@ glade_property_class_new (gpointer handle) property_class->save_always = FALSE; property_class->ignore = FALSE; property_class->needs_sync = FALSE; - property_class->resource = FALSE; property_class->themed_icon = FALSE; property_class->translatable = FALSE; property_class->atk = FALSE; @@ -318,11 +317,10 @@ glade_property_class_make_string_from_object (GladePropertyClass *property_class if (!object) return NULL; - /* XXX Are pixbufs handled the same in both formats ?? */ if (property_class->pspec->value_type == GDK_TYPE_PIXBUF) { if ((filename = g_object_get_data (object, "GladeFileName")) != NULL) - string = g_path_get_basename (filename); + string = g_strdup (filename); } else if (fmt == GLADE_PROJECT_FORMAT_LIBGLADE && property_class->pspec->value_type == GTK_TYPE_ADJUSTMENT) @@ -483,11 +481,7 @@ glade_property_class_make_string_from_gvalue (GladePropertyClass *property_class } else if (G_IS_PARAM_SPEC_STRING(property_class->pspec)) { - if (property_class->resource && g_value_get_string (value) != NULL) - string = g_path_get_basename - (g_value_get_string (value)); - else - string = g_value_dup_string (value); + string = g_value_dup_string (value); } else if (G_IS_PARAM_SPEC_CHAR(property_class->pspec)) string = g_strdup_printf ("%c", g_value_get_char (value)); @@ -644,7 +638,7 @@ glade_property_class_make_object_from_string (GladePropertyClass *property_class if (*string == '\0') return NULL; fullpath = glade_project_resource_fullpath (project, string); - + if ((pixbuf = gdk_pixbuf_new_from_file (fullpath, NULL)) == NULL) { static GdkPixbuf *icon = NULL; @@ -736,7 +730,7 @@ glade_property_class_make_gvalue_from_string (GladePropertyClass *property_class GladeWidget *widget) { GValue *value = g_new0 (GValue, 1); - gchar **strv, *fullpath; + gchar **strv; GdkColor color = { 0, }; g_value_init (value, property_class->pspec->value_type); @@ -804,20 +798,7 @@ glade_property_class_make_gvalue_from_string (GladePropertyClass *property_class else if (G_IS_PARAM_SPEC_DOUBLE(property_class->pspec)) g_value_set_double (value, g_ascii_strtod (string, NULL)); else if (G_IS_PARAM_SPEC_STRING(property_class->pspec)) - { - /* This can be called when loading defaults from - * catalog files... it wont happen and we cant do - * anything for it. - */ - if (property_class->resource && project) - { - fullpath = g_build_filename - (glade_project_get_path (project), string, NULL); - g_value_set_string (value, fullpath); - g_free (fullpath); - } - else g_value_set_string (value, string); - } + g_value_set_string (value, string); else if (G_IS_PARAM_SPEC_CHAR(property_class->pspec)) g_value_set_char (value, string[0]); else if (G_IS_PARAM_SPEC_UCHAR(property_class->pspec)) @@ -1523,7 +1504,6 @@ glade_property_class_update_from_node (GladeXmlNode *node, klass->visible = glade_xml_get_property_boolean (node, GLADE_TAG_VISIBLE, klass->visible); klass->ignore = glade_xml_get_property_boolean (node, GLADE_TAG_IGNORE, klass->ignore); klass->needs_sync = glade_xml_get_property_boolean (node, GLADE_TAG_NEEDS_SYNC, klass->needs_sync); - klass->resource = glade_xml_get_property_boolean (node, GLADE_TAG_RESOURCE, klass->resource); klass->themed_icon = glade_xml_get_property_boolean (node, GLADE_TAG_THEMED_ICON, klass->themed_icon); klass->weight = glade_xml_get_property_double (node, GLADE_TAG_WEIGHT, klass->weight); klass->transfer_on_paste = glade_xml_get_property_boolean (node, GLADE_TAG_TRANSFER_ON_PASTE, klass->transfer_on_paste); @@ -1534,19 +1514,9 @@ glade_property_class_update_from_node (GladeXmlNode *node, glade_xml_get_property_boolean (node, GLADE_TAG_LIBGLADE_UNSUPPORTED, klass->libglade_unsupported); - /* Special case pixbuf here. - */ - if (klass->pspec->value_type == GDK_TYPE_PIXBUF) - klass->resource = TRUE; - if ((buf = glade_xml_get_property_string (node, GLADE_TAG_FACTORY_STOCK_ID)) != NULL) { - if (!klass->resource) /* Assert the early in the game */ - g_error ("%s only supported on properties that are marked as %s", - GLADE_TAG_FACTORY_STOCK_ID, - GLADE_TAG_RESOURCE); - if (klass->factory_stock_id) g_free (klass->factory_stock_id); klass->factory_stock_id = buf; diff --git a/gladeui/glade-property-class.h b/gladeui/glade-property-class.h index 73903a52..dd58f518 100644 --- a/gladeui/glade-property-class.h +++ b/gladeui/glade-property-class.h @@ -142,13 +142,6 @@ struct _GladePropertyClass gboolean is_modified; /* If true, this property_class has been "modified" from the * the standard property by a xml file. */ - gboolean resource; /* Some property types; such as some file specifying - * string properties or GDK_TYPE_PIXBUF properties; are - * resource files and are treated specialy (a filechooser - * popup is used and the resource is copied to the project - * directory). - */ - gboolean themed_icon; /* Some GParamSpecString properties reffer to icon names * in the icon theme... these need to be specified in the * property class definition if proper editing tools are to diff --git a/gladeui/glade-widget-adaptor.c b/gladeui/glade-widget-adaptor.c index 0d95ecc3..b499ae45 100644 --- a/gladeui/glade-widget-adaptor.c +++ b/gladeui/glade-widget-adaptor.c @@ -1094,7 +1094,7 @@ glade_widget_adaptor_get_eprop_type (GParamSpec *pspec) else if (G_IS_PARAM_SPEC_OBJECT(pspec)) { if (pspec->value_type == GDK_TYPE_PIXBUF) - type = GLADE_TYPE_EPROP_RESOURCE; + type = GLADE_TYPE_EPROP_TEXT; else if (pspec->value_type == GTK_TYPE_ADJUSTMENT) type = GLADE_TYPE_EPROP_ADJUSTMENT; else @@ -1119,10 +1119,6 @@ glade_widget_adaptor_object_create_eprop (GladeWidgetAdaptor *adaptor, */ if ((type = glade_widget_adaptor_get_eprop_type (klass->pspec)) == 0) return NULL; - - /* special case for resource specs which are hand specified in the catalog. */ - if (klass->resource) - type = GLADE_TYPE_EPROP_RESOURCE; /* special case for string specs that denote themed application icons. */ if (klass->themed_icon) diff --git a/plugins/gtk+/glade-cell-renderer-button.c b/plugins/gtk+/glade-cell-renderer-button.c index 47731fc3..f85d3d32 100644 --- a/plugins/gtk+/glade-cell-renderer-button.c +++ b/plugins/gtk+/glade-cell-renderer-button.c @@ -32,6 +32,7 @@ typedef struct { + gboolean entry_editable; gchar *button_text; } GladeCellRendererButtonPrivate; @@ -55,6 +56,7 @@ static GtkCellEditable * glade_cell_renderer_button_start_editing (GtkCellRender GtkCellRendererState flags); enum { PROP_0, + PROP_ENTRY_EDITABLE, PROP_BUTTON_TEXT }; @@ -84,6 +86,14 @@ glade_cell_renderer_button_class_init (GladeCellRendererButtonClass *klass) g_object_class_install_property (object_class, PROP_BUTTON_TEXT, + g_param_spec_boolean ("entry-editable", + _("Entry Editable"), + _("Whether the entry is editable"), + TRUE, + G_PARAM_READWRITE)); + + g_object_class_install_property (object_class, + PROP_BUTTON_TEXT, g_param_spec_string ("button-text", _("Button Text"), _("The text to display in the button"), @@ -109,6 +119,7 @@ glade_cell_renderer_button_init (GladeCellRendererButton *self) priv = GLADE_CELL_RENDERER_BUTTON_GET_PRIVATE (self); + priv->entry_editable = TRUE; priv->button_text = NULL; } @@ -140,6 +151,9 @@ glade_cell_renderer_button_get_property (GObject *object, switch (prop_id) { + case PROP_ENTRY_EDITABLE: + g_value_set_boolean (value, priv->entry_editable); + break; case PROP_BUTTON_TEXT: g_value_set_string (value, priv->button_text); break; @@ -151,9 +165,9 @@ glade_cell_renderer_button_get_property (GObject *object, static void glade_cell_renderer_button_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) + guint prop_id, + const GValue *value, + GParamSpec *pspec) { GladeCellRendererButton *renderer; GladeCellRendererButtonPrivate *priv; @@ -163,6 +177,9 @@ glade_cell_renderer_button_set_property (GObject *object, switch (prop_id) { + case PROP_ENTRY_EDITABLE: + priv->entry_editable = g_value_get_boolean (value); + break; case PROP_BUTTON_TEXT: if (priv->button_text) g_free (priv->button_text); @@ -246,6 +263,7 @@ glade_cell_renderer_button_start_editing (GtkCellRenderer *cell, text_button = (GladeTextButton *)glade_text_button_new (); gtk_entry_set_text (GTK_ENTRY (text_button->entry), cell_text->text); + gtk_entry_set_editable (GTK_ENTRY (text_button->entry), priv->entry_editable); gtk_button_set_label (GTK_BUTTON (text_button->button), priv->button_text); g_object_set (text_button->entry, diff --git a/plugins/gtk+/glade-gtk.c b/plugins/gtk+/glade-gtk.c index c7a27f72..8e8c5158 100644 --- a/plugins/gtk+/glade-gtk.c +++ b/plugins/gtk+/glade-gtk.c @@ -8764,8 +8764,19 @@ glade_gtk_store_string_from_value (GladeWidgetAdaptor *adaptor, str = glade_utils_string_from_value (&data->value, fmt); is_last = !row->next && !iter->next; - g_string_append_printf (string, !is_last ? "%s[%d]:%s|" : "%s[%d]:%s", + g_string_append_printf (string, "%s[%d]:%s", data->name, rownum, str); + + if (data->i18n_translatable) + g_string_append_printf (string, " translatable"); + if (data->i18n_context) + g_string_append_printf (string, " i18n-context:%s", data->i18n_context); + if (data->i18n_comment) + g_string_append_printf (string, " i18n-comment:%s", data->i18n_comment); + + if (!is_last) + g_string_append_printf (string, "|"); + g_free (str); } } diff --git a/plugins/gtk+/glade-model-data.c b/plugins/gtk+/glade-model-data.c index 58da14c5..ac128f4d 100644 --- a/plugins/gtk+/glade-model-data.c +++ b/plugins/gtk+/glade-model-data.c @@ -519,7 +519,7 @@ eprop_model_data_generate_store (GladeEditorProperty *eprop) GArray *gtypes = g_array_new (FALSE, TRUE, sizeof (GType)); GtkTreeIter iter; gint column_num, row_num; - GType index_type = G_TYPE_INT; + GType index_type = G_TYPE_INT, string_type = G_TYPE_STRING; glade_property_get (eprop->property, &data_tree); @@ -531,7 +531,10 @@ eprop_model_data_generate_store (GladeEditorProperty *eprop) for (iter_node = data_tree->children->children; iter_node; iter_node = iter_node->next) { iter_data = iter_node->data; - g_array_append_val (gtypes, G_VALUE_TYPE (&iter_data->value)); + if (G_VALUE_TYPE (&iter_data->value) == GDK_TYPE_PIXBUF) + g_array_append_val (gtypes, string_type); + else + g_array_append_val (gtypes, G_VALUE_TYPE (&iter_data->value)); } store = gtk_list_store_newv (gtypes->len, (GType *)gtypes->data); g_array_free (gtypes, TRUE); @@ -549,7 +552,21 @@ eprop_model_data_generate_store (GladeEditorProperty *eprop) column_num++, iter_node = iter_node->next) { iter_data = iter_node->data; - gtk_list_store_set_value (store, &iter, column_num, &iter_data->value); + + /* Special case, show the filename in the cellrenderertext */ + if (G_VALUE_TYPE (&iter_data->value) == GDK_TYPE_PIXBUF) + { + GObject *object = g_value_get_object (&iter_data->value); + gchar *filename = NULL; + if (object) + filename = g_object_get_data (object, "GladeFileName"); + + gtk_list_store_set (store, &iter, + column_num, filename, + -1); + } + else + gtk_list_store_set_value (store, &iter, column_num, &iter_data->value); } } return store; @@ -644,6 +661,9 @@ value_i18n_clicked (GladeCellRendererButton *cell, eprop_data->pending_data_tree = data_tree; g_idle_add ((GSourceFunc)update_data_tree_idle, eprop); } + else + glade_model_data_tree_free (data_tree); + g_free (new_text); } @@ -659,6 +679,7 @@ value_text_edited (GtkCellRendererText *cell, gint row; GNode *data_tree = NULL; GladeModelData *data; + GValue *value; if (!gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (eprop_data->store), &iter, path)) return; @@ -677,36 +698,13 @@ value_text_edited (GtkCellRendererText *cell, data = glade_model_data_tree_get_data (data_tree, row, colnum); - /* cellrenderertext */ - if (G_VALUE_TYPE (&data->value) == G_TYPE_STRING) - g_value_set_string (&data->value, new_text); - else if (G_VALUE_TYPE (&data->value) == G_TYPE_CHAR) - g_value_set_char (&data->value, new_text ? new_text[0] : '\0'); - else if (G_VALUE_TYPE (&data->value) == G_TYPE_UCHAR) - g_value_set_uchar (&data->value, new_text ? new_text[0] : '\0'); - /* cellrendererspin */ - else if (G_VALUE_TYPE (&data->value) == G_TYPE_INT) - g_value_set_int (&data->value, g_ascii_strtoll (new_text, NULL, 10)); - else if (G_VALUE_TYPE (&data->value) == G_TYPE_UINT) - g_value_set_uint (&data->value, g_ascii_strtoull (new_text, NULL, 10)); - else if (G_VALUE_TYPE (&data->value) == G_TYPE_LONG) - g_value_set_long (&data->value, g_ascii_strtoll (new_text, NULL, 10)); - else if (G_VALUE_TYPE (&data->value) == G_TYPE_ULONG) - g_value_set_ulong (&data->value, g_ascii_strtoull (new_text, NULL, 10)); - else if (G_VALUE_TYPE (&data->value) == G_TYPE_INT64) - g_value_set_int64 (&data->value, g_ascii_strtoll (new_text, NULL, 10)); - else if (G_VALUE_TYPE (&data->value) == G_TYPE_UINT64) - g_value_set_uint64 (&data->value, g_ascii_strtoull (new_text, NULL, 10)); - else if (G_VALUE_TYPE (&data->value) == G_TYPE_FLOAT) - g_value_set_float (&data->value, (float) g_ascii_strtod (new_text, NULL)); - else if (G_VALUE_TYPE (&data->value) == G_TYPE_DOUBLE) - g_value_set_double (&data->value, g_ascii_strtod (new_text, NULL)); - else if (G_TYPE_IS_ENUM (G_VALUE_TYPE (&data->value))) - g_value_set_enum (&data->value, - glade_utils_enum_value_from_string (G_VALUE_TYPE (&data->value), new_text)); - else if (G_TYPE_IS_FLAGS (G_VALUE_TYPE (&data->value))) - g_value_set_enum (&data->value, - glade_utils_flags_value_from_string (G_VALUE_TYPE (&data->value), new_text)); + /* Translate string and update value in tree. */ + value = glade_utils_value_from_string (G_VALUE_TYPE (&data->value), new_text, + eprop->property->widget->project, + eprop->property->widget); + g_value_copy (value, &data->value); + g_value_unset (value); + g_free (value); if (eprop_data->pending_data_tree) glade_model_data_tree_free (eprop_data->pending_data_tree); @@ -732,7 +730,8 @@ eprop_model_generate_column (GladeEditorProperty *eprop, /* 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 == G_TYPE_STRING || + type == GDK_TYPE_PIXBUF) { /* Text renderer */ if (type == G_TYPE_STRING) @@ -743,9 +742,7 @@ eprop_model_generate_column (GladeEditorProperty *eprop, else renderer = gtk_cell_renderer_text_new (); - g_object_set (G_OBJECT (renderer), - "editable", TRUE, - NULL); + g_object_set (G_OBJECT (renderer), "editable", TRUE, NULL); gtk_tree_view_column_pack_start (column, renderer, FALSE); gtk_tree_view_column_set_attributes (column, renderer, "text", NUM_COLUMNS + colnum, @@ -768,8 +765,6 @@ eprop_model_generate_column (GladeEditorProperty *eprop, } } - - /* Text renderer single char */ else if (type == G_TYPE_BOOLEAN) { /* Toggle renderer */ diff --git a/plugins/gtk+/glade-text-button.c b/plugins/gtk+/glade-text-button.c index 428b1122..c4b129cd 100644 --- a/plugins/gtk+/glade-text-button.c +++ b/plugins/gtk+/glade-text-button.c @@ -28,17 +28,20 @@ #include "glade-text-button.h" -#define GLADE_CELL_RENDERER_BUTTON_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GLADE_TYPE_CELL_RENDERER_BUTTON, GladeCellRendererButtonPrivate)) +#define GLADE_CELL_RENDERER_BUTTON_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GLADE_TYPE_CELL_RENDERER_BUTTON, GladeTextButtonPrivate)) typedef struct { gchar *button_text; -} GladeCellRendererButtonPrivate; +} GladeTextButtonPrivate; -static void glade_text_button_finalize (GObject *object); +static void glade_text_button_finalize (GObject *object); static void glade_text_button_cell_editable_init (GtkCellEditableIface *iface); +static void glade_text_button_grab_focus (GtkWidget *widget); + + G_DEFINE_TYPE_WITH_CODE (GladeTextButton, glade_text_button, GTK_TYPE_ALIGNMENT, G_IMPLEMENT_INTERFACE (GTK_TYPE_CELL_EDITABLE, glade_text_button_cell_editable_init)); @@ -48,8 +51,12 @@ static void glade_text_button_class_init (GladeTextButtonClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); - + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + object_class->finalize = glade_text_button_finalize; + widget_class->grab_focus = glade_text_button_grab_focus; + + g_type_class_add_private (object_class, sizeof (GladeTextButtonPrivate)); } static void @@ -66,7 +73,6 @@ glade_text_button_init (GladeTextButton *self) self->button = gtk_button_new (); gtk_box_pack_start (GTK_BOX (self->hbox), self->button, FALSE, FALSE, 0); - } static void @@ -77,7 +83,6 @@ glade_text_button_clicked (GtkWidget *widget, gtk_cell_editable_remove_widget (GTK_CELL_EDITABLE (button)); } - /* GtkCellEditable method implementations */ static void @@ -136,6 +141,14 @@ glade_text_button_finalize (GObject *object) G_OBJECT_CLASS (glade_text_button_parent_class)->finalize (object); } +static void +glade_text_button_grab_focus (GtkWidget *widget) +{ + GladeTextButton *text_button = GLADE_TEXT_BUTTON (widget); + + gtk_widget_grab_focus (text_button->entry); +} + /** * glade_text_button_new: * |