Remember attachments dir and reuse adding/saving attachments and images.

* src/client/application/geary-controller.vala (GearyController): Replace
  use of last_save_directory with new attachments_dir property on the
  configuration object.

* src/client/dialogs/attachment-dialog.vala (AttachmentDialog): Replace
  current_folder with use of last_save_directory with new attachments_dir
  property on the configuration object. Add config object as ctor param
  and object field, update call sites.
This commit is contained in:
Michael James Gratton 2017-02-24 12:06:42 +11:00
parent 7787af3aac
commit 527399be76
5 changed files with 47 additions and 26 deletions

View file

@ -2,6 +2,12 @@
<schema id="org.gnome.Geary" path="/org/gnome/Geary/">
<key name="attachments-directory" type="s">
<default>''</default>
<summary>Default attachments directory</summary>
<description>Location used when opening and saving attachments</description>
</key>
<key name="print-directory" type="s">
<default>''</default>
<summary>Default print output directory</summary>

View file

@ -9,6 +9,7 @@
*/
public class Configuration {
public const string ATTACHMENTS_DIR_KEY = "attachments-directory";
public const string PRINT_DIR_KEY = "print-directory";
public const string WINDOW_WIDTH_KEY = "window-width";
public const string WINDOW_HEIGHT_KEY = "window-height";
@ -63,6 +64,11 @@ public class Configuration {
}
}
public string? attachments_dir {
owned get { return settings.get_string(ATTACHMENTS_DIR_KEY); }
set { settings.set_string(ATTACHMENTS_DIR_KEY, value); }
}
public string? print_dir {
owned get { return settings.get_string(PRINT_DIR_KEY); }
set { settings.set_string(PRINT_DIR_KEY, value); }

View file

@ -112,7 +112,6 @@ public class GearyController : Geary.BaseObject {
private Gee.Set<Geary.App.Conversation> selected_conversations = new Gee.HashSet<Geary.App.Conversation>();
private Geary.App.Conversation? last_deleted_conversation = null;
private Gee.LinkedList<ComposerWidget> composer_widgets = new Gee.LinkedList<ComposerWidget>();
private File? last_save_directory = null;
private NewMessagesMonitor? new_messages_monitor = null;
private NewMessagesIndicator? new_messages_indicator = null;
private UnityLauncher? unity_launcher = null;
@ -2079,7 +2078,7 @@ public class GearyController : Geary.BaseObject {
return;
File dest_dir = File.new_for_path(filename);
this.last_save_directory = dest_dir;
this.application.config.attachments_dir = dest_dir.get_path();
debug("Saving attachments to %s", dest_dir.get_path());
@ -2124,7 +2123,7 @@ public class GearyController : Geary.BaseObject {
if (accepted && !Geary.String.is_empty(accepted_filename)) {
File destination = File.new_for_path(accepted_filename);
this.last_save_directory = destination.get_parent();
this.application.config.attachments_dir = destination.get_parent().get_path();
yield write_buffer_to_file(buffer, destination);
}
}
@ -2173,8 +2172,9 @@ public class GearyController : Geary.BaseObject {
null
);
#endif
if (this.last_save_directory != null)
dialog.set_current_folder(this.last_save_directory.get_path());
string? dir = this.application.config.attachments_dir;
if (!Geary.String.is_empty(dir))
dialog.set_current_folder(dir);
dialog.set_create_folders(true);
dialog.set_local_only(false);
return dialog;

View file

@ -2216,7 +2216,7 @@ public class ComposerWidget : Gtk.EventBox {
}
private void on_add_attachment() {
AttachmentDialog dialog = new AttachmentDialog(this.container.top_window);
AttachmentDialog dialog = new AttachmentDialog(this.container.top_window, this.config);
if (dialog.run() == Gtk.ResponseType.ACCEPT) {
dialog.hide();
foreach (File file in dialog.get_files()) {
@ -2227,6 +2227,7 @@ public class ComposerWidget : Gtk.EventBox {
break;
}
}
}
dialog.destroy();
}
@ -2236,7 +2237,7 @@ public class ComposerWidget : Gtk.EventBox {
}
private void on_insert_image(SimpleAction action, Variant? param) {
AttachmentDialog dialog = new AttachmentDialog(this.container.top_window);
AttachmentDialog dialog = new AttachmentDialog(this.container.top_window, this.config);
Gtk.FileFilter filter = new Gtk.FileFilter();
// Translators: This is the name of the file chooser filter
// when inserting an image in the composer.

View file

@ -5,40 +5,44 @@
*/
public class AttachmentDialog : Object {
private const int PREVIEW_SIZE = 180;
private const int PREVIEW_PADDING = 3;
private Configuration config;
#if GTK_3_20
private Gtk.FileChooserNative? chooser = null;
#else
private Gtk.FileChooserDialog? chooser = null;
#endif
private const int PREVIEW_SIZE = 180;
private const int PREVIEW_PADDING = 3;
private static string? current_folder = null;
private Gtk.Image preview_image;
private Gtk.Image preview_image = new Gtk.Image();
public delegate bool Attacher(File attachment_file, bool alert_errors = true);
public AttachmentDialog(Gtk.Window? parent) {
public AttachmentDialog(Gtk.Window? parent, Configuration config) {
this.config = config;
#if GTK_3_20
chooser = new Gtk.FileChooserNative(_("Choose a file"), parent, Gtk.FileChooserAction.OPEN, _("_Attach"), Stock._CANCEL);
this.chooser = new Gtk.FileChooserNative(_("Choose a file"), parent, Gtk.FileChooserAction.OPEN, _("_Attach"), Stock._CANCEL);
#else
chooser = new Gtk.FileChooserDialog(_("Choose a file"), parent, Gtk.FileChooserAction.OPEN, Stock._CANCEL, Gtk.ResponseType.CANCEL, _("_Attach"), Gtk.ResponseType.ACCEPT);
this.chooser = new Gtk.FileChooserDialog(_("Choose a file"), parent, Gtk.FileChooserAction.OPEN, Stock._CANCEL, Gtk.ResponseType.CANCEL, _("_Attach"), Gtk.ResponseType.ACCEPT);
#endif
if (!Geary.String.is_empty(current_folder)) {
chooser.set_current_folder(current_folder);
string? dir = config.attachments_dir;
if (!Geary.String.is_empty(dir)) {
this.chooser.set_current_folder(dir);
}
chooser.set_local_only(false);
chooser.set_select_multiple(true);
this.chooser.set_local_only(false);
this.chooser.set_select_multiple(true);
// preview widget is not supported on Win32 (this will fallback to gtk file chooser)
// and possibly by some org.freedesktop.portal.FileChooser (preview will be ignored).
preview_image = new Gtk.Image();
chooser.set_preview_widget(preview_image);
chooser.use_preview_label = false;
this.chooser.set_preview_widget(this.preview_image);
this.chooser.use_preview_label = false;
chooser.update_preview.connect(on_update_preview);
this.chooser.update_preview.connect(on_update_preview);
}
// XXX Once we depend on GTK+ 3.20 as a minimum, convert this
@ -54,7 +58,11 @@ public class AttachmentDialog : Object {
}
public int run() {
return this.chooser.run();
int response = this.chooser.run();
if (response == Gtk.ResponseType.ACCEPT) {
this.config.attachments_dir = this.chooser.get_current_folder();
}
return response;
}
public void hide() {