#include "nodetreeview.h" namespace olive { NodeTreeView::NodeTreeView(QWidget *parent) : QTreeWidget(parent), only_show_keyframable_(false) { connect(this, &NodeTreeView::itemChanged, this, &NodeTreeView::ItemCheckStateChanged); Retranslate(); } bool NodeTreeView::IsNodeEnabled(Node *n) const { return !disabled_nodes_.contains(n); } bool NodeTreeView::IsInputEnabled(NodeInput *i) const { return !disabled_inputs_.contains(i); } void NodeTreeView::SetNodes(const QVector &nodes) { nodes_ = nodes; this->clear(); foreach (Node* n, nodes_) { QTreeWidgetItem* node_item = new QTreeWidgetItem(); node_item->setText(0, n->Name()); node_item->setCheckState(0, disabled_nodes_.contains(n) ? Qt::Unchecked : Qt::Checked); node_item->setData(0, kItemType, kItemTypeNode); node_item->setData(0, kItemPointer, reinterpret_cast(n)); QVector inputs = n->GetInputsIncludingArrays(); foreach (NodeInput* i, inputs) { if (only_show_keyframable_ && !i->is_keyframable()) { continue; } QTreeWidgetItem* input_item = new QTreeWidgetItem(node_item); input_item->setText(0, i->name()); input_item->setCheckState(0, disabled_inputs_.contains(i) ? Qt::Unchecked : Qt::Checked); input_item->setData(0, kItemType, kItemTypeInput); input_item->setData(0, kItemPointer, reinterpret_cast(i)); } // Add at the end to prevent unnecessary signalling while we're setting these objects up if (node_item->childCount() > 0) { this->addTopLevelItem(node_item); } else { delete node_item; } } } void NodeTreeView::changeEvent(QEvent *e) { QTreeWidget::changeEvent(e); if (e->type() == QEvent::LanguageChange) { Retranslate(); } } void NodeTreeView::Retranslate() { setHeaderLabel(tr("Nodes")); } void NodeTreeView::ItemCheckStateChanged(QTreeWidgetItem *item, int column) { Q_UNUSED(column) switch (item->data(0, kItemType).toInt()) { case kItemTypeNode: { Node* n = reinterpret_cast(item->data(0, kItemPointer).value()); if (item->checkState(0) == Qt::Checked) { if (disabled_nodes_.contains(n)) { disabled_nodes_.removeOne(n); emit NodeEnableChanged(n, true); } } else if (!disabled_nodes_.contains(n)) { disabled_nodes_.append(n); emit NodeEnableChanged(n, false); } break; } case kItemTypeInput: { NodeInput* i = reinterpret_cast(item->data(0, kItemPointer).value()); if (item->checkState(0) == Qt::Checked) { if (disabled_inputs_.contains(i)) { disabled_inputs_.removeOne(i); emit InputEnableChanged(i, true); } } else if (!disabled_inputs_.contains(i)) { disabled_inputs_.append(i); emit InputEnableChanged(i, false); } break; } } } }