[tree model] use ItemDescriptor for building tree

This commit is contained in:
Jan Grewe 2020-12-30 17:33:00 +01:00
parent 47e0d5c589
commit 62dec00295

View File

@ -1,8 +1,7 @@
from PyQt5.QtCore import QAbstractItemModel, QFile, QModelIndex, Qt from PyQt5.QtCore import QAbstractItemModel, QFile, QModelIndex, Qt
from PyQt5.QtWidgets import QHeaderView, QTreeWidgetItem from PyQt5.QtWidgets import QHeaderView, QTreeWidgetItem
from collections import OrderedDict
from enum import Enum
from file_handler import ItemDescriptor, NodeType
from IPython import embed from IPython import embed
column_names = ['Name', 'Type', 'ID', 'Value', 'Description'] column_names = ['Name', 'Type', 'ID', 'Value', 'Description']
@ -11,13 +10,8 @@ column_names = ['Name', 'Type', 'ID', 'Value', 'Description']
class NixTreeItem(): class NixTreeItem():
def __init__(self, name, item_type, description, file_handler, id=None, node_type=None, value=None, parent=None): def __init__(self, node_descriptor, file_handler, parent=None):
self._name = name self._node_descriptor = node_descriptor
self._item_type = item_type
self._description = description
self._id = id
self._node_type = node_type
self._value = value
self._file_handler = file_handler self._file_handler = file_handler
self._parent_item = parent self._parent_item = parent
@ -38,15 +32,15 @@ class NixTreeItem():
def data(self, column): def data(self, column):
if column == 0: if column == 0:
return self._name return self._node_descriptor.name
elif column == 1: elif column == 1:
return self._item_type return self._node_descriptor.type
elif column == 2: elif column == 2:
return self._id return self._node_descriptor.id
elif column == 3: elif column == 3:
return self._value return self._node_descriptor.value
elif column == 4: elif column == 4:
return self._description return self._node_descriptor.definition
else: else:
return None return None
@ -60,79 +54,78 @@ class NixTreeItem():
class FileTreeItem(NixTreeItem): class FileTreeItem(NixTreeItem):
def __init__(self, name, item_type, description, file_handler, id=None, node_type=NodeType.Root, value=None, parent=None): def __init__(self, node_descriptor, file_handler, parent=None):
super().__init__(name, item_type, description, file_handler=file_handler, id=id, node_type=node_type, value=value, parent=parent) super().__init__(node_descriptor, file_handler=file_handler, parent=parent)
self._is_loaded = False self._is_loaded = False
def load_children(self): def load_children(self):
self._child_items = [] self._child_items = []
sections, _ = self._file_handler.request_metadata() sections, _ = self._file_handler.request_metadata()
for s in sections: for s in sections:
self._child_items.append(SectionTreeItem(s["name"], s["item_type"], s["description"], self._file_handler, id=s["id"], parent=self)) self._child_items.append(SectionTreeItem(s, self._file_handler, parent=self))
blocks = self._file_handler.request_blocks() blocks = self._file_handler.request_blocks()
for b in blocks: for b in blocks:
self._child_items.append(BlockTreeItem(b["name"], b["item_type"], b["description"], self._file_handler, id=b["id"], parent=self)) self._child_items.append(BlockTreeItem(b, self._file_handler, parent=self))
self._is_loaded = True self._is_loaded = True
class BlockTreeItem(NixTreeItem): class BlockTreeItem(NixTreeItem):
def __init__(self, name, item_type, description, file_handler, id=None, node_type=NodeType.Block, value=None, parent=None): def __init__(self, node_descriptor, file_handler, parent=None):
super().__init__(name, item_type, description, file_handler, id=id, node_type=node_type, value=value, parent=parent) super().__init__(node_descriptor, file_handler, parent=parent)
self._is_loaded = False self._is_loaded = False
def load_children(self): def load_children(self):
self._child_items = [] self._child_items = []
arrays = self._file_handler.request_data_arrays(self._id) arrays = self._file_handler.request_data_arrays(self._node_descriptor.id)
for a in arrays: for a in arrays:
self._child_items.append(DataArrayTreeItem(a["name"], a["item_type"], a["description"], self._file_handler, id=a["id"], parent=self)) self._child_items.append(DataArrayTreeItem(a, self._file_handler, parent=self))
for t in self._file_handler.request_tags(self._id): for t in self._file_handler.request_tags(self._node_descriptor.id):
self._child_items.append(TagTreeItem(t["name"], t["item_type"], t["description"], self._file_handler, id=t["id"], parent=self)) self._child_items.append(TagTreeItem(t, self._file_handler, parent=self))
self._is_loaded = True self._is_loaded = True
class DataArrayTreeItem(NixTreeItem): class DataArrayTreeItem(NixTreeItem):
def __init__(self, name, item_type, description, file_handler, id, node_type=NodeType.DataArray, value=None, parent=None): def __init__(self, node_descriptor, file_handler, parent=None):
super().__init__(name, item_type, description, file_handler, id=id, node_type=node_type, value=value, parent=parent) super().__init__(node_descriptor, file_handler, parent=parent)
self._is_loaded = False self._is_loaded = False
def load_children(self): def load_children(self):
dimensions = self._file_handler.request_dimensions(self._parent_item._id, self._id) dimensions = self._file_handler.request_dimensions(self._parent_item._node_descriptor.id, self._node_descriptor.id)
for d in dimensions: for d in dimensions:
self._child_items.append(DimensionTreeItem(d["name"], d["item_type"], d["description"], self._file_handler, id=d["id"], parent=self)) self._child_items.append(DimensionTreeItem(d, self._file_handler, parent=self))
self._is_loaded = True self._is_loaded = True
class DimensionTreeItem(NixTreeItem): class DimensionTreeItem(NixTreeItem):
def __init__(self, name, item_type, description, file_handler, id, node_type=NodeType.Dimension, value=None, parent=None): def __init__(self, node_descriptor, file_handler, parent=None):
super().__init__(name, item_type, description, file_handler, id=id, node_type=node_type, value=value, parent=parent) super().__init__(node_descriptor, file_handler, parent=parent)
self._is_loaded = True self._is_loaded = True
class SectionTreeItem(NixTreeItem): class SectionTreeItem(NixTreeItem):
def __init__(self, name, item_type, description, file_handler, id=None, node_type=NodeType.Section, value=None, parent=None): def __init__(self, node_descriptor, file_handler, parent=None):
super().__init__(name, item_type, description, file_handler=file_handler, id=id, node_type=node_type, value=value, parent=parent) super().__init__(node_descriptor, file_handler=file_handler, parent=parent)
self._is_loaded = False self._is_loaded = False
def load_children(self): def load_children(self):
print("Load Children", self._name, self._id)
self._child_items = [] self._child_items = []
sections, properties = self._file_handler.request_metadata(self._id) sections, properties = self._file_handler.request_metadata(self._node_descriptor.id)
for s in sections: for s in sections:
self._child_items.append(SectionTreeItem(s["name"], s["item_type"], s["description"], self._file_handler, id=s["id"], parent=self)) self._child_items.append(SectionTreeItem(s, self._file_handler, parent=self))
for p in properties: for p in properties:
self._child_items.append(PropertyTreeItem(p["name"], "", p["unit"], self._file_handler, id=p["id"],value="unset", parent=self)) self._child_items.append(PropertyTreeItem(p, self._file_handler, parent=self))
self._is_loaded = True self._is_loaded = True
class PropertyTreeItem(NixTreeItem): class PropertyTreeItem(NixTreeItem):
def __init__(self, name, item_type, description, file_handler, id=None, node_type=NodeType.Property, value=None, parent=None): def __init__(self, node_descriptor, file_handler, parent=None):
super().__init__(name, item_type, description, file_handler, id=id, node_type=node_type, value=value, parent=parent) super().__init__(node_descriptor, file_handler, parent=parent)
self._is_loaded = True self._is_loaded = True
def childCount(self): def childCount(self):
return 0 return 0
class TagTreeItem(NixTreeItem): class TagTreeItem(NixTreeItem):
def __init__(self, name, item_type, description, file_handler, id, node_type=NodeType.Tag, value=None, parent=None): def __init__(self, node_descriptor, file_handler, parent=None):
super().__init__(name, item_type, description, file_handler, id=id, node_type=node_type, value=value, parent=parent) super().__init__(node_descriptor, file_handler, parent=parent)
self._is_loaded = False self._is_loaded = False
def load_children(self): def load_children(self):
@ -142,7 +135,8 @@ class TagTreeItem(NixTreeItem):
class TreeModel(QAbstractItemModel): class TreeModel(QAbstractItemModel):
def __init__(self, file_handler, parent=None): def __init__(self, file_handler, parent=None):
super(TreeModel, self).__init__(parent) super(TreeModel, self).__init__(parent)
self.root_item = FileTreeItem(file_handler.filename, "Root Item", "", file_handler, parent=None) nd = ItemDescriptor(file_handler.filename, type="Root item")
self.root_item = FileTreeItem(nd, file_handler, parent=None)
self.root_item.load_children() self.root_item.load_children()
def columnCount(self, parent): def columnCount(self, parent):