[gegl-edit] Improved browse button with 'path' properties



commit 762108e067d93d603f2d8c4a49dfe39fa099569d
Author: Isaac Wagner <isaacbw src gnome org>
Date:   Wed Aug 8 22:09:29 2012 -0400

    Improved browse button with 'path' properties

 gegl-edit/gegl-gtk-property-view.c |   37 ++++++++++++++++++++++++++++++++---
 1 files changed, 33 insertions(+), 4 deletions(-)
---
diff --git a/gegl-edit/gegl-gtk-property-view.c b/gegl-edit/gegl-gtk-property-view.c
index 8b5806a..04edbfd 100644
--- a/gegl-edit/gegl-gtk-property-view.c
+++ b/gegl-edit/gegl-gtk-property-view.c
@@ -163,6 +163,7 @@ typedef struct _propertycallbackdata
   const gchar* prop_name;
   GeglGtkPropertyView *props;
   GtkWidget *value_box;
+  GtkWidget *value_entry;
 } PropertyCallbackData;
 
 static
@@ -270,10 +271,29 @@ proxy_checkbox_toggled (GtkToggleButton *togglebutton, PropertyCallbackData *dat
   }
 }
 
+static void
+file_browse (GtkButton *button, PropertyCallbackData *data)
+{
+  GtkWidget *window = gtk_widget_get_ancestor(GTK_WIDGET(button), GTK_TYPE_WINDOW);
+  GtkWidget *chooser = gtk_file_chooser_dialog_new("Select", GTK_WINDOW(window), 
+						   GTK_FILE_CHOOSER_ACTION_SAVE, 
+						   GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, 
+						   GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
+						   NULL);
+  gint result = gtk_dialog_run(GTK_DIALOG(chooser));
+  if(result)
+    {
+      gtk_entry_set_text(GTK_ENTRY(data->value_entry), gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(chooser)));
+      g_signal_emit_by_name(data->value_entry, "activate");
+    }
+  gtk_widget_destroy(chooser);
+}
+
 static gboolean
 make_value_entry(GtkWidget *value_box, GType type, const gchar *name, GeglNode *node, int *d, PropertyCallbackData *data)
 {
   GtkWidget*	value_entry = gtk_entry_new();
+  data->value_entry = value_entry;
 
   gchar buf[256] = "*";	//can probably be smaller; In fact, can probably do this without sprintf and a buffer. TODO: look at g_string
 
@@ -325,10 +345,19 @@ make_value_entry(GtkWidget *value_box, GType type, const gchar *name, GeglNode *
 	    
   } else if (!strcmp(name, "path")) { //create a special file browser for this property
     skip = TRUE;
-    GtkWidget *file_button = gtk_file_chooser_button_new("Select File", GTK_FILE_CHOOSER_ACTION_OPEN);
+    //GtkWidget *file_button = gtk_file_chooser_button_new("Select File", GTK_FILE_CHOOSER_ACTION_OPEN);
+    //g_signal_connect(file_button, "file-set", (GCallback)property_changed, data);
+    //gtk_box_pack_start(GTK_BOX(value_box), file_button, TRUE, TRUE, 0);
+
+    gtk_entry_set_text(GTK_ENTRY(value_entry), buf);
+    gtk_entry_set_width_chars(GTK_ENTRY(value_entry), 2);
+    g_signal_connect(value_entry, "activate", G_CALLBACK(property_changed), data);
+
+    GtkWidget *browse_button = gtk_button_new_with_label("Browse");
+    g_signal_connect(browse_button, "clicked", G_CALLBACK(file_browse), data);
 
-    g_signal_connect(file_button, "file-set", (GCallback)property_changed, data);
-    gtk_box_pack_start(GTK_BOX(value_box), file_button, TRUE, TRUE, 0);
+    gtk_box_pack_start(GTK_BOX(value_box), value_entry, TRUE, TRUE, 0);
+    gtk_box_pack_start(GTK_BOX(value_box), browse_button, FALSE, FALSE, 0);
   }
 
   if(!skip)
@@ -376,7 +405,7 @@ rebuild_contents(GeglGtkPropertyView *self)
 	  GtkWidget* name_label = gtk_label_new(name);
 	  gtk_misc_set_alignment(GTK_MISC(name_label), 0, 0.5);
 
-	  GtkWidget *value_box = gtk_vbox_new(TRUE, 0);
+	  GtkWidget *value_box = gtk_hbox_new(FALSE, 0);
 
 	  PropertyCallbackData *data = g_new(PropertyCallbackData, 1);
 	  data->node = node;



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