diff --git a/src/client/application/application-main-window.vala b/src/client/application/application-main-window.vala
index 90d5b249..19f04492 100644
--- a/src/client/application/application-main-window.vala
+++ b/src/client/application/application-main-window.vala
@@ -334,6 +334,10 @@ public class Application.MainWindow :
[GtkChild]
private Gtk.ScrolledWindow conversation_list_scrolled;
[GtkChild]
+ private Gtk.Box conversation_viewer_box;
+ [GtkChild]
+ private Components.ConversationActionBar conversation_viewer_action_bar;
+ [GtkChild]
private Gtk.SizeGroup folder_size_group;
[GtkChild]
private Gtk.SizeGroup folder_separator_size_group;
@@ -1266,7 +1270,7 @@ public class Application.MainWindow :
this.conversation_viewer.hexpand = true;
this.conversation_size_group.add_widget(this.conversation_viewer);
- this.main_leaflet.add_with_properties(this.conversation_viewer, "name", "conversation", null);
+ this.conversation_viewer_box.add(this.conversation_viewer);
// Setup conversation actions
@@ -1279,7 +1283,7 @@ public class Application.MainWindow :
BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL);
// Main toolbar
- this.main_toolbar = new MainToolbar(config);
+ this.main_toolbar = new MainToolbar(config, conversation_viewer_action_bar);
this.main_toolbar.add_to_size_groups(this.folder_size_group,
this.folder_separator_size_group,
this.conversations_size_group,
diff --git a/src/client/components/components-conversation-action-bar.vala b/src/client/components/components-conversation-action-bar.vala
index cb574521..cd868b21 100644
--- a/src/client/components/components-conversation-action-bar.vala
+++ b/src/client/components/components-conversation-action-bar.vala
@@ -12,7 +12,7 @@ public class Components.ConversationActionBar : Gtk.Revealer {
private ulong owner_notify;
[GtkChild]
- private Gtk.Box action_box;
+ public Gtk.Box action_box;
public ConversationActionBar() {
}
@@ -23,17 +23,17 @@ public class Components.ConversationActionBar : Gtk.Revealer {
*/
public void add_conversation_actions(Components.ConversationActions actions) {
if (actions.owner == this)
- return;
+ return;
actions.take_ownership(this);
action_box.pack_start(actions.mark_copy_move_buttons, false, false);
action_box.pack_end(actions.archive_trash_delete_buttons, false, false);
reveal_child = true;
this.owner_notify = actions.notify["owner"].connect(() => {
- if (actions.owner != this) {
- reveal_child = false;
- actions.disconnect (this.owner_notify);
- }
+ if (actions.owner != this) {
+ reveal_child = false;
+ actions.disconnect (this.owner_notify);
+ }
});
}
}
diff --git a/src/client/components/components-conversation-header-bar.vala b/src/client/components/components-conversation-header-bar.vala
new file mode 100644
index 00000000..ce28c236
--- /dev/null
+++ b/src/client/components/components-conversation-header-bar.vala
@@ -0,0 +1,70 @@
+/*
+ * Copyright © 2020 Purism SPC
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+[GtkTemplate (ui = "/org/gnome/Geary/components-conversation-header-bar.ui")]
+public class Components.ConversationHeaderBar : Gtk.HeaderBar {
+ public Components.ConversationActionBar action_bar { get; set; }
+ public bool folded { get; set; }
+
+ private ulong owner_notify;
+ private Gtk.Widget? reply_forward_buttons;
+ private Gtk.Widget? archive_trash_delete_buttons;
+
+ public ConversationHeaderBar() {
+ }
+
+ public override void size_allocate(Gtk.Allocation allocation) {
+ update_action_bar();
+ base.size_allocate(allocation);
+ }
+
+ [GtkCallback]
+ private void update_action_bar () {
+ /* Only show the action_bar when the conversation_header is shown */
+ if (parent == null)
+ action_bar.reveal_child = false;
+ else if (reply_forward_buttons != null && archive_trash_delete_buttons != null)
+ if (action_bar.reveal_child && get_allocated_width() > 600) {
+ action_bar.reveal_child = false;
+ remove_action_parent();
+ pack_start(reply_forward_buttons);
+ pack_end(archive_trash_delete_buttons);
+ } else if (!action_bar.reveal_child && get_allocated_width() < 600) {
+ remove_action_parent();
+ action_bar.action_box.pack_start(reply_forward_buttons, false, false);
+ action_bar.action_box.pack_end(archive_trash_delete_buttons, false, false);
+ action_bar.reveal_child = true;
+ }
+ }
+
+ private void remove_action_parent() {
+ if (reply_forward_buttons != null && reply_forward_buttons.parent != null)
+ reply_forward_buttons.parent.remove(reply_forward_buttons);
+ if (archive_trash_delete_buttons != null && archive_trash_delete_buttons.parent != null)
+ archive_trash_delete_buttons.parent.remove(archive_trash_delete_buttons);
+ }
+
+ public void add_conversation_actions(Components.ConversationActions actions) {
+ if (actions.owner != this) {
+ actions.take_ownership(this);
+ pack_start(actions.mark_copy_move_buttons);
+ pack_end(actions.find_button);
+
+ reply_forward_buttons = actions.reply_forward_buttons;
+ archive_trash_delete_buttons = actions.archive_trash_delete_buttons;
+ update_action_bar();
+ this.owner_notify = actions.notify["owner"].connect(() => {
+ if (actions.owner != this) {
+ action_bar.reveal_child = false;
+ reply_forward_buttons = null;
+ archive_trash_delete_buttons = null;
+ actions.disconnect (this.owner_notify);
+ }
+ });
+ }
+ }
+}
diff --git a/src/client/components/main-toolbar.vala b/src/client/components/main-toolbar.vala
index 6458b7fb..ab0e3ba1 100644
--- a/src/client/components/main-toolbar.vala
+++ b/src/client/components/main-toolbar.vala
@@ -17,6 +17,8 @@ public class MainToolbar : Hdy.Leaflet {
// Search bar
public bool search_open { get; set; default = false; }
+ private Components.ConversationActionBar conversation_viewer_action_bar;
+
[GtkChild]
private Hdy.Leaflet conversations_leaflet;
@@ -40,18 +42,21 @@ public class MainToolbar : Hdy.Leaflet {
// Conversation header elements
[GtkChild]
- private Gtk.HeaderBar conversation_header;
+ private Components.ConversationHeaderBar conversation_header;
[GtkChild]
private Hdy.HeaderGroup header_group;
Gtk.SizeGroup conversation_group;
- public MainToolbar(Application.Configuration config) {
+ public MainToolbar(Application.Configuration config,
+ Components.ConversationActionBar action_bar) {
if (config.desktop_environment != UNITY) {
this.bind_property("account", this.conversations_header, "title", BindingFlags.SYNC_CREATE);
this.bind_property("folder", this.conversations_header, "subtitle", BindingFlags.SYNC_CREATE);
}
+ this.conversation_viewer_action_bar = action_bar;
+ this.conversation_header.action_bar = action_bar;
// Assemble the main/mark menus
Gtk.Builder builder = new Gtk.Builder.from_resource("/org/gnome/Geary/main-toolbar-menus.ui");
@@ -63,17 +68,6 @@ public class MainToolbar : Hdy.Leaflet {
BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL);
}
- public void add_conversation_actions(Components.ConversationActions actions) {
- if (actions.owner == this)
- return;
-
- actions.take_ownership(this);
- conversation_header.pack_start(actions.mark_copy_move_buttons);
- conversation_header.pack_start(actions.reply_forward_buttons);
- conversation_header.pack_end(actions.find_button);
- conversation_header.pack_end(actions.archive_trash_delete_buttons);
- }
-
public void set_conversation_header(Gtk.HeaderBar header) {
remove(conversation_header);
this.header_group.add_gtk_header_bar(header);
@@ -111,4 +105,8 @@ public class MainToolbar : Hdy.Leaflet {
conversations_group.add_swipeable(this.conversations_leaflet);
conversation_group.add_swipeable(this);
}
+
+ public void add_conversation_actions(Components.ConversationActions actions) {
+ conversation_header.add_conversation_actions(actions);
+ }
}
diff --git a/src/client/conversation-viewer/conversation-viewer.vala b/src/client/conversation-viewer/conversation-viewer.vala
index a5098764..74706f8c 100644
--- a/src/client/conversation-viewer/conversation-viewer.vala
+++ b/src/client/conversation-viewer/conversation-viewer.vala
@@ -532,5 +532,4 @@ public class ConversationViewer : Gtk.Stack, Geary.BaseInterface {
}
}
}
-
}
diff --git a/src/client/meson.build b/src/client/meson.build
index 4efadc6d..56a07fa4 100644
--- a/src/client/meson.build
+++ b/src/client/meson.build
@@ -49,6 +49,7 @@ client_vala_sources = files(
'components/components-attachment-pane.vala',
'components/components-conversation-actions.vala',
'components/components-conversation-action-bar.vala',
+ 'components/components-conversation-header-bar.vala',
'components/components-entry-undo.vala',
'components/components-info-bar-stack.vala',
'components/components-info-bar.vala',
diff --git a/ui/application-main-window.ui b/ui/application-main-window.ui
index c55e42ab..1b41310d 100644
--- a/ui/application-main-window.ui
+++ b/ui/application-main-window.ui
@@ -137,6 +137,24 @@
False
+
+
+
+ conversation
+
+
True
diff --git a/ui/components-conversation-action-bar.ui b/ui/components-conversation-action-bar.ui
index ae49683f..6fc03f44 100644
--- a/ui/components-conversation-action-bar.ui
+++ b/ui/components-conversation-action-bar.ui
@@ -11,11 +11,28 @@
False
slide-up
-
+
True
False
True
- 6
+ vertical
+
+
+ True
+ False
+
+
+
+
+ True
+ False
+ True
+ 6
+ 6
+ 6
+ 6
+
+
diff --git a/ui/components-conversation-header-bar.ui b/ui/components-conversation-header-bar.ui
new file mode 100644
index 00000000..1677c72a
--- /dev/null
+++ b/ui/components-conversation-header-bar.ui
@@ -0,0 +1,36 @@
+
+
+
+
+
diff --git a/ui/main-toolbar.ui b/ui/main-toolbar.ui
index 64f888ee..ed9948b1 100644
--- a/ui/main-toolbar.ui
+++ b/ui/main-toolbar.ui
@@ -158,37 +158,9 @@
-