class NavigatorDock(DockWidget): def __init__(self): DockWidget.__init__(self, core.mainWindow(), '&Navigator', QIcon(':/enkiicons/goto.png'), "Alt+N") self._tags = [] self._tree = QTreeView(self) self._tree.installEventFilter(self) self._tree.setHeaderHidden(True) self.setFocusProxy(self._tree) self._filterEdit = LineEdit(self) self._filterEdit.setClearButtonVisible(True) self._filterEdit.textEdited.connect(self._applyFilter) self._filterEdit.clearButtonClicked.connect(self._applyFilter) self._filterEdit.clearButtonClicked.connect(self._tree.setFocus) self._filterEdit.clearButtonClicked.connect(self._hideFilter) self._filterEdit.installEventFilter(self) self._displayWidget = QWidget(self) layout = QVBoxLayout(self._displayWidget) layout.addWidget(self._tree) layout.addWidget(self._filterEdit) layout.setContentsMargins(0, 0, 0, 0) self.setWidget(self._displayWidget) self._tagModel = _TagModel(self._tree) self._tagModel.jumpToTagDone.connect(self._hideFilter) self._tree.setModel(self._tagModel) self._tree.activated.connect(self._tagModel.onActivated) self._tree.clicked.connect(self._tagModel.onActivated) self._tagModel.modelAboutToBeReset.connect(self._onModelAboutToBeReset) self._tagModel.modelReset.connect(self._onModelReset) self._currentTagPath = None self._errorLabel = None self._installed = False def term(self): self._tagModel.term() def install(self): if not self._installed: core.mainWindow().addDockWidget(Qt.RightDockWidgetArea, self) core.actionManager().addAction("mView/aNavigator", self.showAction()) self._installed = True def remove(self): if self._installed: core.mainWindow().removeDockWidget(self) core.actionManager().removeAction("mView/aNavigator") self.hide() self._installed = False def setTags(self, tags): self._tags = tags self._setFilteredTags(tags) self._hideFilter() if self.widget() is not self._displayWidget: self.setWidget(self._displayWidget) self._displayWidget.show() if self._errorLabel is not None: self._errorLabel.hide() def _setFilteredTags(self, tags): self._tagModel.setTags(tags) def onError(self, error): self._displayWidget.hide() if self._errorLabel is None: self._errorLabel = QLabel(self) self._errorLabel.setWordWrap(True) self._errorLabel.setText(error) if not self.widget() is self._errorLabel: self.setWidget(self._errorLabel) self._errorLabel.show() self._displayWidget.hide() def _onModelAboutToBeReset(self): currIndex = self._tree.currentIndex() self._currentTagPath = self._tagModel.tagPathForIndex(currIndex) if currIndex.isValid() else None def _onModelReset(self): self._tree.expandAll() # restore current item if self._currentTagPath is not None: index = self._tagModel.indexForTagPath(self._currentTagPath) if index.isValid(): self._tree.setCurrentIndex(index) def eventFilter(self, object_, event): if object_ is self._tree: if event.type() == QEvent.KeyPress: if event.key() == Qt.Key_Backspace: if event.modifiers() == Qt.ControlModifier: self._onTreeCtrlBackspace() else: self._onTreeBackspace() return True elif event.text() and \ (event.text().isalnum() or event.text() == '_'): self._onTreeTextTyped(event.text()) return True elif object_ is self._filterEdit: if event.type() == QEvent.KeyPress: if event.key() in (Qt.Key_Up, Qt.Key_Down): self._tree.setFocus() self._tree.event(event) return True elif event.key() in (Qt.Key_Enter, Qt.Key_Return): currIndex = self._tree.currentIndex() if currIndex.isValid(): self._tagModel.onActivated(currIndex) return DockWidget.eventFilter(self, object_, event) def _hideFilter(self): hadText = self._filterEdit.text() != '' self._filterEdit.clear() self._filterEdit.hide() if hadText: self._applyFilter() def _applyFilter(self): text = self._filterEdit.text() if text: if not text.startswith('*'): text = '*' + text if not text.endswith('*'): text = text + '*' wildcard = text.lower() filteredTags = _filterTags(wildcard, self._tags) self._setFilteredTags(filteredTags) self._tree.expandAll() if filteredTags: firstMatchingTag = _findFirstMatching(wildcard, filteredTags) path = _tagPath(firstMatchingTag) index = self._tagModel.indexForTagPath(path) self._tree.setCurrentIndex(index) else: self._setFilteredTags(self._tags) if text: self._filterEdit.show() elif not self._filterEdit.hasFocus(): self._hideFilter() def _onTreeTextTyped(self, text): self._filterEdit.setText(self._filterEdit.text() + text) self._applyFilter() def _onTreeBackspace(self): text = self._filterEdit.text() if text: self._filterEdit.setText(text[:-1]) self._applyFilter() def _onTreeCtrlBackspace(self): self._hideFilter() self._applyFilter()
class TableViewSelectTypes(QtWidgets.QDialog): def setText(self, text): self._text = text if text in GridTableView.BasicTypes: self.tree.expand(self.bacisItem.index()) for i in range(self.bacisItem.rowCount()): childItem = self.bacisItem.child(i, 0) if childItem.text() == text: self.tree.setCurrentIndex(childItem.index()) else: self.tree.expand(self.otherItem.index()) names = text.split('.') parentItem = self.otherItem for v in names: isBreak = False for i in range(parentItem.rowCount()): if isBreak == True: continue if parentItem.child(i, 0).text() == v: parentItem = parentItem.child(i, 0) self.tree.expand(parentItem.index()) isBreak = True continue self.tree.setCurrentIndex(parentItem.index()) def text(self): return self._text def __init__(self, *args): super(TableViewSelectTypes, self).__init__(args[1]) self.tableView = args[1] self._text = '' gMainWindow = GlobalObjs.GetValue('MainWindow') self.setModal(True) #self.setModel(True) self.setWindowTitle('Select Type') self.vboxLayout = QtWidgets.QVBoxLayout(self) self.tree = QTreeView(self) self.model = QStandardItemModel(self) self.tree.setHeaderHidden(True) self.tree.setModel(self.model) self.bacisItem = QStandardItem() self.bacisItem.setText('BasicTypes') self.bacisItem.setFlags(QtCore.Qt.ItemIsEnabled) self.model.appendRow(self.bacisItem) self.tree.expand(self.bacisItem.index()) for v in GridTableView.BasicTypes: item = QStandardItem() item.setFlags(QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable) item.setText(v) item.setData(True) self.bacisItem.appendRow(item) if self.tableView.Model.activeColumn != args[2]: self.otherItem = QStandardItem() self.otherItem.setText('Other') self.otherItem.setFlags(QtCore.Qt.ItemIsEnabled) self.model.appendRow(self.otherItem) self.tree.expand(self.otherItem.index()) def LoadOtherTypes(item, parent): for i in range(0, item.rowCount()): childItem = item.child(i, 0) if childItem.data(Qt.UserRole + 2) == self.tableView.Model: continue itemAdd = QStandardItem() itemAdd.setText(childItem.text()) if childItem.data() == 3: itemAdd.setFlags(QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable) else: itemAdd.setFlags(QtCore.Qt.ItemIsEnabled) LoadOtherTypes(childItem, itemAdd) parent.appendRow(itemAdd) LoadOtherTypes(gMainWindow.TreeRootItem, self.otherItem) self.vboxLayout.addWidget(self.tree) self.tree.doubleClicked.connect(self.OnDoubleClicked) self.tree.setFocus() self.show() def OnDoubleClicked(self, index): item = self.model.itemFromIndex(index) if item.flags( ) == QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable: if item.data() == True: self.setText(index.data()) else: names = [] parent = index while True: names.append(parent.data()) parent = parent.parent() if parent.isValid() == False or self.otherItem.index( ) == parent: break self.setText('.'.join(reversed(names))) self.done(QtWidgets.QDialog.Accepted)