1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
# Copyright (c) 2016 Ultimaker B.V.
# Uranium is released under the terms of the LGPLv3 or higher.
from PyQt5.QtCore import Qt, QAbstractItemModel, QModelIndex, QVariant, pyqtProperty, pyqtSignal, pyqtSlot
from UM.Settings.SettingDefinition import SettingDefinition
from UM.Settings.ContainerRegistry import ContainerRegistry
class DefinitionTreeModel(QAbstractItemModel):
KeyRole = Qt.UserRole + 1
def __init__(self, parent = None, *args, **kwargs):
super().__init__(parent = parent, *args, **kwargs)
self._container_id = None
self._container = None
self._role_names = {
self.KeyRole: b"key"
}
index = self.KeyRole + 1
for name in SettingDefinition.getPropertyNames():
self._role_names[index] = name.encode()
index += 1
containerIdChanged = pyqtSignal()
def setContainerId(self, container_id):
if container_id != self._container_id:
self._container_id = container_id
self.beginResetModel()
containers = ContainerRegistry.getInstance().findDefinitionContainers(id = self._container_id)
if containers:
self._container = containers[0]
else:
self._container = None
self.endResetModel()
self.containerIdChanged.emit()
@pyqtProperty(str, fset = setContainerId, notify = containerIdChanged)
def containerId(self):
return self._container_id
def index(self, row, column, parent = QModelIndex()):
if not self._container:
return QModelIndex()
if not self.hasIndex(row, column, parent):
return QModelIndex()
definition = None
if not parent.isValid():
definition = self._container.definitions[row]
else:
definition = parent.internalPointer().children[row]
return self.createIndex(row, column, definition)
def parent(self, child):
if not self._container:
return QModelIndex()
if not child.isValid():
return QModelIndex()
parent = child.internalPointer().parent
if not parent:
return QModelIndex()
row = None
if not parent.parent:
row = self._container.definitions.index(parent)
else:
row = parent.parent.children.index(parent)
return self.createIndex(row, 0, parent)
def rowCount(self, parent = QModelIndex()):
if not self._container:
return 0
if parent.column() > 0:
return 0
if not parent.isValid():
return len(self._container.definitions)
setting = parent.internalPointer()
return len(setting.children)
def columnCount(self, parent = QModelIndex()):
return 1
def data(self, index, role):
if not self._container:
return QVariant()
if not index.isValid():
return QVariant()
if role not in self._role_names:
return QVariant()
role_name = self._role_names[role]
definition = index.internalPointer()
try:
data = getattr(definition, role_name.decode())
except AttributeError:
data = ""
return QVariant(str(data))
def roleNames(self):
return self._role_names
@pyqtSlot(QModelIndex, result="QVariantMap")
def get(self, index):
definition = index.internalPointer()
result = { "key": definition.key }
for name in UM.Settings.SettingDefinition.getPropertyNames():
try:
result[name] = str(getattr(definition, name))
except AttributeError:
pass
return result
|