diff options
-rw-r--r-- | grc/core/CMakeLists.txt | 1 | ||||
-rw-r--r-- | grc/core/Config.py | 55 | ||||
-rw-r--r-- | grc/core/FlowGraph.py | 2 | ||||
-rw-r--r-- | grc/core/Param.py | 34 | ||||
-rw-r--r-- | grc/core/Platform.py | 58 | ||||
-rw-r--r-- | grc/core/generator/Generator.py | 9 | ||||
-rw-r--r-- | grc/core/utils/epy_block_io.py | 15 | ||||
-rw-r--r-- | grc/gui/ActionHandler.py | 28 | ||||
-rw-r--r-- | grc/gui/CMakeLists.txt | 1 | ||||
-rw-r--r-- | grc/gui/Config.py | 74 | ||||
-rw-r--r-- | grc/gui/Constants.py | 63 | ||||
-rw-r--r-- | grc/gui/Dialogs.py | 17 | ||||
-rw-r--r-- | grc/gui/Executor.py | 4 | ||||
-rw-r--r-- | grc/gui/FlowGraph.py | 9 | ||||
-rw-r--r-- | grc/gui/Param.py | 6 | ||||
-rw-r--r-- | grc/gui/Platform.py | 27 | ||||
-rwxr-xr-x | grc/scripts/gnuradio-companion | 7 |
17 files changed, 241 insertions, 169 deletions
diff --git a/grc/core/CMakeLists.txt b/grc/core/CMakeLists.txt index 623d912d47..8aee8116b2 100644 --- a/grc/core/CMakeLists.txt +++ b/grc/core/CMakeLists.txt @@ -20,6 +20,7 @@ ######################################################################## GR_PYTHON_INSTALL(FILES Block.py + Config.py Connection.py Constants.py Element.py diff --git a/grc/core/Config.py b/grc/core/Config.py new file mode 100644 index 0000000000..ac38d9978c --- /dev/null +++ b/grc/core/Config.py @@ -0,0 +1,55 @@ +""" +Copyright 2016 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 +from os.path import expanduser, normpath, expandvars, exists + + +class Config(object): + + key = 'grc' + name = 'GNU Radio Companion (no gui)' + license = __doc__.strip() + website = 'http://gnuradio.org' + + hier_block_lib_dir = os.environ.get('GRC_HIER_PATH', expanduser('~/.grc_gnuradio')) + + def __init__(self, prefs_file, version, version_parts=None): + self.prefs = prefs_file + self.version = version + self.version_parts = version_parts or version[1:].split('-', 1)[0].split('.')[:3] + + @property + def block_paths(self): + path_list_sep = {'/': ':', '\\': ';'}[os.path.sep] + + paths_sources = ( + self.hier_block_lib_dir, + os.environ.get('GRC_BLOCKS_PATH', ''), + self.prefs.get_string('grc', 'local_blocks_path', ''), + self.prefs.get_string('grc', 'global_blocks_path', ''), + ) + + collected_paths = sum((paths.split(path_list_sep) + for paths in paths_sources), []) + + valid_paths = [normpath(expanduser(expandvars(path))) + for path in collected_paths if exists(path)] + + return valid_paths diff --git a/grc/core/FlowGraph.py b/grc/core/FlowGraph.py index 3d744f74c4..af6d35f7fb 100644 --- a/grc/core/FlowGraph.py +++ b/grc/core/FlowGraph.py @@ -370,7 +370,7 @@ class FlowGraph(Element): n['block'] = [b.export_data() for b in blocks] n['connection'] = [c.export_data() for c in connections] instructions = odict({ - 'created': '.'.join(self.get_parent().config.version2), + 'created': '.'.join(self.get_parent().config.version_parts), 'format': FLOW_GRAPH_FILE_FORMAT_VERSION, }) return odict({'flow_graph': n, '_instructions': instructions}) diff --git a/grc/core/Param.py b/grc/core/Param.py index 0be30975e0..99106defe4 100644 --- a/grc/core/Param.py +++ b/grc/core/Param.py @@ -20,7 +20,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA import ast import re -from gnuradio import eng_notation, gr from . import Constants from .Constants import VECTOR_TYPES, COMPLEX_TYPES, REAL_TYPES, INT_TYPES @@ -31,8 +30,12 @@ from .utils import odict import __builtin__ -ID_BLACKLIST = ['self', 'options', 'gr', 'blks2', 'wxgui', 'wx', 'math', 'forms', 'firdes'] + \ - filter(lambda x: not x.startswith('_'), dir(gr.top_block())) + dir(__builtin__) +ID_BLACKLIST = ['self', 'options', 'gr', 'blks2', 'wxgui', 'wx', 'math', 'forms', 'firdes'] + dir(__builtin__) +try: + from gnuradio import gr + ID_BLACKLIST.extend(attr for attr in dir(gr.top_block()) if not attr.startswith('_')) +except ImportError: + pass _check_id_matcher = re.compile('^[a-z|A-Z]\w*$') _show_id_matcher = re.compile('^(variable\w*|parameter|options|notebook)$') @@ -51,22 +54,23 @@ def _get_elem(lst, key): def num_to_str(num): """ Display logic for numbers """ + def eng_notation(value, fmt='g'): + """Convert a number to a string in engineering notation. E.g., 5e-9 -> 5n""" + template = '{:' + fmt + '}{}' + magnitude = abs(value) + for exp, symbol in zip(range(9, -15-1, -3), 'GMk munpf'): + factor = 10 ** exp + if magnitude >= factor: + return template.format(value / factor, symbol.strip()) + return template.format(value, '') + if isinstance(num, COMPLEX_TYPES): num = complex(num) # Cast to python complex if num == 0: return '0' - elif num.imag == 0: - # Value is real - return '{}'.format(eng_notation.num_to_str(num.real)) - elif num.real == 0: - # Value is imaginary - return '{}j'.format(eng_notation.num_to_str(num.imag)) - elif num.imag < 0: - return '{}-{}j'.format(eng_notation.num_to_str(num.real), - eng_notation.num_to_str(abs(num.imag))) - else: - return '{}+{}j'.format(eng_notation.num_to_str(num.real), - eng_notation.num_to_str(num.imag)) + output = eng_notation(num.real) if num.real else '' + output += eng_notation(num.imag, '+g' if output else 'g') + 'j' if num.imag else '' + return output else: return str(num) diff --git a/grc/core/Platform.py b/grc/core/Platform.py index 97e2b38309..4c1e6f471a 100644 --- a/grc/core/Platform.py +++ b/grc/core/Platform.py @@ -19,10 +19,10 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA import os import sys -from gnuradio import gr from . import ParseXML, Messages, Constants +from .Config import Config from .Element import Element from .generator import Generator from .FlowGraph import FlowGraph @@ -34,59 +34,9 @@ from .Param import Param from .utils import odict, extract_docs -from os.path import expanduser, normpath, expandvars, dirname, exists - - -class Config(object): - - key = 'grc' - name = 'GNU Radio Companion' - license = __doc__.strip() - website = 'http://gnuradio.org' - version = gr.version() - version2 = (gr.major_version(), gr.api_version(), gr.minor_version()) - - hier_block_lib_dir = os.environ.get('GRC_HIER_PATH', expanduser('~/.grc_gnuradio')) - - def __init__(self): - self.prefs = self._get_prefs() - - if not exists(self.hier_block_lib_dir): - os.mkdir(self.hier_block_lib_dir) - - @staticmethod - def _get_prefs(): - try: - from gnuradio import gr - prefs = gr.prefs() - except ImportError: - import ConfigParser - prefs = ConfigParser.ConfigParser() - - return prefs - - @property - def block_paths(self): - path_list_sep = {'/': ':', '\\': ';'}[os.path.sep] - - paths_sources = ( - self.hier_block_lib_dir, - os.environ.get('GRC_BLOCKS_PATH', ''), - self.prefs.get_string('grc', 'local_blocks_path', ''), - self.prefs.get_string('grc', 'global_blocks_path', ''), - ) - - collected_paths = sum((paths.split(path_list_sep) - for paths in paths_sources), []) - - valid_paths = [normpath(expanduser(expandvars(path))) - for path in collected_paths if exists(path)] - - return valid_paths - - class Platform(Element): + Config = Config Generator = Generator FlowGraph = FlowGraph Connection = Connection @@ -96,11 +46,11 @@ class Platform(Element): is_platform = True - def __init__(self): + def __init__(self, *args, **kwargs): """ Make a platform for GNU Radio """ Element.__init__(self) - self.config = Config() + self.config = self.Config(*args, **kwargs) self.block_docstrings = {} self.block_docstrings_loaded_callback = lambda: None # dummy to be replaced by BlockTreeWindow diff --git a/grc/core/generator/Generator.py b/grc/core/generator/Generator.py index 5c2fa6e0d5..91671072d6 100644 --- a/grc/core/generator/Generator.py +++ b/grc/core/generator/Generator.py @@ -259,9 +259,12 @@ class HierBlockGenerator(TopBlockGenerator): TopBlockGenerator.__init__(self, flow_graph, file_path) platform = flow_graph.get_parent() + hier_block_lib_dir = platform.config.hier_block_lib_dir + if not os.path.exists(hier_block_lib_dir): + os.mkdir(hier_block_lib_dir) + self._mode = HIER_BLOCK_FILE_MODE - self.file_path = os.path.join(platform.config.hier_block_lib_dir, - self._flow_graph.get_option('id') + '.py') + self.file_path = os.path.join(hier_block_lib_dir, self._flow_graph.get_option('id') + '.py') self._file_path_xml = self.file_path + '.xml' def get_file_path_xml(self): @@ -388,4 +391,4 @@ class QtHierBlockGenerator(HierBlockGenerator): "\n#set $win = 'self.%s' % $id" "\n${gui_hint()($win)}" ) - return n
\ No newline at end of file + return n diff --git a/grc/core/utils/epy_block_io.py b/grc/core/utils/epy_block_io.py index c070e1c3f3..df3a4bbc3e 100644 --- a/grc/core/utils/epy_block_io.py +++ b/grc/core/utils/epy_block_io.py @@ -2,9 +2,6 @@ import inspect import collections -from gnuradio import gr -import pmt - TYPE_MAP = { 'complex64': 'complex', 'complex': 'complex', @@ -31,21 +28,27 @@ def _ports(sigs, msgs): return ports -def _blk_class(source_code): +def _find_block_class(source_code, cls): ns = {} try: exec source_code in ns except Exception as e: raise ValueError("Can't interpret source code: " + str(e)) for var in ns.itervalues(): - if inspect.isclass(var) and issubclass(var, gr.gateway.gateway_block): + if inspect.isclass(var) and issubclass(var, cls): return var raise ValueError('No python block class found in code') def extract(cls): + try: + from gnuradio import gr + import pmt + except ImportError: + raise EnvironmentError("Can't import GNU Radio") + if not inspect.isclass(cls): - cls = _blk_class(cls) + cls = _find_block_class(cls, gr.gateway.gateway_block) spec = inspect.getargspec(cls.__init__) defaults = map(repr, spec.defaults or ()) diff --git a/grc/gui/ActionHandler.py b/grc/gui/ActionHandler.py index 139bbedffd..24add2780f 100644 --- a/grc/gui/ActionHandler.py +++ b/grc/gui/ActionHandler.py @@ -23,8 +23,7 @@ import gtk import os import subprocess -from . import Dialogs, Preferences, Actions, Executor -from .Constants import DEFAULT_CANVAS_SIZE, IMAGE_FILE_EXTENSION, GR_PREFIX, XTERM_EXECUTABLE +from . import Dialogs, Preferences, Actions, Executor, Constants from .FileDialogs import (OpenFlowGraphFileDialog, SaveFlowGraphFileDialog, SaveReportsFileDialog, SaveScreenShotDialog, OpenQSSFileDialog) @@ -32,8 +31,7 @@ from .MainWindow import MainWindow from .ParserErrorsDialog import ParserErrorsDialog from .PropsDialog import PropsDialog -from ..core import Constants, ParseXML -from ..core import Messages +from ..core import ParseXML, Messages gobject.threads_init() @@ -487,12 +485,13 @@ class ActionHandler: self.main_window.menu_bar.refresh_submenus() elif action == Actions.FLOW_GRAPH_OPEN_QSS_THEME: - file_paths = OpenQSSFileDialog(GR_PREFIX + '/share/gnuradio/themes/').run() + file_paths = OpenQSSFileDialog(self.platform.config.install_prefix + + '/share/gnuradio/themes/').run() if file_paths: try: - from gnuradio import gr - gr.prefs().set_string("qtgui", "qss", file_paths[0]) - gr.prefs().save() + prefs = self.platform.config.prefs + prefs.set_string("qtgui", "qss", file_paths[0]) + prefs.save() except Exception as e: Messages.send("Failed to save QSS preference: " + str(e)) elif action == Actions.FLOW_GRAPH_CLOSE: @@ -522,7 +521,7 @@ class ActionHandler: file_path, background_transparent = SaveScreenShotDialog(self.get_page().get_file_path()).run() if file_path is not None: pixbuf = self.get_flow_graph().get_drawing_area().get_screenshot(background_transparent) - pixbuf.save(file_path, IMAGE_FILE_EXTENSION[1:]) + pixbuf.save(file_path, Constants.IMAGE_FILE_EXTENSION[1:]) ################################################## # Gen/Exec/Stop ################################################## @@ -540,10 +539,11 @@ class ActionHandler: elif action == Actions.FLOW_GRAPH_EXEC: if not self.get_page().get_proc(): Actions.FLOW_GRAPH_GEN() - if Preferences.xterm_missing() != XTERM_EXECUTABLE: - if not os.path.exists(XTERM_EXECUTABLE): - Dialogs.MissingXTermDialog(XTERM_EXECUTABLE) - Preferences.xterm_missing(XTERM_EXECUTABLE) + xterm = self.platform.config.xterm_executable + if Preferences.xterm_missing() != xterm: + if not os.path.exists(xterm): + Dialogs.MissingXTermDialog(xterm) + Preferences.xterm_missing(xterm) if self.get_page().get_saved() and self.get_page().get_file_path(): Executor.ExecFlowGraphThread(self) elif action == Actions.FLOW_GRAPH_KILL: @@ -634,7 +634,7 @@ class ActionHandler: self.main_window.update() try: #set the size of the flow graph area (if changed) new_size = (self.get_flow_graph().get_option('window_size') or - DEFAULT_CANVAS_SIZE) + self.platform.config.default_canvas_size) if self.get_flow_graph().get_size() != tuple(new_size): self.get_flow_graph().set_size(*new_size) except: pass diff --git a/grc/gui/CMakeLists.txt b/grc/gui/CMakeLists.txt index 7e4355357b..e9c4f71e69 100644 --- a/grc/gui/CMakeLists.txt +++ b/grc/gui/CMakeLists.txt @@ -22,6 +22,7 @@ GR_PYTHON_INSTALL(FILES external_editor.py Block.py Colors.py + Config.py Constants.py Connection.py Element.py diff --git a/grc/gui/Config.py b/grc/gui/Config.py new file mode 100644 index 0000000000..9b0c5d4afe --- /dev/null +++ b/grc/gui/Config.py @@ -0,0 +1,74 @@ +""" +Copyright 2016 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 sys +import os +from ..core.Config import Config as _Config +from . import Constants + + +class Config(_Config): + + name = 'GNU Radio Companion' + + gui_prefs_file = os.environ.get( + 'GRC_PREFS_PATH', os.path.expanduser('~/.gnuradio/grc.conf')) + + def __init__(self, install_prefix, *args, **kwargs): + _Config.__init__(self, *args, **kwargs) + self.install_prefix = install_prefix + Constants.update_font_size(self.font_size) + + @property + def editor(self): + return self.prefs.get_string('grc', 'editor', '') + + @editor.setter + def editor(self, value): + self.prefs.get_string('grc', 'editor', value) + self.prefs.save() + + @property + def xterm_executable(self): + return self.prefs.get_string('grc', 'xterm_executable', 'xterm') + + @property + def default_canvas_size(self): + try: # ugly, but matches current code style + raw = self.prefs.get_string('grc', 'canvas_default_size', '1280, 1024') + value = tuple(int(x.strip('() ')) for x in raw.split(',')) + if len(value) != 2 or not all(300 < x < 4096 for x in value): + raise Exception() + return value + except: + print >> sys.stderr, "Error: invalid 'canvas_default_size' setting." + return Constants.DEFAULT_CANVAS_SIZE_DEFAULT + + @property + def font_size(self): + try: # ugly, but matches current code style + font_size = self.prefs.get_long('grc', 'canvas_font_size', + Constants.DEFAULT_FONT_SIZE) + if font_size <= 0: + raise Exception() + except: + font_size = Constants.DEFAULT_FONT_SIZE + print >> sys.stderr, "Error: invalid 'canvas_font_size' setting." + + return font_size diff --git a/grc/gui/Constants.py b/grc/gui/Constants.py index b891c5b313..e267c6ca02 100644 --- a/grc/gui/Constants.py +++ b/grc/gui/Constants.py @@ -17,28 +17,10 @@ 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 pygtk -pygtk.require('2.0') import gtk -from gnuradio import gr - -prefs = gr.prefs() -GR_PREFIX = gr.prefix() -EDITOR = prefs.get_string('grc', 'editor', '') -XTERM_EXECUTABLE = prefs.get_string('grc', 'xterm_executable', 'xterm') +from ..core.Constants import * -PREFS_FILE = os.environ.get( - 'GRC_PREFS_PATH', - os.path.expanduser('~/.gnuradio/grc.conf') -) -PREFS_FILE_OLD = os.environ.get( - 'GRC_PREFS_PATH', - os.path.expanduser('~/.grc') -) # default path for the open/save dialogs DEFAULT_FILE_PATH = os.getcwd() @@ -60,28 +42,12 @@ MIN_DIALOG_HEIGHT = 500 DEFAULT_BLOCKS_WINDOW_WIDTH = 100 DEFAULT_REPORTS_WINDOW_WIDTH = 100 -try: # ugly, but matches current code style - raw = prefs.get_string('grc', 'canvas_default_size', '1280, 1024') - DEFAULT_CANVAS_SIZE = tuple(int(x.strip('() ')) for x in raw.split(',')) - if len(DEFAULT_CANVAS_SIZE) != 2 or not all(300 < x < 4096 for x in DEFAULT_CANVAS_SIZE): - raise Exception() -except: - DEFAULT_CANVAS_SIZE = 1280, 1024 - print >> sys.stderr, "Error: invalid 'canvas_default_size' setting." - -# flow-graph canvas fonts -try: # ugly, but matches current code style - FONT_SIZE = prefs.get_long('grc', 'canvas_font_size', 8) - if FONT_SIZE <= 0: - raise Exception() -except: - FONT_SIZE = 8 - print >> sys.stderr, "Error: invalid 'canvas_font_size' setting." -FONT_FAMILY = "Sans" -BLOCK_FONT = "%s %f" % (FONT_FAMILY, FONT_SIZE) -PORT_FONT = BLOCK_FONT -PARAM_FONT = "%s %f" % (FONT_FAMILY, FONT_SIZE - 0.5) +DEFAULT_CANVAS_SIZE_DEFAULT = 1280, 1024 +FONT_SIZE = DEFAULT_FONT_SIZE = 8 +FONT_FAMILY = "Sans" +BLOCK_FONT = PORT_FONT = "Sans 8" +PARAM_FONT = "Sans 7.5" # size of the state saving cache in the flow graph (undo/redo functionality) STATE_CACHE_SIZE = 42 @@ -100,8 +66,7 @@ CANVAS_GRID_SIZE = 8 # port constraint dimensions PORT_BORDER_SEPARATION = 8 PORT_SPACING = 2 * PORT_BORDER_SEPARATION -PORT_SEPARATION = PORT_SPACING + 2 * PORT_LABEL_PADDING + int(1.5 * FONT_SIZE) -PORT_SEPARATION += -PORT_SEPARATION % (2 * CANVAS_GRID_SIZE) # even multiple +PORT_SEPARATION = 32 PORT_MIN_WIDTH = 20 PORT_LABEL_HIDDEN_WIDTH = 10 @@ -130,3 +95,17 @@ SCROLL_DISTANCE = 15 # How close the mouse click can be to a line and register a connection select. LINE_SELECT_SENSITIVITY = 5 + + +def update_font_size(font_size): + global PORT_SEPARATION, BLOCK_FONT, PORT_FONT, PARAM_FONT, FONT_SIZE + + FONT_SIZE = font_size + BLOCK_FONT = "%s %f" % (FONT_FAMILY, font_size) + PORT_FONT = BLOCK_FONT + PARAM_FONT = "%s %f" % (FONT_FAMILY, font_size - 0.5) + + PORT_SEPARATION = PORT_SPACING + 2 * PORT_LABEL_PADDING + int(1.5 * font_size) + PORT_SEPARATION += -PORT_SEPARATION % (2 * CANVAS_GRID_SIZE) # even multiple + +update_font_size(DEFAULT_FONT_SIZE) diff --git a/grc/gui/Dialogs.py b/grc/gui/Dialogs.py index c5b4d8b2a7..6cfdd50a34 100644 --- a/grc/gui/Dialogs.py +++ b/grc/gui/Dialogs.py @@ -22,7 +22,7 @@ import gtk import sys from distutils.spawn import find_executable -from . import Utils, Actions, Constants +from . import Utils, Actions from ..core import Messages @@ -238,7 +238,7 @@ def MissingXTermDialog(xterm): ) -def ChooseEditorDialog(): +def ChooseEditorDialog(config): # Give the option to either choose an editor or use the default # Always return true/false so the caller knows it was successful buttons = ( @@ -264,10 +264,7 @@ def ChooseEditorDialog(): file_dialog.set_current_folder('/usr/bin') try: if file_dialog.run() == gtk.RESPONSE_OK: - file_path = file_dialog.get_filename() - Constants.prefs.set_string('grc', 'editor', file_path) - Constants.prefs.save() - Constants.EDITOR = file_path + config.editor = file_path = file_dialog.get_filename() file_dialog.destroy() return file_path finally: @@ -285,16 +282,12 @@ def ChooseEditorDialog(): if process is None: raise ValueError("Can't find default editor executable") # Save - Constants.prefs.set_string('grc', 'editor', process) - Constants.prefs.save() - Constants.EDITOR = process + config.editor = process return process except Exception: Messages.send('>>> Unable to load the default editor. Please choose an editor.\n') # Just reset of the constant and force the user to select an editor the next time - Constants.prefs.set_string('grc', 'editor', '') - Constants.prefs.save() - Constants.EDITOR = "" + config.editor = '' return Messages.send('>>> No editor selected.\n') diff --git a/grc/gui/Executor.py b/grc/gui/Executor.py index 96b95f4c7a..f75f514cdb 100644 --- a/grc/gui/Executor.py +++ b/grc/gui/Executor.py @@ -25,7 +25,6 @@ import re from distutils.spawn import find_executable from ..core import Messages -from .Constants import XTERM_EXECUTABLE class ExecFlowGraphThread(threading.Thread): @@ -41,6 +40,7 @@ class ExecFlowGraphThread(threading.Thread): threading.Thread.__init__(self) self.update_exec_stop = action_handler.update_exec_stop self.flow_graph = action_handler.get_flow_graph() + self.xterm_executable = action_handler.platform.config.xterm_executable #store page and dont use main window calls in run self.page = action_handler.get_page() #get the popen @@ -70,7 +70,7 @@ class ExecFlowGraphThread(threading.Thread): raise ValueError("Can't parse run command {!r}: {}".format(run_command, e)) # When in no gui mode on linux, use a graphical terminal (looks nice) - xterm_executable = find_executable(XTERM_EXECUTABLE) + xterm_executable = find_executable(self.xterm_executable) if generator.generate_options == 'no_gui' and xterm_executable: run_command_args = [xterm_executable, '-e', run_command] diff --git a/grc/gui/FlowGraph.py b/grc/gui/FlowGraph.py index 25fb157b1e..2f8ca0070e 100644 --- a/grc/gui/FlowGraph.py +++ b/grc/gui/FlowGraph.py @@ -88,8 +88,9 @@ class FlowGraph(Element, _Flowgraph): if target in self._external_updaters: editor = self._external_updaters[target] else: - editor = (find_executable(Constants.EDITOR) or - Dialogs.ChooseEditorDialog()) + config = self.get_parent().config + editor = (find_executable(config.editor) or + Dialogs.ChooseEditorDialog(config)) if not editor: return updater = functools.partial( @@ -106,9 +107,7 @@ class FlowGraph(Element, _Flowgraph): # Problem launching the editor. Need to select a new editor. Messages.send('>>> Error opening an external editor. Please select a different editor.\n') # Reset the editor to force the user to select a new one. - Constants.prefs.set_string('grc', 'editor', '') - Constants.prefs.save() - Constants.EDITOR = "" + self.get_parent().config.editor = '' def handle_external_editor_change(self, new_value, target): try: diff --git a/grc/gui/Param.py b/grc/gui/Param.py index 647e81746a..bf0a59b96b 100644 --- a/grc/gui/Param.py +++ b/grc/gui/Param.py @@ -23,7 +23,7 @@ import pygtk pygtk.require('2.0') import gtk -from . import Colors, Utils, Constants, Dialogs +from . import Colors, Utils, Constants from .Element import Element from ..core.Param import Param as _Param @@ -319,7 +319,9 @@ class FileParam(EntryParam): if self.param.get_key() == 'qt_qss_theme': dirname = os.path.dirname(dirname) # trim filename if not os.path.exists(dirname): - dirname = os.path.join(Constants.GR_PREFIX, '/share/gnuradio/themes') + platform = self.param.get_parent().get_parent().get_parent() + dirname = os.path.join(platform.config.install_prefix, + '/share/gnuradio/themes') if not os.path.exists(dirname): dirname = os.getcwd() # fix bad paths diff --git a/grc/gui/Platform.py b/grc/gui/Platform.py index cfd5ae3e3d..500df1cce4 100644 --- a/grc/gui/Platform.py +++ b/grc/gui/Platform.py @@ -22,9 +22,9 @@ import sys from ..core.Platform import Platform as _Platform +from .Config import Config as _Config from .Block import Block as _Block from .Connection import Connection as _Connection -from .Constants import PREFS_FILE, PREFS_FILE_OLD from .Element import Element from .FlowGraph import FlowGraph as _FlowGraph from .Param import Param as _Param @@ -33,28 +33,30 @@ from .Port import Port as _Port class Platform(Element, _Platform): - def __init__(self): + def __init__(self, *args, **kwargs): Element.__init__(self) - _Platform.__init__(self) + _Platform.__init__(self, *args, **kwargs) # Ensure conf directories - if not os.path.exists(os.path.dirname(PREFS_FILE)): - os.mkdir(os.path.dirname(PREFS_FILE)) + gui_prefs_file = self.config.gui_prefs_file + if not os.path.exists(os.path.dirname(gui_prefs_file)): + os.mkdir(os.path.dirname(gui_prefs_file)) self._move_old_pref_file() - self._prefs_file = PREFS_FILE def get_prefs_file(self): - return self._prefs_file + return self.config.gui_prefs_file - @staticmethod - def _move_old_pref_file(): - if PREFS_FILE == PREFS_FILE_OLD: + def _move_old_pref_file(self): + gui_prefs_file = self.config.gui_prefs_file + old_gui_prefs_file = os.environ.get( + 'GRC_PREFS_PATH', os.path.expanduser('~/.grc')) + if gui_prefs_file == old_gui_prefs_file: return # prefs file overridden with env var - if os.path.exists(PREFS_FILE_OLD) and not os.path.exists(PREFS_FILE): + if os.path.exists(old_gui_prefs_file) and not os.path.exists(gui_prefs_file): try: import shutil - shutil.move(PREFS_FILE_OLD, PREFS_FILE) + shutil.move(old_gui_prefs_file, gui_prefs_file) except Exception as e: print >> sys.stderr, e @@ -66,3 +68,4 @@ class Platform(Element, _Platform): Block = _Block Port = _Port Param = _Param + Config = _Config diff --git a/grc/scripts/gnuradio-companion b/grc/scripts/gnuradio-companion index 3a3bf503c2..04529890da 100755 --- a/grc/scripts/gnuradio-companion +++ b/grc/scripts/gnuradio-companion @@ -123,7 +123,12 @@ def main(): except: pass - ActionHandler(args, Platform()) + ActionHandler(args, Platform( + prefs_file=gr.prefs(), + version=gr.version(), + version_parts=(gr.major_version(), gr.api_version(), gr.minor_version()), + install_prefix=gr.prefix() + )) if __name__ == '__main__': |