[tree] split data and mdata trees, fix header resizing

This commit is contained in:
Jan Grewe 2020-12-31 17:44:24 +01:00
parent fc65542aee
commit 9730c3d329
2 changed files with 79 additions and 13 deletions

View File

@ -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)

View File

@ -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):