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