[gtk/wip/baedert/for-master: 21/23] node-editor: Monitor file and reload on changes



commit 949eb8d17afb981d275ba6011a6fd44231bc580d
Author: Timm Bäder <mail baedert org>
Date:   Tue May 12 20:09:22 2020 +0200

    node-editor: Monitor file and reload on changes

 demos/node-editor/node-editor-window.c | 56 ++++++++++++++++++++++++++++------
 1 file changed, 47 insertions(+), 9 deletions(-)
---
diff --git a/demos/node-editor/node-editor-window.c b/demos/node-editor/node-editor-window.c
index 9859a9551b..ebd49c79e0 100644
--- a/demos/node-editor/node-editor-window.c
+++ b/demos/node-editor/node-editor-window.c
@@ -62,6 +62,8 @@ struct _NodeEditorWindow
   GListStore *renderers;
   GdkPaintable *paintable;
 
+  GFileMonitor *file_monitor;
+
   GArray *errors;
 };
 
@@ -331,11 +333,10 @@ text_view_query_tooltip_cb (GtkWidget        *widget,
     }
 }
 
-gboolean
-node_editor_window_load (NodeEditorWindow *self,
-                         GFile            *file)
+static gboolean
+load_file_contents (NodeEditorWindow *self,
+                    GFile            *file)
 {
-  GtkTextIter end;
   GBytes *bytes;
 
   bytes = g_file_load_bytes (file, NULL, NULL, NULL);
@@ -348,17 +349,54 @@ node_editor_window_load (NodeEditorWindow *self,
       return FALSE;
     }
 
-  gtk_text_buffer_get_end_iter (self->text_buffer, &end);
-  gtk_text_buffer_insert (self->text_buffer,
-                          &end,
-                          g_bytes_get_data (bytes, NULL),
-                          g_bytes_get_size (bytes));
+  gtk_text_buffer_set_text (self->text_buffer,
+                            g_bytes_get_data (bytes, NULL),
+                            g_bytes_get_size (bytes));
 
   g_bytes_unref (bytes);
 
   return TRUE;
 }
 
+static void
+file_changed_cb (GFileMonitor      *monitor,
+                 GFile             *file,
+                 GFile             *other_file,
+                 GFileMonitorEvent  event_type,
+                 gpointer           user_data)
+{
+  NodeEditorWindow *self = user_data;
+
+  if (event_type == G_FILE_MONITOR_EVENT_CHANGED)
+    load_file_contents (self, file);
+}
+
+gboolean
+node_editor_window_load (NodeEditorWindow *self,
+                         GFile            *file)
+{
+  GError *error = NULL;
+
+  if (!load_file_contents (self, file))
+    return FALSE;
+
+  g_clear_object (&self->file_monitor);
+  self->file_monitor = g_file_monitor_file (file, G_FILE_MONITOR_NONE, NULL, &error);
+
+
+  if (error)
+    {
+      g_warning ("couldn't monitor file: %s", error->message);
+      g_error_free (error);
+    }
+  else
+    {
+      g_signal_connect (self->file_monitor, "changed", G_CALLBACK (file_changed_cb), self);
+    }
+
+  return TRUE;
+}
+
 static void
 open_response_cb (GtkWidget        *dialog,
                   gint              response,


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