[gnome-builder/wip/chergert/layout] devhelp: move devhelp documentation to layout stack header



commit a6339352e0d7e84161f0e940415c62ad232e82d4
Author: Christian Hergert <chergert redhat com>
Date:   Sat Jul 1 17:09:45 2017 -0700

    devhelp: move devhelp documentation to layout stack header
    
    This helps us get away from the right sidebar being essential
    to using Builder. Devhelp was the last panel there and can
    naturally fit into the same sort of flow as the editor+symbols.
    
    The use-case here is that the user brings up a devhelp view on
    the right-hand of the split. Then that split can be used to
    browse documentation (through the header) or automatically using
    keyboard shortcuts from the editor.
    
    The keyboard shortcuts for the editor still needs additional
    plumbing to locate a view in a sibling stack.

 libide/layout/ide-layout-stack-header.ui           |    2 +-
 plugins/devhelp/gbp-devhelp-editor-view-addin.c    |   54 +++--
 plugins/devhelp/gbp-devhelp-layout-stack-addin.c   |  208 ++++++++++++++++++++
 plugins/devhelp/gbp-devhelp-layout-stack-addin.h   |   29 +++
 plugins/devhelp/gbp-devhelp-menu-button.c          |   88 ++++++++
 plugins/devhelp/gbp-devhelp-menu-button.h          |   32 +++
 plugins/devhelp/gbp-devhelp-menu-button.ui         |   31 +++
 plugins/devhelp/gbp-devhelp-plugin.c               |    6 +-
 .../devhelp/gbp-devhelp-resources.gresource.xml    |    1 +
 plugins/devhelp/meson.build                        |    5 +
 plugins/devhelp/themes/shared.css                  |   12 +-
 11 files changed, 439 insertions(+), 29 deletions(-)
---
diff --git a/libide/layout/ide-layout-stack-header.ui b/libide/layout/ide-layout-stack-header.ui
index 094814e..07c755d 100644
--- a/libide/layout/ide-layout-stack-header.ui
+++ b/libide/layout/ide-layout-stack-header.ui
@@ -97,7 +97,7 @@
             </child>
             <child>
               <object class="GtkButton">
-                <property name="action-name">win.new-devhelp</property>
+                <property name="action-name">devhelp.new-view</property>
                 <property name="visible">true</property>
                 <style>
                   <class name="image-button"/>
diff --git a/plugins/devhelp/gbp-devhelp-editor-view-addin.c b/plugins/devhelp/gbp-devhelp-editor-view-addin.c
index 441acd9..9b25489 100644
--- a/plugins/devhelp/gbp-devhelp-editor-view-addin.c
+++ b/plugins/devhelp/gbp-devhelp-editor-view-addin.c
@@ -26,32 +26,17 @@ struct _GbpDevhelpEditorViewAddin
   GObject parent_instance;
 };
 
-static void iface_init (IdeEditorViewAddinInterface *iface);
-
-G_DEFINE_TYPE_EXTENDED (GbpDevhelpEditorViewAddin, gbp_devhelp_editor_view_addin, G_TYPE_OBJECT, 0,
-                        G_IMPLEMENT_INTERFACE (IDE_TYPE_EDITOR_VIEW_ADDIN, iface_init))
-
 static void
 documentation_requested_cb (GbpDevhelpEditorViewAddin *self,
                             const gchar               *word,
                             IdeSourceView             *source_view)
 {
-  GtkWidget *layout;
-  GtkWidget *panel;
-  GtkWidget *pane;
-
   g_assert (GBP_IS_DEVHELP_EDITOR_VIEW_ADDIN (self));
   g_assert (IDE_IS_SOURCE_VIEW (source_view));
 
-  /* TODO: This would be much better as a GAction */
-
-  layout = gtk_widget_get_ancestor (GTK_WIDGET (source_view), IDE_TYPE_LAYOUT);
-  if (layout == NULL)
-    return;
-
-  pane = dzl_dock_bin_get_right_edge (DZL_DOCK_BIN (layout));
-  panel = dzl_gtk_widget_find_child_typed (pane, GBP_TYPE_DEVHELP_PANEL);
-  gbp_devhelp_panel_focus_search (GBP_DEVHELP_PANEL (panel), word);
+  if (!ide_str_empty0 (word))
+    dzl_gtk_widget_action (GTK_WIDGET (source_view), "devhelp", "search",
+                           g_variant_new_string (word));
 }
 
 static void
@@ -69,17 +54,42 @@ gbp_devhelp_editor_view_addin_load (IdeEditorViewAddin *addin,
 }
 
 static void
-gbp_devhelp_editor_view_addin_class_init (GbpDevhelpEditorViewAddinClass *klass)
+gbp_devhelp_editor_view_addin_unload (IdeEditorViewAddin *addin,
+                                      IdeEditorView      *view)
+{
+  IdeSourceView *source_view;
+
+  g_assert (GBP_IS_DEVHELP_EDITOR_VIEW_ADDIN (addin));
+  g_assert (IDE_IS_EDITOR_VIEW (view));
+
+  source_view = ide_editor_view_get_view (view);
+
+  if (source_view != NULL)
+    g_signal_handlers_disconnect_by_func (source_view,
+                                          G_CALLBACK (documentation_requested_cb),
+                                          addin);
+}
+
+static void
+editor_view_addin_iface_init (IdeEditorViewAddinInterface *iface)
 {
+  iface->load = gbp_devhelp_editor_view_addin_load;
+  iface->unload = gbp_devhelp_editor_view_addin_unload;
 }
 
+G_DEFINE_TYPE_WITH_CODE (GbpDevhelpEditorViewAddin,
+                         gbp_devhelp_editor_view_addin,
+                         G_TYPE_OBJECT,
+                         G_IMPLEMENT_INTERFACE (IDE_TYPE_EDITOR_VIEW_ADDIN,
+                                                editor_view_addin_iface_init))
+
+
 static void
-gbp_devhelp_editor_view_addin_init (GbpDevhelpEditorViewAddin *self)
+gbp_devhelp_editor_view_addin_class_init (GbpDevhelpEditorViewAddinClass *klass)
 {
 }
 
 static void
-iface_init (IdeEditorViewAddinInterface *iface)
+gbp_devhelp_editor_view_addin_init (GbpDevhelpEditorViewAddin *self)
 {
-  iface->load = gbp_devhelp_editor_view_addin_load;
 }
diff --git a/plugins/devhelp/gbp-devhelp-layout-stack-addin.c 
b/plugins/devhelp/gbp-devhelp-layout-stack-addin.c
new file mode 100644
index 0000000..90556ef
--- /dev/null
+++ b/plugins/devhelp/gbp-devhelp-layout-stack-addin.c
@@ -0,0 +1,208 @@
+/* gbp-devhelp-layout-stack-addin.c
+ *
+ * Copyright (C) 2017 Christian Hergert <chergert redhat 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/>.
+ */
+
+#define G_LOG_DOMAIN "gbp-devhelp-layout-stack-addin"
+
+#include "gbp-devhelp-layout-stack-addin.h"
+#include "gbp-devhelp-menu-button.h"
+#include "gbp-devhelp-view.h"
+
+struct _GbpDevhelpLayoutStackAddin
+{
+  GObject               parent_instance;
+  IdeLayoutStack       *stack;
+  GbpDevhelpMenuButton *button;
+};
+
+static void
+gbp_devhelp_layout_stack_addin_search (GSimpleAction *action,
+                                       GVariant      *variant,
+                                       gpointer       user_data)
+{
+  GbpDevhelpLayoutStackAddin *self = user_data;
+  const gchar *keyword;
+
+  g_assert (G_IS_SIMPLE_ACTION (action));
+  g_assert (GBP_IS_DEVHELP_LAYOUT_STACK_ADDIN (self));
+  g_assert (self->stack != NULL);
+  g_assert (IDE_IS_LAYOUT_STACK (self->stack));
+  g_assert (variant != NULL);
+  g_assert (g_variant_is_of_type (variant, G_VARIANT_TYPE_STRING));
+
+  if (self->button != NULL)
+    {
+      keyword = g_variant_get_string (variant, NULL);
+      gbp_devhelp_menu_button_search (self->button, keyword);
+    }
+}
+
+static void
+gbp_devhelp_layout_stack_addin_new_view (GSimpleAction *action,
+                                         GVariant      *variant,
+                                         gpointer       user_data)
+{
+  GbpDevhelpLayoutStackAddin *self = user_data;
+  GbpDevhelpView *view;
+
+  g_assert (G_IS_SIMPLE_ACTION (action));
+  g_assert (GBP_IS_DEVHELP_LAYOUT_STACK_ADDIN (self));
+  g_assert (self->stack != NULL);
+  g_assert (IDE_IS_LAYOUT_STACK (self->stack));
+
+  view = g_object_new (GBP_TYPE_DEVHELP_VIEW,
+                       "visible", TRUE,
+                       NULL);
+  gtk_container_add (GTK_CONTAINER (self->stack), GTK_WIDGET (view));
+}
+
+static void
+gbp_devhelp_layout_stack_addin_navigate_to (GSimpleAction *action,
+                                            GVariant      *variant,
+                                            gpointer       user_data)
+{
+  GbpDevhelpLayoutStackAddin *self = user_data;
+  IdeLayoutView *view;
+  const gchar *uri;
+
+  g_assert (G_IS_SIMPLE_ACTION (action));
+  g_assert (GBP_IS_DEVHELP_LAYOUT_STACK_ADDIN (self));
+  g_assert (self->stack != NULL);
+  g_assert (IDE_IS_LAYOUT_STACK (self->stack));
+  g_assert (variant != NULL);
+  g_assert (g_variant_is_of_type (variant, G_VARIANT_TYPE_STRING));
+
+  uri = g_variant_get_string (variant, NULL);
+  view = ide_layout_stack_get_visible_child (self->stack);
+
+  if (GBP_IS_DEVHELP_VIEW (view))
+    gbp_devhelp_view_set_uri (GBP_DEVHELP_VIEW (view), uri);
+}
+
+static GActionEntry actions[] = {
+  { "new-view", gbp_devhelp_layout_stack_addin_new_view },
+  { "search", gbp_devhelp_layout_stack_addin_search, "s" },
+  { "navigate-to", gbp_devhelp_layout_stack_addin_navigate_to, "s" },
+};
+
+static void
+gbp_devhelp_layout_stack_addin_load (IdeLayoutStackAddin *addin,
+                                     IdeLayoutStack      *stack)
+{
+  GbpDevhelpLayoutStackAddin *self = (GbpDevhelpLayoutStackAddin *)addin;
+  g_autoptr(GSimpleActionGroup) group = NULL;
+
+  g_assert (GBP_IS_DEVHELP_LAYOUT_STACK_ADDIN (self));
+  g_assert (IDE_IS_LAYOUT_STACK (stack));
+
+  self->stack = stack;
+
+  group = g_simple_action_group_new ();
+  g_action_map_add_action_entries (G_ACTION_MAP (group),
+                                   actions,
+                                   G_N_ELEMENTS (actions),
+                                   self);
+  gtk_widget_insert_action_group (GTK_WIDGET (stack),
+                                  "devhelp",
+                                  G_ACTION_GROUP (group));
+}
+
+static void
+gbp_devhelp_layout_stack_addin_unload (IdeLayoutStackAddin *addin,
+                                       IdeLayoutStack      *stack)
+{
+  GbpDevhelpLayoutStackAddin *self = (GbpDevhelpLayoutStackAddin *)addin;
+
+  g_assert (GBP_IS_DEVHELP_LAYOUT_STACK_ADDIN (self));
+  g_assert (IDE_IS_LAYOUT_STACK (stack));
+
+  self->stack = NULL;
+
+  gtk_widget_insert_action_group (GTK_WIDGET (stack), "devhelp", NULL);
+
+  if (self->button != NULL)
+    gtk_widget_destroy (GTK_WIDGET (self->button));
+}
+
+static void
+gbp_devhelp_layout_stack_addin_set_view (IdeLayoutStackAddin *addin,
+                                         IdeLayoutView       *view)
+{
+  GbpDevhelpLayoutStackAddin *self = (GbpDevhelpLayoutStackAddin *)addin;
+  gboolean visible = FALSE;
+
+  g_assert (GBP_IS_DEVHELP_LAYOUT_STACK_ADDIN (self));
+  g_assert (!view || IDE_IS_LAYOUT_VIEW (view));
+  g_assert (self->stack != NULL);
+  g_assert (IDE_IS_LAYOUT_STACK (self->stack));
+
+  /*
+   * We don't setup self->button until we get our first devhelp
+   * view. This helps reduce startup overhead as well as lower
+   * memory footprint until it is necessary.
+   */
+
+  if (GBP_IS_DEVHELP_VIEW (view))
+    {
+      if (self->button == NULL)
+        {
+          GtkWidget *titlebar;
+
+          titlebar = ide_layout_stack_get_titlebar (self->stack);
+
+          self->button = g_object_new (GBP_TYPE_DEVHELP_MENU_BUTTON,
+                                       "hexpand", TRUE,
+                                       NULL);
+          g_signal_connect (self->button,
+                            "destroy",
+                            G_CALLBACK (gtk_widget_destroyed),
+                            &self->button);
+          ide_layout_stack_header_add_custom_title (IDE_LAYOUT_STACK_HEADER (titlebar),
+                                                    GTK_WIDGET (self->button),
+                                                    100);
+        }
+
+      visible = TRUE;
+    }
+
+  if (self->button != NULL)
+    gtk_widget_set_visible (GTK_WIDGET (self->button), visible);
+}
+
+static void
+layout_stack_addin_iface_init (IdeLayoutStackAddinInterface *iface)
+{
+  iface->load = gbp_devhelp_layout_stack_addin_load;
+  iface->unload = gbp_devhelp_layout_stack_addin_unload;
+  iface->set_view = gbp_devhelp_layout_stack_addin_set_view;
+}
+
+G_DEFINE_TYPE_WITH_CODE (GbpDevhelpLayoutStackAddin,
+                         gbp_devhelp_layout_stack_addin,
+                         G_TYPE_OBJECT,
+                         G_IMPLEMENT_INTERFACE (IDE_TYPE_LAYOUT_STACK_ADDIN,
+                                                layout_stack_addin_iface_init))
+
+static void
+gbp_devhelp_layout_stack_addin_class_init (GbpDevhelpLayoutStackAddinClass *klass)
+{
+}
+
+static void
+gbp_devhelp_layout_stack_addin_init (GbpDevhelpLayoutStackAddin *self)
+{
+}
diff --git a/plugins/devhelp/gbp-devhelp-layout-stack-addin.h 
b/plugins/devhelp/gbp-devhelp-layout-stack-addin.h
new file mode 100644
index 0000000..0388064
--- /dev/null
+++ b/plugins/devhelp/gbp-devhelp-layout-stack-addin.h
@@ -0,0 +1,29 @@
+/* gbp-devhelp-layout-stack-addin.h
+ *
+ * Copyright (C) 2017 Christian Hergert <chergert redhat 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/>.
+ */
+
+#pragma once
+
+#include <ide.h>
+
+G_BEGIN_DECLS
+
+#define GBP_TYPE_DEVHELP_LAYOUT_STACK_ADDIN (gbp_devhelp_layout_stack_addin_get_type())
+
+G_DECLARE_FINAL_TYPE (GbpDevhelpLayoutStackAddin, gbp_devhelp_layout_stack_addin, GBP, 
DEVHELP_LAYOUT_STACK_ADDIN, GObject)
+
+G_END_DECLS
diff --git a/plugins/devhelp/gbp-devhelp-menu-button.c b/plugins/devhelp/gbp-devhelp-menu-button.c
new file mode 100644
index 0000000..1c0e9c8
--- /dev/null
+++ b/plugins/devhelp/gbp-devhelp-menu-button.c
@@ -0,0 +1,88 @@
+/* gbp-devhelp-menu-button.c
+ *
+ * Copyright (C) 2017 Christian Hergert <chergert redhat 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/>.
+ */
+
+#define G_LOG_DOMAIN "gbp-devhelp-menu-button"
+
+#include <devhelp/devhelp.h>
+#include <glib/gi18n.h>
+#include <ide.h>
+
+#include "gbp-devhelp-menu-button.h"
+
+struct _GbpDevhelpMenuButton
+{
+  GtkMenuButton  parent_instance;
+
+  GtkPopover    *popover;
+  DhSidebar     *sidebar;
+};
+
+G_DEFINE_TYPE (GbpDevhelpMenuButton, gbp_devhelp_menu_button, GTK_TYPE_MENU_BUTTON)
+
+static void
+gbp_devhelp_menu_button_link_selected (GbpDevhelpMenuButton *self,
+                                       DhLink               *link,
+                                       DhSidebar            *sidebar)
+{
+  g_autofree gchar *uri = NULL;
+
+  g_assert (GBP_IS_DEVHELP_MENU_BUTTON (self));
+  g_assert (link != NULL);
+  g_assert (DH_IS_SIDEBAR (sidebar));
+
+  uri = dh_link_get_uri (link);
+
+  dzl_gtk_widget_action (GTK_WIDGET (self),
+                         "devhelp", "navigate-to",
+                         g_variant_new_string (uri));
+}
+
+static void
+gbp_devhelp_menu_button_class_init (GbpDevhelpMenuButtonClass *klass)
+{
+  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+  gtk_widget_class_set_template_from_resource (widget_class,
+                                               
"/org/gnome/builder/plugins/devhelp-plugin/gbp-devhelp-menu-button.ui");
+  gtk_widget_class_bind_template_child (widget_class, GbpDevhelpMenuButton, popover);
+  gtk_widget_class_bind_template_child (widget_class, GbpDevhelpMenuButton, sidebar);
+
+  g_type_ensure (DH_TYPE_SIDEBAR);
+}
+
+static void
+gbp_devhelp_menu_button_init (GbpDevhelpMenuButton *self)
+{
+  gtk_widget_init_template (GTK_WIDGET (self));
+
+  g_signal_connect_swapped (self->sidebar,
+                            "link-selected",
+                            G_CALLBACK (gbp_devhelp_menu_button_link_selected),
+                            self);
+}
+
+void
+gbp_devhelp_menu_button_search (GbpDevhelpMenuButton *self,
+                                const gchar          *keyword)
+{
+  g_return_if_fail (GBP_IS_DEVHELP_MENU_BUTTON (self));
+
+  gtk_popover_popdown (GTK_POPOVER (self->popover));
+  dh_sidebar_set_search_string (self->sidebar, keyword);
+  dh_sidebar_set_search_focus (self->sidebar);
+}
diff --git a/plugins/devhelp/gbp-devhelp-menu-button.h b/plugins/devhelp/gbp-devhelp-menu-button.h
new file mode 100644
index 0000000..b85969b
--- /dev/null
+++ b/plugins/devhelp/gbp-devhelp-menu-button.h
@@ -0,0 +1,32 @@
+/* gbp-devhelp-menu-button.h
+ *
+ * Copyright (C) 2017 Christian Hergert <chergert redhat 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/>.
+ */
+
+#pragma once
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+#define GBP_TYPE_DEVHELP_MENU_BUTTON (gbp_devhelp_menu_button_get_type())
+
+G_DECLARE_FINAL_TYPE (GbpDevhelpMenuButton, gbp_devhelp_menu_button, GBP, DEVHELP_MENU_BUTTON, GtkMenuButton)
+
+void gbp_devhelp_menu_button_search (GbpDevhelpMenuButton *self,
+                                     const gchar          *keyword);
+
+G_END_DECLS
diff --git a/plugins/devhelp/gbp-devhelp-menu-button.ui b/plugins/devhelp/gbp-devhelp-menu-button.ui
new file mode 100644
index 0000000..fce6654
--- /dev/null
+++ b/plugins/devhelp/gbp-devhelp-menu-button.ui
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <object class="GtkPopover" id="popover">
+    <!--
+         Unfortunately we can't use propagate-natural-width/height
+         inside the scrolled window because it doesn't propagate
+         properly from the sidebar.
+    -->
+    <property name="height-request">600</property>
+    <property name="width-request">420</property>
+    <style>
+      <class name="devhelp"/>
+    </style>
+    <child>
+      <object class="DhSidebar" id="sidebar">
+        <property name="orientation">vertical</property>
+        <property name="visible">true</property>
+      </object>
+    </child>
+  </object>
+  <template class="GbpDevhelpMenuButton" parent="GtkMenuButton">
+    <property name="popover">popover</property>
+    <child>
+      <object class="GtkLabel">
+        <property name="label" translatable="yes">Documentation</property>
+        <property name="visible">true</property>
+        <property name="xalign">0.5</property>
+      </object>
+    </child>
+  </template>
+</interface>
diff --git a/plugins/devhelp/gbp-devhelp-plugin.c b/plugins/devhelp/gbp-devhelp-plugin.c
index 8b8152b..272453c 100644
--- a/plugins/devhelp/gbp-devhelp-plugin.c
+++ b/plugins/devhelp/gbp-devhelp-plugin.c
@@ -20,7 +20,7 @@
 #include <libpeas/peas.h>
 
 #include "gbp-devhelp-editor-view-addin.h"
-#include "gbp-devhelp-workbench-addin.h"
+#include "gbp-devhelp-layout-stack-addin.h"
 
 void
 peas_register_types (PeasObjectModule *module)
@@ -29,6 +29,6 @@ peas_register_types (PeasObjectModule *module)
                                               IDE_TYPE_EDITOR_VIEW_ADDIN,
                                               GBP_TYPE_DEVHELP_EDITOR_VIEW_ADDIN);
   peas_object_module_register_extension_type (module,
-                                              IDE_TYPE_WORKBENCH_ADDIN,
-                                              GBP_TYPE_DEVHELP_WORKBENCH_ADDIN);
+                                              IDE_TYPE_LAYOUT_STACK_ADDIN,
+                                              GBP_TYPE_DEVHELP_LAYOUT_STACK_ADDIN);
 }
diff --git a/plugins/devhelp/gbp-devhelp-resources.gresource.xml 
b/plugins/devhelp/gbp-devhelp-resources.gresource.xml
index ba8120d..bbb69c5 100644
--- a/plugins/devhelp/gbp-devhelp-resources.gresource.xml
+++ b/plugins/devhelp/gbp-devhelp-resources.gresource.xml
@@ -2,6 +2,7 @@
 <gresources>
   <gresource prefix="/org/gnome/builder/plugins/devhelp-plugin">
     <file>themes/shared.css</file>
+    <file>gbp-devhelp-menu-button.ui</file>
     <file>gbp-devhelp-view.ui</file>
     <file>gbp-devhelp-search.ui</file>
   </gresource>
diff --git a/plugins/devhelp/meson.build b/plugins/devhelp/meson.build
index 26c752b..d39fb44 100644
--- a/plugins/devhelp/meson.build
+++ b/plugins/devhelp/meson.build
@@ -7,6 +7,11 @@ devhelp_resources = gnome.compile_resources(
 )
 
 devhelp_sources = [
+  'gbp-devhelp-menu-button.c',
+  'gbp-devhelp-menu-button.h',
+  'gbp-devhelp-layout-stack-addin.c',
+  'gbp-devhelp-layout-stack-addin.h',
+
   'gbp-devhelp-editor-view-addin.c',
   'gbp-devhelp-editor-view-addin.h',
   'gbp-devhelp-panel.c',
diff --git a/plugins/devhelp/themes/shared.css b/plugins/devhelp/themes/shared.css
index e53dc97..9748f0d 100644
--- a/plugins/devhelp/themes/shared.css
+++ b/plugins/devhelp/themes/shared.css
@@ -1,4 +1,10 @@
-devhelppanel entry {
-  border-radius: 0;
-  border-width: 0 0 1px 0;
+popover.devhelp {
+  padding: 12px;
+}
+popover.devhelp treeview {
+  background: transparent;
+  color: @theme_fg_color;
+}
+popover.devhelp treeview:backdrop {
+  color: @theme_unfocused_fg_color;
 }


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