From 59f88d3cc03ed0f0c01433252f0d607330c23321 Mon Sep 17 00:00:00 2001
From: Seth Hitefield <sdhitefield@gmail.com>
Date: Thu, 22 Sep 2016 13:10:57 -0400
Subject: grc: refactor: Moved preferences to Config.py

---
 grc/gui/Config.py | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 120 insertions(+)

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

diff --git a/grc/gui/Config.py b/grc/gui/Config.py
index 0558892e2f..c4d395c0b3 100644
--- a/grc/gui/Config.py
+++ b/grc/gui/Config.py
@@ -25,6 +25,16 @@ import os
 from ..core.Config import Config as CoreConfig
 from . import Constants
 
+from six.moves import configparser
+
+HEADER = """\
+# This contains only GUI settings for GRC and is not meant for users to edit.
+#
+# GRC settings not accessible through the GUI are in gnuradio.conf under
+# section [grc].
+
+"""
+
 
 class Config(CoreConfig):
 
@@ -38,6 +48,41 @@ class Config(CoreConfig):
         self.install_prefix = install_prefix
         Constants.update_font_size(self.font_size)
 
+        self.parser = configparser.SafeConfigParser()
+        for section in ['main', 'files_open', 'files_recent']:
+            try:
+                self.parser.add_section(section)
+            except Exception as e:
+                print(e)
+        try:
+            self.parser.read(self.gui_prefs_file)
+        except Exception as err:
+            print(err, file=sys.stderr)
+
+    def save(self):
+        try:
+            with open(self.gui_prefs_file, 'w') as fp:
+                fp.write(HEADER)
+                self.parser.write(fp)
+        except Exception as err:
+            print(err, file=sys.stderr)
+
+    def entry(self, key, value=None, default=None):
+        if value is not None:
+            self.parser.set('main', key, str(value))
+            result = value
+        else:
+            _type = type(default) if default is not None else str
+            getter = {
+                bool: self.parser.getboolean,
+                int: self.parser.getint,
+            }.get(_type, self.parser.get)
+            try:
+                result = getter('main', key)
+            except (AttributeError, configparser.Error):
+                result = _type() if default is None else default
+        return result
+
     @property
     def editor(self):
         return self._gr_prefs.get_string('grc', 'editor', '')
@@ -84,3 +129,78 @@ class Config(CoreConfig):
     def default_qss_theme(self, value):
         self._gr_prefs.set_string("qtgui", "qss", value)
         self._gr_prefs.save()
+
+    ##### Originally from Preferences.py #####
+    def main_window_size(self, size=None):
+        if size is None:
+            size = [None, None]
+        w = self.entry('main_window_width', size[0], default=1)
+        h = self.entry('main_window_height', size[1], default=1)
+        return w, h
+
+    def file_open(self, filename=None):
+        return self.entry('file_open', filename, default='')
+
+    def set_file_list(self, key, files):
+        self.parser.remove_section(key)  # clear section
+        self.parser.add_section(key)
+        for i, filename in enumerate(files):
+            self.parser.set(key, '%s_%d' % (key, i), filename)
+
+    def get_file_list(self, key):
+        try:
+            files = [value for name, value in self.parser.items(key)
+                     if name.startswith('%s_' % key)]
+        except (AttributeError, configparser.Error):
+            files = []
+        return files
+
+    def get_open_files(self):
+        return self.get_file_list('files_open')
+
+    def set_open_files(self, files):
+        return self.set_file_list('files_open', files)
+
+    def get_recent_files(self):
+        """ Gets recent files, removes any that do not exist and re-saves it """
+        files = list(filter(os.path.exists, self.get_file_list('files_recent')))
+        self.set_recent_files(files)
+        return files
+
+    def set_recent_files(self, files):
+        return self.set_file_list('files_recent', files)
+
+    def add_recent_file(self, file_name):
+        # double check file_name
+        if os.path.exists(file_name):
+            recent_files = self.get_recent_files()
+            if file_name in recent_files:
+                recent_files.remove(file_name)  # Attempt removal
+            recent_files.insert(0, file_name)  # Insert at start
+            self.set_recent_files(recent_files[:10])  # Keep up to 10 files
+
+    def console_window_position(self, pos=None):
+        return self.entry('console_window_position', pos, default=-1) or 1
+
+    def blocks_window_position(self, pos=None):
+        return self.entry('blocks_window_position', pos, default=-1) or 1
+
+    def variable_editor_position(self, pos=None, sidebar=False):
+        # Figure out default
+        if sidebar:
+            w, h = self.main_window_size()
+            return self.entry('variable_editor_sidebar_position', pos, default=int(h*0.7))
+        else:
+            return self.entry('variable_editor_position', pos, default=int(self.blocks_window_position()*0.5))
+
+    def variable_editor_sidebar(self, pos=None):
+        return self.entry('variable_editor_sidebar', pos, default=False)
+
+    def variable_editor_confirm_delete(self, pos=None):
+        return self.entry('variable_editor_confirm_delete', pos, default=True)
+
+    def xterm_missing(self, cmd=None):
+        return self.entry('xterm_missing', cmd, default='INVALID_XTERM_SETTING')
+
+    def screen_shot_background_transparent(self, transparent=None):
+        return self.entry('screen_shot_background_transparent', transparent, default=False)
-- 
cgit v1.2.3