def lessThan(self, index1, index2): """ Implements < operator. :type index1: QModelIndex :type index2: QModelIndex :rtype: bool """ data1 = self.sourceModel().data(index1) data2 = self.sourceModel().data(index2) items = natsorted([data1, data2]) try: return items.index(data1) < items.index(data2) except IndexError: return data1 < data2
def __init__(self, session, project=None, **kwargs): """ Initialize the form dialog. :type session: Session :type project: Project """ super().__init__(parent=session, **kwargs) self._project = project diagrams = natsorted(self.project.diagrams(), key=lambda diagram: diagram.name) for diagram in diagrams: self.addWidget( CheckBox(diagram.name, self, objectName=diagram.name, checked=True, clicked=self.onDiagramChecked)) diagramLayout = QtWidgets.QGridLayout(self) diagramLayout.setContentsMargins(8, 8, 8, 8) nrows = math.floor(math.sqrt(max(len(diagrams), 1))) for i, d in enumerate(diagrams): col = i % nrows row = math.floor(i / nrows) diagramLayout.addWidget(self.widget(d.name), row, col) diagramGroup = QtWidgets.QGroupBox('Diagrams', self) diagramGroup.setLayout(diagramLayout) diagramGroupLayout = QtWidgets.QHBoxLayout(self) diagramGroupLayout.addWidget(diagramGroup) diagramWidget = QtWidgets.QWidget(self) diagramWidget.setLayout(diagramGroupLayout) confirmation = QtWidgets.QDialogButtonBox(QtCore.Qt.Horizontal, self) confirmation.addButton(QtWidgets.QDialogButtonBox.Ok) confirmation.addButton(QtWidgets.QDialogButtonBox.Cancel) confirmation.setObjectName('confirmation') self.addWidget(confirmation) # noinspection PyArgumentList self.addWidget( QtWidgets.QPushButton('All', self, objectName='btn_check_all', clicked=self.doCheckDiagram)) # noinspection PyArgumentList self.addWidget( QtWidgets.QPushButton('Clear', self, objectName='btn_clear_all', clicked=self.doCheckDiagram)) buttonLayout = QtWidgets.QHBoxLayout(self) buttonLayout.setAlignment(QtCore.Qt.AlignRight) buttonLayout.addWidget(self.widget('btn_clear_all'), 0, QtCore.Qt.AlignRight) buttonLayout.addWidget(self.widget('btn_check_all'), 0, QtCore.Qt.AlignRight) buttonLayout.addWidget(self.widget('confirmation'), 0, QtCore.Qt.AlignRight) buttonWidget = QtWidgets.QWidget(self) buttonWidget.setLayout(buttonLayout) mainLayout = QtWidgets.QVBoxLayout() mainLayout.setContentsMargins(10, 10, 10, 10) mainLayout.addWidget(diagramWidget) mainLayout.addWidget(buttonWidget) self.setLayout(mainLayout) self.setWindowIcon(QtGui.QIcon(':/icons/128/ic_eddy')) self.setWindowTitle('Diagram Selection') connect(confirmation.accepted, self.accept) connect(confirmation.rejected, self.reject)
def test_natsorted(): assert [] == natsorted([]) assert ['diagram1', 'diagram9', 'diagram10'] == natsorted(['diagram1', 'diagram10', 'diagram9']) assert [1, 10, 'diagram9', 'diagram10'] == natsorted([1, 'diagram10', 'diagram9', 10])
def run(self, path): """ Perform PDF document generation. :type path: str """ printer = QtPrintSupport.QPrinter(QtPrintSupport.QPrinter.HighResolution) printer.setOutputFormat(QtPrintSupport.QPrinter.PdfFormat) printer.setOutputFileName(path) printer.setOrientation(QtPrintSupport.QPrinter.Landscape) printer.setPrinterName(self.project.name) painter = QtGui.QPainter() # DIAGRAM SELECTION if self.diagrams is None: dialog = DiagramSelectionDialog(self.session) if not dialog.exec_(): return self.diagrams = dialog.selectedDiagrams() # DIAGRAM PAGE SIZE SELECTION if self.pageSize is None: dialog = PageSetupDialog(printer, self.session) if not dialog.exec_(): return else: printer.setPageSize(self.pageSize) ############################################################## # DIAGRAMS ############################################################## for n, diagram in enumerate(natsorted(self.diagrams, key=lambda diagram: diagram.name)): shape = diagram.visibleRect(margin=400) if shape: if n > 0: printer.newPage() if painter.isActive() or painter.begin(printer): # TURN CACHING OFF for item in diagram.items(): if item.isNode() or item.isEdge(): item.setCacheMode(AbstractItem.NoCache) # RENDER THE DIAGRAM diagram.render(painter, source=shape) # RENDER DIAGRAM NAME title = QtGui.QTextDocument() title.setDefaultFont(Font(pixelSize=140)) title.setHtml('{0}<hr width=100%/>'.format(diagram.name)) title.setTextWidth(printer.pageRect().width()) title.drawContents(painter) # TURN CACHING ON for item in diagram.items(): if item.isNode() or item.isEdge(): item.setCacheMode(AbstractItem.DeviceCoordinateCache) ############################################################## # IRI TABLE ############################################################## # RESET PAGE SIZE AND ORIENTATION FOR PREDICATE TABLES printer.setPageSize(QtPrintSupport.QPrinter.A4) printer.setOrientation(QtPrintSupport.QPrinter.Landscape) printer.setPageMargins(12.5, 12.5, 12.5, 12.5, QtPrintSupport.QPrinter.Millimeter) prefixRows = [] for prefix in sorted(self.project.getManagedPrefixes()): ns = self.project.getPrefixResolution(prefix) prefixRows.append(dedent(''' <tr> <td width=25%>{0}</td> <td width=75%>{1}</td> </tr> '''.format(prefix, ns))) sections = [prefixRows[i:i+self.rowsPerPage] for i in range(0, len(prefixRows), self.rowsPerPage)] for section in sections: if len(section) > 0: if len(self.diagrams) > 0: printer.newPage() doc = QtGui.QTextDocument() htmlTable = ''' <table width=100% border=5 cellspacing=0 cellpadding=60> <thead> <tr> <th bgcolor=#c8c8c8>PREFIX</th> <th bgcolor=#c8c8c8>IRI</th> </tr> </thead> <tbody>''' htmlTable += '\n'.join(section) htmlTable += '</tbody>' htmlTable += '</table>' doc.setDefaultFont(Font(pixelSize=180)) doc.setHtml(htmlTable) doc.setPageSize(QtCore.QSizeF(printer.pageRect().size())) doc.drawContents(painter) ############################################################## # ROLES AND ATTRIBUTES TABLE ############################################################## predicateRows = [] predicateIRIs = set() for item in {Item.RoleIRINode, Item.AttributeIRINode}: for node in self.project.iriOccurrences(item=item): if not node.iri.isTopBottomEntity(): predicateIRIs.add(node.iri) for predicateIRI in sorted(predicateIRIs,key=str): meta = predicateIRI.getMetaProperties() attributes = [ meta.get(K_FUNCTIONAL, False), meta.get(K_INVERSE_FUNCTIONAL, False), meta.get(K_REFLEXIVE, False), meta.get(K_IRREFLEXIVE, False), meta.get(K_SYMMETRIC, False), meta.get(K_ASYMMETRIC, False), meta.get(K_TRANSITIVE, False), ] predicateRows.append(''' <tr> <td width=30%>{0}</td> <td width=10%><center>{1}</center></td> <td width=10%><center>{2}</center></td> <td width=10%><center>{3}</center></td> <td width=10%><center>{4}</center></td> <td width=10%><center>{5}</center></td> <td width=10%><center>{6}</center></td> <td width=10%><center>{7}</center></td> </tr> '''.format(str(predicateIRI).replace('\n', ''), *map(lambda x: u'\u2713' if x else '', attributes))) sections = [predicateRows[i:i+self.rowsPerPage] for i in range(0, len(predicateRows), self.rowsPerPage)] for section in sections: if len(section) > 0: if len(self.diagrams) > 0: printer.newPage() doc = QtGui.QTextDocument() htmlTable = ''' <table width=100% border=5 cellspacing=0 cellpadding=60> <thead> <tr> <th bgcolor=#c8c8c8>ENTITY</th> <th bgcolor=#c8c8c8>FUNCT</th> <th bgcolor=#c8c8c8>INVERSE FUNCT</th> <th bgcolor=#c8c8c8>TRANS</th> <th bgcolor=#c8c8c8>REFL</th> <th bgcolor=#c8c8c8>IRREFL</th> <th bgcolor=#c8c8c8>SYMM</th> <th bgcolor=#c8c8c8>ASYMM</th> </tr> </thead> <tbody>''' htmlTable += '\n'.join(section) htmlTable += '</tbody>' htmlTable += '</table>' doc.setDefaultFont(Font(pixelSize=180)) doc.setHtml(htmlTable) doc.setPageSize(QtCore.QSizeF(printer.pageRect().size())) doc.drawContents(painter) # COMPLETE THE EXPORT if painter.isActive(): painter.end() # OPEN THE DOCUMENT if self.open: openPath(printer.outputFileName())
def test_natsorted(): assert [] == natsorted([]) assert ['diagram1', 'diagram9', 'diagram10'] == natsorted(['diagram1', 'diagram10', 'diagram9'], locale=QtCore.QLocale('en_US')) assert [1, 10, 'diagram9', 'diagram10'] == natsorted([1, 'diagram10', 'diagram9', 10], locale=QtCore.QLocale('en_US'))