Files
oak-editor/app/node/value.cpp
T
itsmattkc f424d8b44e rewrote renderers where necessary for new node structure
Largely conforming renderers to new NodeValue system. Code seems a lot cleaner
this way which is a nice advantage. Likely non-functional as this won't
compile just yet and still needs probably another day or two of testing to get
it back to where it was before.
2019-12-05 03:53:52 +11:00

159 lines
2.9 KiB
C++

#include "value.h"
NodeValueDatabase::NodeValueDatabase()
{
}
NodeValueTable NodeValueDatabase::operator[](const QString &input_id) const
{
return tables_.value(input_id);
}
NodeValueTable NodeValueDatabase::operator[](const NodeInput *input) const
{
return tables_.value(input->id());
}
void NodeValueDatabase::Insert(const QString &key, const NodeValueTable &value)
{
tables_.insert(key, value);
}
void NodeValueDatabase::Insert(const NodeInput *key, const NodeValueTable &value)
{
tables_.insert(key->id(), value);
}
NodeValueTable NodeValueDatabase::Merge() const
{
return NodeValueTable::Merge(tables_.values());
}
NodeValue::NodeValue(const NodeParam::DataType &type, const QVariant &data, const QString &tag) :
type_(type),
data_(data),
tag_(tag)
{
}
const NodeParam::DataType &NodeValue::type() const
{
return type_;
}
const QString &NodeValue::tag() const
{
return tag_;
}
const QVariant &NodeValue::data() const
{
return data_;
}
NodeValueTable::NodeValueTable()
{
}
QVariant NodeValueTable::Get(const NodeParam::DataType &type, const QString &tag)
{
return GetInternal(type, tag, false);
}
QVariant NodeValueTable::Take(const NodeParam::DataType &type, const QString &tag)
{
return GetInternal(type, tag, true);
}
void NodeValueTable::Push(const NodeValue &value)
{
values_.append(value);
}
void NodeValueTable::Push(const NodeParam::DataType &type, const QVariant &data, const QString &tag)
{
Push(NodeValue(type, data, tag));
}
void NodeValueTable::Prepend(const NodeValue &value)
{
values_.prepend(value);
}
void NodeValueTable::Prepend(const NodeParam::DataType &type, const QVariant &data, const QString &tag)
{
Prepend(NodeValue(type, data, tag));
}
const NodeValue &NodeValueTable::At(int index) const
{
return values_.at(index);
}
int NodeValueTable::Count() const
{
return values_.size();
}
bool NodeValueTable::isEmpty() const
{
return values_.isEmpty();
}
NodeValueTable NodeValueTable::Merge(QList<NodeValueTable> tables)
{
if (tables.size() == 1) {
return tables.first();
}
int row = 0;
NodeValueTable merged_table;
QHash<QString, NodeValueTable>::const_iterator iterator;
// Slipstreams all tables together
// FIXME: I don't actually know if this is the right approach...
foreach (const NodeValueTable& t, tables) {
if (row >= t.Count()) {
continue;
}
int row_index = t.Count() - 1 - row;
merged_table.Prepend(t.At(row_index));
}
return merged_table;
}
QVariant NodeValueTable::GetInternal(const NodeParam::DataType &type, const QString &tag, bool remove)
{
int index = -1;
for (int i=values_.size() - 1;i>=0;i--) {
const NodeValue& v = values_.at(i);
if (v.type() & type) {
index = i;
if (tag.isEmpty() || tag == v.tag()) {
break;
}
}
}
if (index >= 0) {
if (remove) {
values_.removeAt(index);
}
return values_.at(index).data();
}
return QVariant();
}