[geary] Switch to using an overlay instead of a plugin for inline composer
- From: Jim Nelson <jnelson src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [geary] Switch to using an overlay instead of a plugin for inline composer
- Date: Wed, 21 May 2014 00:41:14 +0000 (UTC)
commit 66a14f3d3adf7348693248747d82870bd1e5e397
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]