[gnome-builder] color-picker: port color picker to new editor addins



commit f1a3a9c879c475b561e78cd748ac254c28a5eade
Author: Christian Hergert <chergert redhat com>
Date:   Fri Jul 14 19:22:48 2017 -0700

    color-picker: port color picker to new editor addins
    
    This uses the simplified IdeEditorAddin interface to track
    state of the various views and connect them to the panel when
    necessary.
    
    The new IdeEditorViewAddin manages the buffer monitor for the
    given view without the complexity of connecting them all
    together in the workbench addin.

 .../color-picker/gb-color-picker-editor-addin.c    |  374 ++++++++++++++++++++
 .../color-picker/gb-color-picker-editor-addin.h    |   33 ++
 .../gb-color-picker-editor-view-addin.c            |  235 ++++++++++++
 .../gb-color-picker-editor-view-addin.h            |   35 ++
 plugins/color-picker/gb-color-picker-plugin.c      |   10 +-
 plugins/color-picker/gb-color-picker-prefs.c       |   40 +--
 plugins/color-picker/gtk/menus.ui                  |    5 +-
 plugins/color-picker/meson.build                   |    4 +
 8 files changed, 700 insertions(+), 36 deletions(-)
---
diff --git a/plugins/color-picker/gb-color-picker-editor-addin.c 
b/plugins/color-picker/gb-color-picker-editor-addin.c
new file mode 100644
index 0000000..7956288
--- /dev/null
+++ b/plugins/color-picker/gb-color-picker-editor-addin.c
@@ -0,0 +1,374 @@
+/* gb-color-picker-editor-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 "gb-color-picker-editor-addin"
+
+#include <glib/gi18n.h>
+#include <gstyle-color-panel.h>
+
+#include "gb-color-picker-editor-addin.h"
+#include "gb-color-picker-editor-view-addin.h"
+
+struct _GbColorPickerEditorAddin
+{
+  GObject parent_instance;
+
+  /*
+   * An unowned reference to the editor. This is set/unset when
+   * load/unload vfuncs are called.
+   */
+  IdeEditorPerspective *editor;
+
+  /*
+   * Our transient panel which we will slide into visibility when
+   * the current view is an IdeEditorView with the color-picker
+   * enabled.
+   */
+  GstyleColorPanel *panel;
+
+  /*
+   * This widget contains @panel but conforms to the DzlDockItem
+   * interface necessary for adding items to the panel.
+   */
+  DzlDockWidget *dock;
+
+  /*
+   * If the current view in the perspective is an editor view, then
+   * this unowned reference will point to that view.
+   */
+  IdeEditorView *view;
+
+  /*
+   * This signal group manages correctly binding/unbinding signals from
+   * our peer addin attached to the view. It emits a ::color-found signal
+   * which we use to propagate the color to the panel.
+   */
+  DzlSignalGroup *view_addin_signals;
+};
+
+static void
+gb_color_picker_editor_addin_show_panel (GbColorPickerEditorAddin *self)
+{
+  g_assert (GB_IS_COLOR_PICKER_EDITOR_ADDIN (self));
+
+  if (self->view != NULL)
+    {
+      IdeLayoutTransientSidebar *sidebar;
+      IdeLayoutView *view = IDE_LAYOUT_VIEW (self->view);
+
+      sidebar = ide_editor_perspective_get_transient_sidebar (self->editor);
+
+      ide_layout_transient_sidebar_set_view (sidebar, view);
+      ide_layout_transient_sidebar_set_panel (sidebar, GTK_WIDGET (self->dock));
+
+      g_object_set (self->editor, "right-visible", TRUE, NULL);
+    }
+}
+
+static void
+gb_color_picker_editor_addin_hide_panel (GbColorPickerEditorAddin *self)
+{
+  g_assert (GB_IS_COLOR_PICKER_EDITOR_ADDIN (self));
+}
+
+static void
+gb_color_picker_editor_addin_notify_enabled (GbColorPickerEditorAddin     *self,
+                                             GParamSpec                   *pspec,
+                                             GbColorPickerEditorViewAddin *view_addin)
+{
+  g_assert (GB_IS_COLOR_PICKER_EDITOR_ADDIN (self));
+  g_assert (GB_IS_COLOR_PICKER_EDITOR_VIEW_ADDIN (view_addin));
+
+  /* This function is called when the enabled state is toggled
+   * for the specific view in question. We hide the panel if it
+   * is current visible, otherwise we show it.
+   */
+
+  if (gb_color_picker_editor_view_addin_get_enabled (view_addin))
+    gb_color_picker_editor_addin_show_panel (self);
+  else
+    gb_color_picker_editor_addin_hide_panel (self);
+}
+
+/*
+ * gb_color_picker_editor_addin_add_palette:
+ * @self: a #GbColorPickerEditorAddin
+ * @palette_widget: the widget to add the palette to
+ * @uri: the uri of the file containing the palette
+ *
+ * Loads a palette found at @uri and adds it to @palette_widget.
+ *
+ * The palette instance returned is a full reference and should
+ * be freed with g_object_unref().
+ *
+ * Returns: (transfer full): The newly loaded palette
+ */
+static GstylePalette *
+gb_color_picker_editor_addin_add_palette (GbColorPickerEditorAddin *self,
+                                          GstylePaletteWidget      *palette_widget,
+                                          const gchar              *uri)
+{
+  g_autoptr(GstylePalette) palette = NULL;
+  g_autoptr(GError) error = NULL;
+  g_autoptr(GFile) file = NULL;
+
+  g_assert (GB_IS_COLOR_PICKER_EDITOR_ADDIN (self));
+  g_assert (GSTYLE_PALETTE_WIDGET (palette_widget));
+  g_assert (!ide_str_empty0 (uri));
+
+  file = g_file_new_for_uri (uri);
+  palette = gstyle_palette_new_from_file (file, NULL, &error);
+
+  if (palette == NULL)
+    {
+      g_warning ("Unable to load palette: %s", error->message);
+      return NULL;
+    }
+
+  gstyle_palette_widget_add (palette_widget, palette);
+
+  return g_steal_pointer (&palette);
+}
+
+static const gchar * internal_palettes[] = {
+  "resource:///org/gnome/builder/plugins/color-picker-plugin/data/basic.gstyle.xml",
+  "resource:///org/gnome/builder/plugins/color-picker-plugin/data/svg.gpl",
+};
+
+static void
+gb_color_picker_editor_addin_init_palettes (GbColorPickerEditorAddin *self)
+{
+  GstylePaletteWidget *palette_widget;
+
+  g_assert (GB_IS_COLOR_PICKER_EDITOR_ADDIN (self));
+
+  palette_widget = gstyle_color_panel_get_palette_widget (self->panel);
+
+  for (guint i = 0; i < G_N_ELEMENTS (internal_palettes); i++)
+    {
+      const gchar *uri = internal_palettes[i];
+      g_autoptr(GstylePalette) palette = NULL;
+
+      palette = gb_color_picker_editor_addin_add_palette (self, palette_widget, uri);
+
+      /* Show the last panel in the list */
+      if (i + 1 == G_N_ELEMENTS (internal_palettes))
+        gstyle_color_panel_show_palette (self->panel, palette);
+    }
+}
+
+static void
+gb_color_picker_editor_addin_notify_rgba (GbColorPickerEditorAddin *self,
+                                          GParamSpec               *pspec,
+                                          GstyleColorPanel         *panel)
+{
+  g_autoptr(GstyleColor) color = NULL;
+  GbColorPickerEditorViewAddin *view_addin;
+  GdkRGBA rgba;
+
+  g_assert (GB_IS_COLOR_PICKER_EDITOR_ADDIN (self));
+  g_assert (pspec != NULL);
+  g_assert (GSTYLE_IS_COLOR_PANEL (panel));
+
+  gstyle_color_panel_get_rgba (self->panel, &rgba);
+  color = gstyle_color_new_from_rgba (NULL, GSTYLE_COLOR_KIND_RGB_HEX6, &rgba);
+
+  view_addin = dzl_signal_group_get_target (self->view_addin_signals);
+
+  if (GB_IS_COLOR_PICKER_EDITOR_VIEW_ADDIN (view_addin))
+    gb_color_picker_editor_view_addin_set_color (view_addin, color);
+}
+
+static void
+gb_color_picker_editor_addin_color_found (GbColorPickerEditorAddin     *self,
+                                          GstyleColor                  *color,
+                                          GbColorPickerEditorViewAddin *view_addin)
+{
+  GdkRGBA rgba;
+
+  g_assert (GB_IS_COLOR_PICKER_EDITOR_ADDIN (self));
+  g_assert (GSTYLE_IS_COLOR (color));
+  g_assert (GB_IS_COLOR_PICKER_EDITOR_VIEW_ADDIN (view_addin));
+
+  dzl_signal_group_block (self->view_addin_signals);
+  gstyle_color_fill_rgba (color, &rgba);
+  gstyle_color_panel_set_rgba (self->panel, &rgba);
+  dzl_signal_group_unblock (self->view_addin_signals);
+}
+
+static void
+gb_color_picker_editor_addin_load (IdeEditorAddin       *addin,
+                                   IdeEditorPerspective *perspective)
+{
+  GbColorPickerEditorAddin *self = (GbColorPickerEditorAddin *)addin;
+  IdeLayoutTransientSidebar *sidebar;
+
+  g_assert (GB_IS_COLOR_PICKER_EDITOR_ADDIN (self));
+  g_assert (IDE_IS_EDITOR_PERSPECTIVE (perspective));
+
+  self->editor = perspective;
+
+  sidebar = ide_editor_perspective_get_transient_sidebar (perspective);
+
+  self->dock = g_object_new (DZL_TYPE_DOCK_WIDGET,
+                             "title", _("Colors"),
+                             "icon-name", "preferences-color-symbolic",
+                             "vexpand", TRUE,
+                             "visible", TRUE,
+                             NULL);
+  g_signal_connect (self->dock,
+                    "destroy",
+                    G_CALLBACK (gtk_widget_destroyed),
+                    &self->dock);
+  gtk_container_add (GTK_CONTAINER (sidebar), GTK_WIDGET (self->dock));
+
+  self->panel = g_object_new (GSTYLE_TYPE_COLOR_PANEL,
+                              "visible", TRUE,
+                              NULL);
+  g_signal_connect (self->panel,
+                    "destroy",
+                    G_CALLBACK (gtk_widget_destroyed),
+                    &self->panel);
+  g_signal_connect_object (self->panel,
+                           "notify::rgba",
+                           G_CALLBACK (gb_color_picker_editor_addin_notify_rgba),
+                           self,
+                           G_CONNECT_SWAPPED);
+  gtk_container_add (GTK_CONTAINER (self->dock), GTK_WIDGET (self->panel));
+
+  self->view_addin_signals = dzl_signal_group_new (GB_TYPE_COLOR_PICKER_EDITOR_VIEW_ADDIN);
+
+  dzl_signal_group_connect_swapped (self->view_addin_signals,
+                                    "color-found",
+                                    G_CALLBACK (gb_color_picker_editor_addin_color_found),
+                                    self);
+
+  dzl_signal_group_connect_swapped (self->view_addin_signals,
+                                    "notify::enabled",
+                                    G_CALLBACK (gb_color_picker_editor_addin_notify_enabled),
+                                    self);
+
+  gb_color_picker_editor_addin_init_palettes (self);
+}
+
+static void
+gb_color_picker_editor_addin_unload (IdeEditorAddin       *addin,
+                                     IdeEditorPerspective *perspective)
+{
+  GbColorPickerEditorAddin *self = (GbColorPickerEditorAddin *)addin;
+
+  g_assert (GB_IS_COLOR_PICKER_EDITOR_ADDIN (self));
+  g_assert (IDE_IS_EDITOR_PERSPECTIVE (perspective));
+
+  g_clear_object (&self->view_addin_signals);
+
+  if (self->dock != NULL)
+    gtk_widget_destroy (GTK_WIDGET (self->dock));
+
+  if (self->panel != NULL)
+    gtk_widget_destroy (GTK_WIDGET (self->panel));
+
+  self->editor = NULL;
+}
+
+static void
+gb_color_picker_editor_addin_view_set (IdeEditorAddin *addin,
+                                       IdeLayoutView  *view)
+{
+  GbColorPickerEditorAddin *self = (GbColorPickerEditorAddin *)addin;
+
+  g_assert (GB_IS_COLOR_PICKER_EDITOR_ADDIN (self));
+  g_assert (!view || IDE_IS_LAYOUT_VIEW (view));
+
+  if (IDE_IS_EDITOR_VIEW (view))
+    {
+      IdeEditorViewAddin *view_addin;
+
+      self->view = IDE_EDITOR_VIEW (view);
+
+      /* The addin may not be available yet if things are just initializing.
+       * We'll have to wait for a follow up view-set to make progress.
+       */
+      view_addin = ide_editor_view_addin_find_by_module_name (self->view, "color-picker-plugin");
+      g_assert (!view_addin || GB_IS_COLOR_PICKER_EDITOR_VIEW_ADDIN (view_addin));
+
+      dzl_signal_group_set_target (self->view_addin_signals, view_addin);
+
+      if (view_addin != NULL &&
+          gb_color_picker_editor_view_addin_get_enabled (GB_COLOR_PICKER_EDITOR_VIEW_ADDIN (view_addin)))
+        gb_color_picker_editor_addin_show_panel (self);
+    }
+  else
+    {
+      self->view = NULL;
+      dzl_signal_group_set_target (self->view_addin_signals, NULL);
+      gb_color_picker_editor_addin_hide_panel (self);
+    }
+}
+
+static void
+editor_addin_iface_init (IdeEditorAddinInterface *iface)
+{
+  iface->load = gb_color_picker_editor_addin_load;
+  iface->unload = gb_color_picker_editor_addin_unload;
+  iface->view_set = gb_color_picker_editor_addin_view_set;
+}
+
+G_DEFINE_TYPE_WITH_CODE (GbColorPickerEditorAddin,
+                         gb_color_picker_editor_addin,
+                         G_TYPE_OBJECT,
+                         G_IMPLEMENT_INTERFACE (IDE_TYPE_EDITOR_ADDIN,
+                                                editor_addin_iface_init))
+
+static void
+gb_color_picker_editor_addin_class_init (GbColorPickerEditorAddinClass *klass)
+{
+}
+
+static void
+gb_color_picker_editor_addin_init (GbColorPickerEditorAddin *self)
+{
+}
+
+/**
+ * gb_color_picker_editor_addin_create_palette:
+ * @self: a #GbColorPickerEditorAddin
+ *
+ * Creates a new #GstylePalette for the currently focused editor view.
+ *
+ * If no editor view is focused, %NULL is returned.
+ *
+ * Returns: (transfer full): A #GstylePalette or %NULL.
+ *
+ * Since: 3.26
+ */
+GstylePalette *
+gb_color_picker_editor_addin_create_palette (GbColorPickerEditorAddin *self)
+{
+  g_return_val_if_fail (GB_IS_COLOR_PICKER_EDITOR_ADDIN (self), NULL);
+
+  if (self->view != NULL)
+    {
+      IdeBuffer *buffer = ide_editor_view_get_buffer (self->view);
+
+      return gstyle_palette_new_from_buffer (GTK_TEXT_BUFFER (buffer),
+                                             NULL, NULL, NULL, NULL);
+    }
+
+  return NULL;
+}
diff --git a/plugins/color-picker/gb-color-picker-editor-addin.h 
b/plugins/color-picker/gb-color-picker-editor-addin.h
new file mode 100644
index 0000000..41cbb2a
--- /dev/null
+++ b/plugins/color-picker/gb-color-picker-editor-addin.h
@@ -0,0 +1,33 @@
+/* gb-color-picker-editor-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>
+
+#include <gstyle-palette.h>
+
+G_BEGIN_DECLS
+
+#define GB_TYPE_COLOR_PICKER_EDITOR_ADDIN (gb_color_picker_editor_addin_get_type())
+
+G_DECLARE_FINAL_TYPE (GbColorPickerEditorAddin, gb_color_picker_editor_addin, GB, COLOR_PICKER_EDITOR_ADDIN, 
GObject)
+
+GstylePalette *gb_color_picker_editor_addin_create_palette (GbColorPickerEditorAddin *self);
+
+G_END_DECLS
diff --git a/plugins/color-picker/gb-color-picker-editor-view-addin.c 
b/plugins/color-picker/gb-color-picker-editor-view-addin.c
new file mode 100644
index 0000000..40d9a7f
--- /dev/null
+++ b/plugins/color-picker/gb-color-picker-editor-view-addin.c
@@ -0,0 +1,235 @@
+/* gb-color-picker-editor-view-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 "gb-color-picker-editor-view-addin"
+
+#include "gb-color-picker-document-monitor.h"
+#include "gb-color-picker-editor-view-addin.h"
+
+struct _GbColorPickerEditorViewAddin
+{
+  GObject parent_instance;
+
+  /* Unowned reference to the view */
+  IdeEditorView *view;
+
+  /* Our document monitor, or NULL */
+  GbColorPickerDocumentMonitor *monitor;
+
+  /* If we've been enabled by the user */
+  guint enabled : 1;
+
+  /* Re-entrancy check for color-found */
+  guint in_color_found : 1;
+};
+
+enum {
+  COLOR_FOUND,
+  N_SIGNALS
+};
+
+enum {
+  PROP_0,
+  PROP_ENABLED,
+  N_PROPS
+};
+
+static GParamSpec *properties [N_PROPS];
+static guint signals [N_SIGNALS];
+
+static void
+monitor_color_found (GbColorPickerEditorViewAddin *self,
+                     GstyleColor                  *color,
+                     GbColorPickerDocumentMonitor *monitor)
+{
+  g_assert (GB_IS_COLOR_PICKER_EDITOR_VIEW_ADDIN (self));
+  g_assert (GSTYLE_IS_COLOR (color));
+  g_assert (GB_IS_COLOR_PICKER_DOCUMENT_MONITOR (monitor));
+
+  self->in_color_found = TRUE;
+  g_signal_emit (self, signals [COLOR_FOUND], 0, color);
+  self->in_color_found = FALSE;
+}
+
+void
+gb_color_picker_editor_view_addin_set_enabled (GbColorPickerEditorViewAddin *self,
+                                               gboolean                      enabled)
+{
+  g_return_if_fail (GB_IS_COLOR_PICKER_EDITOR_VIEW_ADDIN (self));
+
+  enabled = !!enabled;
+
+  if (enabled != self->enabled)
+    {
+      if (self->enabled)
+        {
+          self->enabled = FALSE;
+          gb_color_picker_document_monitor_queue_uncolorize (self->monitor, NULL, NULL);
+          gb_color_picker_document_monitor_set_buffer (self->monitor, NULL);
+          g_clear_object (&self->monitor);
+        }
+
+      if (enabled)
+        {
+          IdeBuffer *buffer = ide_editor_view_get_buffer (self->view);
+
+          self->enabled = TRUE;
+          self->monitor = gb_color_picker_document_monitor_new (buffer);
+          g_signal_connect_object (self->monitor,
+                                   "color-found",
+                                   G_CALLBACK (monitor_color_found),
+                                   self,
+                                   G_CONNECT_SWAPPED);
+          gb_color_picker_document_monitor_queue_colorize (self->monitor, NULL, NULL);
+        }
+
+      g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_ENABLED]);
+    }
+}
+
+gboolean
+gb_color_picker_editor_view_addin_get_enabled (GbColorPickerEditorViewAddin *self)
+{
+  g_return_val_if_fail (GB_IS_COLOR_PICKER_EDITOR_VIEW_ADDIN (self), FALSE);
+
+  return self->enabled;
+}
+
+static void
+gb_color_picker_editor_view_addin_load (IdeEditorViewAddin *addin,
+                                        IdeEditorView      *view)
+{
+  GbColorPickerEditorViewAddin *self = (GbColorPickerEditorViewAddin *)addin;
+  g_autoptr(DzlPropertiesGroup) group = NULL;
+
+  g_assert (GB_IS_COLOR_PICKER_EDITOR_VIEW_ADDIN (self));
+  g_assert (IDE_IS_EDITOR_VIEW (view));
+
+  self->view = view;
+
+  group = dzl_properties_group_new (G_OBJECT (self));
+  dzl_properties_group_add_all_properties (group);
+  gtk_widget_insert_action_group (GTK_WIDGET (view), "color-picker", G_ACTION_GROUP (group));
+}
+
+static void
+gb_color_picker_editor_view_addin_unload (IdeEditorViewAddin *addin,
+                                          IdeEditorView      *view)
+{
+  GbColorPickerEditorViewAddin *self = (GbColorPickerEditorViewAddin *)addin;
+
+  g_assert (GB_IS_COLOR_PICKER_EDITOR_VIEW_ADDIN (self));
+  g_assert (IDE_IS_EDITOR_VIEW (view));
+
+  if (self->monitor != NULL)
+    {
+      gb_color_picker_document_monitor_set_buffer (self->monitor, NULL);
+      g_clear_object (&self->monitor);
+    }
+
+  gtk_widget_insert_action_group (GTK_WIDGET (view), "color-picker", NULL);
+
+  self->view = NULL;
+}
+
+static void
+editor_view_addin_iface_init (IdeEditorViewAddinInterface *iface)
+{
+  iface->load = gb_color_picker_editor_view_addin_load;
+  iface->unload = gb_color_picker_editor_view_addin_unload;
+}
+
+G_DEFINE_TYPE_WITH_CODE (GbColorPickerEditorViewAddin, gb_color_picker_editor_view_addin, G_TYPE_OBJECT,
+                         G_IMPLEMENT_INTERFACE (IDE_TYPE_EDITOR_VIEW_ADDIN, editor_view_addin_iface_init))
+
+static void
+gb_color_picker_editor_view_addin_get_property (GObject    *object,
+                                                guint       prop_id,
+                                                GValue     *value,
+                                                GParamSpec *pspec)
+{
+  GbColorPickerEditorViewAddin *self = GB_COLOR_PICKER_EDITOR_VIEW_ADDIN (object);
+
+  switch (prop_id)
+    {
+    case PROP_ENABLED:
+      g_value_set_boolean (value, gb_color_picker_editor_view_addin_get_enabled (self));
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
+}
+
+static void
+gb_color_picker_editor_view_addin_set_property (GObject      *object,
+                                                guint         prop_id,
+                                                const GValue *value,
+                                                GParamSpec   *pspec)
+{
+  GbColorPickerEditorViewAddin *self = GB_COLOR_PICKER_EDITOR_VIEW_ADDIN (object);
+
+  switch (prop_id)
+    {
+    case PROP_ENABLED:
+      gb_color_picker_editor_view_addin_set_enabled (self, g_value_get_boolean (value));
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
+}
+
+static void
+gb_color_picker_editor_view_addin_class_init (GbColorPickerEditorViewAddinClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+  object_class->get_property = gb_color_picker_editor_view_addin_get_property;
+  object_class->set_property = gb_color_picker_editor_view_addin_set_property;
+
+  properties [PROP_ENABLED] =
+    g_param_spec_boolean ("enabled", NULL, NULL,
+                          FALSE,
+                          (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+  g_object_class_install_properties (object_class, N_PROPS, properties);
+
+  signals [COLOR_FOUND] =
+    g_signal_new ("color-found",
+                  G_TYPE_FROM_CLASS (klass),
+                  G_SIGNAL_RUN_LAST,
+                  0, NULL, NULL, NULL,
+                  G_TYPE_NONE, 1, GSTYLE_TYPE_COLOR);
+}
+
+static void
+gb_color_picker_editor_view_addin_init (GbColorPickerEditorViewAddin *self)
+{
+}
+
+void
+gb_color_picker_editor_view_addin_set_color (GbColorPickerEditorViewAddin *self,
+                                             GstyleColor                  *color)
+{
+  g_return_if_fail (GB_IS_COLOR_PICKER_EDITOR_VIEW_ADDIN (self));
+  g_return_if_fail (GSTYLE_IS_COLOR (color));
+
+  if (self->monitor != NULL && !self->in_color_found)
+    gb_color_picker_document_monitor_set_color_tag_at_cursor (self->monitor, color);
+}
diff --git a/plugins/color-picker/gb-color-picker-editor-view-addin.h 
b/plugins/color-picker/gb-color-picker-editor-view-addin.h
new file mode 100644
index 0000000..dc0d18d
--- /dev/null
+++ b/plugins/color-picker/gb-color-picker-editor-view-addin.h
@@ -0,0 +1,35 @@
+/* gb-color-picker-editor-view-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 GB_TYPE_COLOR_PICKER_EDITOR_VIEW_ADDIN (gb_color_picker_editor_view_addin_get_type())
+
+G_DECLARE_FINAL_TYPE (GbColorPickerEditorViewAddin, gb_color_picker_editor_view_addin, GB, 
COLOR_PICKER_EDITOR_VIEW_ADDIN, GObject)
+
+gboolean gb_color_picker_editor_view_addin_get_enabled (GbColorPickerEditorViewAddin *self);
+void     gb_color_picker_editor_view_addin_set_enabled (GbColorPickerEditorViewAddin *self,
+                                                        gboolean                      enabled);
+void     gb_color_picker_editor_view_addin_set_color   (GbColorPickerEditorViewAddin *self,
+                                                        GstyleColor                  *color);
+
+G_END_DECLS
diff --git a/plugins/color-picker/gb-color-picker-plugin.c b/plugins/color-picker/gb-color-picker-plugin.c
index 9902a46..181e053 100644
--- a/plugins/color-picker/gb-color-picker-plugin.c
+++ b/plugins/color-picker/gb-color-picker-plugin.c
@@ -19,12 +19,16 @@
 #include <ide.h>
 #include <libpeas/peas.h>
 
-#include "gb-color-picker-workbench-addin.h"
+#include "gb-color-picker-editor-addin.h"
+#include "gb-color-picker-editor-view-addin.h"
 
 void
 peas_register_types (PeasObjectModule *module)
 {
   peas_object_module_register_extension_type (module,
-                                              IDE_TYPE_WORKBENCH_ADDIN,
-                                              GB_TYPE_COLOR_PICKER_WORKBENCH_ADDIN);
+                                              IDE_TYPE_EDITOR_ADDIN,
+                                              GB_TYPE_COLOR_PICKER_EDITOR_ADDIN);
+  peas_object_module_register_extension_type (module,
+                                              IDE_TYPE_EDITOR_VIEW_ADDIN,
+                                              GB_TYPE_COLOR_PICKER_EDITOR_VIEW_ADDIN);
 }
diff --git a/plugins/color-picker/gb-color-picker-prefs.c b/plugins/color-picker/gb-color-picker-prefs.c
index 8deb8a0..3465280 100644
--- a/plugins/color-picker/gb-color-picker-prefs.c
+++ b/plugins/color-picker/gb-color-picker-prefs.c
@@ -20,12 +20,11 @@
 
 #include <ide.h>
 
+#include "gb-color-picker-editor-addin.h"
 #include "gb-color-picker-prefs.h"
 #include "gb-color-picker-prefs-list.h"
 #include "gb-color-picker-prefs-palette-list.h"
 #include "gb-color-picker-prefs-palette-row.h"
-#include "gb-color-picker-workbench-addin.h"
-#include "gb-color-picker-workbench-addin-private.h"
 
 struct _GbColorPickerPrefs
 {
@@ -37,7 +36,6 @@ struct _GbColorPickerPrefs
   GtkWidget                      *palettes_list_page;
 
   GstyleColorPanel               *panel;
-  GbColorPickerWorkbenchAddin    *addin;
   GstylePaletteWidget            *palette_widget;
   GListStore                     *palettes_store;
   GbColorPickerPrefsPaletteList  *palettes_box;
@@ -62,10 +60,8 @@ struct _GbColorPickerPrefs
 
 G_DEFINE_TYPE (GbColorPickerPrefs, gb_color_picker_prefs, G_TYPE_OBJECT)
 
-enum
-{
+enum {
   PROP_0,
-  PROP_ADDIN,
   PROP_PANEL,
   N_PROPS
 };
@@ -362,22 +358,19 @@ static void
 generate_palette_button_clicked_cb (GbColorPickerPrefs *self,
                                     GtkButton          *button)
 {
-  IdeEditorView *view;
-  GtkTextBuffer *buffer;
-  GstylePalette *palette;
+  g_autoptr(GstylePalette) palette = NULL;
+  IdeEditorAddin *addin;
+  GtkWidget *editor;
 
   g_assert (GB_IS_COLOR_PICKER_PREFS (self));
   g_assert (GTK_IS_BUTTON (button));
 
-  view = IDE_EDITOR_VIEW (self->addin->active_view);
-  buffer = GTK_TEXT_BUFFER (ide_editor_view_get_buffer (view));
+  editor = gtk_widget_get_ancestor (GTK_WIDGET (self), IDE_TYPE_EDITOR_PERSPECTIVE);
+  addin = ide_editor_addin_find_by_module_name (IDE_EDITOR_PERSPECTIVE (editor), "color-picker-plugin");
+  palette = gb_color_picker_editor_addin_create_palette (GB_COLOR_PICKER_EDITOR_ADDIN (addin));
 
-  palette = gstyle_palette_new_from_buffer (buffer, NULL, NULL, NULL, NULL);
   if (palette != NULL)
-    {
-      gstyle_palette_widget_add (self->palette_widget, palette);
-      g_object_unref (palette);
-    }
+    gstyle_palette_widget_add (self->palette_widget, palette);
 }
 
 static void
@@ -605,10 +598,6 @@ gb_color_picker_prefs_get_property (GObject    *object,
 
   switch (prop_id)
     {
-    case PROP_ADDIN:
-      g_value_set_object (value, self->addin);
-      break;
-
     case PROP_PANEL:
       g_value_set_object (value, gb_color_picker_prefs_get_panel (self));
       break;
@@ -628,10 +617,6 @@ gb_color_picker_prefs_set_property (GObject      *object,
 
   switch (prop_id)
     {
-    case PROP_ADDIN:
-      self->addin = g_value_get_object (value);
-      break;
-
     case PROP_PANEL:
       gb_color_picker_prefs_set_panel (self, g_value_get_object (value));
       break;
@@ -681,13 +666,6 @@ gb_color_picker_prefs_class_init (GbColorPickerPrefsClass *klass)
                          GSTYLE_TYPE_COLOR_PANEL,
                          (G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS));
 
-  properties [PROP_ADDIN] =
-    g_param_spec_object ("addin",
-                         "addin",
-                         "Colorpicker worbench addin",
-                         GB_TYPE_COLOR_PICKER_WORKBENCH_ADDIN,
-                         (G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
-
   g_object_class_install_properties (object_class, N_PROPS, properties);
 }
 
diff --git a/plugins/color-picker/gtk/menus.ui b/plugins/color-picker/gtk/menus.ui
index 3b9d889..022d99e 100644
--- a/plugins/color-picker/gtk/menus.ui
+++ b/plugins/color-picker/gtk/menus.ui
@@ -4,8 +4,9 @@
     <section id="ide-source-view-popup-menu-highlighting-section">
       <submenu id="ide-source-view-popup-menu-highlighting-submenu">
         <item>
-          <attribute name="label" translatable="yes">Enable color picker</attribute>
-          <attribute name="action">view.activate-color-picker</attribute>
+          <attribute name="label" translatable="yes">Highlight colors</attribute>
+          <attribute name="action">color-picker.enabled</attribute>
+          <attribute name="role">check</attribute>
         </item>
       </submenu>
     </section>
diff --git a/plugins/color-picker/meson.build b/plugins/color-picker/meson.build
index 62cadfc..d9ffa05 100644
--- a/plugins/color-picker/meson.build
+++ b/plugins/color-picker/meson.build
@@ -7,6 +7,10 @@ color_picker_resources = gnome.compile_resources(
 )
 
 color_picker_sources = [
+  'gb-color-picker-editor-addin.c',
+  'gb-color-picker-editor-addin.h',
+  'gb-color-picker-editor-view-addin.c',
+  'gb-color-picker-editor-view-addin.h',
   'gb-color-picker-helper.c',
   'gb-color-picker-helper.h',
   'gb-color-picker-plugin.c',


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