From 2fee267dfee11bd687b4d780cb6b82924d59af3c Mon Sep 17 00:00:00 2001
From: Sebastian Koslowski <koslowski@kit.edu>
Date: Thu, 23 Jul 2015 16:36:22 +0200
Subject: grc: open and update params from external editor

---
 grc/gui/external_editor.py | 93 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 93 insertions(+)
 create mode 100644 grc/gui/external_editor.py

(limited to 'grc/gui/external_editor.py')

diff --git a/grc/gui/external_editor.py b/grc/gui/external_editor.py
new file mode 100644
index 0000000000..3322556ce7
--- /dev/null
+++ b/grc/gui/external_editor.py
@@ -0,0 +1,93 @@
+"""
+Copyright 2015 Free Software Foundation, Inc.
+This file is part of GNU Radio
+
+GNU Radio Companion is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+GNU Radio Companion is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+"""
+
+import os
+import sys
+import time
+import threading
+import tempfile
+import subprocess
+
+import Constants
+
+
+class ExternalEditor(threading.Thread):
+
+    def __init__(self, name, value, callback):
+        threading.Thread.__init__(self)
+        self.daemon = True
+        self._stop_event = threading.Event()
+
+        self.callback = callback
+        self.tempfile = self._create_tempfile(name, value)
+
+    def _create_tempfile(self, name, value):
+        fp = tempfile.NamedTemporaryFile(mode='w', suffix='.py',
+                                         prefix=name + '_')
+        fp.write(value)
+        fp.flush()
+        return fp
+
+    @property
+    def filename(self):
+        return self.tempfile.name
+
+    def open_editor(self):
+        proc = subprocess.Popen(
+            args=(Constants.EDITOR, self.filename)
+        )
+        proc.poll()
+        return proc
+
+    def stop(self):
+        self._stop_event.set()
+
+    def run(self):
+        filename = self.filename
+        # print "file monitor: started for", filename
+        last_change = os.path.getmtime(filename)
+        try:
+            while not self._stop_event.is_set():
+                mtime = os.path.getmtime(filename)
+                if mtime > last_change:
+                    # print "file monitor: reload trigger for", filename
+                    last_change = mtime
+                    with open(filename) as fp:
+                        data = fp.read()
+                    self.callback(data)
+                time.sleep(1)
+
+        except Exception as e:
+            print >> sys.stderr, "file monitor crashed:", str(e)
+        else:
+            # print "file monitor: done with", filename
+            pass
+
+
+if __name__ == '__main__':
+    def p(data):
+        print data
+
+    Constants.EDITOR = '/usr/bin/gedit'
+    editor = ExternalEditor("test", "content", p)
+    editor.open_editor()
+    editor.start()
+    time.sleep(15)
+    editor.stop()
+    editor.join()
-- 
cgit v1.2.3