[gnome-builder] libide/gui: add workspace to session item



commit e50b3f5cfdc2b0e375649ca941005ac90b5b9253
Author: Christian Hergert <chergert redhat com>
Date:   Thu Sep 15 22:45:36 2022 -0700

    libide/gui: add workspace to session item
    
    Just so that we don't have to keep checking this from the metadata.

 src/libide/gui/ide-session-item.c | 56 +++++++++++++++++++++++++++++++++++++++
 src/libide/gui/ide-session-item.h |  5 ++++
 2 files changed, 61 insertions(+)
---
diff --git a/src/libide/gui/ide-session-item.c b/src/libide/gui/ide-session-item.c
index 4f49d4303..8780a93d1 100644
--- a/src/libide/gui/ide-session-item.c
+++ b/src/libide/gui/ide-session-item.c
@@ -31,6 +31,7 @@ struct _IdeSessionItem
   PanelPosition *position;
   char *module_name;
   char *id;
+  char *workspace;
   char *type_hint;
   GHashTable *metadata;
 };
@@ -41,6 +42,7 @@ enum {
   PROP_MODULE_NAME,
   PROP_POSITION,
   PROP_TYPE_HINT,
+  PROP_WORKSPACE,
   N_PROPS
 };
 
@@ -58,6 +60,7 @@ ide_session_item_dispose (GObject *object)
   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->workspace, g_free);
   g_clear_pointer (&self->metadata, g_hash_table_unref);
 
   G_OBJECT_CLASS (ide_session_item_parent_class)->dispose (object);
@@ -89,6 +92,10 @@ ide_session_item_get_property (GObject    *object,
       g_value_set_string (value, ide_session_item_get_type_hint (self));
       break;
 
+    case PROP_WORKSPACE:
+      g_value_set_string (value, ide_session_item_get_workspace (self));
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
     }
@@ -120,6 +127,10 @@ ide_session_item_set_property (GObject      *object,
       ide_session_item_set_type_hint (self, g_value_get_string (value));
       break;
 
+    case PROP_WORKSPACE:
+      ide_session_item_set_workspace (self, g_value_get_string (value));
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
     }
@@ -157,6 +168,12 @@ ide_session_item_class_init (IdeSessionItemClass *klass)
                           G_PARAM_EXPLICIT_NOTIFY |
                           G_PARAM_STATIC_STRINGS));
 
+  properties [PROP_WORKSPACE] =
+    g_param_spec_string ("workspace", NULL, NULL, NULL,
+                         (G_PARAM_READWRITE |
+                          G_PARAM_EXPLICIT_NOTIFY |
+                          G_PARAM_STATIC_STRINGS));
+
   g_object_class_install_properties (object_class, N_PROPS, properties);
 }
 
@@ -273,6 +290,41 @@ ide_session_item_set_type_hint (IdeSessionItem *self,
     g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_TYPE_HINT]);
 }
 
+/**
+ * ide_session_item_get_workspace:
+ * @self: a #IdeSessionItem
+ *
+ * Gets the workspace id for the item.
+ *
+ * Returns: (nullable): a workspace or %NULL
+ */
+const char *
+ide_session_item_get_workspace (IdeSessionItem *self)
+{
+  g_return_val_if_fail (IDE_IS_SESSION_ITEM (self), NULL);
+
+  return self->workspace;
+}
+
+/**
+ * ide_session_item_set_workspace:
+ * @self: a #IdeSessionItem
+ * @workspace: (nullable): a workspace string for the item
+ *
+ * Sets the workspace id for the item.
+ *
+ * This is generally used to tie an item to a specific workspace.
+ */
+void
+ide_session_item_set_workspace (IdeSessionItem *self,
+                                const char     *workspace)
+{
+  g_return_if_fail (IDE_IS_SESSION_ITEM (self));
+
+  if (ide_set_string (&self->workspace, workspace))
+    g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_WORKSPACE]);
+}
+
 /**
  * ide_session_item_get_position:
  * @self: a #IdeSessionItem
@@ -538,6 +590,9 @@ _ide_session_item_to_variant (IdeSessionItem  *self,
   if (self->type_hint != NULL)
     g_variant_builder_add_parsed (builder, "{'type-hint',<%s>}", self->type_hint);
 
+  if (self->workspace != NULL)
+    g_variant_builder_add_parsed (builder, "{'workspace',<%s>}", self->workspace);
+
   if (self->metadata != NULL && g_hash_table_size (self->metadata) > 0)
     {
       GHashTableIter iter;
@@ -584,6 +639,7 @@ _ide_session_item_new_from_variant (GVariant  *variant,
   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);
+  g_variant_lookup (variant, "workspace", "s", &self->workspace);
 
   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 8341214a4..5a76bd601 100644
--- a/src/libide/gui/ide-session-item.h
+++ b/src/libide/gui/ide-session-item.h
@@ -48,6 +48,11 @@ IDE_AVAILABLE_IN_ALL
 void            ide_session_item_set_id                 (IdeSessionItem      *self,
                                                          const char          *id);
 IDE_AVAILABLE_IN_ALL
+const char     *ide_session_item_get_workspace          (IdeSessionItem      *self);
+IDE_AVAILABLE_IN_ALL
+void            ide_session_item_set_workspace          (IdeSessionItem      *self,
+                                                         const char          *workspace);
+IDE_AVAILABLE_IN_ALL
 const char     *ide_session_item_get_module_name        (IdeSessionItem      *self);
 IDE_AVAILABLE_IN_ALL
 void            ide_session_item_set_module_name        (IdeSessionItem      *self,


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