[dia] diagram-as-element: pre-selection of extensions for PROP_TYPE_FILE



commit ac3464f7ff0229651f3e6792f6ed3f13134e1871
Author: Hans Breuer <hans breuer org>
Date:   Fri Jul 30 17:02:46 2010 +0200

    diagram-as-element: pre-selection of extensions for PROP_TYPE_FILE
    
    DONE:
     - make diagrams directly selecteable in the properties dialog
       file entry
     - normalize filenames during save (parent diagram relative path)
       (with earlier commit)
    
    TODO:
     - extend the renderer interface to get rid of the extra DiaImage,
       at least for some renderers (DiaRenderer::set_matrix?)
     - the image gets updated too often, something wrong with mtime check?
     - allow to open the diagram stand-alone by context menu
     - make new object available in the Misc sheet

 lib/prop_text.c                  |    2 ++
 lib/widgets.c                    |   31 +++++++++++++++++++++++++++++--
 lib/widgets.h                    |    1 +
 objects/Misc/diagram_as_object.c |    7 ++++++-
 4 files changed, 38 insertions(+), 3 deletions(-)
---
diff --git a/lib/prop_text.c b/lib/prop_text.c
index b2227d3..248dc32 100644
--- a/lib/prop_text.c
+++ b/lib/prop_text.c
@@ -157,6 +157,8 @@ static GtkWidget *
 fileprop_get_widget(StringProperty *prop, PropDialog *dialog) 
 { 
   GtkWidget *ret = dia_file_selector_new();
+  if (prop->common.extra_data)
+    dia_file_selector_set_extensions (DIAFILESELECTOR(ret), prop->common.extra_data);
   prophandler_connect(&prop->common, G_OBJECT(ret), "value-changed");
   return ret;
 }
diff --git a/lib/widgets.c b/lib/widgets.c
index 1a3817a..41d7e7d 100644
--- a/lib/widgets.c
+++ b/lib/widgets.c
@@ -1369,6 +1369,7 @@ struct _DiaFileSelector
   GtkButton *browse;
   GtkWidget *dialog;
   gchar *sys_filename;
+  gchar *pattern; /* for supported formats */
 };
 
 struct _DiaFileSelectorClass
@@ -1396,6 +1397,10 @@ dia_file_selector_unrealize(GtkWidget *widget)
     g_free(fs->sys_filename);
     fs->sys_filename = NULL;
   }
+  if (fs->pattern) {
+    g_free (fs->pattern);
+    fs->pattern = NULL;
+  }
 
   (* GTK_WIDGET_CLASS (gtk_type_class(gtk_hbox_get_type ()))->unrealize) (widget);
 }
@@ -1471,7 +1476,10 @@ dia_file_selector_browse_pressed(GtkWidget *widget, gpointer data)
     
     filter = gtk_file_filter_new ();
     gtk_file_filter_set_name (filter, _("Supported Formats"));
-    gtk_file_filter_add_pixbuf_formats (filter);
+    if (fs->pattern)
+      gtk_file_filter_add_pattern (filter, fs->pattern);
+    else /* fallback */
+      gtk_file_filter_add_pixbuf_formats (filter);
     gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
 
     filter = gtk_file_filter_new ();
@@ -1497,7 +1505,8 @@ dia_file_selector_init (DiaFileSelector *fs)
 {
   /* Here's where we set up the real thing */
   fs->dialog = NULL;
-  fs->sys_filename = NULL;  
+  fs->sys_filename = NULL;
+  fs->pattern = NULL;
 
   fs->entry = GTK_ENTRY(gtk_entry_new());
   gtk_box_pack_start(GTK_BOX(fs), GTK_WIDGET(fs->entry), FALSE, TRUE, 0);
@@ -1545,6 +1554,24 @@ dia_file_selector_new ()
 }
 
 void
+dia_file_selector_set_extensions  (DiaFileSelector *fs, const gchar **exts)
+{
+  GString *pattern = g_string_new ("*.");
+  int i = 0;
+
+  g_free (fs->pattern);
+
+  while (exts[i] != NULL) {
+    if (i != 0)
+      g_string_append (pattern, "|*.");
+    g_string_append (pattern, exts[i]);
+    ++i;
+  }
+  fs->pattern = pattern->str;
+  g_string_free (pattern, FALSE);
+}
+
+void
 dia_file_selector_set_file(DiaFileSelector *fs, gchar *file)
 {
   /* filename is in system encoding */
diff --git a/lib/widgets.h b/lib/widgets.h
index 6af033a..07a8dda 100644
--- a/lib/widgets.h
+++ b/lib/widgets.h
@@ -120,6 +120,7 @@ void       dia_arrow_selector_set_arrow     (DiaArrowSelector *as,
 
 GType      dia_file_selector_get_type        (void);
 GtkWidget* dia_file_selector_new             (void);
+void       dia_file_selector_set_extensions  (DiaFileSelector *fs, const gchar **exts);
 void       dia_file_selector_set_file        (DiaFileSelector *fs, char *file);
 const gchar *dia_file_selector_get_file        (DiaFileSelector *fs);
 
diff --git a/objects/Misc/diagram_as_object.c b/objects/Misc/diagram_as_object.c
index 63cc7bd..78bf7a1 100644
--- a/objects/Misc/diagram_as_object.c
+++ b/objects/Misc/diagram_as_object.c
@@ -102,6 +102,8 @@ DiaObjectType diagram_as_element_type =
 
 static void _dae_update_data (DiagramAsElement *dae);
 
+static const gchar *_extensions[] = { "dia", NULL };
+
 static PropDescription _dae_props[] = {
   ELEMENT_COMMON_PROPERTIES,
   PROP_STD_LINE_WIDTH,
@@ -109,7 +111,7 @@ static PropDescription _dae_props[] = {
   PROP_STD_FILL_COLOUR,
   PROP_STD_SHOW_BACKGROUND,
   { "diagram_file", PROP_TYPE_FILE, PROP_FLAG_VISIBLE,
-    N_("Diagram file"), NULL, NULL},
+    N_("Diagram file"), NULL, /* extra_data */_extensions },
   PROP_DESC_END
 };
 static PropDescription *
@@ -352,6 +354,9 @@ _dae_load (ObjectNode obj_node, int version, const char *filename)
     g_free (dae->filename);
     dae->filename = filename;
     g_free (dirname);
+
+    /* need to update again with new filenames */
+    _dae_update_data(dae);
   }
   return obj;
 }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]