#include "Transaction.hpp" #include "Operations.hpp" #include struct OperationConverter { using result_type = OperationBase*; OperationBase* operator()(const graphene::chain::transfer_operation& op) const { auto ret = new TransferOperation(op); QObject::connect(ret, &QObject::destroyed, []{qDebug("Cleaned up operation");}); return ret; } template OperationBase* operator()(const Op&) const { elog("NYI: OperationConverter for ${type}", ("type", fc::get_typename::name())); abort(); } }; QQmlListProperty Transaction::operations() { auto append = [](QQmlListProperty* list, OperationBase* op) { static_cast(list->data)->appendOperation(op); }; auto count = [](QQmlListProperty* list) { return static_cast(list->data)->operationCount(); }; auto at = [](QQmlListProperty* list, int index) { return static_cast(list->data)->operationAt(index); }; auto clear = [](QQmlListProperty* list) { static_cast(list->data)->clearOperations(); }; return QQmlListProperty(this, this, append, count, at, clear); } OperationBase* Transaction::operationAt(int index) const { return m_transaction.operations[index].visit(OperationConverter()); } void Transaction::appendOperation(OperationBase* op) { if (op == nullptr) { qWarning("Unable to append null operation to transaction"); return; } op->setParent(this); m_transaction.operations.push_back(op->genericOperation()); Q_EMIT operationsChanged(); }