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)
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)
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
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)
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)
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()