Пример #1
0
 def _index_is_on_our_branch(self, index: QModelIndex) -> bool:
     # the tree is only traversed towards the root
     if index.internalPointer().type not in (NodeType.ITER, NodeType.REAL):
         return False
     while index.isValid() and index.internalPointer() is not None:
         node = index.internalPointer()
         if node.type == NodeType.ITER and node.row() != self._iter:
             return False
         index = index.parent()
     return True
Пример #2
0
 def _source_data_changed(
     self, top_left: QModelIndex, bottom_right: QModelIndex, roles: typing.List[int]
 ):
     if top_left.internalPointer() is None:
         return
     if top_left.internalPointer().type != NodeType.REAL:
         return
     proxy_top_left = self.mapFromSource(top_left)
     proxy_bottom_right = self.mapFromSource(bottom_right)
     if not proxy_top_left.isValid() or not proxy_bottom_right.isValid():
         return
     self.dataChanged.emit(proxy_top_left, proxy_bottom_right, roles)
Пример #3
0
 def _source_data_changed(
     self,
     top_left: QModelIndex,
     bottom_right: QModelIndex,
     roles: typing.List[int],
 ):
     if top_left.internalPointer() is None:
         return
     if top_left.internalPointer().type != NodeType.ITER:
         return
     self._recalculate_progress(top_left.row())
     index = self.index(0, 0, QModelIndex())
     self.dataChanged.emit(index, index, [ProgressRole])
Пример #4
0
 def columnCount(self, index: QModelIndex) -> int:
     """Returns the number of columns in the given index."""
     if index.isValid():
         return index.internalPointer().columnCount()
     # For an invalid index, return the number of columns defined at the root item of the tree
     else:
         return self.rootItem.columnCount()
Пример #5
0
    def doubleClicked_callback(self, index: QModelIndex):

        import pandas as pd
        import numpy as np
        import numpy.ma

        if index.isValid() and index.column() == NodeCols.Value:

            item = index.internalPointer()
            obj = item.node['obj']['fullname']
            args = str(item.node['args'])

            data, _ = self.shell.get_obj_value(
                'analyze_getval', obj, args)

            if isinstance(data, (pd.DataFrame, pd.Index, pd.Series)):
                dialog = DataFrameEditor(self)
                dialog.setup_and_check(data)
            elif isinstance(data, (np.ndarray, np.ma.MaskedArray)):
                dialog = ArrayEditor(self)
                dialog.setup_and_check(data, title='', readonly=True)
            elif isinstance(data, (list, set, tuple, dict)):
                dialog = CollectionsEditor(self)
                dialog.setup(data, title='', readonly=True)
            else:
                return

            dialog.show()
Пример #6
0
 def currentChanged(self, current: QModelIndex, previous: QModelIndex) -> None:
     if current.isValid():
         item = current.internalPointer()
         if isinstance(item, ValueItem) and item.attrs["spec"]:
             self.parent().update_dataattrs(item)
         else:
             self.parent().update_dataattrs(None)
Пример #7
0
 def mapFromSource(self, sourceIndex: QModelIndex) -> QModelIndex:
     if not sourceIndex.isValid():
         return QModelIndex()
     if not self._index_is_on_our_branch(sourceIndex):
         return QModelIndex()
     source_node = sourceIndex.internalPointer()
     return self.index(source_node.row(), sourceIndex.column(), QModelIndex())
Пример #8
0
    def setData(self, index: QModelIndex, value, role=Qt.EditRole):
        if not index.isValid():
            return False

        node = index.internalPointer()

        if role == Qt.EditRole:
            if isinstance(node, JsonItem):
                if node.type in ('float', 'int', None):
                    node.value = value
                try:  # PyQt5
                    self.dataChanged.emit(index, index, [Qt.EditRole])
                except TypeError:  # PyQt4, PySide
                    self.dataChanged.emit(index, index)

        elif role == Qt.CheckStateRole:
            if isinstance(node, JsonItem):
                if node.type == 'bool':
                    node.value = value == Qt.Checked
                    try:  # PyQt5
                        self.dataChanged.emit(
                            index, index, [Qt.CheckStateRole])
                    except TypeError:  # PyQt4, PySide
                        self.dataChanged.emit(index, index)
                    return True
        return False
Пример #9
0
    def data(self, index: QModelIndex, role: int) -> Union[str, None]:
        if not index.isValid():
            return None
        node = index.internalPointer()

        if role == Qt.DisplayRole:
            return node.name
 def parent(self, index: QModelIndex = None, **kwargs) -> QModelIndex:
     if index is not None and index.isValid():
         parent_item: IMCFileTreeItem = index.internalPointer(
         ).imc_file_tree_parent
         if parent_item is not None and parent_item.imc_file_tree_parent is not None:
             parent_row = parent_item.imc_file_tree_parent.imc_file_tree_children.index(
                 parent_item)
             return self.createIndex(parent_row, 0, parent_item)
     return QModelIndex()
 def flags(self, index: QModelIndex) -> int:
     if not index.isValid():
         return Qt.NoItemFlags
     flags = super(IMCFileTreeModel, self).flags(index)
     item: IMCFileTreeItem = index.internalPointer()
     if index.column(
     ) == self.CHECK_COLUMN and item.imc_file_tree_is_checkable:
         flags |= Qt.ItemIsUserCheckable
     return flags
Пример #12
0
    def getItem(self, index: QModelIndex) -> TreeItem:
        """Convenience method to get a TreeItem from a given index.

        Returns the root item if the index passed is not valid."""
        if index.isValid():
            item = index.internalPointer()
            if item:
                return item

        return self.rootItem
Пример #13
0
    def getItem(self, index: QModelIndex) -> Node:
        """Return ``Node`` object for a given `QModelIndex`.

        A null or invalid ``QModelIndex`` will return the root Node.
        """
        if index.isValid():
            item = index.internalPointer()
            if item is not None:
                return item
        return self._root
Пример #14
0
    def getItem(self, index: QModelIndex) -> NodeType:
        """Return python object for a given `QModelIndex`.

        An invalid `QModelIndex` will return the root object.
        """
        if index.isValid():
            item = index.internalPointer()
            if item is not None:
                return item
        return self._root
Пример #15
0
    def rowCount(self, parent):
        if parent is None:
            parent = QModelIndex()

        if parent.column() > 0:
            return 0

        if not parent.isValid():
            return len(self.__root)
        else:
            return len(parent.internalPointer())
Пример #16
0
    def mapFromSource(self, sourceIndex: QModelIndex) -> QModelIndex:
        if not sourceIndex.isValid():
            return QModelIndex()
        source_node = sourceIndex.internalPointer()
        if source_node is None or source_node.type != NodeType.JOB:
            return QModelIndex()

        if not self._index_is_on_our_branch(sourceIndex.parent()):
            return QModelIndex()
        return self.index(source_node.row(), sourceIndex.column(),
                          QModelIndex())
 def data(self, index: QModelIndex, role: Optional[int] = None) -> Any:
     if index.isValid():
         item: IMCFileTreeItem = index.internalPointer()
         if role == Qt.DisplayRole and (
                 index.column() != self.CHECK_COLUMN
                 or not item.imc_file_tree_is_checkable):
             return item.imc_file_tree_data[index.column()]
         if role == Qt.CheckStateRole and (
                 index.column() == self.CHECK_COLUMN
                 and item.imc_file_tree_is_checkable):
             return Qt.Checked if item.imc_file_tree_is_checked else Qt.Unchecked
     return None
 def setData(self,
             index: QModelIndex,
             value: Any,
             role: Optional[int] = None) -> bool:
     if index.isValid() and role == Qt.CheckStateRole and index.column(
     ) == self.CHECK_COLUMN:
         item: IMCFileTreeItem = index.internalPointer()
         if item.imc_file_tree_is_checkable:
             # imc_file_acquisition is set to loaded/unloaded in dataChanged event handler
             # imc_file_panorama is set to shown/hidden in dataChanged event handler
             # noinspection PyUnresolvedReferences
             self.dataChanged.emit(index, index, [Qt.CheckStateRole])
             return True
     return super(IMCFileTreeModel, self).setData(index, value, role=role)
Пример #19
0
 def on_imc_file_tree_model_data_changed(top_left: QModelIndex,
                                         bottom_right: QModelIndex,
                                         roles: Optional[int] = None):
     item = top_left.internalPointer()
     if isinstance(item, IMCFilePanoramaModel):
         if item.is_shown:
             self._controller.hide_imc_file_panorama(item)
         else:
             self._controller.show_imc_file_panorama(item)
     elif isinstance(item, IMCFileAcquisitionModel):
         if item.is_loaded:
             self._controller.unload_imc_file_acquisition(item)
         else:
             self._controller.load_imc_file_acquisition(item)
Пример #20
0
    def parent(self, index: QModelIndex) -> QModelIndex:
        """Re-implemented to return an invalid index if the index passed's parent is the root item.

        In other words, an index whose parent is the root item does not have a user/view accessible parent.
        """
        if not index.isValid():
            return QModelIndex()

        childItem = index.internalPointer()
        parentItem = childItem.parent()

        if parentItem == self.rootItem:
            return QModelIndex()

        return self.createIndex(parentItem.row(), 0, parentItem)
Пример #21
0
    def rowCount(self, index: QModelIndex) -> int:
        """If an invalid index is passed, returns the childCount of the root item;
        otherwise, returns the index's childCount.
        """

        # supports only single-column data
        if index.column() > 0:
            return 0

        if not index.isValid():
            parentItem = self.rootItem
        else:
            parentItem = index.internalPointer()

        return parentItem.childCount()
Пример #22
0
    def index(self, row, column, parent=None):
        if parent is None:
            parent = QModelIndex()

        if not self.hasIndex(row, column, parent):
            return QModelIndex()

        if not parent.isValid():
            parent_item = self.__root
        else:
            parent_item = parent.internalPointer()

        child_item = parent_item.child(row)

        return self.createIndex(row, column, child_item)
Пример #23
0
    def parent(self, index: QModelIndex):
        if not index.isValid():
            return QModelIndex()

        child_item = index.internalPointer()
        if not hasattr(child_item, "parent"):
            raise ValueError(
                f"index r{index.row()}/c{index.column()} pointed to parent-less item {child_item}"
            )
        parentItem = child_item.parent

        if parentItem == self.root:
            return QModelIndex()

        return self.createIndex(parentItem.row(), 0, parentItem)
 def index(self,
           row: int,
           column: int,
           parent: QModelIndex = None,
           **kwargs) -> QModelIndex:
     if self.hasIndex(row, column, parent=parent):
         if parent is not None and parent.isValid():
             parent_item: IMCFileTreeItem = parent.internalPointer()
         else:
             parent_item = self._controller
         if 0 <= row < len(parent_item.imc_file_tree_children):
             child_item: IMCFileTreeItem = parent_item.imc_file_tree_children[
                 row]
             if 0 <= column < len(child_item.imc_file_tree_data):
                 return self.createIndex(row, column, child_item)
     return QModelIndex()
Пример #25
0
    def rowCount(self, parent: QModelIndex):
        """
        Parameters
        ------------
        parent : QModelIndex
            Index of parent item.

        Returns
        -----------
        int : number of children in parent
        """
        if not parent.isValid():
            parentNode = self.root
        else:
            parentNode = parent.internalPointer()

        return len(parentNode.children)
Пример #26
0
    def index(self, row: int, column: int,
              parent: QModelIndex = QModelIndex()) -> QModelIndex:
        """Re-implement the index method to appropriately handle tree-like models.

        Returns an invalid (default-constructed) index if hasIndex fails,
        or if the parent index passed does not have any children.
        """
        if not self.hasIndex(row, column, parent):
            return QModelIndex()

        if not parent.isValid():
            parentItem = self.rootItem
        else:
            parentItem = parent.internalPointer()

        childItem = parentItem.child(row)
        if childItem:
            return self.createIndex(row, column, childItem)
        else:
            return QModelIndex()
Пример #27
0
    def data(self, index: QModelIndex, role=Qt.DisplayRole):
        if not index.isValid():
            return QVariant()

        if role == Qt.TextAlignmentRole:
            return Qt.AlignCenter

        node = index.internalPointer()

        if role == NodeRole:
            return node

        if node.type == NodeType.JOB:
            return self._job_data(index, node, role)
        elif node.type == NodeType.REAL:
            return self._real_data(index, node, role)

        if role == Qt.DisplayRole:
            if index.column() == 0:
                return f"{node.type}:{node.id}"
            if index.column() == 1:
                return f"{node.data['status']}"

        return QVariant()
Пример #28
0
    def data(self, index: QModelIndex, role=Qt.DisplayRole):
        if not index.isValid():
            return QVariant()

        if role == Qt.TextAlignmentRole:
            return Qt.AlignCenter

        node = index.internalPointer()

        if role == NodeRole:
            return node

        if node.type == NodeType.JOB:
            return self._job_data(index, node, role)
        elif node.type == NodeType.REAL:
            return self._real_data(index, node, role)

        if role == Qt.DisplayRole:
            if index.column() == 0:
                return f"{node.type}:{node.id}"
            if index.column() == 1:
                return f"{node.data['status']}"

        if role in (Qt.StatusTipRole, Qt.WhatsThisRole, Qt.ToolTipRole):
            return ""

        if role == Qt.SizeHintRole:
            return QSize()

        if role == Qt.FontRole:
            return QFont()

        if role in (Qt.BackgroundRole, Qt.ForegroundRole, Qt.DecorationRole):
            return QColor()

        return QVariant()
Пример #29
0
 def currentChanged(self, current: QModelIndex, previous: QModelIndex):
     """The Qt current item has changed. Update the python model."""
     self._root.selection.current = current.internalPointer()
     return super().currentChanged(current, previous)
Пример #30
0
 def get_node(self, index: QModelIndex):
     if index.isValid():
         # print('internal pointer: {}'.format(index.internalPointer()))
         return index.internalPointer()
     else:
         return self.root
Пример #31
0
 def currentChanged(self, current: QModelIndex, previous: QModelIndex) -> None:
     if current.isValid():
         item = current.internalPointer()
         self.parent().parent().codepane.setCode(item.formula)