[gnome-builder] context: use IdeVcsMonitor



commit 51a00e488862a9e8ced03d36e282295edcd7bca3
Author: Christian Hergert <chergert redhat com>
Date:   Tue Dec 12 02:19:49 2017 -0800

    context: use IdeVcsMonitor
    
    Instead of exposing DzlRecursiveFileMonitor, this uses our
    encapsulated type IdeVcsMonitor. That can be used to access
    cached information about vcs files, which is useful when doing
    tree view drawing (so we can get immediate state information).

 src/libide/ide-context.c                           |   37 +++++---------
 src/libide/ide-context.h                           |    2 +-
 src/libide/vcs/meson.build                         |    2 +
 src/plugins/project-tree/gb-project-tree-builder.c |   52 +++++++++++++++-----
 src/plugins/project-tree/gb-vcs-tree-builder.c     |   14 +++---
 5 files changed, 62 insertions(+), 45 deletions(-)
---
diff --git a/src/libide/ide-context.c b/src/libide/ide-context.c
index 560b254..823882a 100644
--- a/src/libide/ide-context.c
+++ b/src/libide/ide-context.c
@@ -55,6 +55,7 @@
 #include "util/ide-async-helper.h"
 #include "util/ide-settings.h"
 #include "vcs/ide-vcs.h"
+#include "vcs/ide-vcs-monitor.h"
 #include "workbench/ide-workbench.h"
 
 /**
@@ -109,7 +110,7 @@ struct _IdeContext
   IdeDoap                  *doap;
   IdeDocumentation         *documentation;
   GListStore               *pausables;
-  DzlRecursiveFileMonitor  *monitor;
+  IdeVcsMonitor            *monitor;
   GtkRecentManager         *recent_manager;
   IdeRunManager            *run_manager;
   IdeRuntimeManager        *runtime_manager;
@@ -499,7 +500,7 @@ ide_context_dispose (GObject *object)
   IDE_ENTRY;
 
   g_list_store_remove_all (self->pausables);
-  dzl_recursive_file_monitor_cancel (self->monitor);
+  g_object_run_dispose (G_OBJECT (self->monitor));
 
   G_OBJECT_CLASS (ide_context_parent_class)->dispose (object);
 
@@ -2493,18 +2494,6 @@ ide_context_cache_filename (IdeContext  *self,
   return g_build_filenamev ((gchar **)ar->pdata);
 }
 
-static gboolean
-ide_context_ignore_func (GFile    *file,
-                         gpointer  data)
-{
-  IdeContext *self = data;
-
-  g_assert (G_IS_FILE (file));
-  g_assert (IDE_IS_CONTEXT (self));
-
-  return ide_vcs_is_ignored (self->vcs, file, NULL);
-}
-
 /**
  * ide_context_get_monitor:
  * @self: a #IdeContext
@@ -2513,12 +2502,11 @@ ide_context_ignore_func (GFile    *file,
  * recursively. You can use this to track changes across the project
  * tree without creating your own #GFileMonitor.
  *
- * Returns: (transfer none): a #DzlRecursiveFileMonitor to monitor the
- *   project tree.
+ * Returns: (transfer none): a #IdeVcsMonitor to monitor the project tree.
  *
  * Since: 3.28
  */
-DzlRecursiveFileMonitor *
+IdeVcsMonitor *
 ide_context_get_monitor (IdeContext *self)
 {
   g_return_val_if_fail (IDE_IS_CONTEXT (self), NULL);
@@ -2526,18 +2514,19 @@ ide_context_get_monitor (IdeContext *self)
   if (self->monitor == NULL)
     {
       g_autoptr(GFile) root = NULL;
+      GFileType file_type;
+
+      file_type = g_file_query_file_type (self->project_file, 0, NULL);
 
-      if (g_file_query_file_type (self->project_file, 0, NULL) == G_FILE_TYPE_DIRECTORY)
+      if (file_type == G_FILE_TYPE_DIRECTORY)
         root = g_object_ref (self->project_file);
       else
         root = g_file_get_parent (self->project_file);
 
-      self->monitor = dzl_recursive_file_monitor_new (root);
-      dzl_recursive_file_monitor_set_ignore_func (self->monitor,
-                                                  ide_context_ignore_func,
-                                                  g_object_ref (self),
-                                                  g_object_unref);
-      dzl_recursive_file_monitor_start_async (self->monitor, NULL, NULL, NULL);
+      self->monitor = g_object_new (IDE_TYPE_VCS_MONITOR,
+                                    "context", self,
+                                    "root", root,
+                                    NULL);
     }
 
   return self->monitor;
diff --git a/src/libide/ide-context.h b/src/libide/ide-context.h
index d6acf92..147a121 100644
--- a/src/libide/ide-context.h
+++ b/src/libide/ide-context.h
@@ -127,7 +127,7 @@ gchar                    *ide_context_cache_filename            (IdeContext
                                                                  const gchar          *first_part,
                                                                  ...) G_GNUC_NULL_TERMINATED;
 IDE_AVAILABLE_IN_3_28
-DzlRecursiveFileMonitor  *ide_context_get_monitor               (IdeContext           *self);
+IdeVcsMonitor            *ide_context_get_monitor               (IdeContext           *self);
 
 GListModel               *_ide_context_get_pausables            (IdeContext           *self) G_GNUC_INTERNAL;
 gboolean                  _ide_context_is_restoring             (IdeContext           *self) G_GNUC_INTERNAL;
diff --git a/src/libide/vcs/meson.build b/src/libide/vcs/meson.build
index c715fc2..551dbaa 100644
--- a/src/libide/vcs/meson.build
+++ b/src/libide/vcs/meson.build
@@ -2,6 +2,7 @@ vcs_headers = [
   'ide-vcs-config.h',
   'ide-vcs-file-info.h',
   'ide-vcs-initializer.h',
+  'ide-vcs-monitor.h',
   'ide-vcs-uri.h',
   'ide-vcs.h',
 ]
@@ -10,6 +11,7 @@ vcs_sources = [
   'ide-vcs-config.c',
   'ide-vcs-file-info.c',
   'ide-vcs-initializer.c',
+  'ide-vcs-monitor.c',
   'ide-vcs-uri.c',
   'ide-vcs.c',
 ]
diff --git a/src/plugins/project-tree/gb-project-tree-builder.c 
b/src/plugins/project-tree/gb-project-tree-builder.c
index 0f4346b..6f62c61 100644
--- a/src/plugins/project-tree/gb-project-tree-builder.c
+++ b/src/plugins/project-tree/gb-project-tree-builder.c
@@ -187,16 +187,16 @@ gb_project_tree_builder_remove (GbProjectTreeBuilder *self,
 }
 
 static void
-gb_project_tree_builder_changed (GbProjectTreeBuilder    *self,
-                                 GFile                   *file,
-                                 GFile                   *other_file,
-                                 GFileMonitorEvent        event,
-                                 DzlRecursiveFileMonitor *monitor)
+gb_project_tree_builder_changed (GbProjectTreeBuilder *self,
+                                 GFile                *file,
+                                 GFile                *other_file,
+                                 GFileMonitorEvent     event,
+                                 IdeVcsMonitor        *monitor)
 {
   g_assert (GB_PROJECT_TREE_BUILDER (self));
   g_assert (G_IS_FILE (file));
   g_assert (!other_file || G_IS_FILE (other_file));
-  g_assert (DZL_IS_RECURSIVE_FILE_MONITOR (monitor));
+  g_assert (IDE_IS_VCS_MONITOR (monitor));
 
   /*
    * We only handle CREATED in the normal signal connection, so that
@@ -221,16 +221,16 @@ gb_project_tree_builder_changed (GbProjectTreeBuilder    *self,
 }
 
 static void
-gb_project_tree_builder_changed_after (GbProjectTreeBuilder    *self,
-                                       GFile                   *file,
-                                       GFile                   *other_file,
-                                       GFileMonitorEvent        event,
-                                       DzlRecursiveFileMonitor *monitor)
+gb_project_tree_builder_changed_after (GbProjectTreeBuilder *self,
+                                       GFile                *file,
+                                       GFile                *other_file,
+                                       GFileMonitorEvent     event,
+                                       IdeVcsMonitor        *monitor)
 {
   g_assert (GB_PROJECT_TREE_BUILDER (self));
   g_assert (G_IS_FILE (file));
   g_assert (!other_file || G_IS_FILE (other_file));
-  g_assert (DZL_IS_RECURSIVE_FILE_MONITOR (monitor));
+  g_assert (IDE_IS_VCS_MONITOR (monitor));
 
   /*
    * We only handle DELETED in the after request so that we can ensure
@@ -248,6 +248,26 @@ gb_project_tree_builder_changed_after (GbProjectTreeBuilder    *self,
 }
 
 static void
+gb_project_tree_builder_reloaded (GbProjectTreeBuilder *self,
+                                  IdeVcsMonitor        *monitor)
+{
+  DzlTree *tree;
+
+  g_assert (GB_IS_PROJECT_TREE_BUILDER (self));
+  g_assert (IDE_IS_VCS_MONITOR (monitor));
+
+  /*
+   * TODO: VCS reloaded, so queue a draw so we can update the colors on
+   *       previously pixel-cached rows. We'll set the foreground when
+   *       hooking into the pango attributes.
+   */
+
+  tree = dzl_tree_builder_get_tree (DZL_TREE_BUILDER (self));
+  if (tree != NULL)
+    gtk_widget_queue_draw (GTK_WIDGET (tree));
+}
+
+static void
 build_context (GbProjectTreeBuilder *self,
                DzlTreeNode          *node)
 {
@@ -270,11 +290,17 @@ build_context (GbProjectTreeBuilder *self,
 
   if (!self->has_monitor)
     {
-      DzlRecursiveFileMonitor *monitor = ide_context_get_monitor (context);
+      IdeVcsMonitor *monitor = ide_context_get_monitor (context);
 
       self->has_monitor = TRUE;
 
       g_signal_connect_object (monitor,
+                               "reloaded",
+                               G_CALLBACK (gb_project_tree_builder_reloaded),
+                               self,
+                               G_CONNECT_SWAPPED);
+
+      g_signal_connect_object (monitor,
                                "changed",
                                G_CALLBACK (gb_project_tree_builder_changed),
                                self,
diff --git a/src/plugins/project-tree/gb-vcs-tree-builder.c b/src/plugins/project-tree/gb-vcs-tree-builder.c
index 8f7da5a..0559ef1 100644
--- a/src/plugins/project-tree/gb-vcs-tree-builder.c
+++ b/src/plugins/project-tree/gb-vcs-tree-builder.c
@@ -63,11 +63,11 @@ static void gb_vcs_tree_builder_build_node (DzlTreeBuilder *builder,
                                             DzlTreeNode    *node);
 
 static void
-gb_vcs_tree_builder_monitor_changed_cb (GbVcsTreeBuilder        *self,
-                                        GFile                   *file,
-                                        GFile                   *other_file,
-                                        GFileMonitorEvent        event,
-                                        DzlRecursiveFileMonitor *monitor)
+gb_vcs_tree_builder_monitor_changed_cb (GbVcsTreeBuilder  *self,
+                                        GFile             *file,
+                                        GFile             *other_file,
+                                        GFileMonitorEvent  event,
+                                        IdeVcsMonitor     *monitor)
 {
   g_autoptr(DzlTreeNode) node = NULL;
   DzlTree *tree;
@@ -75,7 +75,7 @@ gb_vcs_tree_builder_monitor_changed_cb (GbVcsTreeBuilder        *self,
   g_assert (GB_IS_VCS_TREE_BUILDER (self));
   g_assert (G_IS_FILE (file));
   g_assert (!other_file || G_IS_FILE (other_file));
-  g_assert (DZL_IS_RECURSIVE_FILE_MONITOR (monitor));
+  g_assert (IDE_IS_VCS_MONITOR (monitor));
 
   /* Rebuild the node if we found it */
   tree = dzl_tree_builder_get_tree (DZL_TREE_BUILDER (self));
@@ -90,7 +90,7 @@ static void
 gb_vcs_tree_builder_set_context (GbVcsTreeBuilder *self,
                                  IdeContext       *context)
 {
-  DzlRecursiveFileMonitor *monitor;
+  IdeVcsMonitor *monitor;
 
   g_assert (GB_IS_VCS_TREE_BUILDER (self));
   g_assert (IDE_IS_CONTEXT (context));


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