class GphlSetupWidget(QtGui.QWidget): """Superclass for GPhL interface widgets""" def __init__(self, parent=None, name='gphl_setup_widget'): QtGui.QWidget.__init__(self,parent) if name is not None: self.setObjectName(name) # Properties ---------------------------------------------------------- # Signals ------------------------------------------------------------ # Slots --------------------------------------------------------------- dispatcher.connect(self._refresh_interface, 'model_update', dispatcher.Any) # Hardware objects ---------------------------------------------------- # Internal variables ------------------------------------------------- self._widget_data = OrderedDict() self._data_object = GphlAcquisitionData() self._pulldowns = {} self._parameter_mib = DataModelInputBinder(self._data_object) # Graphic elements ---------------------------------------------------- _parameters_widget = self._parameters_widget = QtGui.QWidget(self) QtGui.QGridLayout(_parameters_widget) _parameters_widget.layout().setColumnStretch(2, 1) # Layout -------------------------------------------------------------- # This seems to be necessary to make widget visible _main_vlayout = QtGui.QVBoxLayout(self) _main_vlayout.addWidget(_parameters_widget) _main_vlayout.setSpacing(0) _main_vlayout.setContentsMargins(0, 0, 0, 0) def setEnabled(self, value): super(GphlSetupWidget, self).setEnabled(value) for tag in self._widget_data: self.set_parameter_enabled(tag, value, warn=False) def set_parameter_enabled(self, tag, value, warn=True): tt = self._widget_data.get(tag) if tt: if hasattr(tt[0], 'setEnabled'): tt[0].setEnabled(value) elif warn: logging.getLogger().warning( "%s Widget has no attribute setEnabled" % tag ) elif warn: logging.getLogger().warning( "%s field not found in GphlSetupWidget" % tag ) def get_data_object(self): return self._data_object def populate_widget(self, **kw): self._data_object = data_object = GphlAcquisitionData() self._parameter_mib.bindings.clear() # NB must be done here to set empty model, and also in subclasses: self._parameter_mib.set_model(data_object) for field_name, tags in self._pulldowns.items(): widget = self._widget_data[field_name][0] widget.clear() widget.addItems(list(QtCore.QString(tag) for tag in tags)) widget.setCurrentIndex(0) def set_parameter_value(self, name, value): """Set value - NB ComboBoxes are set by text, not index""" if hasattr(self._data_object, name): tags = self._pulldowns.get(name) if tags is None: # Not a pulldown setattr(self._data_object, name, value) else: # This is a pulldown if value in tags: indx = tags.index(value) setattr(self._data_object, name, indx) else: raise ValueError( "GPhL acquisition widget %s pulldown has no value %s" % (name, value) ) self._parameter_mib._update_widget(name, None) else: raise ValueError( "GPhL acquisition widget has no parameter named %s" % name ) def get_parameter_value(self, name): """Return value of parameter <name> or None if it does not exist NB ComboBoxes return text values, not indices NB, the attributes defined on the _data_object depend on context, so it is practical not to get errors for unknown names """ if hasattr(self._data_object, name): tags = self._pulldowns.get(name) if tags is None: # Not a pulldown return getattr(self._data_object, name) else: # This is a pulldown - get text from index return tags[getattr(self._data_object, name)] else: return None def _get_label_name(self, name): return name + '_label' def _refresh_interface(self, field_name, data_binder): """Refresh interface when values change""" pass