Only save a new draft if the current draft has not been saved.
* src/client/composer/composer-widget.vala (ComposerWidget): Add ::is_draft_saved field, update it as the draft manager's state changes, or if the message has been changed. Rename ::can_save to ::should_save to better reflect what it is used for, don't allow saving if a draft has been saved. Rename update_draft_state as a proper method, use it update initial state after opening draft manager, tidy up location of draft signal handlers.
This commit is contained in:
parent
58b76ba958
commit
f4b7e69545
1 changed files with 28 additions and 15 deletions
|
|
@ -215,12 +215,13 @@ public class ComposerWidget : Gtk.EventBox {
|
|||
}
|
||||
}
|
||||
|
||||
/** Determines if current message can be saved as draft. */
|
||||
private bool can_save {
|
||||
/** Determines if current message should be saved as draft. */
|
||||
private bool should_save {
|
||||
get {
|
||||
return this.draft_manager != null
|
||||
&& this.draft_manager.is_open
|
||||
&& this.account.information.save_drafts
|
||||
&& !this.is_draft_saved
|
||||
&& !this.is_blank;
|
||||
}
|
||||
}
|
||||
|
|
@ -345,6 +346,7 @@ public class ComposerWidget : Gtk.EventBox {
|
|||
private Geary.App.DraftManager? draft_manager = null;
|
||||
private Geary.EmailFlags draft_flags = new Geary.EmailFlags.with(Geary.EmailFlags.DRAFT);
|
||||
private Geary.TimeoutManager draft_timer;
|
||||
private bool is_draft_saved = false;
|
||||
|
||||
// Is the composer closing (e.g. saving a draft or sending)?
|
||||
private bool is_closing = false;
|
||||
|
|
@ -712,6 +714,7 @@ public class ComposerWidget : Gtk.EventBox {
|
|||
throw err;
|
||||
}
|
||||
|
||||
update_draft_state();
|
||||
close_and_save.set_enabled(true);
|
||||
this.header.save_and_close_button.show();
|
||||
|
||||
|
|
@ -1059,7 +1062,7 @@ public class ComposerWidget : Gtk.EventBox {
|
|||
if (this.is_blank)
|
||||
return CloseStatus.DO_CLOSE;
|
||||
|
||||
bool try_to_save = this.can_save;
|
||||
bool try_to_save = this.should_save;
|
||||
|
||||
this.container.present();
|
||||
AlertDialog dialog;
|
||||
|
|
@ -1094,7 +1097,7 @@ public class ComposerWidget : Gtk.EventBox {
|
|||
}
|
||||
|
||||
private void on_close_and_save(SimpleAction action, Variant? param) {
|
||||
if (this.can_save)
|
||||
if (this.should_save)
|
||||
save_and_exit_async.begin();
|
||||
else
|
||||
on_close(action, param);
|
||||
|
|
@ -1301,36 +1304,31 @@ public class ComposerWidget : Gtk.EventBox {
|
|||
this.container.close_container();
|
||||
}
|
||||
|
||||
private void on_draft_state_changed() {
|
||||
private void update_draft_state() {
|
||||
switch (this.draft_manager.draft_state) {
|
||||
case Geary.App.DraftManager.DraftState.STORED:
|
||||
this.draft_save_text = DRAFT_SAVED_TEXT;
|
||||
this.is_draft_saved = true;
|
||||
break;
|
||||
|
||||
case Geary.App.DraftManager.DraftState.STORING:
|
||||
this.draft_save_text = DRAFT_SAVING_TEXT;
|
||||
this.is_draft_saved = true;
|
||||
break;
|
||||
|
||||
case Geary.App.DraftManager.DraftState.NOT_STORED:
|
||||
this.draft_save_text = "";
|
||||
this.is_draft_saved = false;
|
||||
break;
|
||||
|
||||
case Geary.App.DraftManager.DraftState.ERROR:
|
||||
this.draft_save_text = DRAFT_ERROR_TEXT;
|
||||
this.is_draft_saved = false;
|
||||
break;
|
||||
|
||||
default:
|
||||
assert_not_reached();
|
||||
}
|
||||
}
|
||||
|
||||
private void on_draft_id_changed() {
|
||||
draft_id_changed(this.draft_manager.current_draft_id);
|
||||
}
|
||||
|
||||
private void on_draft_manager_fatal(Error err) {
|
||||
this.draft_save_text = DRAFT_ERROR_TEXT;
|
||||
}
|
||||
|
||||
private async void close_draft_manager_async(Cancellable? cancellable) throws Error {
|
||||
get_action(ACTION_CLOSE_AND_SAVE).set_enabled(false);
|
||||
|
|
@ -1349,10 +1347,13 @@ public class ComposerWidget : Gtk.EventBox {
|
|||
}
|
||||
|
||||
private inline void draft_changed() {
|
||||
this.draft_save_text = "";
|
||||
if (this.can_save) {
|
||||
this.draft_timer.start();
|
||||
}
|
||||
this.draft_save_text = "";
|
||||
// can_save depends on the value of this, so reset it after
|
||||
// the if test above
|
||||
this.is_draft_saved = false;
|
||||
}
|
||||
|
||||
// Note that drafts are NOT "linkified."
|
||||
|
|
@ -2200,6 +2201,18 @@ public class ComposerWidget : Gtk.EventBox {
|
|||
get_action(ACTION_REDO).set_enabled(can_redo);
|
||||
}
|
||||
|
||||
private void on_draft_id_changed() {
|
||||
draft_id_changed(this.draft_manager.current_draft_id);
|
||||
}
|
||||
|
||||
private void on_draft_manager_fatal(Error err) {
|
||||
this.draft_save_text = DRAFT_ERROR_TEXT;
|
||||
}
|
||||
|
||||
private void on_draft_state_changed() {
|
||||
update_draft_state();
|
||||
}
|
||||
|
||||
private void on_selection_changed(bool has_selection) {
|
||||
get_action(ACTION_CUT).set_enabled(has_selection);
|
||||
get_action(ACTION_COPY).set_enabled(has_selection);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue