Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 from python_qt_binding.QtWidgets import QVBoxLayout, QWidget
00034 from qt_gui.plugin import Plugin
00035 from qt_gui_py_common.simple_settings_dialog import SimpleSettingsDialog
00036 from rqt_py_console.py_console_widget import PyConsoleWidget
00037 
00038 try:
00039     from spyder_console_widget import SpyderConsoleWidget
00040     _has_spyderlib = True
00041 except ImportError:
00042     _has_spyderlib = False
00043 
00044 
00045 class PyConsole(Plugin):
00046 
00047     """
00048     Plugin providing an interactive Python console
00049     """
00050 
00051     def __init__(self, context):
00052         super(PyConsole, self).__init__(context)
00053         self.setObjectName('PyConsole')
00054 
00055         self._context = context
00056         self._use_spyderlib = _has_spyderlib
00057         self._console_widget = None
00058         self._widget = QWidget()
00059         self._widget.setLayout(QVBoxLayout())
00060         self._widget.layout().setContentsMargins(0, 0, 0, 0)
00061         if context.serial_number() > 1:
00062             self._widget.setWindowTitle(
00063                 self._widget.windowTitle() + (' (%d)' % context.serial_number()))
00064         self._context.add_widget(self._widget)
00065 
00066     def _switch_console_widget(self):
00067         self._widget.layout().removeWidget(self._console_widget)
00068         self.shutdown_console_widget()
00069 
00070         if _has_spyderlib and self._use_spyderlib:
00071             self._console_widget = SpyderConsoleWidget(self._context)
00072             self._widget.setWindowTitle('SpyderConsole')
00073         else:
00074             self._console_widget = PyConsoleWidget(self._context)
00075             self._widget.setWindowTitle('PyConsole')
00076         if self._context.serial_number() > 1:
00077             self._widget.setWindowTitle(
00078                 self._widget.windowTitle() + (' (%d)' % self._context.serial_number()))
00079 
00080         self._widget.layout().addWidget(self._console_widget)
00081 
00082     def save_settings(self, plugin_settings, instance_settings):
00083         instance_settings.set_value('use_spyderlib', self._use_spyderlib)
00084 
00085     def restore_settings(self, plugin_settings, instance_settings):
00086         self._use_spyderlib = _has_spyderlib and (
00087             instance_settings.value('use_spyderlib', True) in [True, 'true'])
00088         self._switch_console_widget()
00089 
00090     def trigger_configuration(self):
00091         options = [
00092             {'title': 'SpyderConsole',
00093                 'description': 'Advanced Python console with tab-completion (needs spyderlib to be installed).', 'enabled': _has_spyderlib},
00094             {'title': 'PyConsole', 'description': 'Simple Python console.'},
00095         ]
00096         dialog = SimpleSettingsDialog(title='PyConsole Options')
00097         dialog.add_exclusive_option_group(
00098             title='Console Type', options=options, selected_index=int(not self._use_spyderlib))
00099         console_type = dialog.get_settings()[0]
00100         new_use_spyderlib = {0: True, 1: False}.get(
00101             console_type['selected_index'], self._use_spyderlib)
00102         if self._use_spyderlib != new_use_spyderlib:
00103             self._use_spyderlib = new_use_spyderlib
00104             self._switch_console_widget()
00105 
00106     def shutdown_console_widget(self):
00107         if self._console_widget is not None and hasattr(self._console_widget, 'shutdown'):
00108             self._console_widget.shutdown()
00109 
00110     def shutdown_plugin(self):
00111         self.shutdown_console_widget()