Exemple #1
0
    def mousePressEvent(self, event):
        """Handle ctrl + click to follow links.

        Arguments:
            event -- the mouse event
        """
        if (event.button() == Qt.LeftButton
                and event.modifiers() == Qt.ControlModifier):
            cell = self.itemAt(event.pos())
            if cell and isinstance(cell, DataEditCell):
                xOffest = (event.pos().x() -
                           self.columnViewportPosition(cell.column()))
                yOffset = (event.pos().y() -
                           self.rowViewportPosition(cell.row()))
                pt = QPointF(xOffest, yOffset)
                pos = cell.doc.documentLayout().hitTest(pt, Qt.ExactHit)
                if pos >= 0:
                    cursor = QTextCursor(cell.doc)
                    cursor.setPosition(pos)
                    address = cursor.charFormat().anchorHref()
                    if address:
                        if address.startswith('#'):
                            (self.treeView.selectionModel().selectNodeById(
                                address[1:]))
                        else:  # check for relative path
                            if urltools.isRelative(address):
                                defaultPath = (
                                    globalref.mainControl.defaultPathObj(True))
                                address = urltools.toAbsolute(
                                    address, str(defaultPath))
                            dataeditors.openExtUrl(address)
            event.accept()
        else:
            super().mousePressEvent(event)
Exemple #2
0
    def mousePressEvent(self, event):
        """Handle ctrl + click to follow links.

        Arguments:
            event -- the mouse event
        """
        if (event.button() == QtCore.Qt.LeftButton and
            event.modifiers() == QtCore.Qt.ControlModifier):
            cell = self.itemAt(event.pos())
            if cell and isinstance(cell, DataEditCell):
                xOffest = (event.pos().x() -
                           self.columnViewportPosition(cell.column()))
                yOffset = (event.pos().y() -
                           self.rowViewportPosition(cell.row()))
                pt = QtCore.QPointF(xOffest, yOffset)
                pos = cell.doc.documentLayout().hitTest(pt, QtCore.Qt.ExactHit)
                if pos >= 0:
                    cursor = QtGui.QTextCursor(cell.doc)
                    cursor.setPosition(pos)
                    address = cursor.charFormat().anchorHref()
                    if address:
                        if address.startswith('#'):
                            self.selectModel.selectNodeById(address[1:])
                        else:     # check for relative path
                            if urltools.isRelative(address):
                                defaultPath = (globalref.mainControl.
                                               defaultFilePath(True))
                                address = urltools.toAbsolute(address,
                                                              defaultPath)
                            dataeditors.openExtUrl(address)
            event.accept()
        else:
            super().mousePressEvent(event)
Exemple #3
0
    def convertOldNodes(self, structure):
        """Convert node data to new date and time formats.

        Arguments:
            structure -- the ref structure containing the data
        """
        for node in structure.nodeDict.values():
            for field in node.formatRef.fields():
                text = node.data.get(field.name, '')
                if text:
                    if field.typeName in ('Date', 'DateTime'):
                        text = text.replace('/', '-')
                    if field.typeName in ('Time', 'DateTime'):
                        text = text + '.000000'
                    if self.treeLineImportVersion < [1, 9]:  # very old TL ver
                        oldFormatDict = self.treeLineOldFieldAttr[
                            node.formatRef.name]
                        oldFieldAttr = oldFormatDict[field.name]
                        if (field.typeName == 'Text' and not oldFieldAttr.get(
                                'html', '').startswith('y')):
                            text = text.strip()
                            text = xml.sax.saxutils.escape(text)
                            text = text.replace('\n', '<br />')
                        elif (field.typeName == 'ExternalLink'
                              and oldFieldAttr.get('oldfieldtype', '')):
                            oldType = oldFieldAttr['oldfieldtype']
                            linkAltField = oldFieldAttr.get('linkalt', '')
                            dispName = node.data.get(linkAltField, '')
                            if not dispName:
                                dispName = text
                            if oldType == 'URL':
                                if not urltools.extractScheme(text):
                                    text = urltools.replaceScheme('http', text)
                            elif oldType == 'Path':
                                text = urltools.replaceScheme('file', text)
                            elif oldType == 'ExecuteLink':
                                if urltools.isRelative(text):
                                    fullPath = urltools.which(text)
                                    if fullPath:
                                        text = fullPath
                                text = urltools.replaceScheme('file', text)
                            elif oldType == 'Email':
                                text = urltools.replaceScheme('mailto', text)
                            text = '<a href="{0}">{1}</a>'.format(
                                text, dispName)
                        elif field.typeName == 'InternalLink':
                            linkAltField = oldFieldAttr.get('linkalt', '')
                            dispName = node.data.get(linkAltField, '')
                            if not dispName:
                                dispName = text
                            uniqueId = text.strip().split('\n', 1)[0]
                            uniqueId = uniqueId.replace(' ', '_').lower()
                            uniqueId = re.sub(r'[^a-zA-Z0-9_-]+', '', uniqueId)
                            text = '<a href="#{0}">{1}</a>'.format(
                                uniqueId, dispName)
                        elif field.typeName == 'Picture':
                            text = '<img src="{0}" />'.format(text)
                    node.data[field.name] = text
Exemple #4
0
    def setSource(self, url):
        """Called when a user clicks on a URL link.

        Selects an internal link or opens an external browser.
        Arguments:
            url -- the QUrl that is clicked
        """
        name = url.toString()
        if name.startswith('#'):
            if not self.treeView.selectionModel().selectNodeById(name[1:]):
                super().setSource(url)
        else:
            if urltools.isRelative(name):  # check for relative path
                defaultPath = globalref.mainControl.defaultPathObj(True)
                name = urltools.toAbsolute(name, str(defaultPath))
            dataeditors.openExtUrl(name)
Exemple #5
0
    def setSource(self, url):
        """Called when a user clicks on a URL link.

        Selects an internal link or opens an external browser.
        Arguments:
            url -- the QUrl that is clicked
        """
        name = url.toString()
        if name.startswith('#'):
            if not self.selectModel.selectNodeById(name[1:]):
                super().setSource(url)
        else:
            if urltools.isRelative(name):    # check for relative path
                defaultPath = globalref.mainControl.defaultFilePath(True)
                name = urltools.toAbsolute(name, defaultPath)
            dataeditors.openExtUrl(name)
Exemple #6
0
    def convertOldNodes(self):
        """Convert node data from old TreeLine versions to match new formats.

        Fix escaping of special characters.
        """
        for node in self.model.root.descendantGen():
            for field in node.nodeFormat().fields():
                text = node.data.get(field.name, '')
                if text:
                    if field.typeName == 'Text' and not field.oldHasHtml:
                        text = text.strip()
                        text = xml.sax.saxutils.escape(text)
                        text = text.replace('\n', '<br />\n')
                        node.data[field.name] = text
                    elif (field.typeName == 'ExternalLink' and
                          field.oldTypeName):
                        dispName = node.data.get(field.oldLinkAltField, '')
                        if not dispName:
                            dispName = text
                        if field.oldTypeName == 'URL':
                            if not urltools.extractScheme(text):
                                text = urltools.replaceScheme('http', text)
                        elif field.oldTypeName == 'Path':
                            text = urltools.replaceScheme('file', text)
                        elif field.oldTypeName == 'ExecuteLink':
                            if urltools.isRelative(text):
                                fullPath = which(text)
                                if fullPath:
                                    text = fullPath
                            text = urltools.replaceScheme('file', text)
                        elif field.oldTypeName == 'Email':
                            text = urltools.replaceScheme('mailto', text)
                        node.data[field.name] = ('<a href="{0}">{1}</a>'.
                                                 format(text, dispName))
                    elif field.typeName == 'InternalLink':
                        uniqueId = treenode.adjustId(text)
                        dispName = node.data.get(field.oldLinkAltField, '')
                        if not dispName:
                            dispName = uniqueId
                        node.data[field.name] = ('<a href="#{0}">{1}</a>'.
                                                 format(uniqueId, dispName))
                    elif field.typeName == 'Picture':
                        node.data[field.name] = ('<img src="{0}" />'.
                                                 format(text))
            if node.nodeFormat().fields():   # skip for dummy root
                node.updateUniqueId()