[gnome-todo] Move task lists to a new workspace



commit f177b9cd7432e27e1bed3b047e74b15ff2ba97f0
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date:   Mon Apr 27 23:18:06 2020 -0300

    Move task lists to a new workspace
    
    Drop the damn bomb!

 data/org.gnome.todo.gschema.xml                    |   2 +-
 meson.build                                        |   1 +
 plugins/meson.build                                |   1 +
 plugins/plugins.gresource.xml                      |   5 +
 .../gtd-plugin-task-lists-workspace.c              | 170 ++++++++
 .../gtd-plugin-task-lists-workspace.h              |  34 ++
 .../task-lists-workspace}/gtd-task-list-panel.c    |   2 +-
 .../task-lists-workspace}/gtd-task-list-panel.h    |   0
 .../task-lists-workspace}/gtd-task-list-panel.ui   |   0
 .../gtd-task-lists-workspace.c                     | 456 +++++++++++++++++++++
 .../gtd-task-lists-workspace.h                     |  35 ++
 .../gtd-task-lists-workspace.ui                    |  98 +++++
 plugins/task-lists-workspace/meson.build           |  38 ++
 .../sidebar/gtd-sidebar-list-row.c                 |   4 +-
 .../sidebar/gtd-sidebar-list-row.h                 |   0
 .../sidebar/gtd-sidebar-list-row.ui                |   0
 .../sidebar/gtd-sidebar-panel-row.c                |   4 +-
 .../sidebar/gtd-sidebar-panel-row.h                |   0
 .../sidebar/gtd-sidebar-panel-row.ui               |   0
 .../sidebar/gtd-sidebar-provider-row.c             |   4 +-
 .../sidebar/gtd-sidebar-provider-row.h             |   0
 .../sidebar/gtd-sidebar-provider-row.ui            |   0
 .../task-lists-workspace}/sidebar/gtd-sidebar.c    |  16 +-
 .../task-lists-workspace}/sidebar/gtd-sidebar.h    |   0
 .../task-lists-workspace}/sidebar/gtd-sidebar.ui   |   0
 .../task-lists-workspace.gresource.xml             |  11 +
 .../task-lists-workspace.plugin.in                 |  14 +
 src/engine/gtd-plugin-manager.c                    |   1 +
 src/gnome-todo.h                                   |   1 +
 src/gtd-window.c                                   | 424 ++++++-------------
 src/gtd-window.h                                   |   6 +-
 src/gtd-window.ui                                  |  99 +----
 src/meson.build                                    |   9 +-
 src/task-list-view/gtd-task-list-view.c            |   3 +-
 src/todo.gresource.xml                             |   5 -
 35 files changed, 1035 insertions(+), 408 deletions(-)
---
diff --git a/data/org.gnome.todo.gschema.xml b/data/org.gnome.todo.gschema.xml
index efe9018..ac6f30c 100644
--- a/data/org.gnome.todo.gschema.xml
+++ b/data/org.gnome.todo.gschema.xml
@@ -22,7 +22,7 @@
             <description>The identifier of the default provider to add new lists to</description>
         </key>
         <key name="active-extensions" type="as">
-            <default>["inbox-panel", "all-tasks-panel", "background", "eds", "today-panel", 
"next-week-panel", "night-light"]</default>
+            <default>["task-lists-workspace", "inbox-panel", "all-tasks-panel", "background", "eds", 
"today-panel", "next-week-panel", "night-light"]</default>
             <summary>List of active extensions</summary>
             <description>The list of active extensions</description>
         </key>
diff --git a/meson.build b/meson.build
index 6295a61..8e2b289 100644
--- a/meson.build
+++ b/meson.build
@@ -188,6 +188,7 @@ src_inc = include_directories(
   'src/interfaces',
   'src/models',
   'src/notification',
+  'src/provider',
   'src/task-list-view',
   'src/widgets',
 )
diff --git a/plugins/meson.build b/plugins/meson.build
index f175ff0..5185bd6 100644
--- a/plugins/meson.build
+++ b/plugins/meson.build
@@ -15,6 +15,7 @@ subdir('inbox-panel')
 subdir('next-week-panel')
 subdir('night-light')
 subdir('scheduled-panel')
+subdir('task-lists-workspace')
 subdir('today-panel')
 
 if get_option('score_plugin')
diff --git a/plugins/plugins.gresource.xml b/plugins/plugins.gresource.xml
index 690911b..011b844 100644
--- a/plugins/plugins.gresource.xml
+++ b/plugins/plugins.gresource.xml
@@ -43,6 +43,11 @@
     <file compressed="true" 
alias="theme/scheduled-panel/Adwaita.css">scheduled-panel/theme/Adwaita.css</file>
   </gresource>
 
+  <!--Night Light-->
+  <gresource prefix="/org/gnome/todo">
+    <file 
alias="plugins/task-lists-workspace/task-lists-workspace.plugin">task-lists-workspace/task-lists-workspace.plugin</file>
+  </gresource>
+
   <!--Today panel-->
   <gresource prefix="/org/gnome/todo">
     <file alias="plugins/today-panel/today-panel.plugin">today-panel/today-panel.plugin</file>
diff --git a/plugins/task-lists-workspace/gtd-plugin-task-lists-workspace.c 
b/plugins/task-lists-workspace/gtd-plugin-task-lists-workspace.c
new file mode 100644
index 0000000..750f098
--- /dev/null
+++ b/plugins/task-lists-workspace/gtd-plugin-task-lists-workspace.c
@@ -0,0 +1,170 @@
+/* gtd-plugin-task-lists-workspace.c
+ *
+ * Copyright 2020 Georges Basile Stavracas Neto <georges stavracas gmail com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+#define G_LOG_DOMAIN "GtdPluginTaskListsWorkspace"
+
+#include "gtd-plugin-task-lists-workspace.h"
+
+#include "gtd-task-lists-workspace.h"
+#include "task-lists-workspace.h"
+
+#include <glib/gi18n.h>
+#include <glib-object.h>
+
+struct _GtdPluginTaskListsWorkspace
+{
+  PeasExtensionBase   parent;
+
+  GtdWorkspace       *task_list_workspaces;
+};
+
+static void          gtd_activatable_iface_init                  (GtdActivatableInterface  *iface);
+
+G_DEFINE_DYNAMIC_TYPE_EXTENDED (GtdPluginTaskListsWorkspace,
+                                gtd_plugin_task_lists_workspace,
+                                PEAS_TYPE_EXTENSION_BASE,
+                                0,
+                                G_IMPLEMENT_INTERFACE_DYNAMIC (GTD_TYPE_ACTIVATABLE,
+                                                               gtd_activatable_iface_init))
+
+enum
+{
+  PROP_0,
+  PROP_PREFERENCES_PANEL,
+  N_PROPS
+};
+
+
+/*
+ * GtdActivatable interface implementation
+ */
+
+static void
+gtd_plugin_task_lists_workspace_activate (GtdActivatable *activatable)
+{
+  GtdPluginTaskListsWorkspace *self = GTD_PLUGIN_TASK_LISTS_WORKSPACE (activatable);
+
+  gtd_manager_add_workspace (gtd_manager_get_default (), self->task_list_workspaces);
+}
+
+static void
+gtd_plugin_task_lists_workspace_deactivate (GtdActivatable *activatable)
+{
+  GtdPluginTaskListsWorkspace *self = GTD_PLUGIN_TASK_LISTS_WORKSPACE (activatable);
+
+  gtd_manager_remove_workspace (gtd_manager_get_default (), self->task_list_workspaces);
+}
+
+static GList*
+gtd_plugin_task_lists_workspace_get_header_widgets (GtdActivatable *activatable)
+{
+  return NULL;
+}
+
+static GtkWidget*
+gtd_plugin_task_lists_workspace_get_preferences_panel (GtdActivatable *activatable)
+{
+  return NULL;
+}
+
+static GList*
+gtd_plugin_task_lists_workspace_get_panels (GtdActivatable *activatable)
+{
+  return NULL;
+}
+
+static GList*
+gtd_plugin_task_lists_workspace_get_providers (GtdActivatable *activatable)
+{
+  return NULL;
+}
+
+static void
+gtd_activatable_iface_init (GtdActivatableInterface *iface)
+{
+  iface->activate = gtd_plugin_task_lists_workspace_activate;
+  iface->deactivate = gtd_plugin_task_lists_workspace_deactivate;
+  iface->get_header_widgets = gtd_plugin_task_lists_workspace_get_header_widgets;
+  iface->get_preferences_panel = gtd_plugin_task_lists_workspace_get_preferences_panel;
+  iface->get_panels = gtd_plugin_task_lists_workspace_get_panels;
+  iface->get_providers = gtd_plugin_task_lists_workspace_get_providers;
+}
+
+static void
+gtd_plugin_task_lists_workspace_finalize (GObject *object)
+{
+  GtdPluginTaskListsWorkspace *self = (GtdPluginTaskListsWorkspace *)object;
+
+  g_clear_object (&self->task_list_workspaces);
+
+  G_OBJECT_CLASS (gtd_plugin_task_lists_workspace_parent_class)->finalize (object);
+}
+
+static void
+gtd_plugin_task_lists_workspace_get_property (GObject    *object,
+                                              guint       prop_id,
+                                              GValue     *value,
+                                              GParamSpec *pspec)
+{
+  switch (prop_id)
+    {
+    case PROP_PREFERENCES_PANEL:
+      g_value_set_object (value, NULL);
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
+}
+
+static void
+gtd_plugin_task_lists_workspace_class_init (GtdPluginTaskListsWorkspaceClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+  object_class->finalize = gtd_plugin_task_lists_workspace_finalize;
+  object_class->get_property = gtd_plugin_task_lists_workspace_get_property;
+
+  g_object_class_override_property (object_class, PROP_PREFERENCES_PANEL, "preferences-panel");
+}
+
+static void
+gtd_plugin_task_lists_workspace_init (GtdPluginTaskListsWorkspace *self)
+{
+  g_resources_register (task_lists_workspace_get_resource ());
+
+  self->task_list_workspaces = gtd_task_lists_workspace_new ();
+}
+
+static void
+gtd_plugin_task_lists_workspace_class_finalize (GtdPluginTaskListsWorkspaceClass *klass)
+{
+  g_resources_unregister (task_lists_workspace_get_resource ());
+}
+
+G_MODULE_EXPORT void
+gtd_plugin_task_lists_workspace_register_types (PeasObjectModule *module)
+{
+  gtd_plugin_task_lists_workspace_register_type (G_TYPE_MODULE (module));
+
+  peas_object_module_register_extension_type (module,
+                                              GTD_TYPE_ACTIVATABLE,
+                                              GTD_TYPE_PLUGIN_TASK_LISTS_WORKSPACE);
+}
diff --git a/plugins/task-lists-workspace/gtd-plugin-task-lists-workspace.h 
b/plugins/task-lists-workspace/gtd-plugin-task-lists-workspace.h
new file mode 100644
index 0000000..57f211c
--- /dev/null
+++ b/plugins/task-lists-workspace/gtd-plugin-task-lists-workspace.h
@@ -0,0 +1,34 @@
+/* gtd-plugin-task-lists-workspace.h
+ *
+ * Copyright 2020 Georges Basile Stavracas Neto <georges stavracas gmail com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+#pragma once
+
+#include "gnome-todo.h"
+
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+#define GTD_TYPE_PLUGIN_TASK_LISTS_WORKSPACE (gtd_plugin_task_lists_workspace_get_type())
+G_DECLARE_FINAL_TYPE (GtdPluginTaskListsWorkspace, gtd_plugin_task_lists_workspace, GTD, 
PLUGIN_TASK_LISTS_WORKSPACE, PeasExtensionBase)
+
+G_MODULE_EXPORT void gtd_plugin_task_lists_workspace_register_types   (PeasObjectModule   *module);
+
+G_END_DECLS
diff --git a/src/gtd-task-list-panel.c b/plugins/task-lists-workspace/gtd-task-list-panel.c
similarity index 99%
rename from src/gtd-task-list-panel.c
rename to plugins/task-lists-workspace/gtd-task-list-panel.c
index 4fd5e2a..e48c786 100644
--- a/src/gtd-task-list-panel.c
+++ b/plugins/task-lists-workspace/gtd-task-list-panel.c
@@ -538,7 +538,7 @@ gtd_task_list_panel_class_init (GtdTaskListPanelClass *klass)
                                         1,
                                         GTD_TYPE_TASK_LIST);
 
-  gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/todo/ui/gtd-task-list-panel.ui");
+  gtk_widget_class_set_template_from_resource (widget_class, 
"/org/gnome/todo/plugins/task-lists-workspace/gtd-task-list-panel.ui");
 
   gtk_widget_class_bind_template_child (widget_class, GtdTaskListPanel, archive_button);
   gtk_widget_class_bind_template_child (widget_class, GtdTaskListPanel, colors_flowbox);
diff --git a/src/gtd-task-list-panel.h b/plugins/task-lists-workspace/gtd-task-list-panel.h
similarity index 100%
rename from src/gtd-task-list-panel.h
rename to plugins/task-lists-workspace/gtd-task-list-panel.h
diff --git a/src/gtd-task-list-panel.ui b/plugins/task-lists-workspace/gtd-task-list-panel.ui
similarity index 100%
rename from src/gtd-task-list-panel.ui
rename to plugins/task-lists-workspace/gtd-task-list-panel.ui
diff --git a/plugins/task-lists-workspace/gtd-task-lists-workspace.c 
b/plugins/task-lists-workspace/gtd-task-lists-workspace.c
new file mode 100644
index 0000000..9f70996
--- /dev/null
+++ b/plugins/task-lists-workspace/gtd-task-lists-workspace.c
@@ -0,0 +1,456 @@
+/* gtd-task-lists-workspace.c
+ *
+ * Copyright 2020 Georges Basile Stavracas Neto <georges stavracas gmail com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+#define G_LOG_DOMAIN "GtdTaskListsWorkspace"
+
+#include "gtd-task-lists-workspace.h"
+
+#include "sidebar/gtd-sidebar.h"
+#include "gtd-task-list-panel.h"
+
+#include <glib/gi18n.h>
+
+struct _GtdTaskListsWorkspace
+{
+  GtkBox              parent;
+
+  GtkWidget          *back_button;
+  GtkWidget          *end_box;
+  GtkMenuButton      *gear_menu_button;
+  GtkWidget          *new_list_button;
+  GtkWidget          *panel_box_end;
+  GtkWidget          *panel_box_start;
+  GtkStack           *stack;
+  GtkWidget          *start_box;
+  GtdSidebar         *sidebar;
+  GtkWidget          *toggle_sidebar_button;
+
+  GtdPanel           *active_panel;
+  GtdPanel           *task_list_panel;
+
+  GSimpleActionGroup *action_group;
+};
+
+static void          gtd_workspace_iface_init                    (GtdWorkspaceInterface  *iface);
+
+G_DEFINE_TYPE_WITH_CODE (GtdTaskListsWorkspace, gtd_task_lists_workspace, GTK_TYPE_BOX,
+                         G_IMPLEMENT_INTERFACE (GTD_TYPE_WORKSPACE, gtd_workspace_iface_init))
+
+enum
+{
+  PROP_0,
+  PROP_ICON,
+  PROP_TITLE,
+  N_PROPS
+};
+
+
+/*
+ * Auxiliary methods
+ */
+
+static void
+add_widgets (GtdTaskListsWorkspace *self,
+             GList                 *widgets)
+{
+  GList *l;
+
+  for (l = widgets; l; l = l->next)
+    {
+      switch (gtk_widget_get_halign (l->data))
+        {
+        case GTK_ALIGN_END:
+          gtk_container_add (GTK_CONTAINER (self->panel_box_end), l->data);
+          break;
+
+        case GTK_ALIGN_START:
+        case GTK_ALIGN_BASELINE:
+        case GTK_ALIGN_FILL:
+        default:
+          gtk_container_add (GTK_CONTAINER (self->panel_box_start), l->data);
+          break;
+        }
+    }
+}
+
+static void
+remove_widgets (GtdTaskListsWorkspace *self,
+                GList                 *widgets)
+{
+  GList *l;
+
+  for (l = widgets; l; l = l->next)
+    {
+      GtkWidget *container;
+
+      if (gtk_widget_get_halign (l->data) == GTK_ALIGN_END)
+        container = self->panel_box_end;
+      else
+        container = self->panel_box_start;
+
+      g_object_ref (l->data);
+      gtk_container_remove (GTK_CONTAINER (container), l->data);
+    }
+}
+
+static void
+update_panel_menu (GtdTaskListsWorkspace *self)
+{
+  GtkPopover *popover;
+  const GMenu *menu;
+
+  popover = gtd_panel_get_popover (self->active_panel);
+  menu = gtd_panel_get_menu (self->active_panel);
+
+  gtk_widget_set_visible (GTK_WIDGET (self->gear_menu_button), popover || menu);
+
+  if (popover)
+    {
+      gtk_menu_button_set_popover (self->gear_menu_button, GTK_WIDGET (popover));
+    }
+  else
+    {
+      gtk_menu_button_set_popover (self->gear_menu_button, NULL);
+      gtk_menu_button_set_menu_model (self->gear_menu_button, G_MENU_MODEL (menu));
+    }
+}
+
+
+/*
+ * Callbacks
+ */
+
+static void
+on_action_activate_panel_activated_cb (GSimpleAction *simple,
+                                       GVariant      *parameters,
+                                       gpointer       user_data)
+{
+  GtdTaskListsWorkspace *self;
+  g_autoptr (GVariant) panel_parameters = NULL;
+  g_autofree gchar *panel_id = NULL;
+  GtdPanel *panel;
+
+  self = GTD_TASK_LISTS_WORKSPACE (user_data);
+
+  g_variant_get (parameters,
+                 "(sv)",
+                 &panel_id,
+                 &panel_parameters);
+
+  g_debug ("Activating panel '%s'", panel_id);
+
+  panel = (GtdPanel *) gtk_stack_get_child_by_name (self->stack, panel_id);
+  g_return_if_fail (panel && GTD_IS_PANEL (panel));
+
+  gtd_panel_activate (panel, panel_parameters);
+
+  gtk_stack_set_visible_child (self->stack, GTK_WIDGET (panel));
+}
+
+static void
+on_action_toggle_archive_activated_cb (GSimpleAction *simple,
+                                       GVariant      *state,
+                                       gpointer       user_data)
+{
+  GtdTaskListsWorkspace *self;
+  gboolean archive_visible;
+
+  self = GTD_TASK_LISTS_WORKSPACE (user_data);
+  archive_visible = g_variant_get_boolean (state);
+
+  gtk_widget_set_visible (self->new_list_button, !archive_visible);
+  gtd_sidebar_set_archive_visible (self->sidebar, archive_visible);
+}
+
+static void
+on_back_button_clicked_cb (GtkButton             *button,
+                           GtdTaskListsWorkspace *self)
+{
+  gtk_widget_activate_action (GTK_WIDGET (self),
+                              "task-lists-workspace.toggle-archive",
+                              "b",
+                              FALSE);
+}
+
+static void
+on_panel_added_cb (GtdManager            *manager,
+                   GtdPanel              *panel,
+                   GtdTaskListsWorkspace *self)
+{
+  gtk_stack_add_titled (self->stack,
+                        GTK_WIDGET (panel),
+                        gtd_panel_get_panel_name (panel),
+                        gtd_panel_get_panel_title (panel));
+}
+
+static void
+on_panel_removed_cb (GtdManager            *manager,
+                     GtdPanel              *panel,
+                     GtdTaskListsWorkspace *self)
+{
+  gtk_container_remove (GTK_CONTAINER (self->stack), GTK_WIDGET (panel));
+}
+
+static void
+on_panel_menu_changed_cb (GObject               *object,
+                          GParamSpec            *pspec,
+                          GtdTaskListsWorkspace *self)
+{
+  if (GTD_PANEL (object) != self->active_panel)
+    return;
+
+  update_panel_menu (self);
+}
+static void
+on_stack_visible_child_cb (GtdTaskListsWorkspace *self,
+                           GParamSpec            *pspec,
+                           GtkStack              *stack)
+{
+  GtkWidget *visible_child;
+  GtdPanel *panel;
+  GList *header_widgets;
+
+  visible_child = gtk_stack_get_visible_child (stack);
+  panel = GTD_PANEL (visible_child);
+
+  /* Remove previous panel's widgets */
+  if (self->active_panel)
+    {
+      header_widgets = gtd_panel_get_header_widgets (self->active_panel);
+
+      /* Disconnect signals */
+      g_signal_handlers_disconnect_by_func (self->active_panel,
+                                            on_panel_menu_changed_cb,
+                                            self);
+
+      remove_widgets (self, header_widgets);
+
+      g_list_free (header_widgets);
+    }
+
+  /* Add current panel's header widgets */
+  header_widgets = gtd_panel_get_header_widgets (panel);
+  add_widgets (self, header_widgets);
+
+  g_list_free (header_widgets);
+
+  g_signal_connect (panel, "notify::menu", G_CALLBACK (on_panel_menu_changed_cb), self);
+
+  /* Set panel as the new active panel */
+  g_set_object (&self->active_panel, panel);
+
+  /* Setup the panel's menu */
+  update_panel_menu (self);
+}
+
+
+/*
+ * GtdWorkspace implementation
+ */
+
+static const gchar*
+gtd_task_lists_workspace_get_id (GtdWorkspace *workspace)
+{
+  return "task-lists-workspace";
+}
+
+static const gchar*
+gtd_task_lists_workspace_get_title (GtdWorkspace *workspace)
+{
+  return _("Task Lists");
+}
+
+static gint
+gtd_task_lists_workspace_get_priority (GtdWorkspace *workspace)
+{
+  return 1000;
+}
+
+static GIcon*
+gtd_task_lists_workspace_get_icon (GtdWorkspace *workspace)
+{
+  return g_themed_icon_new ("view-list-symbolic");
+}
+
+static void
+gtd_task_lists_workspace_activate (GtdWorkspace *workspace)
+{
+  GtdTaskListsWorkspace *self = GTD_TASK_LISTS_WORKSPACE (workspace);
+  GtdWindow *window = GTD_WINDOW (gtk_widget_get_root (GTK_WIDGET (self)));
+
+  gtd_window_embed_widget_in_header (window, self->start_box, GTK_POS_LEFT);
+  gtd_window_embed_widget_in_header (window, self->end_box, GTK_POS_RIGHT);
+
+  gtd_sidebar_activate (self->sidebar);
+}
+
+static void
+gtd_task_lists_workspace_deactivate (GtdWorkspace *workspace)
+{
+}
+
+static void
+gtd_workspace_iface_init (GtdWorkspaceInterface  *iface)
+{
+  iface->get_id = gtd_task_lists_workspace_get_id;
+  iface->get_title = gtd_task_lists_workspace_get_title;
+  iface->get_priority = gtd_task_lists_workspace_get_priority;
+  iface->get_icon = gtd_task_lists_workspace_get_icon;
+  iface->activate = gtd_task_lists_workspace_activate;
+  iface->deactivate = gtd_task_lists_workspace_deactivate;
+}
+
+
+/*
+ * GObject overrides
+ */
+
+static void
+gtd_task_lists_workspace_constructed (GObject *object)
+{
+  GtdTaskListsWorkspace *self = (GtdTaskListsWorkspace *)object;
+  g_autoptr (GList) lists = NULL;
+  g_autoptr (GList) l = NULL;
+  GtdManager *manager;
+
+  self = GTD_TASK_LISTS_WORKSPACE (object);
+
+  G_OBJECT_CLASS (gtd_task_lists_workspace_parent_class)->constructed (object);
+
+  /* Add plugins' header widgets, and setup for new plugins */
+  manager = gtd_manager_get_default ();
+
+  /* Add loaded panels */
+  lists = gtd_manager_get_panels (manager);
+
+  for (l = lists; l; l = l->next)
+    on_panel_added_cb (NULL, l->data, self);
+
+  g_signal_connect (manager, "panel-added", G_CALLBACK (on_panel_added_cb), self);
+  g_signal_connect (manager, "panel-removed", G_CALLBACK (on_panel_removed_cb), self);
+
+  g_settings_bind (gtd_manager_get_settings (manager),
+                   "sidebar-revealed",
+                   self->toggle_sidebar_button,
+                   "active",
+                   G_SETTINGS_BIND_DEFAULT);
+}
+
+static void
+gtd_task_lists_workspace_get_property (GObject    *object,
+                                       guint       prop_id,
+                                       GValue     *value,
+                                       GParamSpec *pspec)
+{
+  GtdWorkspace *workspace = GTD_WORKSPACE (object);
+
+  switch (prop_id)
+    {
+    case PROP_ICON:
+      g_value_take_object (value, gtd_workspace_get_icon (workspace));
+      break;
+
+    case PROP_TITLE:
+      g_value_set_string (value, gtd_workspace_get_title (workspace));
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
+}
+
+static void
+gtd_task_lists_workspace_set_property (GObject      *object,
+                                       guint         prop_id,
+                                       const GValue *value,
+                                       GParamSpec   *pspec)
+{
+  G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+}
+
+static void
+gtd_task_lists_workspace_class_init (GtdTaskListsWorkspaceClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+  object_class->constructed = gtd_task_lists_workspace_constructed;
+  object_class->get_property = gtd_task_lists_workspace_get_property;
+  object_class->set_property = gtd_task_lists_workspace_set_property;
+
+  g_object_class_override_property (object_class, PROP_ICON, "icon");
+  g_object_class_override_property (object_class, PROP_TITLE, "title");
+
+  g_type_ensure (GTD_TYPE_PROVIDER_POPOVER);
+  g_type_ensure (GTD_TYPE_SIDEBAR);
+
+  gtk_widget_class_set_template_from_resource (widget_class, 
"/org/gnome/todo/plugins/task-lists-workspace/gtd-task-lists-workspace.ui");
+
+  gtk_widget_class_bind_template_child (widget_class, GtdTaskListsWorkspace, back_button);
+  gtk_widget_class_bind_template_child (widget_class, GtdTaskListsWorkspace, end_box);
+  gtk_widget_class_bind_template_child (widget_class, GtdTaskListsWorkspace, gear_menu_button);
+  gtk_widget_class_bind_template_child (widget_class, GtdTaskListsWorkspace, new_list_button);
+  gtk_widget_class_bind_template_child (widget_class, GtdTaskListsWorkspace, panel_box_end);
+  gtk_widget_class_bind_template_child (widget_class, GtdTaskListsWorkspace, panel_box_start);
+  gtk_widget_class_bind_template_child (widget_class, GtdTaskListsWorkspace, sidebar);
+  gtk_widget_class_bind_template_child (widget_class, GtdTaskListsWorkspace, stack);
+  gtk_widget_class_bind_template_child (widget_class, GtdTaskListsWorkspace, start_box);
+  gtk_widget_class_bind_template_child (widget_class, GtdTaskListsWorkspace, toggle_sidebar_button);
+
+  gtk_widget_class_bind_template_callback (widget_class, on_back_button_clicked_cb);
+  gtk_widget_class_bind_template_callback (widget_class, on_stack_visible_child_cb);
+}
+
+static void
+gtd_task_lists_workspace_init (GtdTaskListsWorkspace *self)
+{
+  static const GActionEntry entries[] = {
+    { "activate-panel", on_action_activate_panel_activated_cb, "(sv)" },
+    { "toggle-archive", on_action_toggle_archive_activated_cb, "b" },
+  };
+
+  gtk_widget_init_template (GTK_WIDGET (self));
+
+  self->action_group = g_simple_action_group_new ();
+  g_action_map_add_action_entries (G_ACTION_MAP (self->action_group),
+                                   entries,
+                                   G_N_ELEMENTS (entries),
+                                   self);
+  gtk_widget_insert_action_group (GTK_WIDGET (self),
+                                  "task-lists-workspace",
+                                  G_ACTION_GROUP (self->action_group));
+
+  gtk_actionable_set_action_target_value (GTK_ACTIONABLE (self->back_button),
+                                          g_variant_new_boolean (FALSE));
+
+  /* Task list panel */
+  self->task_list_panel = GTD_PANEL (gtd_task_list_panel_new ());
+  on_panel_added_cb (gtd_manager_get_default (), self->task_list_panel, self);
+
+  gtd_sidebar_set_panel_stack (self->sidebar, self->stack);
+  gtd_sidebar_set_task_list_panel (self->sidebar, self->task_list_panel);
+
+}
+
+GtdWorkspace*
+gtd_task_lists_workspace_new (void)
+{
+  return g_object_new (GTD_TYPE_TASK_LISTS_WORKSPACE, NULL);
+}
diff --git a/plugins/task-lists-workspace/gtd-task-lists-workspace.h 
b/plugins/task-lists-workspace/gtd-task-lists-workspace.h
new file mode 100644
index 0000000..2cd699a
--- /dev/null
+++ b/plugins/task-lists-workspace/gtd-task-lists-workspace.h
@@ -0,0 +1,35 @@
+/* gtd-task-lists-workspace.h
+ *
+ * Copyright 2020 Georges Basile Stavracas Neto <georges stavracas gmail com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+#pragma once
+
+#include <gtk/gtk.h>
+
+#include "gnome-todo.h"
+
+G_BEGIN_DECLS
+
+#define GTD_TYPE_TASK_LISTS_WORKSPACE (gtd_task_lists_workspace_get_type())
+
+G_DECLARE_FINAL_TYPE (GtdTaskListsWorkspace, gtd_task_lists_workspace, GTD, TASK_LISTS_WORKSPACE, GtkBox)
+
+GtdWorkspace*        gtd_task_lists_workspace_new                (void);
+
+G_END_DECLS
diff --git a/plugins/task-lists-workspace/gtd-task-lists-workspace.ui 
b/plugins/task-lists-workspace/gtd-task-lists-workspace.ui
new file mode 100644
index 0000000..d843a3a
--- /dev/null
+++ b/plugins/task-lists-workspace/gtd-task-lists-workspace.ui
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <template class="GtdTaskListsWorkspace" parent="GtkBox">
+
+    <!-- Sidebar -->
+    <child>
+      <object class="GtkRevealer" id="sidebar_revealer">
+        <property name="transition-type">slide-left</property>
+        <property name="reveal-child" bind-source="toggle_sidebar_button" bind-property="active" 
bind-flags="default" />
+        <child>
+          <object class="GtdSidebar" id="sidebar">
+            <property name="can_focus">False</property>
+            <property name="vexpand">True</property>
+          </object>
+        </child>
+      </object>
+    </child>
+
+    <!-- Panels Stack -->
+    <child>
+      <object class="GtkStack" id="stack">
+        <property name="hexpand">true</property>
+        <property name="vexpand">true</property>
+        <property name="homogeneous">0</property>
+        <property name="transition_duration">250</property>
+        <property name="transition_type">crossfade</property>
+        <signal name="notify::visible-child" handler="on_stack_visible_child_cb" 
object="GtdTaskListsWorkspace" swapped="yes"/>
+        <style>
+          <class name="background"/>
+        </style>
+      </object>
+    </child>
+
+  </template>
+
+  <!-- Start -->
+  <object class="GtkBox" id="start_box">
+    <property name="spacing">6</property>
+
+    <!-- New List -->
+    <child>
+      <object class="GtkMenuButton" id="new_list_button">
+        <property name="can_focus">1</property>
+        <property name="label" translatable="yes">New List</property>
+        <property name="receives_default">1</property>
+        <property name="popover">new_list_popover</property>
+        <property name="halign">start</property>
+      </object>
+    </child>
+
+    <child>
+      <object class="GtkButton" id="back_button">
+        <property name="visible" bind-source="new_list_button" bind-property="visible" 
bind-flags="sync-create|invert-boolean" />
+        <property name="can_focus">1</property>
+        <property name="receives_default">1</property>
+        <property name="halign">start</property>
+        <property name="icon-name">go-previous-symbolic</property>
+        <signal name="clicked" handler="on_back_button_clicked_cb" object="GtdTaskListsWorkspace" 
swapped="no" />
+      </object>
+    </child>
+
+    <child>
+      <object class="GtkToggleButton" id="toggle_sidebar_button">
+        <property name="can_focus">1</property>
+        <property name="icon-name">builder-view-left-pane-symbolic</property>
+      </object>
+    </child>
+
+    <child>
+      <object class="GtkBox" id="panel_box_start">
+        <property name="spacing">6</property>
+      </object>
+    </child>
+  </object>
+
+  <!-- End -->
+  <object class="GtkBox" id="end_box">
+    <property name="spacing">6</property>
+
+    <child>
+      <object class="GtkMenuButton" id="gear_menu_button">
+        <property name="can_focus">1</property>
+        <property name="icon-name">view-more-symbolic</property>
+      </object>
+    </child>
+
+    <child>
+      <object class="GtkBox" id="panel_box_end">
+        <property name="spacing">6</property>
+      </object>
+    </child>
+  </object>
+
+  <object class="GtdProviderPopover" id="new_list_popover">
+    <property name="can_focus">False</property>
+    <property name="position">bottom</property>
+  </object>
+</interface>
diff --git a/plugins/task-lists-workspace/meson.build b/plugins/task-lists-workspace/meson.build
new file mode 100644
index 0000000..130a032
--- /dev/null
+++ b/plugins/task-lists-workspace/meson.build
@@ -0,0 +1,38 @@
+plugin_name = 'task-lists-workspace'
+
+plugins_ldflags += ['-Wl,--undefined=gtd_plugin_task_lists_workspace_register_types']
+
+plugin_data = plugin_name + '.plugin'
+
+plugin_in = configure_file(
+          input: plugin_data + '.in',
+         output: plugin_data,
+  configuration: plugins_conf
+)
+
+sources = files(
+  'sidebar/gtd-sidebar.c',
+  'sidebar/gtd-sidebar-list-row.c',
+  'sidebar/gtd-sidebar-panel-row.c',
+  'sidebar/gtd-sidebar-provider-row.c',
+  'gtd-plugin-task-lists-workspace.c',
+  'gtd-task-list-panel.c',
+  'gtd-task-lists-workspace.c',
+)
+
+sources += gnome.compile_resources(
+  'task-lists-workspace',
+  'task-lists-workspace.gresource.xml',
+       c_name: 'task_lists_workspace',
+       export: true,
+ dependencies: plugin_in,
+)
+
+plugins_libs += static_library(
+          plugin_name,
+              sources: sources,
+  include_directories: plugins_incs,
+         dependencies: gnome_todo_deps
+)
+
+plugins_confs += plugin_in
diff --git a/src/sidebar/gtd-sidebar-list-row.c b/plugins/task-lists-workspace/sidebar/gtd-sidebar-list-row.c
similarity index 97%
rename from src/sidebar/gtd-sidebar-list-row.c
rename to plugins/task-lists-workspace/sidebar/gtd-sidebar-list-row.c
index e39ae71..86e1a73 100644
--- a/src/sidebar/gtd-sidebar-list-row.c
+++ b/plugins/task-lists-workspace/sidebar/gtd-sidebar-list-row.c
@@ -1,6 +1,6 @@
 /* gtd-sidebar-list-row.c
  *
- * Copyright 2018 Georges Basile Stavracas Neto <georges stavracas gmail com>
+ * Copyright 2018-2020 Georges Basile Stavracas Neto <georges stavracas gmail com>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -232,7 +232,7 @@ gtd_sidebar_list_row_class_init (GtdSidebarListRowClass *klass)
 
   g_object_class_install_properties (object_class, N_PROPS, properties);
 
-  gtk_widget_class_set_template_from_resource (widget_class, 
"/org/gnome/todo/ui/sidebar/gtd-sidebar-list-row.ui");
+  gtk_widget_class_set_template_from_resource (widget_class, 
"/org/gnome/todo/plugins/task-lists-workspace/sidebar/gtd-sidebar-list-row.ui");
 
   gtk_widget_class_bind_template_child (widget_class, GtdSidebarListRow, color_icon);
   gtk_widget_class_bind_template_child (widget_class, GtdSidebarListRow, name_label);
diff --git a/src/sidebar/gtd-sidebar-list-row.h b/plugins/task-lists-workspace/sidebar/gtd-sidebar-list-row.h
similarity index 100%
rename from src/sidebar/gtd-sidebar-list-row.h
rename to plugins/task-lists-workspace/sidebar/gtd-sidebar-list-row.h
diff --git a/src/sidebar/gtd-sidebar-list-row.ui 
b/plugins/task-lists-workspace/sidebar/gtd-sidebar-list-row.ui
similarity index 100%
rename from src/sidebar/gtd-sidebar-list-row.ui
rename to plugins/task-lists-workspace/sidebar/gtd-sidebar-list-row.ui
diff --git a/src/sidebar/gtd-sidebar-panel-row.c 
b/plugins/task-lists-workspace/sidebar/gtd-sidebar-panel-row.c
similarity index 96%
rename from src/sidebar/gtd-sidebar-panel-row.c
rename to plugins/task-lists-workspace/sidebar/gtd-sidebar-panel-row.c
index 63861c1..c133b3d 100644
--- a/src/sidebar/gtd-sidebar-panel-row.c
+++ b/plugins/task-lists-workspace/sidebar/gtd-sidebar-panel-row.c
@@ -1,6 +1,6 @@
 /* gtd-sidebar-panel-row.c
  *
- * Copyright 2018 Georges Basile Stavracas Neto <georges stavracas gmail com>
+ * Copyright 2018-2020 Georges Basile Stavracas Neto <georges stavracas gmail com>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -150,7 +150,7 @@ gtd_sidebar_panel_row_class_init (GtdSidebarPanelRowClass *klass)
 
   g_object_class_install_properties (object_class, N_PROPS, properties);
 
-  gtk_widget_class_set_template_from_resource (widget_class, 
"/org/gnome/todo/ui/sidebar/gtd-sidebar-panel-row.ui");
+  gtk_widget_class_set_template_from_resource (widget_class, 
"/org/gnome/todo/plugins/task-lists-workspace/sidebar/gtd-sidebar-panel-row.ui");
 
   gtk_widget_class_bind_template_child (widget_class, GtdSidebarPanelRow, panel_icon);
   gtk_widget_class_bind_template_child (widget_class, GtdSidebarPanelRow, subtitle_label);
diff --git a/src/sidebar/gtd-sidebar-panel-row.h 
b/plugins/task-lists-workspace/sidebar/gtd-sidebar-panel-row.h
similarity index 100%
rename from src/sidebar/gtd-sidebar-panel-row.h
rename to plugins/task-lists-workspace/sidebar/gtd-sidebar-panel-row.h
diff --git a/src/sidebar/gtd-sidebar-panel-row.ui 
b/plugins/task-lists-workspace/sidebar/gtd-sidebar-panel-row.ui
similarity index 100%
rename from src/sidebar/gtd-sidebar-panel-row.ui
rename to plugins/task-lists-workspace/sidebar/gtd-sidebar-panel-row.ui
diff --git a/src/sidebar/gtd-sidebar-provider-row.c 
b/plugins/task-lists-workspace/sidebar/gtd-sidebar-provider-row.c
similarity index 98%
rename from src/sidebar/gtd-sidebar-provider-row.c
rename to plugins/task-lists-workspace/sidebar/gtd-sidebar-provider-row.c
index 1a80d5e..4c66e31 100644
--- a/src/sidebar/gtd-sidebar-provider-row.c
+++ b/plugins/task-lists-workspace/sidebar/gtd-sidebar-provider-row.c
@@ -1,6 +1,6 @@
 /* gtd-sidebar-provider-row.c
  *
- * Copyright 2018 Georges Basile Stavracas Neto <georges stavracas gmail com>
+ * Copyright 2018-2020 Georges Basile Stavracas Neto <georges stavracas gmail com>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -262,7 +262,7 @@ gtd_sidebar_provider_row_class_init (GtdSidebarProviderRowClass *klass)
 
   g_object_class_install_properties (object_class, N_PROPS, properties);
 
-  gtk_widget_class_set_template_from_resource (widget_class, 
"/org/gnome/todo/ui/sidebar/gtd-sidebar-provider-row.ui");
+  gtk_widget_class_set_template_from_resource (widget_class, 
"/org/gnome/todo/plugins/task-lists-workspace/sidebar/gtd-sidebar-provider-row.ui");
 
   gtk_widget_class_bind_template_child (widget_class, GtdSidebarProviderRow, loading_label);
   gtk_widget_class_bind_template_child (widget_class, GtdSidebarProviderRow, provider_label);
diff --git a/src/sidebar/gtd-sidebar-provider-row.h 
b/plugins/task-lists-workspace/sidebar/gtd-sidebar-provider-row.h
similarity index 100%
rename from src/sidebar/gtd-sidebar-provider-row.h
rename to plugins/task-lists-workspace/sidebar/gtd-sidebar-provider-row.h
diff --git a/src/sidebar/gtd-sidebar-provider-row.ui 
b/plugins/task-lists-workspace/sidebar/gtd-sidebar-provider-row.ui
similarity index 100%
rename from src/sidebar/gtd-sidebar-provider-row.ui
rename to plugins/task-lists-workspace/sidebar/gtd-sidebar-provider-row.ui
diff --git a/src/sidebar/gtd-sidebar.c b/plugins/task-lists-workspace/sidebar/gtd-sidebar.c
similarity index 97%
rename from src/sidebar/gtd-sidebar.c
rename to plugins/task-lists-workspace/sidebar/gtd-sidebar.c
index be4b78c..ace2445 100644
--- a/src/sidebar/gtd-sidebar.c
+++ b/plugins/task-lists-workspace/sidebar/gtd-sidebar.c
@@ -257,7 +257,10 @@ activate_appropriate_row (GtdSidebar    *self,
   if (activate_row_below (self, GTD_SIDEBAR_LIST_ROW (row)))
     return;
 
-  gtk_widget_activate_action (GTK_WIDGET (self), "win.toggle-archive", "b", FALSE);
+  gtk_widget_activate_action (GTK_WIDGET (self),
+                              "task-lists-workspace.toggle-archive",
+                              "b",
+                              FALSE);
 
   to_be_activated = gtk_list_box_get_row_at_index (self->listbox, 0);
   g_signal_emit_by_name (to_be_activated, "activate");
@@ -428,7 +431,7 @@ on_listbox_row_activated_cb (GtkListBox    *panels_listbox,
       GtdPanel *panel = gtd_sidebar_panel_row_get_panel (GTD_SIDEBAR_PANEL_ROW (row));
 
       gtk_widget_activate_action (GTK_WIDGET (self),
-                                  "win.activate-panel",
+                                  "task-lists-workspace.activate-panel",
                                   "(sv)",
                                   gtd_panel_get_panel_name (panel),
                                   g_variant_new_maybe (G_VARIANT_TYPE_VARIANT, NULL));
@@ -455,14 +458,17 @@ on_listbox_row_activated_cb (GtkListBox    *panels_listbox,
                              g_variant_new_string (gtd_object_get_uid (GTD_OBJECT (list))));
 
       gtk_widget_activate_action (GTK_WIDGET (self),
-                                  "win.activate-panel",
+                                  "task-lists-workspace.activate-panel",
                                   "(sv)",
                                   "task-list-panel",
                                   g_variant_builder_end (&builder));
     }
   else if (row == self->archive_row)
     {
-      gtk_widget_activate_action (GTK_WIDGET (self), "win.toggle-archive", "b", TRUE);
+      gtk_widget_activate_action (GTK_WIDGET (self),
+                                  "task-lists-workspace.toggle-archive",
+                                  "b",
+                                  TRUE);
     }
   else
     {
@@ -808,7 +814,7 @@ gtd_sidebar_class_init (GtdSidebarClass *klass)
 
   object_class->constructed = gtd_sidebar_constructed;
 
-  gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/todo/ui/sidebar/gtd-sidebar.ui");
+  gtk_widget_class_set_template_from_resource (widget_class, 
"/org/gnome/todo/plugins/task-lists-workspace/sidebar/gtd-sidebar.ui");
 
   gtk_widget_class_bind_template_child (widget_class, GtdSidebar, archive_listbox);
   gtk_widget_class_bind_template_child (widget_class, GtdSidebar, archive_row);
diff --git a/src/sidebar/gtd-sidebar.h b/plugins/task-lists-workspace/sidebar/gtd-sidebar.h
similarity index 100%
rename from src/sidebar/gtd-sidebar.h
rename to plugins/task-lists-workspace/sidebar/gtd-sidebar.h
diff --git a/src/sidebar/gtd-sidebar.ui b/plugins/task-lists-workspace/sidebar/gtd-sidebar.ui
similarity index 100%
rename from src/sidebar/gtd-sidebar.ui
rename to plugins/task-lists-workspace/sidebar/gtd-sidebar.ui
diff --git a/plugins/task-lists-workspace/task-lists-workspace.gresource.xml 
b/plugins/task-lists-workspace/task-lists-workspace.gresource.xml
new file mode 100644
index 0000000..895ac77
--- /dev/null
+++ b/plugins/task-lists-workspace/task-lists-workspace.gresource.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gresources>
+  <gresource prefix="/org/gnome/todo/plugins/task-lists-workspace">
+    <file>sidebar/gtd-sidebar.ui</file>
+    <file>sidebar/gtd-sidebar-list-row.ui</file>
+    <file>sidebar/gtd-sidebar-panel-row.ui</file>
+    <file>sidebar/gtd-sidebar-provider-row.ui</file>
+    <file>gtd-task-list-panel.ui</file>
+    <file>gtd-task-lists-workspace.ui</file>
+  </gresource>
+</gresources>
diff --git a/plugins/task-lists-workspace/task-lists-workspace.plugin.in 
b/plugins/task-lists-workspace/task-lists-workspace.plugin.in
new file mode 100644
index 0000000..391c2ae
--- /dev/null
+++ b/plugins/task-lists-workspace/task-lists-workspace.plugin.in
@@ -0,0 +1,14 @@
+[Plugin]
+Name = Task Lists Workspace
+Module = task-lists-workspace
+Description = Plugin implementing the task lists workspace
+Version = @VERSION@
+Authors = Georges Basile Stavracas Neto <gbsneto gnome org>
+Copyright = Copyleft © The To Do maintainers
+Website = https://wiki.gnome.org/Apps/Todo
+Builtin = true
+Hidden = true
+License = GPL
+Loader = C
+Embedded = gtd_plugin_task_lists_workspace_register_types
+Depends =
diff --git a/src/engine/gtd-plugin-manager.c b/src/engine/gtd-plugin-manager.c
index 4f35d62..59b4f7d 100644
--- a/src/engine/gtd-plugin-manager.c
+++ b/src/engine/gtd-plugin-manager.c
@@ -49,6 +49,7 @@ enum
 static guint signals[NUM_SIGNALS] = { 0, };
 
 static const gchar * const default_plugins[] = {
+  "task-lists-workspace",
   "inbox-panel",
   "eds",
   "night-light",
diff --git a/src/gnome-todo.h b/src/gnome-todo.h
index 2758f80..ecadc22 100644
--- a/src/gnome-todo.h
+++ b/src/gnome-todo.h
@@ -29,6 +29,7 @@
 #include "gtd-object.h"
 #include "gtd-panel.h"
 #include "gtd-provider.h"
+#include "gtd-provider-popover.h"
 #include "gtd-task.h"
 #include "gtd-task-list.h"
 #include "gtd-task-list-view.h"
diff --git a/src/gtd-window.c b/src/gtd-window.c
index 628b4e6..bea2e93 100644
--- a/src/gtd-window.c
+++ b/src/gtd-window.c
@@ -23,6 +23,7 @@
 #include "interfaces/gtd-activatable.h"
 #include "interfaces/gtd-provider.h"
 #include "interfaces/gtd-panel.h"
+#include "interfaces/gtd-workspace.h"
 #include "gtd-application.h"
 #include "gtd-debug.h"
 #include "gtd-enum-types.h"
@@ -32,10 +33,8 @@
 #include "gtd-notification.h"
 #include "gtd-notification-widget.h"
 #include "gtd-plugin-manager.h"
-#include "gtd-sidebar.h"
 #include "gtd-task.h"
 #include "gtd-task-list.h"
-#include "gtd-task-list-panel.h"
 #include "gtd-window.h"
 #include "gtd-window-private.h"
 
@@ -58,27 +57,17 @@ struct _GtdWindow
 {
   GtkApplicationWindow application;
 
-  GtkWidget          *back_button;
   GtkWidget          *cancel_selection_button;
-  GtkWidget          *gear_menu_button;
   GtkHeaderBar       *headerbar;
-  GtkWidget          *new_list_button;
   GtkStack           *stack;
-  GtdSidebar         *sidebar;
+  GtkWidget          *workspace_box_end;
+  GtkWidget          *workspace_box_start;
 
   GtdNotificationWidget *notification_widget;
 
-  /* boxes */
-  GtkWidget          *extension_box_end;
-  GtkWidget          *extension_box_start;
-  GtkWidget          *panel_box_end;
-  GtkWidget          *panel_box_start;
-  GtkWidget          *toggle_sidebar_button;
+  GPtrArray          *workspace_header_widgets;
 
-  GtdPanel           *active_panel;
-  GtdPanel           *task_list_panel;
-
-  GBinding           *headerbar_title_binding;
+  GtdWorkspace       *current_workspace;
 
   /* mode */
   GtdWindowMode       mode;
@@ -126,141 +115,6 @@ is_development_build (void)
 #endif
 }
 
-static void
-add_widgets (GtdWindow *self,
-             GtkWidget *container_start,
-             GtkWidget *container_end,
-             GList     *widgets)
-{
-  GList *l;
-
-  for (l = widgets; l; l = l->next)
-    {
-      switch (gtk_widget_get_halign (l->data))
-        {
-        case GTK_ALIGN_START:
-          gtk_container_add (GTK_CONTAINER (container_start), l->data);
-          break;
-
-        case GTK_ALIGN_CENTER:
-          gtk_header_bar_set_custom_title (self->headerbar, l->data);
-          break;
-
-        case GTK_ALIGN_END:
-          gtk_container_add (GTK_CONTAINER (container_end), l->data);
-          break;
-
-        case GTK_ALIGN_BASELINE:
-        case GTK_ALIGN_FILL:
-        default:
-          gtk_container_add (GTK_CONTAINER (container_start), l->data);
-          break;
-        }
-    }
-}
-
-static void
-remove_widgets (GtdWindow *self,
-                GtkWidget *container_start,
-                GtkWidget *container_end,
-                GList     *widgets)
-{
-  GList *l;
-
-  for (l = widgets; l; l = l->next)
-    {
-      GtkWidget *container;
-
-      if (gtk_widget_get_halign (l->data) == GTK_ALIGN_END)
-        container = container_end;
-      else if (gtk_widget_get_halign (l->data) == GTK_ALIGN_CENTER)
-        container = GTK_WIDGET (self->headerbar);
-      else
-        container = container_start;
-
-      g_object_ref (l->data);
-      gtk_container_remove (GTK_CONTAINER (container), l->data);
-    }
-}
-
-static void
-on_plugin_loaded_cb (GtdWindow      *self,
-                     gpointer        unused_field,
-                     GtdActivatable *activatable)
-{
-  g_autoptr (GList) header_widgets = gtd_activatable_get_header_widgets (activatable);
-
-  add_widgets (self,
-               self->extension_box_start,
-               self->extension_box_end,
-               header_widgets);
-}
-
-static void
-on_plugin_unloaded_cb (GtdWindow      *self,
-                       gpointer        unused_field,
-                       GtdActivatable *activatable)
-{
-  GList *header_widgets = gtd_activatable_get_header_widgets (activatable);
-
-  remove_widgets (self,
-                  self->extension_box_start,
-                  self->extension_box_end,
-                  header_widgets);
-}
-
-static void
-update_panel_menu (GtdWindow *self)
-{
-  GtkPopover *popover;
-  const GMenu *menu;
-
-  popover = gtd_panel_get_popover (self->active_panel);
-  menu = gtd_panel_get_menu (self->active_panel);
-
-  gtk_widget_set_visible (self->gear_menu_button, popover || menu);
-
-  if (popover)
-    {
-      gtk_menu_button_set_popover (GTK_MENU_BUTTON (self->gear_menu_button), GTK_WIDGET (popover));
-    }
-  else
-    {
-      gtk_menu_button_set_popover (GTK_MENU_BUTTON (self->gear_menu_button), NULL);
-      gtk_menu_button_set_menu_model (GTK_MENU_BUTTON (self->gear_menu_button), G_MENU_MODEL (menu));
-    }
-}
-
-static void
-gtd_window__panel_menu_changed (GObject    *object,
-                                GParamSpec *pspec,
-                                GtdWindow  *self)
-{
-  if (GTD_PANEL (object) != self->active_panel)
-    return;
-
-  update_panel_menu (self);
-}
-
-static void
-on_panel_added_cb (GtdManager *manager,
-                   GtdPanel   *panel,
-                   GtdWindow  *self)
-{
-  gtk_stack_add_titled (self->stack,
-                        GTK_WIDGET (panel),
-                        gtd_panel_get_panel_name (panel),
-                        gtd_panel_get_panel_title (panel));
-}
-
-static void
-on_panel_removed_cb (GtdManager *manager,
-                     GtdPanel   *panel,
-                     GtdWindow  *self)
-{
-  gtk_container_remove (GTK_CONTAINER (self->stack), GTK_WIDGET (panel));
-}
-
 static void
 error_data_free (ErrorData *error_data)
 {
@@ -327,47 +181,46 @@ load_geometry (GtdWindow *self)
 }
 
 static void
-on_action_activate_panel_activated_cb (GSimpleAction *simple,
-                                       GVariant      *parameters,
-                                       gpointer       user_data)
+add_workspace (GtdWindow    *self,
+               GtdWorkspace *workspace)
 {
-  g_autoptr (GVariant) panel_parameters = NULL;
-  g_autofree gchar *panel_id = NULL;
-  GtdWindow *self;
-  GtdPanel *panel;
+  const gchar *workspace_id;
 
-  self = GTD_WINDOW (user_data);
+  workspace_id = gtd_workspace_get_id (workspace);
 
-  g_variant_get (parameters,
-                 "(sv)",
-                 &panel_id,
-                 &panel_parameters);
-
-  g_debug ("Activating panel '%s'", panel_id);
-
-  panel = (GtdPanel *) gtk_stack_get_child_by_name (self->stack, panel_id);
-  g_return_if_fail (panel && GTD_IS_PANEL (panel));
-
-  gtd_panel_activate (panel, panel_parameters);
-
-  gtk_stack_set_visible_child (self->stack, GTK_WIDGET (panel));
+  gtk_stack_add_named (self->stack, GTK_WIDGET (workspace), workspace_id);
 }
 
 static void
-on_action_toggle_archive_activated_cb (GSimpleAction *simple,
-                                       GVariant      *state,
-                                       gpointer       user_data)
+remove_all_workspace_header_widgets (GtdWindow *self)
 {
-  GtdWindow *self;
-  gboolean archive_visible;
+  GtkWidget *parent;
+  GtkWidget *widget;
+  guint i;
+
+  GTD_ENTRY;
+
+  /* remove from the header */
+  for (i = 0; i < self->workspace_header_widgets->len; i++)
+    {
+      widget = g_ptr_array_index (self->workspace_header_widgets, i);
+      parent = gtk_widget_get_parent (widget);
+
+      g_assert (parent == GTK_WIDGET (self->workspace_box_start) ||
+                parent == GTK_WIDGET (self->workspace_box_end));
+      gtk_container_remove (GTK_CONTAINER (parent), widget);
+    }
 
-  self = GTD_WINDOW (user_data);
-  archive_visible = g_variant_get_boolean (state);
+  g_ptr_array_set_size (self->workspace_header_widgets, 0);
 
-  gtk_widget_set_visible (self->new_list_button, !archive_visible);
-  gtd_sidebar_set_archive_visible (self->sidebar, archive_visible);
+  GTD_EXIT;
 }
 
+
+/*
+ * Callbacks
+ */
+
 static void
 on_cancel_selection_button_clicked (GtkWidget *button,
                                     GtdWindow *self)
@@ -376,64 +229,26 @@ on_cancel_selection_button_clicked (GtkWidget *button,
 }
 
 static void
-on_stack_visible_child_cb (GtdWindow  *self,
+on_stack_visible_child_cb (GtkStack   *stack,
                            GParamSpec *pspec,
-                           GtkStack   *stack)
+                           GtdWindow  *self)
 {
-  GtkWidget *visible_child;
-  GtdPanel *panel;
-  GList *header_widgets;
-
-  visible_child = gtk_stack_get_visible_child (stack);
-  panel = GTD_PANEL (visible_child);
-
-  /* Remove previous panel's widgets */
-  if (self->active_panel)
-    {
-      header_widgets = gtd_panel_get_header_widgets (self->active_panel);
-
-      /* Disconnect signals */
-      g_signal_handlers_disconnect_by_func (self->active_panel,
-                                            gtd_window__panel_menu_changed,
-                                            self);
-
-      remove_widgets (self,
-                      self->panel_box_start,
-                      self->panel_box_end,
-                      header_widgets);
-
-      g_assert (self->headerbar_title_binding != NULL);
-      g_clear_pointer (&self->headerbar_title_binding, g_binding_unbind);
-
-      g_list_free (header_widgets);
-    }
-
-  /* Add current panel's header widgets */
-  header_widgets = gtd_panel_get_header_widgets (panel);
+  GtdWorkspace *new_workspace;
 
-  add_widgets (self,
-               self->panel_box_start,
-               self->panel_box_end,
-               header_widgets);
+  GTD_ENTRY;
 
-  g_list_free (header_widgets);
+  remove_all_workspace_header_widgets (self);
 
-  g_signal_connect (panel,
-                    "notify::menu",
-                    G_CALLBACK (gtd_window__panel_menu_changed),
-                    self);
+  if (self->current_workspace)
+    gtd_workspace_deactivate (self->current_workspace);
 
-  /* Set panel as the new active panel */
-  g_set_object (&self->active_panel, panel);
+  new_workspace = GTD_WORKSPACE (gtk_stack_get_visible_child (stack));
+  g_assert (new_workspace != NULL);
 
-  /* Setup the panel's menu */
-  update_panel_menu (self);
+  self->current_workspace = new_workspace;
+  gtd_workspace_activate (new_workspace);
 
-  self->headerbar_title_binding = g_object_bind_property (panel,
-                                                          "title",
-                                                          self->headerbar,
-                                                          "title",
-                                                          G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE);
+  GTD_EXIT;
 }
 
 static void
@@ -482,6 +297,30 @@ on_show_notification_cb (GtdManager      *manager,
   gtd_window_notify (self, notification);
 }
 
+static void
+on_manager_workspace_added_cb (GtdManager   *manager,
+                               GtdWorkspace *workspace,
+                               GtdWindow    *self)
+{
+  GTD_ENTRY;
+
+  add_workspace (self, workspace);
+
+  GTD_EXIT;
+}
+
+static void
+on_manager_workspace_removed_cb (GtdManager   *manager,
+                                 GtdWorkspace *workspace,
+                                 GtdWindow    *self)
+{
+  GTD_ENTRY;
+
+  g_message ("Workspace removed");
+
+  GTD_EXIT;
+}
+
 
 /*
  * GtkWindow overrides
@@ -519,14 +358,10 @@ gtd_window_unmap (GtkWidget *widget)
 static void
 gtd_window_constructed (GObject *object)
 {
-  g_autoptr (GList) plugins = NULL;
-  g_autoptr (GList) lists = NULL;
-  g_autoptr (GList) l = NULL;
-  GtdPluginManager *plugin_manager;
-  GtkApplication *app;
+  g_autoptr (GPtrArray) workspaces = NULL;
   GtdManager *manager;
   GtdWindow *self;
-  GMenu *menu;
+  guint i;
 
   self = GTD_WINDOW (object);
 
@@ -535,39 +370,18 @@ gtd_window_constructed (GObject *object)
   /* Load stored size */
   load_geometry (GTD_WINDOW (object));
 
-  /* Gear menu */
-  app = GTK_APPLICATION (g_application_get_default ());
-  menu = gtk_application_get_menu_by_id (app, "gear-menu");
-  gtk_menu_button_set_menu_model (GTK_MENU_BUTTON (self->gear_menu_button), G_MENU_MODEL (menu));
-
-  /* Add plugins' header widgets, and setup for new plugins */
   manager = gtd_manager_get_default ();
-  plugin_manager = gtd_manager_get_plugin_manager (manager);
-  plugins = gtd_plugin_manager_get_loaded_plugins (plugin_manager);
-
-  for (l = plugins; l; l = l->next)
-    on_plugin_loaded_cb (self, NULL, l->data);
-
-  g_signal_connect_swapped (plugin_manager, "plugin-loaded", G_CALLBACK (on_plugin_loaded_cb), self);
-  g_signal_connect_swapped (plugin_manager, "plugin-unloaded", G_CALLBACK (on_plugin_unloaded_cb), self);
-
-  /* Add loaded panels */
-  lists = gtd_manager_get_panels (manager);
-
-  for (l = lists; l; l = l->next)
-    on_panel_added_cb (NULL, l->data, self);
-
-  g_signal_connect (manager, "panel-added", G_CALLBACK (on_panel_added_cb), self);
-  g_signal_connect (manager, "panel-removed", G_CALLBACK (on_panel_removed_cb), self);
-
   g_signal_connect (manager, "show-error-message", G_CALLBACK (on_show_error_message_cb), self);
   g_signal_connect (manager, "show-notification", G_CALLBACK (on_show_notification_cb), self);
 
-  g_settings_bind (gtd_manager_get_settings (manager),
-                   "sidebar-revealed",
-                   self->toggle_sidebar_button,
-                   "active",
-                   G_SETTINGS_BIND_DEFAULT);
+  /* Workspaces */
+  workspaces = gtd_manager_get_workspaces (manager);
+
+  for (i = 0; i < workspaces->len; i++)
+    add_workspace (self, g_ptr_array_index (workspaces, i));
+
+  g_signal_connect (manager, "workspace-added", G_CALLBACK (on_manager_workspace_added_cb), self);
+  g_signal_connect (manager, "workspace-removed", G_CALLBACK (on_manager_workspace_removed_cb), self);
 }
 
 static void
@@ -636,24 +450,15 @@ gtd_window_class_init (GtdWindowClass *klass)
                            G_PARAM_READWRITE));
 
   g_type_ensure (GTD_TYPE_NOTIFICATION_WIDGET);
-  g_type_ensure (GTD_TYPE_SIDEBAR);
 
   gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/todo/ui/gtd-window.ui");
 
-  gtk_widget_class_bind_template_child (widget_class, GtdWindow, back_button);
   gtk_widget_class_bind_template_child (widget_class, GtdWindow, cancel_selection_button);
-  gtk_widget_class_bind_template_child (widget_class, GtdWindow, gear_menu_button);
   gtk_widget_class_bind_template_child (widget_class, GtdWindow, headerbar);
   gtk_widget_class_bind_template_child (widget_class, GtdWindow, notification_widget);
-  gtk_widget_class_bind_template_child (widget_class, GtdWindow, new_list_button);
-  gtk_widget_class_bind_template_child (widget_class, GtdWindow, sidebar);
   gtk_widget_class_bind_template_child (widget_class, GtdWindow, stack);
-  gtk_widget_class_bind_template_child (widget_class, GtdWindow, toggle_sidebar_button);
-
-  gtk_widget_class_bind_template_child (widget_class, GtdWindow, extension_box_end);
-  gtk_widget_class_bind_template_child (widget_class, GtdWindow, extension_box_start);
-  gtk_widget_class_bind_template_child (widget_class, GtdWindow, panel_box_end);
-  gtk_widget_class_bind_template_child (widget_class, GtdWindow, panel_box_start);
+  gtk_widget_class_bind_template_child (widget_class, GtdWindow, workspace_box_end);
+  gtk_widget_class_bind_template_child (widget_class, GtdWindow, workspace_box_start);
 
   gtk_widget_class_bind_template_callback (widget_class, on_cancel_selection_button_clicked);
   gtk_widget_class_bind_template_callback (widget_class, on_stack_visible_child_cb);
@@ -662,28 +467,10 @@ gtd_window_class_init (GtdWindowClass *klass)
 static void
 gtd_window_init (GtdWindow *self)
 {
-  static const GActionEntry entries[] = {
-    { "activate-panel", on_action_activate_panel_activated_cb, "(sv)" },
-    { "toggle-archive", on_action_toggle_archive_activated_cb, "b" },
-  };
+  self->workspace_header_widgets = g_ptr_array_new_with_free_func (g_object_unref);
 
   gtk_widget_init_template (GTK_WIDGET (self));
 
-  g_action_map_add_action_entries (G_ACTION_MAP (self),
-                                   entries,
-                                   G_N_ELEMENTS (entries),
-                                   self);
-
-  gtk_actionable_set_action_target_value (GTK_ACTIONABLE (self->back_button),
-                                          g_variant_new_boolean (FALSE));
-
-  /* Task list panel */
-  self->task_list_panel = GTD_PANEL (gtd_task_list_panel_new ());
-  on_panel_added_cb (gtd_manager_get_default (), self->task_list_panel, self);
-
-  gtd_sidebar_set_panel_stack (self->sidebar, GTK_STACK (self->stack));
-  gtd_sidebar_set_task_list_panel (self->sidebar, self->task_list_panel);
-
   /* Development build */
   if (is_development_build ())
     setup_development_build (self);
@@ -767,7 +554,6 @@ gtd_window_set_mode (GtdWindow     *self,
       context = gtk_widget_get_style_context (GTK_WIDGET (self->headerbar));
       is_selection_mode = (mode == GTD_WINDOW_MODE_SELECTION);
 
-      gtk_widget_set_visible (self->gear_menu_button, !is_selection_mode);
       gtk_widget_set_visible (self->cancel_selection_button, is_selection_mode);
       gtk_header_bar_set_show_title_buttons (self->headerbar, !is_selection_mode);
       gtk_header_bar_set_subtitle (self->headerbar, NULL);
@@ -816,11 +602,51 @@ gtd_window_set_custom_title (GtdWindow   *self,
     }
 }
 
+/**
+ * gtd_window_embed_widget_in_header:
+ * @self: a #GtdWindow
+ * @widget: a #GtkWidget
+ * @position: either @GTK_POS_LEFT or @GTK_POS_RIGHT
+ *
+ * Embeds @widget into @self's header bar.
+ */
+void
+gtd_window_embed_widget_in_header (GtdWindow       *self,
+                                   GtkWidget       *widget,
+                                   GtkPositionType  position)
+{
+  g_return_if_fail (GTD_IS_WINDOW (self));
+  g_return_if_fail (GTK_IS_WIDGET (widget));
+
+  GTD_ENTRY;
+
+  /* add to header */
+  switch (position)
+    {
+    case GTK_POS_RIGHT:
+      gtk_container_add (GTK_CONTAINER (self->workspace_box_end), widget);
+      break;
+
+    case GTK_POS_LEFT:
+      gtk_container_add (GTK_CONTAINER (self->workspace_box_start), widget);
+      break;
+
+    case GTK_POS_TOP:
+    case GTK_POS_BOTTOM:
+    default:
+      g_warning ("Invalid position passed");
+      return;
+    }
+
+  g_ptr_array_add (self->workspace_header_widgets, g_object_ref (widget));
+
+  GTD_EXIT;
+
+}
+
 /* Private functions */
 void
 _gtd_window_finish_startup (GtdWindow *self)
 {
   g_return_if_fail (GTD_IS_WINDOW (self));
-
-  gtd_sidebar_activate (self->sidebar);
 }
diff --git a/src/gtd-window.h b/src/gtd-window.h
index 5cc690e..ed2cd66 100644
--- a/src/gtd-window.h
+++ b/src/gtd-window.h
@@ -1,6 +1,6 @@
 /* gtd-window.h
  *
- * Copyright (C) 2015 Georges Basile Stavracas Neto <georges stavracas gmail com>
+ * Copyright (C) 2015-2020 Georges Basile Stavracas Neto <georges stavracas gmail com>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -49,6 +49,10 @@ void                      gtd_window_set_custom_title     (GtdWindow
                                                            const gchar           *title,
                                                            const gchar           *subtitle);
 
+void                      gtd_window_embed_widget_in_header (GtdWindow           *self,
+                                                             GtkWidget           *widget,
+                                                             GtkPositionType      position);
+
 G_END_DECLS
 
 #endif /* GTD_WINDOW_H */
diff --git a/src/gtd-window.ui b/src/gtd-window.ui
index 72e5781..6a67602 100644
--- a/src/gtd-window.ui
+++ b/src/gtd-window.ui
@@ -16,39 +16,22 @@
             <property name="valign">start</property>
           </object>
         </child>
-        <child>
-          <object class="GtkBox">
-
-            <!-- Sidebar -->
-            <child>
-              <object class="GtkRevealer" id="sidebar_revealer">
-                <property name="transition-type">slide-left</property>
-                <property name="reveal-child" bind-source="toggle_sidebar_button" bind-property="active" 
bind-flags="default" />
-                <child>
-                  <object class="GtdSidebar" id="sidebar">
-                    <property name="can_focus">False</property>
-                    <property name="vexpand">True</property>
-                  </object>
-                </child>
-              </object>
-            </child>
 
-            <!-- Main Stack -->
-            <child>
-              <object class="GtkStack" id="stack">
-                <property name="hexpand">true</property>
-                <property name="vexpand">true</property>
-                <property name="homogeneous">0</property>
-                <property name="transition_duration">250</property>
-                <property name="transition_type">crossfade</property>
-                <signal name="notify::visible-child" handler="on_stack_visible_child_cb" object="GtdWindow" 
swapped="yes"/>
-                <style>
-                  <class name="background"/>
-                </style>
-              </object>
-            </child>
+        <!-- Main Stack -->
+        <child>
+          <object class="GtkStack" id="stack">
+            <property name="hexpand">true</property>
+            <property name="vexpand">true</property>
+            <property name="homogeneous">0</property>
+            <property name="transition_duration">250</property>
+            <property name="transition_type">crossfade</property>
+            <signal name="notify::visible-child" handler="on_stack_visible_child_cb" object="GtdWindow" 
swapped="no"/>
+            <style>
+              <class name="background"/>
+            </style>
           </object>
         </child>
+
       </object>
     </child>
     <child type="titlebar">
@@ -58,37 +41,7 @@
             <property name="hexpand">1</property>
             <property name="show-title-buttons">1</property>
             <child>
-              <object class="GtkMenuButton" id="new_list_button">
-                <property name="can_focus">1</property>
-                <property name="label" translatable="yes">New List</property>
-                <property name="receives_default">1</property>
-                <property name="popover">new_list_popover</property>
-                <property name="halign">start</property>
-              </object>
-            </child>
-            <child>
-              <object class="GtkButton" id="back_button">
-                <property name="visible" bind-source="new_list_button" bind-property="visible" 
bind-flags="sync-create|invert-boolean" />
-                <property name="can_focus">1</property>
-                <property name="receives_default">1</property>
-                <property name="halign">start</property>
-                <property name="action-name">win.toggle-archive</property>
-                <property name="icon-name">go-previous-symbolic</property>
-              </object>
-            </child>
-            <child>
-              <object class="GtkToggleButton" id="toggle_sidebar_button">
-                <property name="can_focus">1</property>
-                <property name="icon-name">builder-view-left-pane-symbolic</property>
-              </object>
-            </child>
-            <child>
-              <object class="GtkBox" id="panel_box_start">
-                <property name="spacing">6</property>
-              </object>
-            </child>
-            <child>
-              <object class="GtkBox" id="extension_box_start">
+              <object class="GtkBox" id="workspace_box_start">
                 <property name="spacing">6</property>
               </object>
             </child>
@@ -109,18 +62,7 @@
               </object>
             </child>
             <child type="end">
-              <object class="GtkMenuButton" id="gear_menu_button">
-                <property name="can_focus">1</property>
-                <property name="icon-name">view-more-symbolic</property>
-              </object>
-            </child>
-            <child type="end">
-              <object class="GtkBox" id="panel_box_end">
-                <property name="spacing">6</property>
-              </object>
-            </child>
-            <child type="end">
-              <object class="GtkBox" id="extension_box_end">
+              <object class="GtkBox" id="workspace_box_end">
                 <property name="spacing">6</property>
               </object>
             </child>
@@ -129,16 +71,7 @@
       </object>
     </child>
   </template>
-  <object class="GtdProviderPopover" id="new_list_popover">
-    <property name="can_focus">False</property>
-    <property name="position">bottom</property>
-  </object>
-  <object class="GtkSizeGroup">
-    <widgets>
-      <widget name="stack"/>
-      <widget name="headerbar"/>
-    </widgets>
-  </object>
+
   <menu id="app-menu">
     <section>
       <item>
diff --git a/src/meson.build b/src/meson.build
index 80e1a1a..ca0eceb 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -23,6 +23,7 @@ headers = enum_headers + files(
   'models/gtd-list-model-filter.h',
   'models/gtd-list-store.h',
   'notification/gtd-notification.h',
+  'provider/gtd-provider-popover.h',
   'task-list-view/gtd-task-list-view.h',
   'gtd-clock.h',
   'gtd-object.h',
@@ -58,10 +59,6 @@ sources = files(
   'provider/gtd-provider-popover.c',
   'provider/gtd-provider-row.c',
   'provider/gtd-provider-selector.c',
-  'sidebar/gtd-sidebar.c',
-  'sidebar/gtd-sidebar-list-row.c',
-  'sidebar/gtd-sidebar-panel-row.c',
-  'sidebar/gtd-sidebar-provider-row.c',
   'task-list-view/gtd-edit-pane.c',
   'task-list-view/gtd-dnd-row.c',
   'task-list-view/gtd-markdown-renderer.c',
@@ -81,7 +78,6 @@ sources = files(
   'gtd-rows-common.c',
   'gtd-task.c',
   'gtd-task-list.c',
-  'gtd-task-list-panel.c',
   'gtd-utils.c',
   'gtd-window.c',
   'main.c'
@@ -135,7 +131,6 @@ incs = [
     'notification',
     'interfaces',
     'widgets',
-    'sidebar',
   )
 ]
 
@@ -243,6 +238,8 @@ if get_option('introspection')
     'models/gtd-list-store.h',
     'notification/gtd-notification.c',
     'notification/gtd-notification.h',
+    'provider/gtd-provider-popover.c',
+    'provider/gtd-provider-popover.h',
     'task-list-view/gtd-task-list-view.c',
     'task-list-view/gtd-task-list-view.h',
     'gtd-enums.h',
diff --git a/src/task-list-view/gtd-task-list-view.c b/src/task-list-view/gtd-task-list-view.c
index 49811a8..00a4063 100644
--- a/src/task-list-view/gtd-task-list-view.c
+++ b/src/task-list-view/gtd-task-list-view.c
@@ -331,7 +331,8 @@ scroll_to_bottom_cb (gpointer data)
   widget = GTK_WIDGET (data);
   root = gtk_widget_get_root (widget);
 
-  g_assert (root != NULL);
+  if (!root)
+    return G_SOURCE_CONTINUE;
 
   priv->scroll_to_bottom_handler_id = 0;
 
diff --git a/src/todo.gresource.xml b/src/todo.gresource.xml
index 0b725ce..acb9f72 100644
--- a/src/todo.gresource.xml
+++ b/src/todo.gresource.xml
@@ -5,10 +5,6 @@
     <file compressed="true" preprocess="xml-stripblanks">provider/gtd-provider-popover.ui</file>
     <file compressed="true" preprocess="xml-stripblanks">provider/gtd-provider-row.ui</file>
     <file compressed="true" preprocess="xml-stripblanks">provider/gtd-provider-selector.ui</file>
-    <file compressed="true" preprocess="xml-stripblanks">sidebar/gtd-sidebar.ui</file>
-    <file compressed="true" preprocess="xml-stripblanks">sidebar/gtd-sidebar-list-row.ui</file>
-    <file compressed="true" preprocess="xml-stripblanks">sidebar/gtd-sidebar-panel-row.ui</file>
-    <file compressed="true" preprocess="xml-stripblanks">sidebar/gtd-sidebar-provider-row.ui</file>
     <file compressed="true" preprocess="xml-stripblanks">task-list-view/gtd-dnd-row.ui</file>
     <file compressed="true" preprocess="xml-stripblanks">task-list-view/gtd-edit-pane.ui</file>
     <file compressed="true" preprocess="xml-stripblanks">task-list-view/gtd-new-task-row.ui</file>
@@ -19,7 +15,6 @@
     <file compressed="true" preprocess="xml-stripblanks">gtd-initial-setup-window.ui</file>
     <file compressed="true" preprocess="xml-stripblanks">gtd-plugin-dialog.ui</file>
     <file compressed="true" preprocess="xml-stripblanks">gtd-plugin-dialog-row.ui</file>
-    <file compressed="true" preprocess="xml-stripblanks">gtd-task-list-panel.ui</file>
     <file compressed="true" preprocess="xml-stripblanks">gtd-window.ui</file>
   </gresource>
 


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