def __init__(self, p_configManager, parent=None): super(UGMModuleDockWidget, self).__init__(parent) self.fileName = None self.configManager = p_configManager # UI auto-generated from QT Designer self.ui = Ui_UGMMainWidget() self.ui.setupUi(self) l_attributesConfig = self.configManager.get_attributes_config() self._initModel(UGMPropertiesModel(l_attributesConfig['attributes_def'], l_attributesConfig['attributes_for_elem'], self.configManager.get_ugm_fields())) self.connect(self.ui.propertyList, QtCore.SIGNAL("collapsed(QModelIndex)"), self.resizeColumns) self.connect(self.ui.propertyList, QtCore.SIGNAL("expanded(QModelIndex)"), self.resizeColumns) self.initActions() self._connection = None
class UGMModuleDockWidget(QtGui.QDockWidget): """Dock widget which is used to configure all UGM properties""" def __init__(self, p_configManager, parent=None): super(UGMModuleDockWidget, self).__init__(parent) self.fileName = None self.configManager = p_configManager # UI auto-generated from QT Designer self.ui = Ui_UGMMainWidget() self.ui.setupUi(self) l_attributesConfig = self.configManager.get_attributes_config() self._initModel(UGMPropertiesModel(l_attributesConfig['attributes_def'], l_attributesConfig['attributes_for_elem'], self.configManager.get_ugm_fields())) self.connect(self.ui.propertyList, QtCore.SIGNAL("collapsed(QModelIndex)"), self.resizeColumns) self.connect(self.ui.propertyList, QtCore.SIGNAL("expanded(QModelIndex)"), self.resizeColumns) self.initActions() self._connection = None def resizeColumns(self): """Resizes columns, to fit contents""" for i_column in range(self.propertiesModel.columnCount(QtCore.QModelIndex())): self.ui.propertyList.resizeColumnToContents(i_column) def initActions(self): """Initialises all actions used by UGM dock widget""" self.ui.sendToUgmButton.setDefaultAction(self.ui.actionSendToUgm) self.ui.loadButton.setDefaultAction(self.ui.actionLoad) self.ui.saveButton.setDefaultAction(self.ui.actionSave) self.ui.saveAsButton.setDefaultAction(self.ui.actionSaveAs) self.ui.addButton.setDefaultAction(self.ui.actionAdd) self.ui.addRectangleButton.setDefaultAction(self.ui.actionAddRectangle) self.ui.addImageButton.setDefaultAction(self.ui.actionAddImage) self.ui.addTextButton.setDefaultAction(self.ui.actionAddText) self.ui.removeButton.setDefaultAction(self.ui.actionRemove) self.ui.actionSendToUgm.triggered.connect(self.sendToUgm) self.ui.actionLoad.triggered.connect(self.loadConfig) self.ui.actionSave.triggered.connect(self.saveConfig) self.ui.actionSaveAs.triggered.connect(self.saveConfigAs) self.ui.actionAdd.triggered.connect(lambda p_unused, p_type="field": self.addRoot(p_type)) self.ui.actionAddRectangle.triggered.connect(lambda p_unused, p_type="rectangle": self.addRoot(p_type)) self.ui.actionAddImage.triggered.connect(lambda p_unused, p_type="image": self.addRoot(p_type)) self.ui.actionAddText.triggered.connect(lambda p_unused, p_type="text": self.addRoot(p_type)) self.ui.actionRemove.triggered.connect(self.removeRoot) self.updateActions() def updateActions(self, p_newSelection=None): """Called every time something happens, that can change availability of this plugins actions""" # If this was called by signal, we will have new selection send as parameter if p_newSelection != None and p_newSelection.count() > 0 and p_newSelection.first().isValid(): l_currentIndex = p_newSelection.first().topLeft() else: l_currentIndex = self.ui.propertyList.selectionModel().currentIndex() # We can always add new field, sen to ugm or save/load self.ui.actionAdd.setEnabled(True) self.ui.actionSendToUgm.setEnabled(True) self.ui.actionLoad.setEnabled(True) self.ui.actionSave.setEnabled(True) self.ui.actionSaveAs.setEnabled(True) if not self.ui.propertyList.selectionModel().selection().isEmpty() and l_currentIndex.isValid(): l_item = self.propertiesModel.getItem(l_currentIndex) # We can only remove fields or stimuluses... l_canRemove = (l_item.type == 'field' or l_item.type == 'rectangle' or l_item.type == 'image' or l_item.type == 'text') # ...and we can only add stimuluses to lists l_canAddStimulus = (l_item.type == 'list') self.ui.actionAddRectangle.setEnabled(l_canAddStimulus) self.ui.actionAddImage.setEnabled(l_canAddStimulus) self.ui.actionAddText.setEnabled(l_canAddStimulus) self.ui.actionRemove.setEnabled(l_canRemove) else: # Nothing is selected, so we can't add or remove anything :) self.ui.actionAddRectangle.setEnabled(False) self.ui.actionAddImage.setEnabled(False) self.ui.actionAddText.setEnabled(False) self.ui.actionRemove.setEnabled(False) def sendToUgm(self): """Sends currently edited config to UGM, if it's running""" # # Change config managers loaded config self.configManager.set_full_config(self.propertiesModel.createConfigNode()) # # We check whether we changed model structure: added or removed fields, # # changed ids, because if we did then we must send different message type if self.propertiesModel.structureModified: l_type = 0 self.propertiesModel.structureModified = False else: l_type = 1 l_msg = variables_pb2.UgmUpdate() l_msg.type = int(l_type) l_msg.value = self.configManager.config_to_message() # # # Everything done :) All that is left is to establish connection if needed... if not self._connection: self._connection = connect_client(type = peers.LOGIC_DECISION, addresses=settings.MULTIPLEXER_ADDRESSES) # ...and send message to UGM self._connection.send_message( message = l_msg.SerializeToString(), type=types.UGM_UPDATE_MESSAGE, flush=True) #### TEMPORARY FOR LOCAL UGM #### #l_tempConfigManager = UgmConfigManager() #l_tempConfigManager.set_full_config(self.propertiesModel.createConfigNode()) #l_tempConfigManager.update_to_file() def loadConfig(self): """Loads config from file and rebuilds whole tree""" l_fileName = QtGui.QFileDialog().getOpenFileName(self, self.tr(u"Otwórz"), QtCore.QString(settings.module_abs_path()), "Pliki UGMa (*.ugm)") if l_fileName == "": return self.fileName = unicode(l_fileName) l_shortFileName = os.path.split(unicode(l_fileName))[1] self.setWindowTitle(QtGui.QApplication.translate("UGMMainWidget", "UGM Configuration - %s" % (l_shortFileName), None, QtGui.QApplication.UnicodeUTF8)) self.configManager.update_from_file(self.fileName) l_attributesConfig = self.configManager.get_attributes_config() self._initModel(UGMPropertiesModel(l_attributesConfig['attributes_def'], l_attributesConfig['attributes_for_elem'], self.configManager.get_ugm_fields())) def saveConfig(self): """Saves config to default file, if none were loaded or to last loaded file""" # Change config managers loaded config self.configManager.set_full_config(self.propertiesModel.createConfigNode()) # We also save new config to file self.configManager.update_to_file(self.fileName) def saveConfigAs(self): """Saves config to specified file""" l_fileName = QtGui.QFileDialog().getSaveFileName(self, self.tr("Zapisz jako..."), QtCore.QString(settings.module_abs_path()), "Plik UGMa (*.ugm)") if l_fileName == "": return elif not unicode(l_fileName).endswith('.ugm'): l_fileName += '.ugm' self.fileName = l_fileName self.saveConfig() def addRoot(self, p_type): """Adds root item of given type to the list/model""" l_currentIndex = self.ui.propertyList.selectionModel().currentIndex() self.propertiesModel.addRoot(l_currentIndex, p_type) self.updateActions() def removeRoot(self): """Removes currently selected root item from list/model""" l_currentIndex = self.ui.propertyList.selectionModel().currentIndex() self.propertiesModel.removeRoot(l_currentIndex.parent(), l_currentIndex.row()) self.updateActions() def _initModel(self, p_model): """Creates and initialises model, from given parameter""" self.propertiesModel = p_model self.propertiesDelegate = UGMPropertiesDelegate() # Preparing model self.ui.propertyList.setModel(self.propertiesModel) self.ui.propertyList.setItemDelegate(self.propertiesDelegate) self.ui.propertyList.setEditTriggers(QtGui.QAbstractItemView.AllEditTriggers) # Initialising everything self.resizeColumns() self.ui.propertyList.selectionModel().selectionChanged.connect(self.updateActions)