dashboard.py
Go to the documentation of this file.
00001 # Software License Agreement (BSD License)
00002 #
00003 # Copyright (c) 2012, Willow Garage, Inc.
00004 # All rights reserved.
00005 #
00006 # Redistribution and use in source and binary forms, with or without
00007 # modification, are permitted provided that the following conditions
00008 # are met:
00009 #
00010 #  * Redistributions of source code must retain the above copyright
00011 #    notice, this list of conditions and the following disclaimer.
00012 #  * Redistributions in binary form must reproduce the above
00013 #    copyright notice, this list of conditions and the following
00014 #    disclaimer in the documentation and/or other materials provided
00015 #    with the distribution.
00016 #  * Neither the name of Willow Garage, Inc. nor the names of its
00017 #    contributors may be used to endorse or promote products derived
00018 #    from this software without specific prior written permission.
00019 #
00020 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
00021 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
00022 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
00023 # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
00024 # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
00025 # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
00026 # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
00027 # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
00028 # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
00029 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
00030 # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00031 # POSSIBILITY OF SUCH DAMAGE.
00032 
00033 from python_qt_binding.QtCore import QSize, Qt
00034 from python_qt_binding.QtWidgets import QToolBar, QGroupBox, QHBoxLayout
00035 from qt_gui.plugin import Plugin
00036 
00037 
00038 class Dashboard(Plugin):
00039     """
00040     Base class from which dashboards should inherit.
00041 
00042     :param context: the plugin context
00043     :type context: qt_gui.plugin.Plugin
00044     """
00045     def __init__(self, context):
00046         super(Dashboard, self).__init__(context)
00047         self.context = context
00048         self.setup(context)
00049 
00050         if not hasattr(self, 'name'):
00051             self.name = 'Dashboard'
00052         if not hasattr(self, 'max_icon_size'):
00053             self.max_icon_size = QSize(50, 30)
00054         self._main_widget = QToolBar()
00055         self._main_widget.setIconSize(self.max_icon_size)
00056         self._main_widget.setObjectName(self.name)
00057         self._main_widget.setWindowTitle(self.name)
00058         if context.serial_number() > 1:
00059             self._main_widget.setWindowTitle(self._main_widget.windowTitle() + (' (%d)' % context.serial_number()))
00060 
00061         # Convert list of widgets into layout
00062         self.add_widgets()
00063 
00064         # Display the dashboard
00065         context.add_toolbar(self._main_widget)
00066 
00067     def setup(self, context):
00068         """
00069         Called during ``__init__`` Subclasses should do initialization here.
00070 
00071         NOTE when overriding this method you should provide a ``self.name`` to
00072         avoid naming conflicts.
00073 
00074         :param context: The plugin context
00075         :type context: qt_gui.plugin.Plugin
00076         """
00077         pass
00078 
00079     def shutdown_plugin(self):
00080         """
00081         Called when the toolbar is closed by Qt.
00082         """
00083         for widget in self._widgets:
00084             if hasattr(widget, 'shutdown_widget'):
00085                 widget.shutdown_widget()
00086             if hasattr(widget, 'close'):
00087                 widget.close()
00088 
00089         self.shutdown_dashboard()
00090 
00091     def shutdown_dashboard(self):
00092         """
00093         Called after shutdown plugin, subclasses should do cleanup here, not in shutdown_plugin
00094         """
00095         pass
00096 
00097     def get_widgets(self):
00098         """
00099         Most of the dashboard customization should be done here.
00100         If this function is not overriden the dashboard will display nothing.
00101 
00102         :returns: List of lists containing dashboard widgets, or list of lists
00103                   containing a string followed by a list of dashboard widgets.
00104         """
00105         return []
00106 
00107     def add_widgets(self):
00108         """
00109         Add groups of widgets to _main_widget. Supports group labels.
00110 
00111         This method can be reimplemented in order to customize appearances.
00112         """
00113         widgets = self.get_widgets()
00114         self._widgets = [] # stores widgets which may need to be shut down when done
00115         for group in widgets:
00116             # Check for group label
00117             if isinstance(group[0], str):
00118                 grouplabel, v = group
00119                 box = QGroupBox(grouplabel)
00120                 box.setContentsMargins(0, 18, 0, 0) # LTRB
00121                 # Apply the center-label directive only for single-icon groups
00122                 if len(group[1]) == 1:
00123                     box.setAlignment(Qt.AlignHCenter)
00124             else:
00125                 box = QGroupBox()
00126                 box.setContentsMargins(0, 0, 0, 0) # LTRB
00127                 v = group
00128             # Add widgets to QGroupBox
00129             layout = QHBoxLayout()
00130             layout.setSpacing(0)
00131             layout.setContentsMargins(0, 0, 0, 0) # LTRB
00132             for i in v:
00133                 try:
00134                     try:
00135                         i.setIconSize(self.max_icon_size) # without this, icons are tiny
00136                     except AttributeError as e:
00137                         # triggers with battery which uses a QLabel instead of a QToolButton-based widget
00138                         pass
00139                     layout.addWidget(i)
00140                     self._widgets.append(i)
00141                 except:
00142                     raise Exception("All widgets must be a subclass of QWidget!")
00143 
00144             layout.activate()
00145             box.setLayout(layout)
00146             self._main_widget.addWidget(box)
00147             self._main_widget.addSeparator()


rqt_robot_dashboard
Author(s): Ze'ev Klapow
autogenerated on Wed May 3 2017 02:40:43