Updating branch refs/heads/master
         to f5d46e944af70a9295936e92713120c1717a822d (commit)
       from c75e25ed2aaaa38cdecc1e4149c96739ba3b6444 (commit)

commit f5d46e944af70a9295936e92713120c1717a822d
Author: Mike Massonnet <mmasson...@xfce.org>
Date:   Mon Nov 15 07:41:36 2010 +0100

    Add configurable notes path
    
    Xnp.Application has a new notes-path property that can be tweaked
    through Xfconf. The new directory must be writable and empty.
    
    Added a directory button inside the settings dialog to choose the new
    notes path.

 lib/application.vala       |   68 ++++++++++++++++++++++++++++++++++++-------
 src/xfce4-notes-settings.c |   66 ++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 122 insertions(+), 12 deletions(-)

diff --git a/lib/application.vala b/lib/application.vala
index df4414f..1f45804 100644
--- a/lib/application.vala
+++ b/lib/application.vala
@@ -25,17 +25,11 @@ namespace Xnp {
        public class Application : GLib.Object {
 
                private SList<Xnp.Window> window_list;
-               private string notes_path;
+               public string notes_path { get; set construct; }
                public string config_file { get; construct; }
                private Xfconf.Channel xfconf_channel;
 
                construct {
-                       notes_path = "%s/notes".printf 
(GLib.Environment.get_user_data_dir ());
-               }
-
-               public Application (string config_file) {
-                       GLib.Object (config_file: config_file);
-
                        var notesgtkrc = "%s/xfce4/xfce4-notes.gtkrc".printf 
(GLib.Environment.get_user_config_dir ());
                        Gtk.rc_parse (notesgtkrc);
 
@@ -56,19 +50,27 @@ namespace Xnp {
                        }
 
                        xfconf_channel = new Xfconf.Channel.with_property_base 
("xfce4-panel", "/plugins/notes");
-                       update_color ();
 
+                       update_color ();
                        
xfconf_channel.property_changed["/global/background-color"].connect (() => {
                                update_color ();
                        });
-
                        Gtk.Settings.get_default 
().notify["gtk-theme-name"].connect (() => {
                                update_color ();
                        });
 
+                       if (notes_path == null) {
+                               var default_path = "%s/notes".printf 
(GLib.Environment.get_user_data_dir ());
+                               notes_path = xfconf_channel.get_string 
("/global/notes-path", default_path);
+                       }
+                       
xfconf_channel.property_changed["/global/notes-path"].connect (() => {
+                               update_notes_path ();
+                       });
+
                        string name;
                        bool found = false;
                        try {
+                               /* Load existing windows */
                                var dir = Dir.open (notes_path, 0);
                                while ((name = dir.read_name ()) != null) {
                                        create_window (name);
@@ -79,10 +81,19 @@ namespace Xnp {
                                GLib.DirUtils.create_with_parents (notes_path, 
0700);
                        }
                        if (found == false) {
+                               /* Create first-run window */
                                create_window ();
                        }
                }
 
+               public Application (string config_file) {
+                       GLib.Object (config_file: config_file);
+               }
+
+               public Application.with_notes_path (string config_file, string 
notes_path) {
+                       GLib.Object (config_file: config_file, notes_path: 
notes_path);
+               }
+
                ~Application () {
                        save_windows_configuration ();
                        xfconf_channel = null;
@@ -93,6 +104,41 @@ namespace Xnp {
                        }
                }
 
+               private void update_notes_path () {
+                       var new_notes_path = xfconf_channel.get_string 
("/global/notes-path", notes_path);
+                       if (notes_path == new_notes_path) {
+                               return;
+                       }
+
+                       /* Check that the new path is empty */
+                       try {
+                               var dir = Dir.open (new_notes_path, 0);
+                               if (dir.read_name () != null) {
+                                       var error_dialog = new 
Gtk.MessageDialog (null, 0, Gtk.MessageType.ERROR, Gtk.ButtonsType.CLOSE,
+                                               _("Select notes path"));
+                                       error_dialog.format_secondary_text 
(_("The selected directory (%s) for the new notes path already contains files. 
You must select or create an empty directory."), new_notes_path);
+                                       error_dialog.run ();
+                                       error_dialog.destroy ();
+                                       xfconf_channel.set_string 
("/global/notes-path", notes_path);
+                                       return;
+                               }
+                       }
+                       catch (GLib.Error e) {
+                       }
+
+                       /* Create/move to the new path */
+                       var dirname = Path.get_dirname (new_notes_path);
+                       if (GLib.DirUtils.create_with_parents (dirname, 0700) 
!= 0 || GLib.FileUtils.rename (notes_path, new_notes_path) != 0) {
+                               var error_dialog = new Gtk.MessageDialog (null, 
0, Gtk.MessageType.ERROR, Gtk.ButtonsType.CLOSE,
+                                       _("Select notes path"));
+                               error_dialog.format_secondary_text (_("Unable 
to select directory for new notes path: %s"), strerror (errno));
+                               error_dialog.run ();
+                               error_dialog.destroy ();
+                               xfconf_channel.set_string 
("/global/notes-path", notes_path);
+                               return;
+                       }
+               }
+
                private void update_color () {
                        string color = xfconf_channel.get_string 
("/global/background-color", "#F7EB96");
                        if (color == "GTK+") {
@@ -243,8 +289,8 @@ namespace Xnp {
                                while ((name = dir.read_name ()) != null) {
                                        try {
                                                string contents;
-                                               string filename = 
"%s/%s".printf (path, name);
-                                               GLib.FileUtils.get_contents 
(filename, out contents, null);
+                                               var file = File.new_for_path 
("%s/%s".printf (path, name));
+                                               GLib.FileUtils.get_contents 
(file.get_path (), out contents, null);
                                                var note = window.insert_note 
();
                                                note.name = name;
                                                var buffer = 
note.text_view.get_buffer ();
diff --git a/src/xfce4-notes-settings.c b/src/xfce4-notes-settings.c
index f66bb13..00f8b51 100644
--- a/src/xfce4-notes-settings.c
+++ b/src/xfce4-notes-settings.c
@@ -30,6 +30,9 @@
 #include "defines.h"
 #include "color.h"
 
+static GtkWidget *notes_path_button_new ();
+static void cb_notes_path_changed (GtkFileChooserButton *button, gpointer 
data);
+
 enum
 {
   COMBOBOX_TABS_NONE,
@@ -77,6 +80,7 @@ static gboolean timeout_cb_background_changed (gchar *color);
 static GtkWidget *color_button_new ();
 static gboolean cb_color_button_pressed (GtkButton *button, GdkEventButton 
*event, gpointer data);
 
+static GtkWidget *parent_window = NULL;
 static XfconfChannel *xfconf_channel = NULL;
 static GtkWidget *color_combobox = NULL;
 static GtkWidget *color_button = NULL;
@@ -91,7 +95,7 @@ prop_dialog_new (void)
     xfconf_channel = xfconf_channel_new_with_property_base ("xfce4-panel", 
"/plugins/notes");
 
   /* Dialog */
-  dialog =
+  parent_window = dialog =
     xfce_titled_dialog_new_with_buttons (_("Notes"), NULL,
                                          
GTK_DIALOG_DESTROY_WITH_PARENT|GTK_DIALOG_NO_SEPARATOR,
                                          GTK_STOCK_CLOSE, GTK_RESPONSE_OK,
@@ -126,6 +130,16 @@ prop_dialog_new (void)
                           G_TYPE_BOOLEAN, G_OBJECT (button), "active");
   gtk_box_pack_start (GTK_BOX (box), button, TRUE, FALSE, 0);
 
+  /* Notes path */
+  hbox = gtk_hbox_new (FALSE, BORDER);
+  gtk_box_pack_start (GTK_BOX (box), hbox, TRUE, FALSE, 0);
+
+  label = gtk_label_new (_("Notes path:"));
+  gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+
+  button = notes_path_button_new (dialog);
+  gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
+
   /* Tabs position */
   hbox = gtk_hbox_new (FALSE, BORDER);
   gtk_box_pack_start (GTK_BOX (box), hbox, TRUE, FALSE, 0);
@@ -198,6 +212,56 @@ prop_dialog_new (void)
 }
 
 static GtkWidget *
+notes_path_button_new (void)
+{
+  GtkWidget *dialog, *button;
+  gchar *default_path, *notes_path;
+
+  default_path = g_strdup_printf ("%s/notes", g_get_user_data_dir ());
+  notes_path = xfconf_channel_get_string (xfconf_channel, 
"/global/notes-path", default_path);
+
+  dialog = gtk_file_chooser_dialog_new (_("Select notes path"), GTK_WINDOW 
(parent_window),
+                                        GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+                                        GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                                        GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
+                                        NULL);
+  gtk_window_set_icon_name (GTK_WINDOW (dialog), GTK_STOCK_DIRECTORY);
+
+  button = GTK_WIDGET (g_object_new (GTK_TYPE_FILE_CHOOSER_BUTTON,
+                                     "title", _("Select notes path"),
+                                     "width-chars", 15,
+                                     "action", GTK_FILE_CHOOSER_ACTION_OPEN,
+                                     "dialog", dialog,
+                                     NULL));
+  g_object_set (dialog, "action", GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, NULL);
+  gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (button), notes_path);
+
+  g_signal_connect (button, "file-set", G_CALLBACK (cb_notes_path_changed), 
NULL);
+
+  g_free (default_path);
+  g_free (notes_path);
+
+  return button;
+}
+
+static void
+cb_notes_path_changed (GtkFileChooserButton *button,
+                       gpointer data)
+{
+  GFile *file;
+  gchar *notes_path;
+
+  file = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (button));
+  notes_path = g_file_get_path (file);
+
+  if (notes_path != NULL)
+    xfconf_channel_set_string (xfconf_channel, "/global/notes-path", 
notes_path);
+
+  g_object_unref (file);
+  g_free (notes_path);
+}
+
+static GtkWidget *
 tabs_combo_box_new (void)
 {
   GtkWidget *combobox;
_______________________________________________
Xfce4-commits mailing list
Xfce4-commits@xfce.org
http://foo-projects.org/mailman/listinfo/xfce4-commits

Reply via email to