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
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)
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])
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()
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()
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)
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())
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
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
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
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
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
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())
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)
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)
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)
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()
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)
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()
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)
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()
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()
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()
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)
def get_node(self, index: QModelIndex): if index.isValid(): # print('internal pointer: {}'.format(index.internalPointer())) return index.internalPointer() else: return self.root
def currentChanged(self, current: QModelIndex, previous: QModelIndex) -> None: if current.isValid(): item = current.internalPointer() self.parent().parent().codepane.setCode(item.formula)