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
Esempio n. 2
0
    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)
Esempio n. 3
0
def test_natsorted():
    assert [] == natsorted([])
    assert ['diagram1', 'diagram9', 'diagram10'] == natsorted(['diagram1', 'diagram10', 'diagram9'])
    assert [1, 10, 'diagram9', 'diagram10'] == natsorted([1, 'diagram10', 'diagram9', 10])
Esempio n. 4
0
    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())
Esempio n. 5
0
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'))