class QAliasList(QtGui.QTreeWidget): """ QAliasList just inherits from QListView to have a customized list and items """ #signals aliasUpdated = pyqtSignal(Alias) aliasRemoved = pyqtSignal(str) highlightModule = pyqtSignal(int) def __init__(self, controller, panel, parent=None): """ QAliasList(parent: QWidget) -> QAliasTable """ QtGui.QTreeWidget.__init__(self, parent) self.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) self.setRootIsDecorated(False) self.panel = panel self.aliases = Bidict() self.alias_widgets = {} self.current_item = None self.controller = controller self.header().setStretchLastSection(True) self.setHeaderLabels(QtCore.QStringList() << "Position" << "Name" << "Type") self.itemSelectionChanged.connect(self.setPreviousSelected) self.connect(self, QtCore.SIGNAL("currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)"), self.currentAliasChanged) self.previousSelected = -1 @pyqtSlot() def setPreviousSelected(self): if len(self.selectedItems()) == 1: item = self.selectedItems()[0] self.previousSelected = self.indexOfTopLevelItem(item) else: self.previousSelected = -1 def processCellChanges(self, row, col): """ processCellChanges(row: int, col: int) -> None Event handler for capturing when the contents in a cell changes """ item = self.item(row, col) if col == 0: old_alias = item.alias.alias new_alias = str(item.text()) if new_alias in self.aliases.keys(): QtGui.QMessageBox.warning(self, "VisMashup", """Label name %s already exists. Please type a different name. """ % new_alias) item.setText(old_alias) return elif new_alias == '': del self.aliases[old_alias] wdgt = self.cellWidget(row, 1) del self.alias_widgets[wdgt] item.alias.alias = '' self.removeRow(row) wdgt.deleteLater() self.updateRowNumbers() else: self.aliases[new_alias] = self.aliases[old_alias] del self.aliases[old_alias] item.alias.alias = new_alias elif col == 1: wdgt = self.cellWidget(row,col) if wdgt is not None: item.alias.value = wdgt.contents() self.aliasUpdated.emit(item.alias) def currentAliasChanged(self, current, previous): if current: if ((previous is not None and current.alias != previous.alias) or previous is None): self.highlightModule.emit(current.alias.component.vtmid) else: self.highlightModule.emit(-1) def _getOtherParameterInfo(self, pipeline, id, ptype): parameter = pipeline.db_get_object(ptype,id) return (parameter.type, parameter.strValue, 1, parameter.pos) def createAliasItem(self, alias): """ createAliasRow( alias: core.mashup.Alias) -> AliasItem Creates a row in the list """ alias.pos = self.topLevelItemCount() labels = QtCore.QStringList() << str(alias.component.pos) << str(alias.name) << \ str(alias.component.type) item = QAliasListItem(self, alias, labels) item.setFlags(QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable ) return alias def populateFromMashup(self, mashupController): #print "populateFromMashup ", self , self.previousSelected if self.controller != mashupController: self.controller = mashupController self.itemSelectionChanged.disconnect(self.setPreviousSelected) self.aliases = {} self.alias_cache = {} self.alias_widgets = {} self.clear() mashup = self.controller.currentMashup if len(mashup.alias_list) > 0: for alias in mashup.alias_list: alias = self.createAliasItem(copy.copy(alias)) self.aliases[alias.name] = alias if (self.previousSelected > -1 and self.previousSelected < self.topLevelItemCount()): item = self.topLevelItem(self.previousSelected) self.setItemSelected(item, True) self.itemSelectionChanged.connect(self.setPreviousSelected) def updatePosNumbers(self): new_order = [] for idx in range(self.topLevelItemCount()): item = self.topLevelItem(idx) new_order.append(item.alias.component.pos) item.setText(0,str(idx)) return new_order def moveItemToNewPos(self, old, new): """moveItemToNewPos(old:int, new:int) -> None Move item from pos old to pos new """ self.itemSelectionChanged.disconnect(self.panel.updateInspector) item = self.takeTopLevelItem(old) self.insertTopLevelItem(new,item) self.clearSelection() new_order = self.updatePosNumbers() self.setItemSelected(item, True) self.itemSelectionChanged.connect(self.panel.updateInspector) self.controller.reorderAliases(new_order) def keyPressEvent(self, event): """ keyPressEvent(event: QKeyEvent) -> None Capture 'Del', 'Backspace' for deleting aliases """ if (event.key() in [QtCore.Qt.Key_Backspace, QtCore.Qt.Key_Delete]): self.removeCurrentAlias() @pyqtSlot(bool) def removeCurrentAlias(self, checked=False): item = self.currentItem() name = item.alias.name res = show_question("Mashups", "Are you sure do you want to remove '%s' from the mashup?"%name, [YES_BUTTON, NO_BUTTON], NO_BUTTON) if res == YES_BUTTON: old_alias = item.alias.name del self.aliases[old_alias] pos = self.indexOfTopLevelItem(item) self.takeTopLevelItem(pos) self.updatePosNumbers() if pos < self.topLevelItemCount() -1: new_item = self.topLevelItem(pos) else: new_item = self.topLevelItem(pos-1) self.setCurrentItem(new_item) self.aliasRemoved.emit(name)
class QAliasList(QtGui.QTreeWidget): """ QAliasList just inherits from QListView to have a customized list and items """ #signals aliasUpdated = pyqtSignal(Alias) aliasRemoved = pyqtSignal(str) highlightModule = pyqtSignal(int) def __init__(self, controller, panel, parent=None): """ QAliasList(parent: QWidget) -> QAliasTable """ QtGui.QTreeWidget.__init__(self, parent) self.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) self.setRootIsDecorated(False) self.panel = panel self.aliases = Bidict() self.alias_widgets = {} self.current_item = None self.controller = controller self.header().setStretchLastSection(True) self.setHeaderLabels( QtCore.QStringList() << "Position" << "Name" << "Type") self.itemSelectionChanged.connect(self.setPreviousSelected) self.connect( self, QtCore.SIGNAL( "currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)"), self.currentAliasChanged) self.previousSelected = -1 @pyqtSlot() def setPreviousSelected(self): if len(self.selectedItems()) == 1: item = self.selectedItems()[0] self.previousSelected = self.indexOfTopLevelItem(item) else: self.previousSelected = -1 def processCellChanges(self, row, col): """ processCellChanges(row: int, col: int) -> None Event handler for capturing when the contents in a cell changes """ item = self.item(row, col) if col == 0: old_alias = item.alias.alias new_alias = str(item.text()) if new_alias in self.aliases.keys(): QtGui.QMessageBox.warning( self, "VisMashup", """Label name %s already exists. Please type a different name. """ % new_alias) item.setText(old_alias) return elif new_alias == '': del self.aliases[old_alias] wdgt = self.cellWidget(row, 1) del self.alias_widgets[wdgt] item.alias.alias = '' self.removeRow(row) wdgt.deleteLater() self.updateRowNumbers() else: self.aliases[new_alias] = self.aliases[old_alias] del self.aliases[old_alias] item.alias.alias = new_alias elif col == 1: wdgt = self.cellWidget(row, col) if wdgt is not None: item.alias.value = wdgt.contents() self.aliasUpdated.emit(item.alias) def currentAliasChanged(self, current, previous): if current: if ((previous is not None and current.alias != previous.alias) or previous is None): self.highlightModule.emit(current.alias.component.vtmid) else: self.highlightModule.emit(-1) def _getOtherParameterInfo(self, pipeline, id, ptype): parameter = pipeline.db_get_object(ptype, id) return (parameter.type, parameter.strValue, 1, parameter.pos) def createAliasItem(self, alias): """ createAliasRow( alias: core.mashup.Alias) -> AliasItem Creates a row in the list """ alias.pos = self.topLevelItemCount() labels = QtCore.QStringList() << str(alias.component.pos) << str(alias.name) << \ str(alias.component.type) item = QAliasListItem(self, alias, labels) item.setFlags(QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable) return alias def populateFromMashup(self, mashupController): #print "populateFromMashup ", self , self.previousSelected if self.controller != mashupController: self.controller = mashupController self.itemSelectionChanged.disconnect(self.setPreviousSelected) self.aliases = {} self.alias_cache = {} self.alias_widgets = {} self.clear() mashup = self.controller.currentMashup if len(mashup.alias_list) > 0: for alias in mashup.alias_list: alias = self.createAliasItem(copy.copy(alias)) self.aliases[alias.name] = alias if (self.previousSelected > -1 and self.previousSelected < self.topLevelItemCount()): item = self.topLevelItem(self.previousSelected) self.setItemSelected(item, True) self.itemSelectionChanged.connect(self.setPreviousSelected) def updatePosNumbers(self): new_order = [] for idx in range(self.topLevelItemCount()): item = self.topLevelItem(idx) new_order.append(item.alias.component.pos) item.setText(0, str(idx)) return new_order def moveItemToNewPos(self, old, new): """moveItemToNewPos(old:int, new:int) -> None Move item from pos old to pos new """ self.itemSelectionChanged.disconnect(self.panel.updateInspector) item = self.takeTopLevelItem(old) self.insertTopLevelItem(new, item) self.clearSelection() new_order = self.updatePosNumbers() self.setItemSelected(item, True) self.itemSelectionChanged.connect(self.panel.updateInspector) self.controller.reorderAliases(new_order) def keyPressEvent(self, event): """ keyPressEvent(event: QKeyEvent) -> None Capture 'Del', 'Backspace' for deleting aliases """ if (event.key() in [QtCore.Qt.Key_Backspace, QtCore.Qt.Key_Delete]): self.removeCurrentAlias() @pyqtSlot(bool) def removeCurrentAlias(self, checked=False): item = self.currentItem() name = item.alias.name res = show_question( "Mashups", "Are you sure do you want to remove '%s' from the mashup?" % name, [YES_BUTTON, NO_BUTTON], NO_BUTTON) if res == YES_BUTTON: old_alias = item.alias.name del self.aliases[old_alias] pos = self.indexOfTopLevelItem(item) self.takeTopLevelItem(pos) self.updatePosNumbers() if pos < self.topLevelItemCount() - 1: new_item = self.topLevelItem(pos) else: new_item = self.topLevelItem(pos - 1) self.setCurrentItem(new_item) self.aliasRemoved.emit(name)