def setContent(self, metaProvider): self.metaProvider = metaProvider # load main model #self.file = QFile(metaFilePath) self.metaXML = QDomDocument() metadata = self.metaProvider.getMetadata().encode("utf-8") self.metaXML.setContent(metadata) self.model = DomModel(self.metaXML, self) # set full view self.treeFull.setModel(self.model) self.treeFull.hideColumn(1) # hide attrs self.treeFull.resizeColumnToContents(0) # resize value column # load filtered list self.filteredIndexes = None # lazy init # set filtered view #self.fillTableWidget() self.btnSave.setEnabled(False)
class MetatoolsEditor(QDialog, FORM_CLASS): def __init__(self, parent=None): super(MetatoolsEditor, self).__init__(parent) self.setupUi(self) self.setWindowFlags(Qt.Window | Qt.WindowMaximizeButtonHint) self.tabWidget.setCurrentIndex(0) self.lblNodePath.setText("") self.btnSave = self.buttonBox.button(QDialogButtonBox.Save) self.btnClose = self.buttonBox.button(QDialogButtonBox.Close) self.btnApply = QPushButton(self.tr("Apply")) self.btnDiscard = QPushButton(self.tr("Discard")) self.editorButtonBox.clear() self.editorButtonBox.addButton(self.btnApply, QDialogButtonBox.AcceptRole) self.editorButtonBox.addButton(self.btnDiscard, QDialogButtonBox.RejectRole) #contextmenu self.lblNodePath.setContextMenuPolicy(Qt.ActionsContextMenu) self.lblNodePath.addAction(self.actionCopyPath) self.connect(self.actionCopyPath, SIGNAL("activated()"), self.slotCopyPath) # full metadata view self.treeFull.clicked.connect(self.itemSelected) self.treeFull.collapsed.connect(self.collapsedExpanded) self.treeFull.expanded.connect(self.collapsedExpanded) # filtered metadata view self.tbwFiltered.currentCellChanged.connect(self.cellSelected) self.textValue.textChanged.connect(self.valueModified) self.tabWidget.currentChanged.connect(self.tabChanged) self.btnApply.clicked.connect(self.applyEdits) self.btnDiscard.clicked.connect(self.resetEdits) self.buttonBox.accepted.disconnect(self.accept) self.btnSave.clicked.connect(self.saveMetadata) def slotCopyPath(self): QApplication.clipboard().setText(self.lblNodePath.text()) def setContent(self, metaProvider): self.metaProvider = metaProvider # load main model #self.file = QFile(metaFilePath) self.metaXML = QDomDocument() metadata = self.metaProvider.getMetadata().encode("utf-8") self.metaXML.setContent(metadata) self.model = DomModel(self.metaXML, self) # set full view self.treeFull.setModel(self.model) self.treeFull.hideColumn(1) # hide attrs self.treeFull.resizeColumnToContents(0) # resize value column # load filtered list self.filteredIndexes = None # lazy init # set filtered view #self.fillTableWidget() self.btnSave.setEnabled(False) def itemSelected(self, mindex): # Display item selected in TreeView in edit box. self.textValue.clear() path = "" editable = False self.text = None # full view self.mindex = self.model.index(mindex.row(), 2, mindex.parent()) path = self.model.nodePath(self.mindex) editable = self.model.isEditable(self.mindex) self.text = self.model.data(self.mindex, 0) self.lblNodePath.setText(path) if editable: self.textValue.setPlainText(self.text) self.groupBox.setEnabled(True) self.editorButtonBox.setEnabled(False) else: self.textValue.clear() self.groupBox.setEnabled(False) def cellSelected(self, currentRow, currentColumn, previousRow, previousColumn): # Display item selected in TableWidget in edit box. self.textValue.clear() path = "" editable = False self.text = None self.mindex = self.filteredIndexes[currentRow][1] path = self.model.nodePath(self.mindex) editable = self.model.isEditable(self.mindex) self.text = self.model.data(self.mindex, 0) self.lblNodePath.setText(path) if editable: self.textValue.setPlainText(self.text) self.groupBox.setEnabled(True) self.editorButtonBox.setEnabled(False) else: self.textValue.clear() self.groupBox.setEnabled(False) def collapsedExpanded(self, mindex): if self.tabWidget.currentIndex() == 0: self.treeFull.resizeColumnToContents(0) else: self.tbwFiltered.resizeColumnToContents(0) def valueModified(self): self.editorButtonBox.setEnabled(True) def tabChanged(self, tab): self.textValue.clear() path = "" editable = False self.text = None if tab == 0: mindex = self.treeFull.currentIndex() self.mindex = self.model.index(mindex.row(), 2, mindex.parent()) path = self.model.nodePath(self.mindex) editable = self.model.isEditable(self.mindex) self.text = self.model.data(self.mindex, 0) else: # lazy init if not self.filteredIndexes: filter_lines = self.loadFilter() self.filteredIndexes = self.searchNodes( self.model, filter_lines) self.tbwFiltered.horizontalHeader().setVisible( True) # pyuic4 bug self.tbwFiltered.setRowCount(len(self.filteredIndexes)) # refresh table self.fillTableWidget() # refresh selection selectedItems = self.tbwFiltered.selectedItems() if len(selectedItems): self.mindex = self.filteredIndexes[selectedItems[0].row()][1] path = self.model.nodePath(self.mindex) editable = self.model.isEditable(self.mindex) self.text = self.model.data(self.mindex, 0) self.lblNodePath.setText(path) if editable: self.textValue.setPlainText(self.text) self.groupBox.setEnabled(True) self.editorButtonBox.setEnabled(False) else: self.textValue.clear() self.groupBox.setEnabled(False) def applyEdits(self): self.model.setData(self.mindex, self.textValue.toPlainText()) self.text = self.model.data(self.mindex, 0) self.btnSave.setEnabled(True) self.editorButtonBox.setEnabled(False) if self.tabWidget.currentIndex() != 0: self.fillTableWidget() def resetEdits(self): self.textValue.setPlainText(self.text) self.editorButtonBox.setEnabled(False) def saveMetadata(self): try: self.metaProvider.setMetadata(unicode(self.metaXML.toString())) # TODO: create preview image if need self.btnSave.setEnabled(False) except: QMessageBox.warning( self, self.tr("Metatools"), self.tr("Metadata can't be saved:\n") + unicode(sys.exc_info()[0])) def loadFilter(self): settings = QSettings("NextGIS", "metatools") fileName = settings.value("general/filterFile", "") if fileName == "": return [] # read filter from file filter_lines = [] f = QFile(fileName) if not f.open(QIODevice.ReadOnly): QMessageBox.warning(self, self.tr('I/O error'), self.tr("Can't open file %s") % (fileName)) return [] stream = QTextStream(f) while not stream.atEnd(): line = stream.readLine() filter_lines.append(line) f.close() return filter_lines def searchNodes(self, model, filters): allItemsIndexes = model.match(model.index(0, 0, QModelIndex()), Qt.DisplayRole, '*', -1, Qt.MatchWildcard | Qt.MatchRecursive) searchedItems = [] for itemIndex in allItemsIndexes: if self.model.nodePath(itemIndex) in filters: valueItemIndex = self.model.index(0, 2, itemIndex.parent()) if not self.model.isEditable( itemIndex) and self.model.hasOneGco(itemIndex): valueItemIndex = self.model.index(0, 2, itemIndex) searchedItems.append([itemIndex, valueItemIndex]) return searchedItems def fillTableWidget(self): row = 0 for nameItemIndex, valueItemIndex in self.filteredIndexes: name = unicode(self.model.data(nameItemIndex, Qt.DisplayRole)) value = unicode(self.model.data(valueItemIndex, Qt.DisplayRole)) self.tbwFiltered.setItem(row, 0, QTableWidgetItem(name)) self.tbwFiltered.setItem(row, 1, QTableWidgetItem(value)) row += 1 self.tbwFiltered.resizeColumnToContents(0) def accept(self): QDialog.accept(self)
class MetatoolsEditor(QDialog, Ui_MetatoolsEditor): def __init__(self): QDialog.__init__(self) self.setupUi(self) self.setWindowFlags(Qt.Window | Qt.WindowMaximizeButtonHint) self.tabWidget.setCurrentIndex(0) self.lblNodePath.setText("") self.btnSave = self.buttonBox.button(QDialogButtonBox.Save) self.btnClose = self.buttonBox.button(QDialogButtonBox.Close) self.btnApply = QPushButton(self.tr("Apply")) self.btnDiscard = QPushButton(self.tr("Discard")) self.editorButtonBox.clear() self.editorButtonBox.addButton(self.btnApply, QDialogButtonBox.AcceptRole) self.editorButtonBox.addButton(self.btnDiscard, QDialogButtonBox.RejectRole) #contextmenu self.lblNodePath.setContextMenuPolicy(Qt.ActionsContextMenu) self.lblNodePath.addAction(self.actionCopyPath) self.connect(self.actionCopyPath, SIGNAL("activated()"), self.slotCopyPath) # full metadata view self.treeFull.clicked.connect(self.itemSelected) self.treeFull.collapsed.connect(self.collapsedExpanded) self.treeFull.expanded.connect(self.collapsedExpanded) # filtered metadata view self.tbwFiltered.currentCellChanged.connect(self.cellSelected) self.textValue.textChanged.connect(self.valueModified) self.tabWidget.currentChanged.connect(self.tabChanged) self.btnApply.clicked.connect(self.applyEdits) self.btnDiscard.clicked.connect(self.resetEdits) self.buttonBox.accepted.disconnect(self.accept) self.btnSave.clicked.connect(self.saveMetadata) def slotCopyPath(self): QApplication.clipboard().setText(self.lblNodePath.text()) def setContent(self, metaProvider): self.metaProvider = metaProvider # load main model #self.file = QFile(metaFilePath) self.metaXML = QDomDocument() metadata = self.metaProvider.getMetadata().encode("utf-8") self.metaXML.setContent(metadata) self.model = DomModel(self.metaXML, self) # set full view self.treeFull.setModel(self.model) self.treeFull.hideColumn(1) # hide attrs self.treeFull.resizeColumnToContents(0) # resize value column # load filtered list self.filteredIndexes = None # lazy init # set filtered view #self.fillTableWidget() self.btnSave.setEnabled(False) def itemSelected(self, mindex): # Display item selected in TreeView in edit box. self.textValue.clear() path = "" editable = False self.text = None # full view self.mindex = self.model.index(mindex.row(), 2, mindex.parent()) path = self.model.nodePath(self.mindex) editable = self.model.isEditable(self.mindex) self.text = self.model.data(self.mindex, 0) self.lblNodePath.setText(path) if editable: self.textValue.setPlainText(self.text) self.groupBox.setEnabled(True) self.editorButtonBox.setEnabled(False) else: self.textValue.clear() self.groupBox.setEnabled(False) def cellSelected(self, currentRow, currentColumn, previousRow, previousColumn): # Display item selected in TableWidget in edit box. self.textValue.clear() path = "" editable = False self.text = None self.mindex = self.filteredIndexes[currentRow][1] path = self.model.nodePath(self.mindex) editable = self.model.isEditable(self.mindex) self.text = self.model.data(self.mindex, 0) self.lblNodePath.setText(path) if editable: self.textValue.setPlainText(self.text) self.groupBox.setEnabled(True) self.editorButtonBox.setEnabled(False) else: self.textValue.clear() self.groupBox.setEnabled(False) def collapsedExpanded(self, mindex): if self.tabWidget.currentIndex() == 0: self.treeFull.resizeColumnToContents(0) else: self.tbwFiltered.resizeColumnToContents(0) def valueModified(self): self.editorButtonBox.setEnabled(True) def tabChanged(self, tab): self.textValue.clear() path = "" editable = False self.text = None if tab == 0: mindex = self.treeFull.currentIndex() self.mindex = self.model.index(mindex.row(), 2, mindex.parent()) path = self.model.nodePath(self.mindex) editable = self.model.isEditable(self.mindex) self.text = self.model.data(self.mindex, 0) else: # lazy init if not self.filteredIndexes: filter_lines = self.loadFilter() self.filteredIndexes = self.searchNodes(self.model, filter_lines) self.tbwFiltered.horizontalHeader().setVisible(True) # pyuic4 bug self.tbwFiltered.setRowCount(len(self.filteredIndexes)) # refresh table self.fillTableWidget() # refresh selection selectedItems = self.tbwFiltered.selectedItems() if len(selectedItems): self.mindex = self.filteredIndexes[selectedItems[0].row()][1] path = self.model.nodePath(self.mindex) editable = self.model.isEditable(self.mindex) self.text = self.model.data(self.mindex, 0) self.lblNodePath.setText(path) if editable: self.textValue.setPlainText(self.text) self.groupBox.setEnabled(True) self.editorButtonBox.setEnabled(False) else: self.textValue.clear() self.groupBox.setEnabled(False) def applyEdits(self): self.model.setData(self.mindex, self.textValue.toPlainText()) self.text = self.model.data(self.mindex, 0) self.btnSave.setEnabled(True) self.editorButtonBox.setEnabled(False) if self.tabWidget.currentIndex() != 0: self.fillTableWidget() def resetEdits(self): self.textValue.setPlainText(self.text) self.editorButtonBox.setEnabled(False) def saveMetadata(self): try: self.metaProvider.setMetadata(unicode(self.metaXML.toString())) # TODO: create preview image if need self.btnSave.setEnabled(False) except: QMessageBox.warning(self, self.tr("Metatools"), self.tr("Metadata can't be saved:\n") + unicode(sys.exc_info()[0]) ) def loadFilter(self): settings = QSettings("NextGIS", "metatools") fileName = settings.value("general/filterFile", "") if fileName == "": return [] # read filter from file filter_lines = [] f = QFile(fileName) if not f.open(QIODevice.ReadOnly): QMessageBox.warning(self, self.tr('I/O error'), self.tr("Can't open file %s") % (fileName) ) return [] stream = QTextStream(f) while not stream.atEnd(): line = stream.readLine() filter_lines.append(line) f.close() return filter_lines def searchNodes(self, model, filters): allItemsIndexes = model.match(model.index(0, 0, QModelIndex()), Qt.DisplayRole, '*', -1, Qt.MatchWildcard | Qt.MatchRecursive) searchedItems = [] for itemIndex in allItemsIndexes: if self.model.nodePath(itemIndex) in filters: valueItemIndex = self.model.index(0, 2, itemIndex.parent()) if not self.model.isEditable(itemIndex) and self.model.hasOneGco(itemIndex) : valueItemIndex = self.model.index(0, 2, itemIndex) searchedItems.append([itemIndex, valueItemIndex]) return searchedItems def fillTableWidget(self): row = 0 for nameItemIndex, valueItemIndex in self.filteredIndexes: name = unicode(self.model.data(nameItemIndex, Qt.DisplayRole)) value = unicode(self.model.data(valueItemIndex, Qt.DisplayRole)) self.tbwFiltered.setItem(row, 0, QTableWidgetItem(name)) self.tbwFiltered.setItem(row, 1, QTableWidgetItem(value)) row += 1 self.tbwFiltered.resizeColumnToContents(0) def accept(self): QDialog.accept(self)