def set_dataset(self, data, tid=None): """Set the input dataset.""" if data is not None: if tid in self.inputs: # update existing input slot slot = self.inputs[tid] view = slot.view # reset the (header) view state. view.setModel(None) view.horizontalHeader().setSortIndicator(-1, Qt.AscendingOrder) else: view = QTableView() view.setSelectionBehavior(QTableView.SelectRows) view.setSortingEnabled(True) view.setHorizontalScrollMode(QTableView.ScrollPerPixel) header = view.horizontalHeader() header.setMovable(True) header.setClickable(True) header.setSortIndicatorShown(True) header.setSortIndicator(-1, Qt.AscendingOrder) # QHeaderView does not 'reset' the model sort column, # because there is no guaranty (requirement) that the # models understand the -1 sort column. def sort_reset(index, order): if view.model() is not None and index == -1: view.model().sort(index, order) header.sortIndicatorChanged.connect(sort_reset) view.dataset = data self.tabs.addTab(view, getattr(data, "name", "Data")) self._setup_table_view(view, data) slot = TableSlot(tid, data, table_summary(data), view) view._input_slot = slot self.inputs[tid] = slot self.tabs.setCurrentIndex(self.tabs.indexOf(view)) self.set_info(slot.summary) if isinstance(slot.summary.len, concurrent.futures.Future): def update(f): QMetaObject.invokeMethod( self, "_update_info", Qt.QueuedConnection) slot.summary.len.add_done_callback(update) elif tid in self.inputs: slot = self.inputs.pop(tid) view = slot.view view.hide() view.deleteLater() self.tabs.removeTab(self.tabs.indexOf(view)) current = self.tabs.currentWidget() if current is not None: self.set_info(current._input_slot.summary) self.tabs.tabBar().setVisible(self.tabs.count() > 1)
def set_dataset(self, data, tid=None): """Set the input dataset.""" if data is not None: if tid in self.inputs: # update existing input slot slot = self.inputs[tid] view = slot.view # reset the (header) view state. view.setModel(None) view.horizontalHeader().setSortIndicator(-1, Qt.AscendingOrder) else: view = QTableView() view.setSortingEnabled(True) view.setHorizontalScrollMode(QTableView.ScrollPerPixel) if self.select_rows: view.setSelectionBehavior(QTableView.SelectRows) header = view.horizontalHeader() header.setMovable(True) header.setClickable(True) header.setSortIndicatorShown(True) header.setSortIndicator(-1, Qt.AscendingOrder) # QHeaderView does not 'reset' the model sort column, # because there is no guaranty (requirement) that the # models understand the -1 sort column. def sort_reset(index, order): if view.model() is not None and index == -1: view.model().sort(index, order) header.sortIndicatorChanged.connect(sort_reset) view.dataset = data self.tabs.addTab(view, getattr(data, "name", "Data")) self._setup_table_view(view, data) slot = TableSlot(tid, data, table_summary(data), view) view._input_slot = slot self.inputs[tid] = slot self.tabs.setCurrentIndex(self.tabs.indexOf(view)) self.set_info(slot.summary) if isinstance(slot.summary.len, concurrent.futures.Future): def update(f): QMetaObject.invokeMethod(self, "_update_info", Qt.QueuedConnection) slot.summary.len.add_done_callback(update) elif tid in self.inputs: slot = self.inputs.pop(tid) view = slot.view view.hide() view.deleteLater() self.tabs.removeTab(self.tabs.indexOf(view)) current = self.tabs.currentWidget() if current is not None: self.set_info(current._input_slot.summary) self.tabs.tabBar().setVisible(self.tabs.count() > 1)
class DictValueDialog(QtHelper.EnhancedQDialog, Logger.ClassLogger): """ Dict dialog """ def __init__(self, parent, testParams, variables, advancedMode=False ): """ Operator to fill parameter description @param dataArgs: @type dataArgs: @param parent: @type parent: """ super(DictValueDialog, self).__init__(parent) self.advancedMode = advancedMode self.testParams = testParams self.variables = variables self.createDialog() self.createConnections() self.createActions() def createDialog (self): """ Create qt dialog """ self.buttonBox = QDialogButtonBox(self) self.buttonBox.setStyleSheet( """QDialogButtonBox { dialogbuttonbox-buttons-have-icons: 1; dialog-ok-icon: url(:/ok.png); dialog-cancel-icon: url(:/test-close-black.png); }""") self.buttonBox.setStandardButtons(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) mainLayout = QVBoxLayout() self.dictTable = QTableView(self) self.model = DictTableModel(self, advancedMode=self.advancedMode) self.dictTable.setModel(self.model) self.dictTable.setFrameShape(QFrame.StyledPanel) self.dictTable.setShowGrid(True) self.dictTable.setGridStyle (Qt.DotLine) self.dictTable.setSelectionMode(QAbstractItemView.ExtendedSelection) self.dictTable.setSelectionBehavior(QAbstractItemView.SelectRows) self.dictTable.setContextMenuPolicy(Qt.CustomContextMenu) self.dictTable.verticalHeader().setVisible(False) self.dictTable.horizontalHeader().setHighlightSections(False) self.dictTable.setHorizontalScrollMode(QAbstractItemView.ScrollPerPixel) self.dictTable.horizontalHeader().setStretchLastSection(True) self.dictTable.setColumnWidth(COL_KEY, 200) # delegate item on advanced mode if self.advancedMode: self.dictTable.setItemDelegateForColumn( COL_KEY, ItemComboDelegate(self, COL_KEY) ) self.dictTable.setItemDelegateForColumn( COL_VALUE, ItemComboDelegate(self, COL_VALUE) ) mainLayout.addWidget(self.dictTable) mainLayout.addWidget(self.buttonBox) self.setLayout(mainLayout) self.setWindowTitle(self.tr("Dict configuration")) self.setMinimumWidth(500) self.center() def getInputs(self): """ Get test inputs """ return self.testParams.parameters.table().model.getData() def getOutputs(self): """ Get test outputs """ return self.testParams.parametersOutput.table().model.getData() def createConnections (self): """ Create qt connections """ self.buttonBox.accepted.connect(self.accept) self.buttonBox.rejected.connect(self.reject) self.dictTable.customContextMenuRequested.connect(self.onPopupMenu) def getValue(self): """ Return value """ return self.model.getData() def createActions (self): """ Actions defined: * add * del """ self.addAction = QtHelper.createAction(self, self.tr("&Add"), self.addKey, icon = QIcon(":/test-parameter-add.png"), tip = self.tr('Add a new key') ) self.delAction = QtHelper.createAction(self, self.tr("&Delete"), self.delKey, icon = QIcon(":/test-parameter-del.png"), tip = self.tr('Delete the selected key') ) self.delAllAction = QtHelper.createAction(self, self.tr("&Delete All"), self.delKeys, icon = QIcon(":/test-parameter-del.png"), tip = self.tr('Delete the selected key') ) def addKey(self): """ Add key """ self.delAllAction.setEnabled(True) index = self.dictTable.currentIndex() if not index.isValid(): row = self.model.rowCount() else: row = index.row() data = self.model.getData() if self.advancedMode: tpl = { 'key': { 'operator': '', 'value': '', 'type': '' }, 'value': { 'operator': '', 'value': '', 'type': '' } } else: tpl = { 'key': 'my key', 'value': 'my value' } # add data to model data.insert(row + 1, tpl) self.model.reset() def clear (self): """ clear contents """ self.model.setDataModel( [] ) def delKey(self): """ Delete key """ # get selected proxy indexes indexes = self.dictTable.selectedIndexes() if not indexes: return if indexes: answer = QMessageBox.question(self, self.tr("Remove"), self.tr("Do you want to remove selected key?"), QMessageBox.Yes | QMessageBox.No) if answer == QMessageBox.Yes: self.removeValues(indexes) def removeValues(self, indexes): """ Remove values from data @param indexes: @type indexes: """ if not indexes: return # extract name, name are unique datas = self.model.getData() allNames = [] # remove duplicate index cleanIndexes = {} for index in indexes: if index.row() not in cleanIndexes: cleanIndexes[index.row()] = index #for cleanIndex in cleanIndexes.keys(): for cleanIndex in list(cleanIndexes.keys()): # for python3 support allNames.append( datas[cleanIndex]['key'] ) self.trace('Key to remove: %s' % allNames) for paramName in allNames: self.removeValue( paramName=paramName ) def removeValue(self, paramName): """ Remove one parameter according to the name passed on argument """ datas = self.model.getData() i = None for i in xrange(len(datas)): if datas[i]['key'] == paramName: break if i is not None: param = datas.pop( i ) del param self.model.reset() def delKeys(self): """ Clear all keys """ reply = QMessageBox.question(self, self.tr("Clear all keys"), self.tr("Are you sure ?"), QMessageBox.Yes | QMessageBox.No ) if reply == QMessageBox.Yes: data = self.model.getData() try: for i in xrange(len(data)): data.pop() except Exception as e: pass self.model.reset() self.delAllAction.setEnabled(False) def onPopupMenu(self, pos): """ Display menu on right click @param pos: @type pos: """ self.menu = QMenu(self.dictTable) index = self.dictTable.currentIndex() indexes = self.dictTable.selectedIndexes() if not indexes: self.menu.addAction( self.delAction ) self.menu.addAction( self.addAction ) self.menu.addSeparator() self.menu.addAction( self.delAllAction ) self.menu.addSeparator() else: self.menu.addAction( self.delAction ) self.menu.addAction( self.addAction ) self.menu.addSeparator() self.menu.addAction( self.delAllAction ) self.menu.addSeparator() self.menu.popup( self.mapToGlobal(pos) ) def loadData(self, data): """ Load data """ if isinstance(data, dict): data = [data] self.model.setDataModel( data )