[gnome-builder] workbench: set workbench title from project name



commit c0032808a7b6fcec82787be79b4d9a3804b3d05d
Author: Christian Hergert <christian hergert me>
Date:   Thu Apr 9 13:36:49 2015 -0700

    workbench: set workbench title from project name
    
    "Builder - gnome-builder" would be the title when opening a project named
    "gnome-builder".

 data/ui/gb-workbench.ui              |    1 +
 src/app/gb-application.c             |    1 -
 src/workbench/gb-workbench-private.h |    2 +
 src/workbench/gb-workbench.c         |   72 +++++++++++++++++++++++++++++++++-
 4 files changed, 73 insertions(+), 3 deletions(-)
---
diff --git a/data/ui/gb-workbench.ui b/data/ui/gb-workbench.ui
index fe76192..404648c 100644
--- a/data/ui/gb-workbench.ui
+++ b/data/ui/gb-workbench.ui
@@ -3,6 +3,7 @@
   <!-- interface-requires gtk+ 3.15 -->
   <template class="GbWorkbench" parent="GtkApplicationWindow">
     <property name="icon-name">builder</property>
+    <property name="title" translatable="yes">Builder</property>
     <child type="titlebar">
       <object class="GtkHeaderBar">
         <property name="visible">true</property>
diff --git a/src/app/gb-application.c b/src/app/gb-application.c
index 59c459e..40b3349 100644
--- a/src/app/gb-application.c
+++ b/src/app/gb-application.c
@@ -343,7 +343,6 @@ gb_application__context_new_cb (GObject      *object,
                             "context", context,
                             "default-width", req.width,
                             "default-height", req.height,
-                            "title", _("Builder"),
                             NULL);
 
   if (ar->len == 0)
diff --git a/src/workbench/gb-workbench-private.h b/src/workbench/gb-workbench-private.h
index 5d7933b..e05138c 100644
--- a/src/workbench/gb-workbench-private.h
+++ b/src/workbench/gb-workbench-private.h
@@ -51,6 +51,8 @@ struct _GbWorkbench
   GbSearchBox            *search_box;
   GtkStack               *stack;
 
+  gulong                  project_notify_name_handler;
+
   guint                   disposing;
   guint                   building : 1;
   guint                   unloading : 1;
diff --git a/src/workbench/gb-workbench.c b/src/workbench/gb-workbench.c
index 4076fdb..ff8cade 100644
--- a/src/workbench/gb-workbench.c
+++ b/src/workbench/gb-workbench.c
@@ -57,14 +57,82 @@ static const GtkTargetEntry gDropTypes[] = {
 };
 
 static void
+gb_workbench__project_notify_name_cb (GbWorkbench *self,
+                                      GParamSpec  *pspec,
+                                      IdeProject  *project)
+{
+  g_autofree gchar *title = NULL;
+  const gchar *name;
+
+  g_assert (GB_IS_WORKBENCH (self));
+  g_assert (IDE_IS_PROJECT (project));
+
+  name = ide_project_get_name (project);
+
+  if (!ide_str_empty0 (name))
+    title = g_strdup_printf (_("Builder - %s"), name);
+  else
+    title = g_strdup (_("Builder"));
+
+  gtk_window_set_title (GTK_WINDOW (self), title);
+}
+
+static void
+gb_workbench_connect_context (GbWorkbench *self,
+                              IdeContext  *context)
+{
+  IdeProject *project;
+
+  g_assert (GB_IS_WORKBENCH (self));
+  g_assert (IDE_IS_CONTEXT (context));
+
+  project = ide_context_get_project (context);
+
+  self->project_notify_name_handler =
+    g_signal_connect_object (project,
+                             "notify::name",
+                             G_CALLBACK (gb_workbench__project_notify_name_cb),
+                             self,
+                             G_CONNECT_SWAPPED);
+  gb_workbench__project_notify_name_cb (self, NULL, project);
+}
+
+static void
+gb_workbench_disconnect_context (GbWorkbench *self,
+                                 IdeContext  *context)
+{
+  IdeProject *project;
+
+  g_assert (GB_IS_WORKBENCH (self));
+  g_assert (IDE_IS_CONTEXT (context));
+
+  project = ide_context_get_project (context);
+  ide_clear_signal_handler (project, &self->project_notify_name_handler);
+}
+
+static void
 gb_workbench_set_context (GbWorkbench *self,
                           IdeContext  *context)
 {
   g_return_if_fail (GB_IS_WORKBENCH (self));
   g_return_if_fail (IDE_IS_CONTEXT (context));
 
-  if (g_set_object (&self->context, context))
-    g_object_notify_by_pspec (G_OBJECT (self), gParamSpecs [PROP_CONTEXT]);
+  if (context != self->context)
+    {
+      if (self->context != NULL)
+        {
+          gb_workbench_disconnect_context (self, context);
+          g_clear_object (&self->context);
+        }
+
+      if (context != NULL)
+        {
+          self->context = g_object_ref (context);
+          gb_workbench_connect_context (self, context);
+        }
+
+      g_object_notify_by_pspec (G_OBJECT (self), gParamSpecs [PROP_CONTEXT]);
+    }
 }
 
 static void


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