[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 from file_handler import FileHandler
import communicator as comm import communicator as comm
import constants as cnst import constants as cnst
from tree_model import TreeModel from tree_model import TreeModel, TreeType
class CentralWidget(QWidget): class CentralWidget(QWidget):
@ -41,21 +41,49 @@ class FileView(QWidget):
grid.addWidget(QLabel("FileView"), 0, 0, 1, 3) grid.addWidget(QLabel("FileView"), 0, 0, 1, 3)
self.setLayout(grid) self.setLayout(grid)
self._view = QTreeView() self._data_tree = QTreeView()
self._view.setAlternatingRowColors(True) self._data_tree.expanded.connect(self.dataTreeResize)
self._view.setUniformRowHeights(True) # Allows for scrolling optimizations. self._data_tree.collapsed.connect(self.dataTreeResize)
self._view.setWindowTitle("Simple Tree Model") self._data_tree.setAlternatingRowColors(True)
self._view.setIconSize(QSize(20,20)) self._data_tree.setUniformRowHeights(True) # Allows for scrolling optimizations.
header = self._view.header() self._data_tree.setWindowTitle("Simple Tree Model")
self._data_tree.setIconSize(QSize(20,20))
header = self._data_tree.header()
header.setStretchLastSection(False) header.setStretchLastSection(False)
header.setSectionResizeMode(1, QHeaderView.ResizeToContents) header.setSectionResizeMode(1, QHeaderView.ResizeToContents)
header.setSectionResizeMode(2, QHeaderView.ResizeToContents) header.setSectionResizeMode(2, QHeaderView.ResizeToContents)
header.setSectionResizeMode(0, QHeaderView.Stretch) 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): def update(self):
model = TreeModel(self._file_handler) data_model = TreeModel(self._file_handler, TreeType.Data)
self._view.setModel(model) 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): def reset(self):
print("FileView ", self._file_handler.is_valid) print("FileView ", self._file_handler.is_valid)

View File

@ -1,12 +1,19 @@
from PyQt5.QtCore import QAbstractItemModel, QModelIndex, Qt from PyQt5.QtCore import QAbstractItemModel, QModelIndex, Qt
from PyQt5.QtGui import QIcon from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QTreeWidgetItem from PyQt5.QtWidgets import QTreeWidgetItem
from enum import Enum
from file_handler import ItemDescriptor, NodeType from file_handler import ItemDescriptor, NodeType
column_names = ['Name', 'Type', 'ID', 'Value', 'Description'] column_names = ['Name', 'Type', 'ID', 'Value', 'Description']
class TreeType(Enum):
Full = "full"
Metadata = "metadata"
Data = "data"
class NixTreeItem(QTreeWidgetItem): class NixTreeItem(QTreeWidgetItem):
def __init__(self, node_descriptor, file_handler, parent=None): def __init__(self, node_descriptor, file_handler, parent=None):
super().__init__(parent) super().__init__(parent)
@ -55,7 +62,6 @@ class NixTreeItem(QTreeWidgetItem):
return self._parent_item._child_items.index(self) return self._parent_item._child_items.index(self)
return 0 return 0
class FileTreeItem(NixTreeItem): class FileTreeItem(NixTreeItem):
def __init__(self, node_descriptor, file_handler, parent=None): def __init__(self, node_descriptor, file_handler, parent=None):
super().__init__(node_descriptor, file_handler=file_handler, parent=parent) 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._child_items.append(BlockTreeItem(b, self._file_handler, parent=self))
self._is_loaded = True 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): class BlockTreeItem(NixTreeItem):
def __init__(self, node_descriptor, file_handler, parent=None): def __init__(self, node_descriptor, file_handler, parent=None):
super().__init__(node_descriptor, file_handler, parent=parent) super().__init__(node_descriptor, file_handler, parent=parent)
@ -195,10 +228,9 @@ class TagTreeItem(NixTreeItem):
class TreeModel(QAbstractItemModel): 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) super(TreeModel, self).__init__(parent)
nd = ItemDescriptor(file_handler.filename, type="Root item") 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"), self.type_icons = {NodeType.Block: QIcon("./icons/nix_block_1d.png"),
NodeType.Source: QIcon("./icons/nix_source.png"), NodeType.Source: QIcon("./icons/nix_source.png"),
NodeType.DataArray: QIcon("./icons/nix_data_array.png"), NodeType.DataArray: QIcon("./icons/nix_data_array.png"),
@ -210,6 +242,12 @@ class TreeModel(QAbstractItemModel):
NodeType.MultiTag: QIcon("./icons/nix_tag.png"), NodeType.MultiTag: QIcon("./icons/nix_tag.png"),
NodeType.Group: QIcon("./icons/nix_group.png"), NodeType.Group: QIcon("./icons/nix_group.png"),
NodeType.Feature: QIcon("./icons/nix_feature.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() self.root_item.load_children()
def columnCount(self, parent): def columnCount(self, parent):