diff --git a/central_widget.py b/central_widget.py index db061bc..613925c 100644 --- a/central_widget.py +++ b/central_widget.py @@ -6,7 +6,7 @@ from PyQt5.QtCore import Qt, QSettings, QSize from file_handler import FileHandler import communicator as comm import constants as cnst -from tree_model import TreeModel +from tree_model import TreeModel, TreeType class CentralWidget(QWidget): @@ -41,21 +41,49 @@ class FileView(QWidget): grid.addWidget(QLabel("FileView"), 0, 0, 1, 3) self.setLayout(grid) - self._view = QTreeView() - self._view.setAlternatingRowColors(True) - self._view.setUniformRowHeights(True) # Allows for scrolling optimizations. - self._view.setWindowTitle("Simple Tree Model") - self._view.setIconSize(QSize(20,20)) - header = self._view.header() + self._data_tree = QTreeView() + self._data_tree.expanded.connect(self.dataTreeResize) + self._data_tree.collapsed.connect(self.dataTreeResize) + self._data_tree.setAlternatingRowColors(True) + self._data_tree.setUniformRowHeights(True) # Allows for scrolling optimizations. + self._data_tree.setWindowTitle("Simple Tree Model") + self._data_tree.setIconSize(QSize(20,20)) + header = self._data_tree.header() header.setStretchLastSection(False) header.setSectionResizeMode(1, QHeaderView.ResizeToContents) header.setSectionResizeMode(2, QHeaderView.ResizeToContents) header.setSectionResizeMode(0, QHeaderView.Stretch) - grid.addWidget(self._view, 1, 0, 3, 3) + grid.addWidget(self._data_tree, 2, 0, 2, 3) + + self._mdata_tree = QTreeView() + self._mdata_tree.expanded.connect(self.metadataTreeResize) + self._mdata_tree.collapsed.connect(self.metadataTreeResize) + + self._mdata_tree.setAlternatingRowColors(True) + self._mdata_tree.setUniformRowHeights(True) # Allows for scrolling optimizations. + self._mdata_tree.setWindowTitle("Simple Tree Model") + self._mdata_tree.setIconSize(QSize(20,20)) + + mheader = self._mdata_tree.header() + mheader.setStretchLastSection(False) + mheader.setSectionResizeMode(1, QHeaderView.ResizeToContents) + mheader.setSectionResizeMode(2, QHeaderView.ResizeToContents) + mheader.setSectionResizeMode(0, QHeaderView.Stretch) + grid.addWidget(self._mdata_tree, 1, 0, 1, 3) + def metadataTreeResize(self, index): + self._mdata_tree.resizeColumnToContents(index.column()) + + def dataTreeResize(self, index): + self._data_tree.resizeColumnToContents(index.column()) + def update(self): - model = TreeModel(self._file_handler) - self._view.setModel(model) + data_model = TreeModel(self._file_handler, TreeType.Data) + metadata_model = TreeModel(self._file_handler, TreeType.Metadata) + self._data_tree.setModel(data_model) + self._mdata_tree.setModel(metadata_model) + self._data_tree.resizeColumnToContents(0) + self._mdata_tree.resizeColumnToContents(0) def reset(self): print("FileView ", self._file_handler.is_valid) diff --git a/tree_model.py b/tree_model.py index d46c1d8..d94ec50 100644 --- a/tree_model.py +++ b/tree_model.py @@ -1,12 +1,19 @@ from PyQt5.QtCore import QAbstractItemModel, QModelIndex, Qt from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import QTreeWidgetItem +from enum import Enum from file_handler import ItemDescriptor, NodeType column_names = ['Name', 'Type', 'ID', 'Value', 'Description'] +class TreeType(Enum): + Full = "full" + Metadata = "metadata" + Data = "data" + + class NixTreeItem(QTreeWidgetItem): def __init__(self, node_descriptor, file_handler, parent=None): super().__init__(parent) @@ -55,7 +62,6 @@ class NixTreeItem(QTreeWidgetItem): return self._parent_item._child_items.index(self) return 0 - class FileTreeItem(NixTreeItem): def __init__(self, node_descriptor, file_handler, parent=None): super().__init__(node_descriptor, file_handler=file_handler, parent=parent) @@ -71,6 +77,33 @@ class FileTreeItem(NixTreeItem): self._child_items.append(BlockTreeItem(b, self._file_handler, parent=self)) self._is_loaded = True + +class DataTreeItem(NixTreeItem): + def __init__(self, node_descriptor, file_handler, parent=None): + super().__init__(node_descriptor, file_handler=file_handler, parent=parent) + self._is_loaded = False + + def load_children(self): + self._child_items = [] + blocks = self._file_handler.request_blocks() + for b in blocks: + self._child_items.append(BlockTreeItem(b, self._file_handler, parent=self)) + self._is_loaded = True + + +class MetadataTreeItem(NixTreeItem): + def __init__(self, node_descriptor, file_handler, parent=None): + super().__init__(node_descriptor, file_handler=file_handler, parent=parent) + self._is_loaded = False + + def load_children(self): + self._child_items = [] + sections, _ = self._file_handler.request_metadata() + for s in sections: + self._child_items.append(SectionTreeItem(s, self._file_handler, parent=self)) + self._is_loaded = True + + class BlockTreeItem(NixTreeItem): def __init__(self, node_descriptor, file_handler, parent=None): super().__init__(node_descriptor, file_handler, parent=parent) @@ -195,10 +228,9 @@ class TagTreeItem(NixTreeItem): class TreeModel(QAbstractItemModel): - def __init__(self, file_handler, parent=None): + def __init__(self, file_handler, tree_type=TreeType.Full, parent=None): super(TreeModel, self).__init__(parent) nd = ItemDescriptor(file_handler.filename, type="Root item") - self.root_item = FileTreeItem(nd, file_handler, parent=None) self.type_icons = {NodeType.Block: QIcon("./icons/nix_block_1d.png"), NodeType.Source: QIcon("./icons/nix_source.png"), NodeType.DataArray: QIcon("./icons/nix_data_array.png"), @@ -210,6 +242,12 @@ class TreeModel(QAbstractItemModel): NodeType.MultiTag: QIcon("./icons/nix_tag.png"), NodeType.Group: QIcon("./icons/nix_group.png"), NodeType.Feature: QIcon("./icons/nix_feature.png")} + if tree_type == TreeType.Full: + self.root_item = FileTreeItem(nd, file_handler, parent=None) + elif tree_type == TreeType.Metadata: + self.root_item = MetadataTreeItem(nd, file_handler, parent=None) + else: + self.root_item = DataTreeItem(nd, file_handler, parent=None) self.root_item.load_children() def columnCount(self, parent):