[geary/wip/713739-inline: 11/37] Switch to using an overlay instead of a plugin for inline composer



commit f968802c0357e0056a892d483a5d5615c8b7befe
Author: Robert Schroll <rschroll gmail com>
Date:   Tue May 13 10:32:04 2014 -0700

    Switch to using an overlay instead of a plugin for inline composer
    
    This takes care of displaying it correctly, but we still need to handle
    closing and destroying the composer properly.

 src/client/components/main-window.vala             |    2 -
 src/client/composer/composer-embed.vala            |   26 +++++++++++++------
 src/client/composer/composer-widget.vala           |    4 +-
 .../conversation-list/conversation-list-view.vala  |    5 ++-
 .../conversation-viewer/conversation-viewer.vala   |   11 +++++++-
 5 files changed, 33 insertions(+), 15 deletions(-)
---
diff --git a/src/client/components/main-window.vala b/src/client/components/main-window.vala
index 2433895..b42162b 100644
--- a/src/client/components/main-window.vala
+++ b/src/client/components/main-window.vala
@@ -18,7 +18,6 @@ public class MainWindow : Gtk.ApplicationWindow {
     public ConversationListView conversation_list_view  { get; private set; }
     public ConversationViewer conversation_viewer { get; private set; default = new ConversationViewer(); }
     public StatusBar status_bar { get; private set; default = new StatusBar(); }
-    public ComposerEmbed composer_embed { get; private set; }
     
     public int window_width { get; set; }
     public int window_height { get; set; }
@@ -39,7 +38,6 @@ public class MainWindow : Gtk.ApplicationWindow {
         title = GearyApplication.NAME;
         
         conversation_list_view = new ConversationListView(conversation_list_store);
-        composer_embed = new ComposerEmbed(conversation_viewer);
         
         add_events(Gdk.EventMask.KEY_PRESS_MASK | Gdk.EventMask.KEY_RELEASE_MASK
             | Gdk.EventMask.FOCUS_CHANGE_MASK);
diff --git a/src/client/composer/composer-embed.vala b/src/client/composer/composer-embed.vala
index d42af66..2062867 100644
--- a/src/client/composer/composer-embed.vala
+++ b/src/client/composer/composer-embed.vala
@@ -22,6 +22,9 @@ public class ComposerEmbed : Gtk.Box, ComposerContainer {
     public ComposerEmbed(ConversationViewer conversation_viewer) {
         Object(orientation: Gtk.Orientation.VERTICAL);
         this.conversation_viewer = conversation_viewer;
+        no_show_all = true;
+        halign = Gtk.Align.FILL;
+        valign = Gtk.Align.FILL;
         
         Gtk.Toolbar toolbar = new Gtk.Toolbar();
         toolbar.set_icon_size(Gtk.IconSize.MENU);
@@ -34,10 +37,10 @@ public class ComposerEmbed : Gtk.Box, ComposerContainer {
         toolbar.insert(detach, -1);
         toolbar.insert(close, -1);
         pack_start(toolbar, false, false);
+        toolbar.show_all();
         
         close.clicked.connect(on_close);
         detach.clicked.connect(on_detach);
-        conversation_viewer.web_view.create_plugin_widget.connect(on_plugin_requested);
     }
     
     public void new_composer(ComposerWidget new_composer, Geary.Email? referred) {
@@ -59,19 +62,17 @@ public class ComposerEmbed : Gtk.Box, ComposerContainer {
         
         try {
             conversation_viewer.show_conversation_div();
-            conversation_viewer.web_view.settings.enable_plugins = true;
             email_element.insert_adjacent_html("afterend",
-                @"<div id='$embed_id'><embed type='composer' /></div>");
+                @"<div id='$embed_id'></div>");
         } catch (Error error) {
             debug("Error creating embed element: %s", error.message);
             return;
-        } finally {
-            conversation_viewer.web_view.settings.enable_plugins = false;
         }
         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);
-        show_all();
+        new_composer.show_all();
+        show();
         present();
         this.composer = new_composer;
     }
@@ -128,8 +129,16 @@ public class ComposerEmbed : Gtk.Box, ComposerContainer {
         close();
     }
     
-    private Gtk.Widget on_plugin_requested() {
-        return this;
+    public bool set_position(Gtk.Widget widget, 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;
+        
+        allocation.x = (int) embed.offset_left;
+        allocation.y = (int) embed.offset_top;
+        allocation.width = (int) embed.offset_width;
+        allocation.height = (int) embed.offset_height;
+        return true;
     }
     
     private bool on_focus_in() {
@@ -151,6 +160,7 @@ public class ComposerEmbed : Gtk.Box, ComposerContainer {
     }
     
     private void close() {
+        hide();
         if (composer != null) {
             composer.editor.focus_in_event.disconnect(on_focus_in);
             composer.editor.focus_out_event.disconnect(on_focus_out);
diff --git a/src/client/composer/composer-widget.vala b/src/client/composer/composer-widget.vala
index 29b301a..eeaa86a 100644
--- a/src/client/composer/composer-widget.vala
+++ b/src/client/composer/composer-widget.vala
@@ -461,8 +461,8 @@ public class ComposerWidget : Gtk.EventBox {
         if (!from_multiple.visible)
             open_drafts_folder_async.begin(cancellable_drafts);
         
-        ((MainWindow) GearyApplication.instance.controller.main_window).composer_embed.
-            new_composer(this, referred);
+        ((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 bf431a5..55bb9d0 100644
--- a/src/client/conversation-list/conversation-list-view.vala
+++ b/src/client/conversation-list/conversation-list-view.vala
@@ -204,7 +204,8 @@ public class ConversationListView : Gtk.TreeView {
         }
         
         if (!get_selection().path_is_selected(path) && !((MainWindow) GearyApplication.
-            instance.controller.main_window).composer_embed.abandon_existing_composition())
+            instance.controller.main_window).conversation_viewer.composer_embed.
+            abandon_existing_composition())
             return true;
         
         if (event.button == 3 && event.type == Gdk.EventType.BUTTON_PRESS) {
@@ -388,7 +389,7 @@ public class ConversationListView : Gtk.TreeView {
     // Selects the first conversation, if nothing has been selected yet and we're not composing.
     public void select_first_conversation() {
         if (get_selected_path() == null && !((MainWindow) GearyApplication.instance.
-            controller.main_window).composer_embed.is_active) {
+            controller.main_window).conversation_viewer.composer_embed.is_active) {
             set_cursor(new Gtk.TreePath.from_indices(0, -1), null, false);
         }
     }
diff --git a/src/client/conversation-viewer/conversation-viewer.vala 
b/src/client/conversation-viewer/conversation-viewer.vala
index 5ab0676..6da1bee 100644
--- a/src/client/conversation-viewer/conversation-viewer.vala
+++ b/src/client/conversation-viewer/conversation-viewer.vala
@@ -117,6 +117,9 @@ public class ConversationViewer : Gtk.Box {
     // The HTML viewer to view the emails.
     public ConversationWebView web_view { get; private set; }
     
+    // The container to hold the inline composer.
+    public ComposerEmbed composer_embed { get; private set; }
+    
     // Current conversation, or null if none.
     public Geary.App.Conversation? current_conversation = null;
     
@@ -186,9 +189,15 @@ public class ConversationViewer : Gtk.Box {
 
         web_view.link_selected.connect((link) => { link_selected(link); });
         
+        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);
+        
         Gtk.ScrolledWindow conversation_viewer_scrolled = new Gtk.ScrolledWindow(null, null);
         conversation_viewer_scrolled.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC);
-        conversation_viewer_scrolled.add(web_view);
+        conversation_viewer_scrolled.add(compose_overlay);
         
         message_overlay = new Gtk.Overlay();
         message_overlay.add(conversation_viewer_scrolled);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]