[gnome-builder] libide/gui: add module-name property for session items



commit 6dff2fe8042a0d6f98b02b84fd28cdf01765be55
Author: Christian Hergert <chergert redhat com>
Date:   Thu Sep 15 00:28:31 2022 -0700

    libide/gui: add module-name property for session items
    
    The goal here is to make it easy for addins to find the items that they
    added simply by checking the module-name. That will free up the type-hint
    to be used for actual type decoding information.

 src/libide/gui/ide-session-item.c | 55 ++++++++++++++++++++++++++++++++++
 src/libide/gui/ide-session-item.h | 63 +++++++++++++++++++++------------------
 2 files changed, 89 insertions(+), 29 deletions(-)
---
diff --git a/src/libide/gui/ide-session-item.c b/src/libide/gui/ide-session-item.c
index 773a142c0..4f49d4303 100644
--- a/src/libide/gui/ide-session-item.c
+++ b/src/libide/gui/ide-session-item.c
@@ -29,6 +29,7 @@ struct _IdeSessionItem
 {
   GObject parent_instance;
   PanelPosition *position;
+  char *module_name;
   char *id;
   char *type_hint;
   GHashTable *metadata;
@@ -37,6 +38,7 @@ struct _IdeSessionItem
 enum {
   PROP_0,
   PROP_ID,
+  PROP_MODULE_NAME,
   PROP_POSITION,
   PROP_TYPE_HINT,
   N_PROPS
@@ -54,6 +56,7 @@ ide_session_item_dispose (GObject *object)
   g_clear_object (&self->position);
 
   g_clear_pointer (&self->id, g_free);
+  g_clear_pointer (&self->module_name, g_free);
   g_clear_pointer (&self->type_hint, g_free);
   g_clear_pointer (&self->metadata, g_hash_table_unref);
 
@@ -74,6 +77,10 @@ ide_session_item_get_property (GObject    *object,
       g_value_set_string (value, ide_session_item_get_id (self));
       break;
 
+    case PROP_MODULE_NAME:
+      g_value_set_string (value, ide_session_item_get_module_name (self));
+      break;
+
     case PROP_POSITION:
       g_value_set_object (value, ide_session_item_get_position (self));
       break;
@@ -101,6 +108,10 @@ ide_session_item_set_property (GObject      *object,
       ide_session_item_set_id (self, g_value_get_string (value));
       break;
 
+    case PROP_MODULE_NAME:
+      ide_session_item_set_module_name (self, g_value_get_string (value));
+      break;
+
     case PROP_POSITION:
       ide_session_item_set_position (self, g_value_get_object (value));
       break;
@@ -129,6 +140,10 @@ ide_session_item_class_init (IdeSessionItemClass *klass)
                           G_PARAM_EXPLICIT_NOTIFY |
                           G_PARAM_STATIC_STRINGS));
 
+  properties [PROP_MODULE_NAME] =
+    g_param_spec_string ("module-name", NULL, NULL, NULL,
+                         (G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS));
+
   properties [PROP_POSITION] =
     g_param_spec_object ("position", NULL, NULL,
                          PANEL_TYPE_POSITION,
@@ -186,6 +201,42 @@ ide_session_item_set_id (IdeSessionItem *self,
     g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_ID]);
 }
 
+/**
+ * ide_session_item_get_module_name:
+ * @self: a #IdeSessionItem
+ *
+ * Gets the module-name that created an item.
+ *
+ * Returns: (nullable): a module-name or %NULL
+ */
+const char *
+ide_session_item_get_module_name (IdeSessionItem *self)
+{
+  g_return_val_if_fail (IDE_IS_SESSION_ITEM (self), NULL);
+
+  return self->module_name;
+}
+
+/**
+ * ide_session_item_set_module_name:
+ * @self: a #IdeSessionItem
+ * @module_name: (nullable): the module name owning the item
+ *
+ * Sets the module-name for the session item.
+ *
+ * This is generally used to help determine which plugin created
+ * the item when decoding them at project load time.
+ */
+void
+ide_session_item_set_module_name (IdeSessionItem *self,
+                                  const char     *module_name)
+{
+  g_return_if_fail (IDE_IS_SESSION_ITEM (self));
+
+  if (ide_set_string (&self->module_name, module_name))
+    g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_MODULE_NAME]);
+}
+
 /**
  * ide_session_item_get_type_hint:
  * @self: a #IdeSessionItem
@@ -481,6 +532,9 @@ _ide_session_item_to_variant (IdeSessionItem  *self,
   if (self->id != NULL)
     g_variant_builder_add_parsed (builder, "{'id',<%s>}", self->id);
 
+  if (self->module_name != NULL)
+    g_variant_builder_add_parsed (builder, "{'module-name',<%s>}", self->module_name);
+
   if (self->type_hint != NULL)
     g_variant_builder_add_parsed (builder, "{'type-hint',<%s>}", self->type_hint);
 
@@ -528,6 +582,7 @@ _ide_session_item_new_from_variant (GVariant  *variant,
   self = g_object_new (IDE_TYPE_SESSION_ITEM, NULL);
 
   g_variant_lookup (variant, "id", "s", &self->id);
+  g_variant_lookup (variant, "module-name", "s", &self->module_name);
   g_variant_lookup (variant, "type-hint", "s", &self->type_hint);
 
   if ((positionv = g_variant_lookup_value (variant, "position", NULL)))
diff --git a/src/libide/gui/ide-session-item.h b/src/libide/gui/ide-session-item.h
index 82c522be9..8341214a4 100644
--- a/src/libide/gui/ide-session-item.h
+++ b/src/libide/gui/ide-session-item.h
@@ -38,45 +38,50 @@ G_DECLARE_FINAL_TYPE (IdeSessionItem, ide_session_item, IDE, SESSION_ITEM, GObje
 IDE_AVAILABLE_IN_ALL
 IdeSessionItem *ide_session_item_new                    (void);
 IDE_AVAILABLE_IN_ALL
-PanelPosition   *ide_session_item_get_position           (IdeSessionItem     *self);
+PanelPosition  *ide_session_item_get_position           (IdeSessionItem      *self);
 IDE_AVAILABLE_IN_ALL
-void             ide_session_item_set_position           (IdeSessionItem     *self,
-                                                           PanelPosition       *position);
+void            ide_session_item_set_position           (IdeSessionItem      *self,
+                                                         PanelPosition       *position);
 IDE_AVAILABLE_IN_ALL
-const char      *ide_session_item_get_id                 (IdeSessionItem     *self);
+const char     *ide_session_item_get_id                 (IdeSessionItem      *self);
 IDE_AVAILABLE_IN_ALL
-void             ide_session_item_set_id                 (IdeSessionItem     *self,
-                                                           const char          *id);
+void            ide_session_item_set_id                 (IdeSessionItem      *self,
+                                                         const char          *id);
 IDE_AVAILABLE_IN_ALL
-const char      *ide_session_item_get_type_hint          (IdeSessionItem     *self);
+const char     *ide_session_item_get_module_name        (IdeSessionItem      *self);
 IDE_AVAILABLE_IN_ALL
-void             ide_session_item_set_type_hint          (IdeSessionItem     *self,
-                                                           const char          *type_hint);
+void            ide_session_item_set_module_name        (IdeSessionItem      *self,
+                                                         const char          *module_name);
 IDE_AVAILABLE_IN_ALL
-gboolean         ide_session_item_has_metadata           (IdeSessionItem     *self,
-                                                           const char          *key,
-                                                           const GVariantType **value_type);
+const char     *ide_session_item_get_type_hint          (IdeSessionItem      *self);
 IDE_AVAILABLE_IN_ALL
-gboolean         ide_session_item_has_metadata_with_type (IdeSessionItem     *self,
-                                                           const char          *key,
-                                                           const GVariantType  *expected_type);
+void            ide_session_item_set_type_hint          (IdeSessionItem      *self,
+                                                         const char          *type_hint);
 IDE_AVAILABLE_IN_ALL
-void             ide_session_item_get_metadata           (IdeSessionItem     *self,
-                                                           const char          *key,
-                                                           const char          *format,
-                                                           ...);
+gboolean        ide_session_item_has_metadata           (IdeSessionItem      *self,
+                                                         const char          *key,
+                                                         const GVariantType **value_type);
 IDE_AVAILABLE_IN_ALL
-void             ide_session_item_set_metadata           (IdeSessionItem     *self,
-                                                           const char          *key,
-                                                           const char          *format,
-                                                           ...);
+gboolean        ide_session_item_has_metadata_with_type (IdeSessionItem      *self,
+                                                         const char          *key,
+                                                         const GVariantType  *expected_type);
 IDE_AVAILABLE_IN_ALL
-GVariant        *ide_session_item_get_metadata_value     (IdeSessionItem     *self,
-                                                           const char          *key,
-                                                           const GVariantType  *expected_type);
+void            ide_session_item_get_metadata           (IdeSessionItem      *self,
+                                                         const char          *key,
+                                                         const char          *format,
+                                                         ...);
 IDE_AVAILABLE_IN_ALL
-void             ide_session_item_set_metadata_value     (IdeSessionItem     *self,
-                                                           const char          *key,
-                                                           GVariant            *value);
+void            ide_session_item_set_metadata           (IdeSessionItem      *self,
+                                                         const char          *key,
+                                                         const char          *format,
+                                                         ...);
+IDE_AVAILABLE_IN_ALL
+GVariant       *ide_session_item_get_metadata_value     (IdeSessionItem      *self,
+                                                         const char          *key,
+                                                         const GVariantType  *expected_type);
+IDE_AVAILABLE_IN_ALL
+void            ide_session_item_set_metadata_value     (IdeSessionItem      *self,
+                                                         const char          *key,
+                                                         GVariant            *value);
 
 G_END_DECLS


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