[geary/wip/778728-split-composer: 5/8] Simply and update ComposerContainer interface and implementations.
- From: Michael Gratton <mjog src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [geary/wip/778728-split-composer: 5/8] Simply and update ComposerContainer interface and implementations.
- Date: Tue, 17 Oct 2017 07:50:03 +0000 (UTC)
commit 86bea60a947da3117fd4f668aea5e08e675d9147
Author: Michael James Gratton <mike vee net>
Date: Wed Oct 4 16:19:57 2017 -0700
Simply and update ComposerContainer interface and implementations.
* src/client/composer/composer-container.vala (ComposerContainer): Remove
::present and ::get_focus, update call sites to just get these diretly
from their top levels. Make :top_window protected, we only need this
since the interface itself doesn't extend GtkWidget and it's an
implementation detail. Update implementations.
* src/client/composer/composer-window.vala (ComposerContainer): Pass a
config object to the ctor so we don't need to use the depreciated
global application instance to get to it.
* src/client/composer/composer-widget.vala (ComposerWidget): Don't
attempt to implement copy/paste for Gtk.Entry instances, we'll do that
elsewhere.
src/client/application/geary-controller.vala | 2 +-
src/client/composer/composer-box.vala | 6 +-
src/client/composer/composer-container.vala | 14 +---
src/client/composer/composer-embed.vala | 10 +--
src/client/composer/composer-widget.vala | 95 +++++++++++++++-----------
src/client/composer/composer-window.vala | 9 +--
6 files changed, 70 insertions(+), 66 deletions(-)
---
diff --git a/src/client/application/geary-controller.vala b/src/client/application/geary-controller.vala
index b263530..767abfb 100644
--- a/src/client/application/geary-controller.vala
+++ b/src/client/application/geary-controller.vala
@@ -2295,7 +2295,7 @@ public class GearyController : Geary.BaseObject {
);
}
} else {
- new ComposerWindow(widget);
+ new ComposerWindow(widget, this.application.config);
widget.state = ComposerWidget.ComposerState.DETACHED;
}
diff --git a/src/client/composer/composer-box.vala b/src/client/composer/composer-box.vala
index e3116d8..c4ae911 100644
--- a/src/client/composer/composer-box.vala
+++ b/src/client/composer/composer-box.vala
@@ -10,12 +10,12 @@
*/
public class ComposerBox : Gtk.Frame, ComposerContainer {
- public Gtk.ApplicationWindow top_window {
+ internal ComposerWidget composer { get; set; }
+
+ protected Gtk.ApplicationWindow top_window {
get { return (Gtk.ApplicationWindow) get_toplevel(); }
}
- internal ComposerWidget composer { get; set; }
-
protected Gee.MultiMap<string, string>? old_accelerators { get; set; }
private MainToolbar main_toolbar { get; private set; }
diff --git a/src/client/composer/composer-container.vala b/src/client/composer/composer-container.vala
index da82724..387581a 100644
--- a/src/client/composer/composer-container.vala
+++ b/src/client/composer/composer-container.vala
@@ -21,17 +21,6 @@ public interface ComposerContainer {
// We use old_accelerators to keep track of the accelerators we temporarily disabled.
protected abstract Gee.MultiMap<string, string>? old_accelerators { get; set; }
- // The toplevel window for the container. Note that it needs to be a GtkApplicationWindow.
- public abstract Gtk.ApplicationWindow top_window { get; }
-
- public virtual void present() {
- this.top_window.present();
- }
-
- public virtual unowned Gtk.Widget get_focus() {
- return this.top_window.get_focus();
- }
-
public abstract void close_container();
/**
@@ -45,6 +34,9 @@ public interface ComposerContainer {
*/
public abstract void remove_composer();
+ // The toplevel window for the container. Note that it needs to be a GtkApplicationWindow.
+ protected abstract Gtk.ApplicationWindow top_window { get; }
+
protected virtual bool on_focus_in() {
if (this.old_accelerators == null) {
this.old_accelerators = new Gee.HashMultiMap<string, string>();
diff --git a/src/client/composer/composer-embed.vala b/src/client/composer/composer-embed.vala
index 37d67bc..9b4bcc8 100644
--- a/src/client/composer/composer-embed.vala
+++ b/src/client/composer/composer-embed.vala
@@ -14,12 +14,12 @@ public class ComposerEmbed : Gtk.EventBox, ComposerContainer {
public Geary.Email referred { get; private set; }
- public Gtk.ApplicationWindow top_window {
+ internal ComposerWidget composer { get; set; }
+
+ protected Gtk.ApplicationWindow top_window {
get { return (Gtk.ApplicationWindow) get_toplevel(); }
}
- internal ComposerWidget composer { get; set; }
-
protected Gee.MultiMap<string, string>? old_accelerators { get; set; }
private Gtk.ScrolledWindow outer_scroller;
@@ -186,10 +186,6 @@ public class ComposerEmbed : Gtk.EventBox, ComposerContainer {
return ret;
}
- public void present() {
- top_window.present();
- }
-
public void vanish() {
hide();
this.composer.state = ComposerWidget.ComposerState.DETACHED;
diff --git a/src/client/composer/composer-widget.vala b/src/client/composer/composer-widget.vala
index ad2489d..9183268 100644
--- a/src/client/composer/composer-widget.vala
+++ b/src/client/composer/composer-widget.vala
@@ -1056,7 +1056,11 @@ public class ComposerWidget : Gtk.EventBox {
}
update_composer_view();
- this.container.present();
+
+ Gtk.Window? window = get_toplevel() as Gtk.Window;
+ if (window != null) {
+ window.present();
+ }
set_focus();
}
@@ -1114,12 +1118,17 @@ public class ComposerWidget : Gtk.EventBox {
if (this.is_blank)
return CloseStatus.DO_CLOSE;
- this.container.present();
+ Gtk.Window? window = get_toplevel() as Gtk.Window;
+ if (window != null) {
+ window.present();
+ }
CloseStatus status = CloseStatus.PENDING_CLOSE;
if (this.can_save) {
- AlertDialog dialog = new TernaryConfirmationDialog(container.top_window,
- _("Do you want to discard this message?"), null, Stock._KEEP, Stock._DISCARD,
+ AlertDialog dialog = new TernaryConfirmationDialog(
+ get_toplevel() as Gtk.Window,
+ _("Do you want to discard this message?"),
+ null, Stock._KEEP, Stock._DISCARD,
Gtk.ResponseType.CLOSE, "suggested-action");
Gtk.ResponseType response = dialog.run();
if (response == Gtk.ResponseType.CANCEL ||
@@ -1137,8 +1146,10 @@ public class ComposerWidget : Gtk.EventBox {
discard_and_exit_async.begin();
}
} else {
- AlertDialog dialog = new ConfirmationDialog(container.top_window,
- _("Do you want to discard this message?"), null, Stock._DISCARD, "destructive-action");
+ AlertDialog dialog = new ConfirmationDialog(
+ get_toplevel() as Gtk.Window,
+ _("Do you want to discard this message?"),
+ null, Stock._DISCARD, "destructive-action");
Gtk.ResponseType response = dialog.run();
if (response == Gtk.ResponseType.OK) {
discard_and_exit_async.begin();
@@ -1169,9 +1180,17 @@ public class ComposerWidget : Gtk.EventBox {
private void on_detach() {
if (this.state == ComposerState.DETACHED)
return;
- Gtk.Widget? focus = this.container.top_window.get_focus();
+
+ // Get the currently focused widget before we remove ourselves
+ // from the window
+ Gtk.Widget? focus = null;
+ Gtk.Window? toplevel = get_toplevel() as Gtk.Window;
+ if (toplevel != null) {
+ focus = toplevel.get_focus();
+ }
+
this.container.remove_composer();
- ComposerWindow window = new ComposerWindow(this);
+ ComposerWindow window = new ComposerWindow(this, this.config);
// Workaround a GTK+ crasher, Bug 771812. When the composer is
// re-parented, its menu_button's popover keeps a reference to
@@ -1253,7 +1272,8 @@ public class ComposerWidget : Gtk.EventBox {
confirmation = _("Send message without an attachment?");
}
if (confirmation != null) {
- ConfirmationDialog dialog = new ConfirmationDialog(container.top_window,
+ ConfirmationDialog dialog = new ConfirmationDialog(
+ get_toplevel() as Gtk.Window,
confirmation, null, Stock._OK, "suggested-action");
return (dialog.run() == Gtk.ResponseType.OK);
}
@@ -1590,7 +1610,9 @@ public class ComposerWidget : Gtk.EventBox {
}
private void attachment_failed(string msg) {
- ErrorDialog dialog = new ErrorDialog(this.container.top_window, _("Cannot add attachment"), msg);
+ ErrorDialog dialog = new ErrorDialog(
+ get_toplevel() as Gtk.Window, _("Cannot add attachment"), msg
+ );
dialog.run();
}
@@ -1678,17 +1700,11 @@ public class ComposerWidget : Gtk.EventBox {
}
private void on_cut(SimpleAction action, Variant? param) {
- if (this.container.get_focus() == this.editor)
- this.editor.cut_clipboard();
- else if (this.container.get_focus() is Gtk.Editable)
- ((Gtk.Editable) this.container.get_focus()).cut_clipboard();
+ this.editor.cut_clipboard();
}
private void on_copy(SimpleAction action, Variant? param) {
- if (this.container.get_focus() == this.editor)
- this.editor.copy_clipboard();
- else if (this.container.get_focus() is Gtk.Editable)
- ((Gtk.Editable) this.container.get_focus()).copy_clipboard();
+ this.editor.copy_clipboard();
}
private void on_copy_link(SimpleAction action, Variant? param) {
@@ -1700,15 +1716,11 @@ public class ComposerWidget : Gtk.EventBox {
}
private void on_paste(SimpleAction action, Variant? param) {
- if (this.container.get_focus() == this.editor)
- this.editor.paste_plain_text();
- else if (this.container.get_focus() is Gtk.Editable)
- ((Gtk.Editable) this.container.get_focus()).paste_clipboard();
+ this.editor.paste_plain_text();
}
private void on_paste_with_formatting(SimpleAction action, Variant? param) {
- if (this.container.get_focus() == this.editor)
- this.editor.paste_rich_text();
+ this.editor.paste_rich_text();
}
private void on_select_all(SimpleAction action, Variant? param) {
@@ -1783,8 +1795,10 @@ public class ComposerWidget : Gtk.EventBox {
}
private void on_select_color() {
- Gtk.ColorChooserDialog dialog = new Gtk.ColorChooserDialog(_("Select Color"),
- this.container.top_window);
+ Gtk.ColorChooserDialog dialog = new Gtk.ColorChooserDialog(
+ _("Select Color"),
+ get_toplevel() as Gtk.Window
+ );
if (dialog.run() == Gtk.ResponseType.OK) {
this.editor.execute_editing_command_with_argument(
"forecolor", dialog.get_rgba().to_string()
@@ -1807,19 +1821,22 @@ public class ComposerWidget : Gtk.EventBox {
}
private void update_message_overlay_label_style() {
- Gdk.RGBA window_background = container.top_window.get_style_context()
- .get_background_color(Gtk.StateFlags.NORMAL);
- Gdk.RGBA label_background = message_overlay_label.get_style_context()
- .get_background_color(Gtk.StateFlags.NORMAL);
-
- if (label_background == window_background)
- return;
-
- message_overlay_label.get_style_context().changed.disconnect(
- on_message_overlay_label_style_changed);
- message_overlay_label.override_background_color(Gtk.StateFlags.NORMAL, window_background);
- message_overlay_label.get_style_context().changed.connect(
- on_message_overlay_label_style_changed);
+ Gtk.Window? window = get_toplevel() as Gtk.Window;
+ if (window != null) {
+ Gdk.RGBA window_background = window.get_style_context()
+ .get_background_color(Gtk.StateFlags.NORMAL);
+ Gdk.RGBA label_background = message_overlay_label.get_style_context()
+ .get_background_color(Gtk.StateFlags.NORMAL);
+
+ if (label_background == window_background)
+ return;
+
+ message_overlay_label.get_style_context().changed.disconnect(
+ on_message_overlay_label_style_changed);
+ message_overlay_label.override_background_color(Gtk.StateFlags.NORMAL, window_background);
+ message_overlay_label.get_style_context().changed.connect(
+ on_message_overlay_label_style_changed);
+ }
}
[GtkCallback]
diff --git a/src/client/composer/composer-window.vala b/src/client/composer/composer-window.vala
index 7c1e3b8..b4ffd19 100644
--- a/src/client/composer/composer-window.vala
+++ b/src/client/composer/composer-window.vala
@@ -10,18 +10,17 @@
*/
public class ComposerWindow : Gtk.ApplicationWindow, ComposerContainer {
- public Gtk.ApplicationWindow top_window {
- get { return this; }
- }
internal ComposerWidget composer { get; set; }
+ protected Gtk.ApplicationWindow top_window { get { return this; } }
+
protected Gee.MultiMap<string, string>? old_accelerators { get; set; }
private bool closing = false;
- public ComposerWindow(ComposerWidget composer) {
+ public ComposerWindow(ComposerWidget composer, Configuration config) {
Object(type: Gtk.WindowType.TOPLEVEL);
this.composer = composer;
@@ -36,7 +35,7 @@ public class ComposerWindow : Gtk.ApplicationWindow, ComposerContainer {
focus_in_event.connect(on_focus_in);
focus_out_event.connect(on_focus_out);
- if (composer.config.desktop_environment == Configuration.DesktopEnvironment.UNITY) {
+ if (config.desktop_environment == Configuration.DesktopEnvironment.UNITY) {
composer.embed_header();
composer.bind_property("window-title", this, "title", BindingFlags.SYNC_CREATE);
} else {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]