[gegl-edit] Implemented Save so after you SaveAs or Open, you can Save over the current file. Changed the wave s



commit 90f73b854be159f5a3883b097329136d129056b4
Author: Isaac Wagner <isaacbw src gnome org>
Date:   Wed Aug 8 16:38:33 2012 -0400

    Implemented Save so after you SaveAs or Open, you can Save over the current file. Changed the wave save works. Now you need to create and connect an output proxy node to specify the output for the composition. Opening a graph adds existing proxy nodes to the canvas (current deserialization code creates and input and output proxy for every loaded graph)

 gegl-edit/gegl-edit.c |  146 ++++++++++++++++++++++++++++++++++++++++++++-----
 gegl-edit/menubar.ui  |   29 +++++-----
 2 files changed, 146 insertions(+), 29 deletions(-)
---
diff --git a/gegl-edit/gegl-edit.c b/gegl-edit/gegl-edit.c
index c20df30..22b0d02 100644
--- a/gegl-edit/gegl-edit.c
+++ b/gegl-edit/gegl-edit.c
@@ -18,6 +18,7 @@ typedef struct CallbackData
   GtkWidget	*property_view;
   GtkMenu       *popup;
   GtkMenu       *popup2;
+  const gchar *filename;
 } CallbackData;
 
 static const gchar* query_proxy(GeglGtkPropertyView *view, GeglNode *node, const gchar *property, CallbackData* data);
@@ -75,6 +76,7 @@ main (gint	  argc,
   GtkWidget *props = gegl_gtk_property_view_new(NULL);
 
   CallbackData *data = g_new(CallbackData, 1);
+  data->filename = NULL;
   data->window = window;
   data->view_stack = g_queue_new();
   g_queue_push_head(data->view_stack, GRAPH_GTK_VIEW(view));
@@ -391,7 +393,12 @@ G_MODULE_EXPORT void activated_add_input(GtkMenuItem *menuitem, gpointer user_da
     {
       const gchar *name = gtk_entry_get_text(GTK_ENTRY(name_entry));
       GraphGtkNode *node = graph_gtk_node_new();
-      graph_gtk_node_set_name(node, name);
+
+      GString *str = g_string_new("input-proxy: ");
+      str = g_string_append(str, name);
+      graph_gtk_node_set_name(node, str->str);
+      g_string_free(str, TRUE);
+
       graph_gtk_node_add_pad(node, "output", TRUE);
       graph_gtk_view_add_node(g_queue_peek_head(data->view_stack), node);
       GeglNode *proxy = gegl_node_get_input_proxy(g_queue_peek_head(data->graph_stack), name);
@@ -429,7 +436,12 @@ G_MODULE_EXPORT void activated_add_output(GtkMenuItem *menuitem, gpointer user_d
     {
       const gchar *name = gtk_entry_get_text(GTK_ENTRY(name_entry));
       GraphGtkNode *node = graph_gtk_node_new();
-      graph_gtk_node_set_name(node, name);
+
+      GString *str = g_string_new("output-proxy: ");
+      str = g_string_append(str, name);
+      graph_gtk_node_set_name(node, str->str);
+      g_string_free(str, TRUE);
+
       graph_gtk_node_add_pad(node, "input", FALSE);
       graph_gtk_view_add_node(g_queue_peek_head(data->view_stack), node);
       GeglNode *proxy = gegl_node_get_output_proxy(g_queue_peek_head(data->graph_stack), name);
@@ -444,7 +456,7 @@ G_MODULE_EXPORT void activated_open(GtkMenuItem *menuitem, gpointer user_data)
   CallbackData *data = user_data;
   GraphGtkView *view = g_queue_peek_head(data->view_stack);
 
-  GtkFileChooserDialog	*file_select = GTK_FILE_CHOOSER_DIALOG(gtk_file_chooser_dialog_new("Save As", GTK_WINDOW(data->window), 
+  GtkFileChooserDialog	*file_select = GTK_FILE_CHOOSER_DIALOG(gtk_file_chooser_dialog_new("Open", GTK_WINDOW(data->window), 
 											   GTK_FILE_CHOOSER_ACTION_OPEN, 
 											   GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
 											   GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
@@ -453,9 +465,36 @@ G_MODULE_EXPORT void activated_open(GtkMenuItem *menuitem, gpointer user_data)
   if(result == GTK_RESPONSE_ACCEPT)
     {
       const gchar	*filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(file_select));
+      data->filename = filename;
+      gtk_window_set_title(GTK_WINDOW(data->window), filename);
+
       GeglNode* gegl = gegl_node_new_from_file(filename);
 
-      load_graph(view, gegl);
+      while(g_queue_get_length(data->graph_stack) > 0)
+	{
+	  GtkWidget *view = GTK_WIDGET(g_queue_pop_head(data->view_stack));
+	  gtk_container_remove(GTK_CONTAINER(data->view_box), view);
+	  gtk_box_pack_start(GTK_BOX(data->view_box), GTK_WIDGET(g_queue_peek_head(data->view_stack)), TRUE, TRUE, 0);
+	  gtk_widget_destroy(view);
+
+	  GeglNode *node =   g_queue_pop_head(data->graph_stack);
+	}
+
+      GtkWidget *view = graph_gtk_view_new();
+      gtk_box_pack_start(GTK_BOX(data->view_box), view, TRUE, TRUE, 0);
+      gtk_widget_show(view);
+      load_graph(GRAPH_GTK_VIEW(view), gegl);
+
+      g_queue_push_head(data->view_stack, view);
+      g_queue_push_head(data->graph_stack, gegl);
+
+      g_signal_connect(view, "canvas-rightclicked", G_CALLBACK(canvas_rightclicked), data);
+      g_signal_connect(view, "node-selected", G_CALLBACK(node_selected), data);
+      g_signal_connect(view, "node-deselected", G_CALLBACK(node_deselected), data);
+      g_signal_connect(view, "node-doubleclicked", G_CALLBACK(node_doubleclicked), data);
+      g_signal_connect(view, "node-rightclicked", G_CALLBACK(node_rightclicked), data);
+      g_signal_connect(view, "nodes-connected", G_CALLBACK(nodes_connected), data);
+      g_signal_connect(view, "nodes-disconnected", G_CALLBACK(nodes_disconnected), data);
     }
 
   gtk_widget_destroy(GTK_WIDGET(file_select));
@@ -489,24 +528,76 @@ G_MODULE_EXPORT void activated_save_as(GtkMenuItem *menuitem, gpointer user_data
     {
       const gchar	*filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(file_select));
 
-      //Try to guess at an output
-      GeglNode* first = gegl_node_get_nth_child(g_queue_peek_head(data->graph_stack), 0);
-      GeglNode* last = getFinalNode(first);
+      gtk_widget_destroy(GTK_WIDGET(file_select));
+      GeglNode *last = gegl_node_get_output_proxy(g_queue_peek_head(data->graph_stack), "output");
 
-      g_print("Final node: %s\n", gegl_node_get_operation(last));
-      const gchar	*xml = gegl_node_to_xml(last, "/");
+      gint result = GTK_RESPONSE_OK;
 
-      g_print("%s\n", filename);
+      if(!gegl_node_get_producer(last, "input", NULL))
+	{
+	  GtkWidget *dialog = gtk_message_dialog_new (GTK_WINDOW(data->window),
+						      GTK_DIALOG_DESTROY_WITH_PARENT,
+						      GTK_MESSAGE_ERROR,
+						      GTK_BUTTONS_OK_CANCEL,
+						      "Nothing is connected to the graph's output proxy. Saving will result in an empty graph. Save anyway?");
+	  result = gtk_dialog_run (GTK_DIALOG (dialog));
+	  gtk_widget_destroy (dialog);
+	}
 
-      g_file_set_contents(filename, xml, -1, NULL);	//TODO: check for error
-    }
+      if(result == GTK_RESPONSE_OK)
+	{
+	  data->filename = filename;
+	  gtk_window_set_title(GTK_WINDOW(data->window), filename);
 
-  gtk_widget_destroy(GTK_WIDGET(file_select));
+	  g_print("Final node: %s\n", gegl_node_get_operation(last));
+	  const gchar	*xml = gegl_node_to_xml(last, "/");
+
+	  g_print("%s\n", data->filename);
+
+	  g_file_set_contents(data->filename, xml, -1, NULL);	//TODO: check for error
+	}
+    }
+  else
+    {
+      gtk_widget_destroy(GTK_WIDGET(file_select));
+    }
 }
 
 G_MODULE_EXPORT void activated_save(GtkMenuItem *menuitem, gpointer user_data)
 {
   CallbackData *data = user_data;
+  if(data->filename == NULL) {
+    activated_save_as(menuitem, user_data);
+  }
+  else {
+    //Try to guess at an output
+    //GeglNode* first = gegl_node_get_nth_child(g_queue_peek_head(data->graph_stack), 0);
+    //GeglNode* last = getFinalNode(first);
+    GeglNode *last = gegl_node_get_output_proxy(g_queue_peek_head(data->graph_stack), "output");
+
+    gint result = GTK_RESPONSE_OK;
+
+    if(!gegl_node_get_producer(last, "input", NULL))
+      {
+	GtkWidget *dialog = gtk_message_dialog_new (GTK_WINDOW(data->window),
+					 GTK_DIALOG_DESTROY_WITH_PARENT,
+					 GTK_MESSAGE_ERROR,
+					 GTK_BUTTONS_OK_CANCEL,
+					 "Nothing is connected to the graph's output proxy. Saving will result in an empty graph. Save anyway?");
+	result = gtk_dialog_run (GTK_DIALOG (dialog));
+	gtk_widget_destroy (dialog);
+      }
+
+    if(result == GTK_RESPONSE_OK)
+      {
+	g_print("Final node: %s\n", gegl_node_get_operation(last));
+	const gchar	*xml = gegl_node_to_xml(last, "/");
+
+	g_print("%s\n", data->filename);
+
+	g_file_set_contents(data->filename, xml, -1, NULL);	//TODO: check for error
+      }
+  }
 }
 
 G_MODULE_EXPORT void activated_delete(GtkMenuItem *menuitem, gpointer user_data)
@@ -521,7 +612,7 @@ G_MODULE_EXPORT void activated_delete(GtkMenuItem *menuitem, gpointer user_data)
     {
       GraphGtkNode *node = list->data;
       gegl_node_disconnect_all_pads(node->user_data);
-      gegl_node_remove_child(graph, node);
+      gegl_node_remove_child(graph, node->user_data);
     }
   
   graph_gtk_view_remove_selected_nodes(g_queue_peek_head(data->view_stack));
@@ -800,6 +891,33 @@ static void load_graph(GraphGtkView *view, GeglNode *gegl)
       g_hash_table_insert(hash_table, node, view_node);
     }
 
+  GSList *pads;
+  for(pads = gegl_node_get_input_pads(gegl); pads != NULL; pads = pads->next)
+    {
+      GeglNode *node = gegl_node_get_input_proxy(gegl, gegl_pad_get_name(pads->data));
+      GraphGtkNode *view_node = add_gegl_node_to_view(view, node);
+
+      GString *str = g_string_new("input-proxy: ");
+      str = g_string_append(str, gegl_pad_get_name(pads->data));
+      graph_gtk_node_set_name(view_node, str->str);
+      g_string_free(str, TRUE);
+
+      g_hash_table_insert(hash_table, node, view_node);
+    }
+
+  if(gegl_node_get_pad(gegl, "output"))
+    {
+      GeglNode *node = gegl_node_get_output_proxy(gegl, "output");
+      GraphGtkNode *view_node = add_gegl_node_to_view(view, node);
+
+      GString *str = g_string_new("output-proxy: ");
+      str = g_string_append(str, "output");
+      graph_gtk_node_set_name(view_node, str->str);
+      g_string_free(str, TRUE);
+
+      g_hash_table_insert(hash_table, node, view_node);
+    }
+
   for(list = gegl_node_get_children(gegl); list != NULL; list = list->next)
     {
       GeglNode* node = GEGL_NODE(list->data);
diff --git a/gegl-edit/menubar.ui b/gegl-edit/menubar.ui
index 6317b89..81f0185 100644
--- a/gegl-edit/menubar.ui
+++ b/gegl-edit/menubar.ui
@@ -1,18 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <!-- interface-requires gtk+ 3.0 -->
-  <object class="GtkImage" id="image6">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
-    <property name="xalign">0.47999998927116394</property>
-    <property name="stock">gtk-yes</property>
-  </object>
-  <object class="GtkImage" id="image7">
+  <object class="GtkImage" id="image5">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
-    <property name="xalign">0.49000000953674316</property>
-    <property name="yalign">0.49000000953674316</property>
-    <property name="stock">gtk-yes</property>
+    <property name="stock">gtk-cancel</property>
   </object>
   <object class="GtkImage" id="image1">
     <property name="visible">True</property>
@@ -37,15 +29,23 @@
     <property name="can_focus">False</property>
     <property name="stock">gtk-add</property>
   </object>
-  <object class="GtkImage" id="image5">
+  <object class="GtkImage" id="image8">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
-    <property name="stock">gtk-cancel</property>
+    <property name="stock">gtk-add</property>
   </object>
-  <object class="GtkImage" id="image8">
+  <object class="GtkImage" id="image6">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
-    <property name="stock">gtk-add</property>
+    <property name="xalign">0.47999998927116394</property>
+    <property name="stock">gtk-yes</property>
+  </object>
+  <object class="GtkImage" id="image7">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="xalign">0.49000000953674316</property>
+    <property name="yalign">0.49000000953674316</property>
+    <property name="stock">gtk-yes</property>
   </object>
   <object class="GtkMenuBar" id="menu_bar">
     <property name="visible">True</property>
@@ -223,7 +223,6 @@
                         <property name="can_focus">False</property>
                         <property name="image">image3</property>
                         <property name="use_stock">False</property>
-                        <signal name="activate" handler="activated_metaop_properties" swapped="no"/>
                       </object>
                     </child>
                   </object>



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