[geary] Fix TRUE/FALSE listed as composer drafts status.
- From: Michael Gratton <mjog src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [geary] Fix TRUE/FALSE listed as composer drafts status.
- Date: Sat, 14 Apr 2018 05:25:56 +0000 (UTC)
commit 5a9075b345e8eda82dbcdc4d987cbaa10f8f2be9
Author: Michael James Gratton <mike vee net>
Date: Sat Apr 14 12:37:22 2018 +1000
Fix TRUE/FALSE listed as composer drafts status.
* src/client/composer/composer-widget.vala (Composer): Replace use of
inappropriate public properties and obtuse property bindings with a
subject_changed signal and private properties that update the info
label in their setter, so it's obvious how the whole thing works. Move
code for managing a detached compoer's window title to the
ComposerWindow class.
src/client/composer/composer-widget.vala | 108 +++++++++++++++++------------
src/client/composer/composer-window.vala | 33 ++++++++--
ui/composer-widget.ui | 2 +-
3 files changed, 91 insertions(+), 52 deletions(-)
---
diff --git a/src/client/composer/composer-widget.vala b/src/client/composer/composer-widget.vala
index d14d109..0b02e65 100644
--- a/src/client/composer/composer-widget.vala
+++ b/src/client/composer/composer-widget.vala
@@ -159,7 +159,6 @@ public class ComposerWidget : Gtk.EventBox {
private const string DRAFT_SAVING_TEXT = _("Saving");
private const string DRAFT_ERROR_TEXT = _("Error saving");
private const string BACKSPACE_TEXT = _("Press Backspace to delete quote");
- private const string DEFAULT_TITLE = _("New Message");
private const string URI_LIST_MIME_TYPE = "text/uri-list";
private const string FILE_URI_PREFIX = "file://";
@@ -239,12 +238,6 @@ public class ComposerWidget : Gtk.EventBox {
public ComposerWebView editor { get; private set; }
- public string draft_save_text { get; private set; }
-
- public bool can_delete_quote { get; private set; default = false; }
-
- public string toolbar_text { get; set; }
-
public string window_title { get; set; }
public Configuration config { get; set; }
@@ -362,6 +355,23 @@ public class ComposerWidget : Gtk.EventBox {
private Geary.EmailFlags draft_flags = new Geary.EmailFlags.with(Geary.EmailFlags.DRAFT);
private Geary.TimeoutManager draft_timer;
private bool is_draft_saved = false;
+ private string draft_status_text {
+ get { return this._draft_status_text; }
+ set {
+ this._draft_status_text = value;
+ update_info_label();
+ }
+ }
+ private string _draft_status_text = "";
+
+ private bool can_delete_quote {
+ get { return this._can_delete_quote; }
+ set {
+ this._can_delete_quote = value;
+ update_info_label();
+ }
+ }
+ private bool _can_delete_quote = false;
// Is the composer closing (e.g. saving a draft or sending)?
private bool is_closing = false;
@@ -379,6 +389,9 @@ public class ComposerWidget : Gtk.EventBox {
/** Fired when the user opens a link in the composer. */
public signal void link_activated(string url);
+ /** Fired when the user has changed the composer's subject. */
+ public signal void subject_changed(string new_subject);
+
public ComposerWidget(Geary.Account account,
ContactListStoreCache contact_list_store_cache,
@@ -413,19 +426,10 @@ public class ComposerWidget : Gtk.EventBox {
add_events(Gdk.EventMask.KEY_PRESS_MASK | Gdk.EventMask.KEY_RELEASE_MASK);
- this.visible_on_attachment_drag_over.remove(this.visible_on_attachment_drag_over_child);
-
- BindingTransformFunc set_toolbar_text = (binding, source_value, ref target_value) => {
- if (draft_save_text == "" && can_delete_quote)
- target_value = BACKSPACE_TEXT;
- else
- target_value = draft_save_text;
- return true;
- };
- bind_property("draft-save-text", this, "toolbar-text", BindingFlags.SYNC_CREATE,
- (owned) set_toolbar_text);
- bind_property("can-delete-quote", this, "toolbar-text", BindingFlags.SYNC_CREATE,
- (owned) set_toolbar_text);
+ this.visible_on_attachment_drag_over.remove(
+ this.visible_on_attachment_drag_over_child
+ );
+
this.to_entry = new EmailEntry(this);
this.to_entry.changed.connect(on_envelope_changed);
this.to_box.add(to_entry);
@@ -466,13 +470,6 @@ public class ComposerWidget : Gtk.EventBox {
this.context_menu_webkit_spelling = (Menu) builder.get_object("context_menu_webkit_spelling");
this.context_menu_webkit_text_entry = (Menu) builder.get_object("context_menu_webkit_text_entry");
- this.subject_entry.bind_property("text", this, "window-title", BindingFlags.SYNC_CREATE,
- (binding, source_value, ref target_value) => {
- target_value = Geary.String.is_empty_or_whitespace(this.subject_entry.text)
- ? DEFAULT_TITLE : this.subject_entry.text.strip();
- return true;
- });
-
embed_header();
// Listen to account signals to update from menu.
@@ -769,10 +766,11 @@ public class ComposerWidget : Gtk.EventBox {
this.references = Geary.RFC822.Utils.reply_references(referred);
referred_quote = Geary.RFC822.Utils.quote_email_for_reply(referred, quote,
Geary.RFC822.TextFormat.HTML);
- if (!Geary.String.is_empty(quote))
+ if (!Geary.String.is_empty(quote)) {
this.top_posting = false;
- else
+ } else {
this.can_delete_quote = true;
+ }
break;
case ComposeType.FORWARD:
@@ -852,7 +850,9 @@ public class ComposerWidget : Gtk.EventBox {
private void on_content_loaded() {
if (this.can_delete_quote) {
this.editor.selection_changed.connect(
- () => { this.can_delete_quote = false; }
+ () => {
+ this.can_delete_quote = false;
+ }
);
}
}
@@ -1347,7 +1347,8 @@ public class ComposerWidget : Gtk.EventBox {
private async void close_draft_manager_async(Cancellable? cancellable)
throws Error {
- this.draft_save_text = "";
+ this.draft_status_text = "";
+
get_action(ACTION_CLOSE_AND_SAVE).set_enabled(false);
Geary.App.DraftManager old_manager = this.draft_manager;
@@ -1371,22 +1372,22 @@ public class ComposerWidget : Gtk.EventBox {
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.draft_status_text = DRAFT_SAVED_TEXT;
this.is_draft_saved = true;
break;
case Geary.App.DraftManager.DraftState.STORING:
- this.draft_save_text = DRAFT_SAVING_TEXT;
+ this.draft_status_text = DRAFT_SAVING_TEXT;
this.is_draft_saved = true;
break;
case Geary.App.DraftManager.DraftState.NOT_STORED:
- this.draft_save_text = "";
+ this.draft_status_text = "";
this.is_draft_saved = false;
break;
case Geary.App.DraftManager.DraftState.ERROR:
- this.draft_save_text = DRAFT_ERROR_TEXT;
+ this.draft_status_text = DRAFT_ERROR_TEXT;
this.is_draft_saved = false;
break;
@@ -1399,7 +1400,7 @@ public class ComposerWidget : Gtk.EventBox {
if (this.can_save) {
this.draft_timer.start();
}
- this.draft_save_text = "";
+ this.draft_status_text = "";
// can_save depends on the value of this, so reset it after
// the if test above
this.is_draft_saved = false;
@@ -1658,11 +1659,6 @@ public class ComposerWidget : Gtk.EventBox {
return ret;
}
- [GtkCallback]
- private void on_envelope_changed() {
- draft_changed();
- }
-
private void validate_send_button() {
get_action(ACTION_SEND).set_enabled(this.to_entry.valid || this.cc_entry.valid ||
this.bcc_entry.valid);
}
@@ -2041,6 +2037,17 @@ public class ComposerWidget : Gtk.EventBox {
return set_active;
}
+ private void update_info_label() {
+ string text = "";
+ if (this.can_delete_quote) {
+ text = BACKSPACE_TEXT;
+ } else {
+ text = this.draft_status_text;
+ }
+
+ this.info_label.set_text(text);
+ }
+
// Updates from combobox contents and visibility, returns true if
// the from address had to be set
private bool update_from_field() {
@@ -2104,7 +2111,7 @@ public class ComposerWidget : Gtk.EventBox {
return !set_active;
}
- private void update_from_account() throws Error {
+ private void update_from() throws Error {
int index = this.from_multiple.get_active();
if (index >= 0) {
FromAddressMap selected = this.from_list.get(index);
@@ -2183,18 +2190,29 @@ public class ComposerWidget : Gtk.EventBox {
}
private void on_draft_manager_fatal(Error err) {
- this.draft_save_text = DRAFT_ERROR_TEXT;
+ this.draft_status_text = DRAFT_ERROR_TEXT;
}
private void on_draft_state_changed() {
update_draft_state();
}
+ [GtkCallback]
+ private void on_subject_changed() {
+ draft_changed();
+ subject_changed(this.subject);
+ }
+
+ [GtkCallback]
+ private void on_envelope_changed() {
+ draft_changed();
+ }
+
private void on_from_changed() {
try {
- update_from_account();
+ update_from();
} catch (Error err) {
- debug("Unable to update From: Account in composer: %s", err.message);
+ debug("Error updating from address: %s", err.message);
}
}
diff --git a/src/client/composer/composer-window.vala b/src/client/composer/composer-window.vala
index 4c297c2..495a065 100644
--- a/src/client/composer/composer-window.vala
+++ b/src/client/composer/composer-window.vala
@@ -10,6 +10,10 @@
*/
public class ComposerWindow : Gtk.ApplicationWindow, ComposerContainer {
+
+ private const string DEFAULT_TITLE = _("New Message");
+
+
public Gtk.ApplicationWindow top_window {
get { return this; }
}
@@ -37,15 +41,15 @@ public class ComposerWindow : Gtk.ApplicationWindow, ComposerContainer {
if (composer.config.desktop_environment == Configuration.DesktopEnvironment.UNITY) {
composer.embed_header();
- composer.bind_property("window-title", this, "title", BindingFlags.SYNC_CREATE);
} else {
- this.composer.header.show_close_button = true;
- this.composer.free_header();
+ composer.header.show_close_button = true;
+ composer.free_header();
set_titlebar(this.composer.header);
- composer.bind_property("window-title", this.composer.header, "title",
- BindingFlags.SYNC_CREATE);
}
+ composer.subject_changed.connect(() => { update_title(); } );
+ update_title();
+
show();
set_position(Gtk.WindowPosition.CENTER);
}
@@ -114,5 +118,22 @@ public class ComposerWindow : Gtk.ApplicationWindow, ComposerContainer {
public void remove_composer() {
warning("Detached composer received remove");
}
-}
+ private void update_title() {
+ string subject = this.composer.subject.strip();
+ if (Geary.String.is_empty_or_whitespace(subject)) {
+ subject = DEFAULT_TITLE;
+ }
+
+ switch (this.composer.config.desktop_environment) {
+ case Configuration.DesktopEnvironment.UNITY:
+ this.title = subject;
+ break;
+
+ default:
+ this.composer.header.title = subject;
+ break;
+ }
+ }
+
+}
diff --git a/ui/composer-widget.ui b/ui/composer-widget.ui
index a6b805d..1d1d78b 100644
--- a/ui/composer-widget.ui
+++ b/ui/composer-widget.ui
@@ -114,7 +114,7 @@
<property name="margin_top">6</property>
<property name="hexpand">True</property>
<property name="invisible_char">•</property>
- <signal name="changed" handler="on_envelope_changed" swapped="no"/>
+ <signal name="changed" handler="on_subject_changed" swapped="no"/>
</object>
<packing>
<property name="left_attach">1</property>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]