Author: abrander
Date: 2009-08-05 23:57:02 +0200 (Wed, 05 Aug 2009)
New Revision: 2611

Modified:
   trunk/src/rs-toolbox.c
Log:
[285] Fixed curve open/save regression and added very simple presets based on 
saved curves.

Modified: trunk/src/rs-toolbox.c
===================================================================
--- trunk/src/rs-toolbox.c      2009-08-05 17:58:41 UTC (rev 2610)
+++ trunk/src/rs-toolbox.c      2009-08-05 21:57:02 UTC (rev 2611)
@@ -361,6 +361,195 @@
        }
 }
 
+static void
+curve_context_callback_save(GtkMenuItem *menuitem, gpointer user_data)
+{
+       RSCurveWidget *curve = RS_CURVE_WIDGET(user_data);
+       GtkWidget *fc;
+       gchar *dir;
+
+       fc = gtk_file_chooser_dialog_new (_("Export File"), NULL,
+               GTK_FILE_CHOOSER_ACTION_SAVE,
+               GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+               GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL);
+       gtk_dialog_set_default_response(GTK_DIALOG(fc), GTK_RESPONSE_ACCEPT);
+#if GTK_CHECK_VERSION(2,8,0)
+       gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (fc), 
TRUE);
+#endif
+
+       /* Set default directory */
+       dir = g_build_filename(rs_confdir_get(), "curves", NULL);
+       g_mkdir_with_parents(dir, 00755);
+       gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER (fc), dir);
+       g_free(dir);
+
+       if (gtk_dialog_run (GTK_DIALOG (fc)) == GTK_RESPONSE_ACCEPT)
+       {
+               char *filename;
+               filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER 
(fc));
+               if (filename)
+               {
+                       if (!g_str_has_suffix(filename, ".rscurve"))
+                       {
+                               GString *gs;
+                               gs = g_string_new(filename);
+                               g_string_append(gs, ".rscurve");
+                               g_free(filename);
+                               filename = gs->str;
+                               g_string_free(gs, FALSE);
+                       }
+                       rs_curve_widget_save(curve, filename);
+                       g_free(filename);
+               }
+       }
+       gtk_widget_destroy(fc);
+}
+
+static void
+curve_context_callback_open(GtkMenuItem *menuitem, gpointer user_data)
+{
+       RSCurveWidget *curve = RS_CURVE_WIDGET(user_data);
+       GtkWidget *fc;
+       gchar *dir;
+
+       fc = gtk_file_chooser_dialog_new (_("Open curve ..."), NULL,
+               GTK_FILE_CHOOSER_ACTION_OPEN,
+               GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+               GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL);
+       gtk_dialog_set_default_response(GTK_DIALOG(fc), GTK_RESPONSE_ACCEPT);
+
+       /* Set default directory */
+       dir = g_build_filename(rs_confdir_get(), "curves", NULL);
+       g_mkdir_with_parents(dir, 00755);
+       gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER (fc), dir);
+       g_free(dir);
+
+       if (gtk_dialog_run (GTK_DIALOG (fc)) == GTK_RESPONSE_ACCEPT)
+       {
+               char *filename;
+               filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER 
(fc));
+               if (filename)
+               {
+                       rs_curve_widget_load(curve, filename);
+                       g_free(filename);
+               }
+       }
+       gtk_widget_destroy(fc);
+}
+
+static void
+curve_context_callback_reset(GtkMenuItem *menuitem, gpointer user_data)
+{
+       RSCurveWidget *curve = RS_CURVE_WIDGET(user_data);
+
+       gulong handler = g_signal_handler_find(curve, G_SIGNAL_MATCH_FUNC, 0, 
0, NULL, curve_changed, NULL);
+       g_signal_handler_block(curve, handler);
+
+       rs_curve_widget_reset(curve);
+       rs_curve_widget_add_knot(curve, 0.0,0.0);
+       g_signal_handler_unblock(curve, handler);
+       rs_curve_widget_add_knot(curve, 1.0,1.0);
+}
+
+static void
+curve_context_callback_white_black_point(GtkMenuItem *menuitem, gpointer 
user_data)
+{
+       /* FIXME: Stub. Convert this to an action */
+}
+
+static void
+curve_context_callback_preset(GtkMenuItem *menuitem, gpointer user_data)
+{
+       RSCurveWidget *curve = RS_CURVE_WIDGET(user_data);
+
+       gchar *filename;
+       filename = g_object_get_data(G_OBJECT(menuitem), "filename");
+       if (filename)
+       {
+               gchar *fullname = g_build_filename(rs_confdir_get(), "curves", 
filename, NULL);
+               rs_curve_widget_load(curve, fullname);
+               g_free(fullname);
+       }
+}
+
+static void
+curve_context_callback(GtkWidget *widget, gpointer user_data)
+{
+       GtkWidget *i, *menu = gtk_menu_new();
+       gint n=0;
+
+       const gchar *filename;
+       GList *list = NULL;
+       gchar *dirpath = g_build_filename(rs_confdir_get(), "curves", NULL);
+       GDir *dir = g_dir_open(dirpath, 0, NULL);
+       while((filename = g_dir_read_name(dir)))
+               if (g_str_has_suffix(filename, ".rscurve"))
+                       list = g_list_prepend(list, g_strdup(filename));
+       g_dir_close(dir);
+       g_free(dirpath);
+
+       list = g_list_sort(list, (GCompareFunc) g_strcmp0);
+
+       GList *p = list;
+       while (p)
+       {
+               gchar *name = (gchar *) p->data;
+
+               gchar *ext = g_strrstr(name, ".rscurve");
+               if (ext)
+               {
+                       ext[0] = '\0';
+
+                       i = 
gtk_image_menu_item_new_from_stock(GTK_STOCK_REVERT_TO_SAVED, NULL);
+                       gtk_menu_item_set_label(GTK_MENU_ITEM(i), name);
+                       gtk_widget_show (i);
+                       gtk_menu_attach (GTK_MENU (menu), i, 0, 1, n, n+1); n++;
+                       g_signal_connect (i, "activate", G_CALLBACK 
(curve_context_callback_preset), widget);
+
+                       ext[0] = '.';
+                       g_object_set_data_full(G_OBJECT(i), "filename", name, 
g_free);
+               }
+               else
+                       g_free(name);
+
+               p = g_list_next(p);
+       }
+
+       g_list_free(list);
+
+       /* If any files were added before this, add a seperator */
+       if (n > 0)
+       {
+               i = gtk_separator_menu_item_new();
+               gtk_widget_show (i);
+               gtk_menu_attach (GTK_MENU (menu), i, 0, 1, n, n+1); n++;
+       }
+
+       i = gtk_image_menu_item_new_from_stock(GTK_STOCK_OPEN, NULL);
+       gtk_menu_item_set_label(GTK_MENU_ITEM(i), _("Open curve ..."));
+       gtk_widget_show (i);
+       gtk_menu_attach (GTK_MENU (menu), i, 0, 1, n, n+1); n++;
+       g_signal_connect (i, "activate", G_CALLBACK 
(curve_context_callback_open), widget);
+
+       i = gtk_image_menu_item_new_from_stock(GTK_STOCK_SAVE_AS, NULL);
+       gtk_menu_item_set_label(GTK_MENU_ITEM(i), _("Save curve as ..."));
+       gtk_widget_show (i);
+       gtk_menu_attach (GTK_MENU (menu), i, 0, 1, n, n+1); n++;
+       g_signal_connect (i, "activate", G_CALLBACK 
(curve_context_callback_save), widget);
+
+       i = gtk_image_menu_item_new_from_stock(GTK_STOCK_REFRESH, NULL);
+       gtk_menu_item_set_label(GTK_MENU_ITEM(i), _("Reset curve"));
+       gtk_widget_show (i);
+       gtk_menu_attach (GTK_MENU (menu), i, 0, 1, n, n+1); n++;
+       g_signal_connect (i, "activate", G_CALLBACK 
(curve_context_callback_reset), widget);
+
+       i = gtk_menu_item_new_with_label (_("Auto adjust curve ends"));
+       gtk_widget_show (i);
+       gtk_menu_attach (GTK_MENU (menu), i, 0, 1, n, n+1); n++;
+       g_signal_connect (i, "activate", G_CALLBACK 
(curve_context_callback_white_black_point), NULL);
+       gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 0, 
GDK_CURRENT_TIME);
+}
+
 /* FIXME: Move gui_box_* somewhere sane! */
 
 static void
@@ -431,6 +620,7 @@
        toolbox->curve[snapshot] = rs_curve_widget_new();
        g_object_set_data(G_OBJECT(toolbox->curve[snapshot]), "rs-snapshot", 
GINT_TO_POINTER(snapshot));
        g_signal_connect(toolbox->curve[snapshot], "changed", 
G_CALLBACK(curve_changed), toolbox);
+       g_signal_connect(toolbox->curve[snapshot], "right-click", 
G_CALLBACK(curve_context_callback), NULL);
 
        /* Pack everything nice */
        gtk_box_pack_start(GTK_BOX(vbox), gui_box(_("Basic"), 
GTK_WIDGET(table), "show_basic", TRUE), FALSE, FALSE, 0);


_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit

Reply via email to