[geary/wip/713739-inline: 13/37] Use a new ComposerEmbed for each inline composer
- From: Jim Nelson <jnelson src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [geary/wip/713739-inline: 13/37] Use a new ComposerEmbed for each inline composer
- Date: Tue, 20 May 2014 20:16:45 +0000 (UTC)
commit bb941e7939dc29b5dc0b90ce98d0b65a4218ca49
Author: Robert Schroll <rschroll gmail com>
Date: Tue May 13 12:31:26 2014 -0700
Use a new ComposerEmbed for each inline composer
I think this will make it easier to destroy the ComposerWidgets at the
right time.
src/client/application/geary-controller.vala | 36 ++++++++++++
src/client/composer/composer-embed.vala | 59 ++++----------------
src/client/composer/composer-widget.vala | 3 -
.../conversation-list/conversation-list-view.vala | 5 +-
.../conversation-viewer/conversation-viewer.vala | 10 ++-
5 files changed, 56 insertions(+), 57 deletions(-)
---
diff --git a/src/client/application/geary-controller.vala b/src/client/application/geary-controller.vala
index e95ca16..534fcc1 100644
--- a/src/client/application/geary-controller.vala
+++ b/src/client/application/geary-controller.vala
@@ -111,6 +111,8 @@ public class GearyController : Geary.BaseObject {
// List of windows we're waiting to close before Geary closes.
private Gee.List<ComposerWidget> waiting_to_close = new Gee.ArrayList<ComposerWidget>();
+ public ComposerEmbed? inline_composer = null;
+
/**
* Fired when the currently selected account has changed.
*/
@@ -1837,6 +1839,40 @@ public class GearyController : Geary.BaseObject {
// an exit without losing their data.
composer_widgets.add(widget);
widget.destroy.connect(on_composer_widget_destroy);
+
+ if (abandon_existing_composition(widget))
+ inline_composer = new ComposerEmbed(widget, main_window.conversation_viewer, referred);
+ }
+
+ public bool abandon_existing_composition(ComposerWidget? new_composer = null) {
+ if (inline_composer == null)
+ return true;
+
+ main_window.present();
+ AlertDialog dialog;
+ if (new_composer != null)
+ dialog = new AlertDialog(main_window, Gtk.MessageType.QUESTION,
+ _("Do you want to discard the existing composition?"), null, Gtk.Stock.DISCARD,
+ Gtk.Stock.CANCEL, _("Open New Composition Window"), Gtk.ResponseType.YES);
+ else
+ dialog = new AlertDialog(main_window, Gtk.MessageType.QUESTION,
+ _("Do you want to discard the existing composition?"), null, Gtk.Stock.DISCARD,
+ Gtk.Stock.CANCEL, _("Move Composition to New Window"), Gtk.ResponseType.YES);
+ Gtk.ResponseType response = dialog.run();
+ if (response == Gtk.ResponseType.OK) {
+ close();
+ return true;
+ }
+ if (new_composer != null) {
+ if (response == Gtk.ResponseType.YES)
+ new ComposerWindow(new_composer);
+ else
+ new_composer.destroy();
+ } else if (response == Gtk.ResponseType.YES) {
+ inline_composer.on_detach();
+ return true;
+ }
+ return false;
}
private void on_composer_widget_destroy(Gtk.Widget sender) {
diff --git a/src/client/composer/composer-embed.vala b/src/client/composer/composer-embed.vala
index 0ecc53b..7888c83 100644
--- a/src/client/composer/composer-embed.vala
+++ b/src/client/composer/composer-embed.vala
@@ -8,7 +8,7 @@ public class ComposerEmbed : Gtk.Box, ComposerContainer {
private static string embed_id = "composer_embed";
- private ComposerWidget? composer = null;
+ private ComposerWidget composer;
private ConversationViewer conversation_viewer;
private Gee.Set<Geary.App.Conversation>? prev_selection = null;
@@ -19,10 +19,11 @@ public class ComposerEmbed : Gtk.Box, ComposerContainer {
get { return composer != null; }
}
- public ComposerEmbed(ConversationViewer conversation_viewer) {
+ public ComposerEmbed(ComposerWidget composer, ConversationViewer conversation_viewer,
+ Geary.Email? referred) {
Object(orientation: Gtk.Orientation.VERTICAL);
+ this.composer = composer;
this.conversation_viewer = conversation_viewer;
- no_show_all = true;
halign = Gtk.Align.FILL;
valign = Gtk.Align.FILL;
@@ -41,11 +42,6 @@ public class ComposerEmbed : Gtk.Box, ComposerContainer {
close.clicked.connect(on_close);
detach.clicked.connect(on_detach);
- }
-
- public void new_composer(ComposerWidget new_composer, Geary.Email? referred) {
- if (!abandon_existing_composition(new_composer))
- return;
WebKit.DOM.HTMLElement? email_element = null;
if (referred != null)
@@ -68,44 +64,12 @@ public class ComposerEmbed : Gtk.Box, ComposerContainer {
debug("Error creating embed element: %s", error.message);
return;
}
- pack_start(new_composer, true, true);
- new_composer.editor.focus_in_event.connect(on_focus_in);
- new_composer.editor.focus_out_event.connect(on_focus_out);
- new_composer.show_all();
- show();
- present();
- this.composer = new_composer;
- }
-
- public bool abandon_existing_composition(ComposerWidget? new_composer = null) {
- if (composer == null)
- return true;
-
+ pack_start(composer, true, true);
+ composer.editor.focus_in_event.connect(on_focus_in);
+ composer.editor.focus_out_event.connect(on_focus_out);
+ conversation_viewer.compose_overlay.add_overlay(this);
+ show_all();
present();
- AlertDialog dialog;
- if (new_composer != null)
- dialog = new AlertDialog(top_window, Gtk.MessageType.QUESTION,
- _("Do you want to discard the existing composition?"), null, Gtk.Stock.DISCARD,
- Gtk.Stock.CANCEL, _("Open New Composition Window"), Gtk.ResponseType.YES);
- else
- dialog = new AlertDialog(top_window, Gtk.MessageType.QUESTION,
- _("Do you want to discard the existing composition?"), null, Gtk.Stock.DISCARD,
- Gtk.Stock.CANCEL, _("Move Composition to New Window"), Gtk.ResponseType.YES);
- Gtk.ResponseType response = dialog.run();
- if (response == Gtk.ResponseType.OK) {
- close();
- return true;
- }
- if (new_composer != null) {
- if (response == Gtk.ResponseType.YES)
- new ComposerWindow(new_composer);
- else
- new_composer.destroy();
- } else if (response == Gtk.ResponseType.YES) {
- on_detach();
- return true;
- }
- return false;
}
private void on_close() {
@@ -113,7 +77,7 @@ public class ComposerEmbed : Gtk.Box, ComposerContainer {
close();
}
- private void on_detach() {
+ public void on_detach() {
if (composer.editor.has_focus)
on_focus_out();
composer.editor.focus_in_event.disconnect(on_focus_in);
@@ -129,7 +93,7 @@ public class ComposerEmbed : Gtk.Box, ComposerContainer {
close();
}
- public bool set_position(Gtk.Widget widget, Gdk.Rectangle allocation) {
+ public bool set_position(ref Gdk.Rectangle allocation) {
WebKit.DOM.Element embed =
conversation_viewer.web_view.get_dom_document().get_element_by_id(embed_id);
if (embed == null)
return false;
@@ -160,6 +124,7 @@ public class ComposerEmbed : Gtk.Box, ComposerContainer {
}
private void close() {
+ GearyApplication.instance.controller.inline_composer = null;
hide();
if (composer != null) {
composer.editor.focus_in_event.disconnect(on_focus_in);
diff --git a/src/client/composer/composer-widget.vala b/src/client/composer/composer-widget.vala
index 3c09fbd..7dbbb80 100644
--- a/src/client/composer/composer-widget.vala
+++ b/src/client/composer/composer-widget.vala
@@ -463,9 +463,6 @@ public class ComposerWidget : Gtk.EventBox {
// the drafts folder will be opened by on_from_changed().
if (!from_multiple.visible)
open_drafts_folder_async.begin(cancellable_drafts);
-
- ((MainWindow) GearyApplication.instance.controller.main_window).conversation_viewer.
- composer_embed.new_composer(this, referred);
}
public ComposerWidget.from_mailto(Geary.Account account, string mailto) {
diff --git a/src/client/conversation-list/conversation-list-view.vala
b/src/client/conversation-list/conversation-list-view.vala
index 55bb9d0..56085a2 100644
--- a/src/client/conversation-list/conversation-list-view.vala
+++ b/src/client/conversation-list/conversation-list-view.vala
@@ -203,9 +203,8 @@ public class ConversationListView : Gtk.TreeView {
}
}
- if (!get_selection().path_is_selected(path) && !((MainWindow) GearyApplication.
- instance.controller.main_window).conversation_viewer.composer_embed.
- abandon_existing_composition())
+ if (!get_selection().path_is_selected(path) &&
+ !GearyApplication.instance.controller.abandon_existing_composition())
return true;
if (event.button == 3 && event.type == Gdk.EventType.BUTTON_PRESS) {
diff --git a/src/client/conversation-viewer/conversation-viewer.vala
b/src/client/conversation-viewer/conversation-viewer.vala
index 6da1bee..3e6077e 100644
--- a/src/client/conversation-viewer/conversation-viewer.vala
+++ b/src/client/conversation-viewer/conversation-viewer.vala
@@ -129,6 +129,9 @@ public class ConversationViewer : Gtk.Box {
// Label for displaying overlay messages.
private Gtk.Label message_overlay_label;
+ // Overlay containing any inline composers.
+ public Gtk.Overlay compose_overlay;
+
// Maps emails to their corresponding elements.
private Gee.HashMap<Geary.EmailIdentifier, WebKit.DOM.HTMLElement> email_to_element = new
Gee.HashMap<Geary.EmailIdentifier, WebKit.DOM.HTMLElement>();
@@ -189,11 +192,10 @@ public class ConversationViewer : Gtk.Box {
web_view.link_selected.connect((link) => { link_selected(link); });
- Gtk.Overlay compose_overlay = new Gtk.Overlay();
+ compose_overlay = new Gtk.Overlay();
compose_overlay.add(web_view);
- composer_embed = new ComposerEmbed(this);
- compose_overlay.add_overlay(composer_embed);
- compose_overlay.get_child_position.connect(composer_embed.set_position);
+ compose_overlay.get_child_position.connect((widget, allocation) =>
+ { return ((ComposerEmbed) widget).set_position(ref allocation); } );
Gtk.ScrolledWindow conversation_viewer_scrolled = new Gtk.ScrolledWindow(null, null);
conversation_viewer_scrolled.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]