[geary/wip/713739-inline: 13/37] Use a new ComposerEmbed for each inline composer



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]