예제 #1
0
파일: dock.py 프로젝트: gpa14/enki
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()
예제 #2
0
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)