Browse Source

continue code model impl

cl-refactor
arkpar 10 years ago
parent
commit
ab89822535
  1. 37
      mix/AppContext.cpp
  2. 37
      mix/AppContext.h
  3. 43
      mix/AssemblyDebuggerCtrl.cpp
  4. 12
      mix/AssemblyDebuggerCtrl.h
  5. 15
      mix/AssemblyDebuggerModel.cpp
  6. 51
      mix/CodeEditorExtensionManager.cpp
  7. 5
      mix/CodeEditorExtensionManager.h
  8. 55
      mix/CodeModel.cpp
  9. 31
      mix/CodeModel.h
  10. 50
      mix/ConstantCompilationCtrl.cpp
  11. 9
      mix/ConstantCompilationCtrl.h
  12. 66
      mix/ConstantCompilationModel.cpp
  13. 53
      mix/ConstantCompilationModel.h
  14. 6
      mix/ContractCallDataEncoder.cpp
  15. 6
      mix/ContractCallDataEncoder.h
  16. 21
      mix/Extension.cpp
  17. 11
      mix/Extension.h
  18. 8
      mix/KeyEventManager.cpp
  19. 7
      mix/KeyEventManager.h
  20. 26
      mix/MixApplication.cpp
  21. 13
      mix/MixApplication.h
  22. 6
      mix/QBasicNodeDefinition.h
  23. 22
      mix/QContractDefinition.cpp
  24. 10
      mix/QContractDefinition.h
  25. 6
      mix/QFunctionDefinition.cpp
  26. 3
      mix/QFunctionDefinition.h
  27. 6
      mix/QVariableDeclaration.h
  28. 8
      mix/QVariableDefinition.h
  29. 76
      mix/TransactionListModel.cpp
  30. 8
      mix/TransactionListModel.h
  31. 5
      mix/TransactionListView.cpp
  32. 4
      mix/TransactionListView.h
  33. 13
      mix/main.cpp

37
mix/AppContext.cpp

@ -27,26 +27,31 @@
#include <QQmlComponent>
#include <QQmlApplicationEngine>
#include "libdevcrypto/FileSystem.h"
#include "libwebthree/WebThree.h"
#include "KeyEventManager.h"
#include "AppContext.h"
#include "CodeModel.h"
using namespace dev;
using namespace dev::eth;
using namespace dev::solidity;
using namespace dev::mix;
AppContext* AppContext::Instance = nullptr;
AppContext::AppContext(QQmlApplicationEngine* _engine)
{
m_applicationEngine = std::unique_ptr<QQmlApplicationEngine>(_engine);
m_applicationEngine = _engine;
m_keyEventManager = std::unique_ptr<KeyEventManager>(new KeyEventManager());
m_webThree = std::unique_ptr<dev::WebThreeDirect>(new WebThreeDirect(std::string("Mix/v") + dev::Version + "/" DEV_QUOTED(ETH_BUILD_TYPE) "/" DEV_QUOTED(ETH_BUILD_PLATFORM), getDataDir() + "/Mix", false, {"eth", "shh"}));
m_compiler = std::unique_ptr<CompilerStack>(new CompilerStack());
m_codeModel = std::unique_ptr<CodeModel>(new CodeModel(this));
}
AppContext::~AppContext()
{
}
QQmlApplicationEngine* AppContext::appEngine()
{
return m_applicationEngine.get();
return m_applicationEngine;
}
dev::eth::Client* AppContext::getEthereumClient()
@ -68,22 +73,10 @@ KeyEventManager* AppContext::getKeyEventManager()
return m_keyEventManager.get();
}
CompilerStack* AppContext::compiler()
{
m_compiler.reset(new CompilerStack());
return m_compiler.get();
}
void AppContext::setApplicationContext(QQmlApplicationEngine* _engine)
{
if (Instance == nullptr)
Instance = new AppContext(_engine);
}
void AppContext::displayMessageDialog(QString _title, QString _message)
{
QObject* dialogWin = m_applicationEngine.get()->rootObjects().at(0)->findChild<QObject*>("alertMessageDialog", Qt::FindChildrenRecursively);
QObject* dialogWinComponent = m_applicationEngine.get()->rootObjects().at(0)->findChild<QObject*>("alertMessageDialogContent", Qt::FindChildrenRecursively);
QObject* dialogWin = m_applicationEngine->rootObjects().at(0)->findChild<QObject*>("alertMessageDialog", Qt::FindChildrenRecursively);
QObject* dialogWinComponent = m_applicationEngine->rootObjects().at(0)->findChild<QObject*>("alertMessageDialogContent", Qt::FindChildrenRecursively);
dialogWinComponent->setProperty("source", QString("qrc:/qml/BasicMessage.qml"));
dialogWin->setProperty("title", _title);
dialogWin->setProperty("width", "250");
@ -91,3 +84,9 @@ void AppContext::displayMessageDialog(QString _title, QString _message)
dialogWin->findChild<QObject*>("messageContent", Qt::FindChildrenRecursively)->setProperty("text", _message);
QMetaObject::invokeMethod(dialogWin, "open");
}
void AppContext::resourceLoaded(QObject *_obj, QUrl _url)
{
Q_UNUSED(_url);
initKeyEventManager(_obj);
}

37
mix/AppContext.h

@ -27,42 +27,51 @@
#pragma once
#include <QQmlApplicationEngine>
#include "libsolidity/CompilerStack.h"
#include "libwebthree/WebThree.h"
#include "KeyEventManager.h"
#include <memory>
#include <QUrl>
#include <QObject>
class QQmlApplicationEngine;
namespace dev
{
class WebThreeDirect;
namespace eth
{
class Client;
}
namespace mix
{
class AppContext: public QObject
class CodeModel;
class KeyEventManager;
class AppContext : public QObject
{
Q_OBJECT
public:
AppContext(QQmlApplicationEngine* _engine);
~AppContext() {}
static AppContext* getInstance() { return Instance; }
static void setApplicationContext(QQmlApplicationEngine* _engine);
~AppContext();
QQmlApplicationEngine* appEngine();
dev::eth::Client* getEthereumClient();
void initKeyEventManager(QObject* _obj);
KeyEventManager* getKeyEventManager();
dev::solidity::CompilerStack* compiler();
CodeModel* codeModel() { return m_codeModel.get(); }
void displayMessageDialog(QString _title, QString _message);
private:
static AppContext* Instance;
std::unique_ptr<QQmlApplicationEngine> m_applicationEngine;
QQmlApplicationEngine* m_applicationEngine; //owned by app
std::unique_ptr<dev::WebThreeDirect> m_webThree;
std::unique_ptr<KeyEventManager> m_keyEventManager;
std::unique_ptr<solidity::CompilerStack> m_compiler;
std::unique_ptr<CodeModel> m_codeModel;
public slots:
void quitApplication() { delete Instance; }
void resourceLoaded(QObject* _obj, QUrl _url) { Q_UNUSED(_url); initKeyEventManager(_obj); }
void quitApplication() {}
void resourceLoaded(QObject* _obj, QUrl _url);
};
}

43
mix/AssemblyDebuggerCtrl.cpp

@ -19,12 +19,11 @@
#include <QtConcurrent/QtConcurrent>
#include <QDebug>
#include <QVariableDefinition.h>
#include <QQmlContext>
#include <QQmlApplicationEngine>
#include <QModelIndex>
#include <libdevcore/CommonJS.h>
#include "libethereum/Transaction.h"
#include "AssemblyDebuggerModel.h"
#include <libethereum/Transaction.h>
#include "AssemblyDebuggerCtrl.h"
#include "KeyEventManager.h"
#include "AppContext.h"
@ -33,10 +32,14 @@
#include "QContractDefinition.h"
#include "QVariableDeclaration.h"
#include "ContractCallDataEncoder.h"
#include "KeyEventManager.h"
#include "CodeModel.h"
#include "AssemblyDebuggerModel.h"
using namespace dev::eth;
using namespace dev::mix;
AssemblyDebuggerCtrl::AssemblyDebuggerCtrl(QTextDocument* _doc): Extension(ExtensionDisplayBehavior::ModalDialog)
AssemblyDebuggerCtrl::AssemblyDebuggerCtrl(AppContext* _context): Extension(_context, ExtensionDisplayBehavior::ModalDialog)
{
qRegisterMetaType<QVariableDefinition*>("QVariableDefinition*");
qRegisterMetaType<QVariableDefinitionList*>("QVariableDefinitionList*");
@ -48,8 +51,6 @@ AssemblyDebuggerCtrl::AssemblyDebuggerCtrl(QTextDocument* _doc): Extension(Exten
this, SLOT(updateGUI(bool, DebuggingStatusResult, QList<QVariableDefinition*>, QList<QObject*>, AssemblyDebuggerData)), Qt::QueuedConnection);
m_modelDebugger = std::unique_ptr<AssemblyDebuggerModel>(new AssemblyDebuggerModel);
m_compilation = std::unique_ptr<ConstantCompilationModel>(new ConstantCompilationModel);
m_doc = _doc;
}
QString AssemblyDebuggerCtrl::contentUrl() const
@ -74,41 +75,41 @@ void AssemblyDebuggerCtrl::keyPressed(int _key)
{
QtConcurrent::run([this]()
{
deployContract(m_doc->toPlainText());
deployContract();
});
}
}
void AssemblyDebuggerCtrl::callContract(dev::mix::TransactionSettings _tr)
{
CompilerResult compilerRes = m_compilation.get()->compile(m_doc->toPlainText());
if (!compilerRes.success)
auto compilerRes = m_ctx->codeModel()->lastCompilationResult();
if (!compilerRes->successfull())
{
AppContext::getInstance()->displayMessageDialog("debugger","compilation failed");
m_ctx->displayMessageDialog("debugger","compilation failed");
return;
}
ContractCallDataEncoder c;
std::shared_ptr<QContractDefinition> contractDef = QContractDefinition::Contract(m_doc->toPlainText());
QContractDefinition const* contractDef = compilerRes->contract();
QFunctionDefinition* f = nullptr;
for (int k = 0; k < contractDef.get()->functions().size(); k++)
QFunctionDefinition const* f = nullptr;
for (int k = 0; k < contractDef->functions().size(); k++)
{
if (contractDef.get()->functions().at(k)->name() == _tr.functionId)
if (contractDef->functions().at(k)->name() == _tr.functionId)
{
f = (QFunctionDefinition*)contractDef->functions().at(k);
f = contractDef->functions().at(k);
}
}
if (!f)
{
AppContext::getInstance()->displayMessageDialog("debugger","contract code changed. redeploy contract");
m_ctx->displayMessageDialog("debugger","contract code changed. redeploy contract");
return;
}
c.encode(f->index());
for (int k = 0; k < f->parameters().size(); k++)
{
QVariableDeclaration* var = (QVariableDeclaration*)f->parameters().at(k);
QVariableDeclaration const* var = static_cast<QVariableDeclaration const*>(f->parameters().at(k));
c.encode(var, _tr.parameterValues[var->name()]);
}
@ -120,16 +121,16 @@ void AssemblyDebuggerCtrl::callContract(dev::mix::TransactionSettings _tr)
finalizeExecution(debuggingContent);
}
void AssemblyDebuggerCtrl::deployContract(QString _source)
void AssemblyDebuggerCtrl::deployContract()
{
CompilerResult compilerRes = m_compilation.get()->compile(_source);
if (!compilerRes.success)
auto compilerRes = m_ctx->codeModel()->lastCompilationResult();
if (!compilerRes->successfull())
{
emit dataAvailable(false, DebuggingStatusResult::Compilationfailed);
return;
}
m_previousDebugResult = m_modelDebugger->getContractInitiationDebugStates(compilerRes.bytes);
m_previousDebugResult = m_modelDebugger->getContractInitiationDebugStates(compilerRes->bytes());
finalizeExecution(m_previousDebugResult);
}

12
mix/AssemblyDebuggerCtrl.h

@ -20,12 +20,9 @@
#pragma once
#include <QKeySequence>
#include "QTextDocument"
#include "Extension.h"
#include "ConstantCompilationModel.h"
#include "TransactionListModel.h"
#include "AssemblyDebuggerModel.h"
#include "AppContext.h"
using AssemblyDebuggerData = std::tuple<QList<QObject*>, dev::mix::QQMLMap*>;
enum DebuggingStatusResult
@ -38,6 +35,8 @@ Q_DECLARE_METATYPE(AssemblyDebuggerData)
Q_DECLARE_METATYPE(DebuggingStatusResult)
Q_DECLARE_METATYPE(dev::mix::DebuggingContent)
class AppContext;
namespace dev
{
namespace mix
@ -48,7 +47,7 @@ class AssemblyDebuggerCtrl: public Extension
Q_OBJECT
public:
AssemblyDebuggerCtrl(QTextDocument*);
AssemblyDebuggerCtrl(AppContext* _context);
~AssemblyDebuggerCtrl() {}
void start() const override;
QString title() const override;
@ -56,9 +55,7 @@ public:
private:
std::unique_ptr<AssemblyDebuggerModel> m_modelDebugger;
std::unique_ptr<ConstantCompilationModel> m_compilation;
QTextDocument* m_doc;
void deployContract(QString _source);
void deployContract();
void callContract(dev::mix::TransactionSettings _contractAddress);
void finalizeExecution(DebuggingContent _content);
DebuggingContent m_previousDebugResult; //used for now to keep the contract address in case of transaction call.
@ -70,7 +67,6 @@ public slots:
signals:
void dataAvailable(bool _success, DebuggingStatusResult _reason, QList<QVariableDefinition*> _returnParams = QList<QVariableDefinition*>(), QList<QObject*> _wStates = QList<QObject*>(), AssemblyDebuggerData _code = AssemblyDebuggerData());
};
}

15
mix/AssemblyDebuggerModel.cpp

@ -23,15 +23,19 @@
#include <libethereum/Executive.h>
#include <libethereum/Transaction.h>
#include <libethereum/ExtVM.h>
#include "AssemblyDebuggerModel.h"
#include "AppContext.h"
#include "TransactionListModel.h"
#include "AssemblyDebuggerModel.h"
#include "ConstantCompilationModel.h"
#include "DebuggingStateWrapper.h"
using namespace std;
using namespace dev;
using namespace dev::eth;
using namespace dev::mix;
namespace dev
{
namespace mix
{
AssemblyDebuggerModel::AssemblyDebuggerModel():
m_userAccount(KeyPair::create()),
@ -44,11 +48,9 @@ AssemblyDebuggerModel::AssemblyDebuggerModel():
DebuggingContent AssemblyDebuggerModel::executeTransaction(bytesConstRef _rawTransaction)
{
QList<DebuggingState> machineStates;
// Reset the state back to our clean premine.
m_currentExecution = std::unique_ptr<Executive>(new Executive(m_executiveState, 0));
QList<DebuggingState> states;
m_currentExecution->setup(_rawTransaction);
std::vector<DebuggingState const*> levels;
bytes code;
@ -119,3 +121,6 @@ void AssemblyDebuggerModel::resetState()
{
m_executiveState = m_baseState;
}
}
}

51
mix/CodeEditorExtensionManager.cpp

@ -30,9 +30,17 @@
#include "AssemblyDebuggerCtrl.h"
#include "TransactionListView.h"
#include "AppContext.h"
#include "MixApplication.h"
#include "CodeModel.h"
#include "CodeEditorExtensionManager.h"
using namespace dev::mix;
CodeEditorExtensionManager::CodeEditorExtensionManager():
m_appContext(static_cast<MixApplication*>(QApplication::instance())->context())
{
}
CodeEditorExtensionManager::~CodeEditorExtensionManager()
{
m_features.clear();
@ -42,38 +50,26 @@ void CodeEditorExtensionManager::loadEditor(QQuickItem* _editor)
{
if (!_editor)
return;
try
QVariant doc = _editor->property("textDocument");
if (doc.canConvert<QQuickTextDocument*>())
{
QVariant doc = _editor->property("textDocument");
if (doc.canConvert<QQuickTextDocument*>())
QQuickTextDocument* qqdoc = doc.value<QQuickTextDocument*>();
if (qqdoc)
{
QQuickTextDocument* qqdoc = doc.value<QQuickTextDocument*>();
if (qqdoc)
{
m_doc = qqdoc->textDocument();
auto args = QApplication::arguments();
if (args.length() > 1)
{
QString path = args[1];
QFile file(path);
if (file.exists() && file.open(QFile::ReadOnly))
m_doc->setPlainText(file.readAll());
}
}
m_doc = qqdoc->textDocument();
}
}
catch (...)
{
qDebug() << "unable to load editor: ";
}
}
void CodeEditorExtensionManager::initExtensions()
{
initExtension(std::make_shared<ConstantCompilationCtrl>(m_doc));
std::shared_ptr<AssemblyDebuggerCtrl> debug = std::make_shared<AssemblyDebuggerCtrl>(m_doc);
std::shared_ptr<TransactionListView> tr = std::make_shared<TransactionListView>(m_doc);
initExtension(std::make_shared<ConstantCompilationCtrl>(m_appContext));
std::shared_ptr<AssemblyDebuggerCtrl> debug = std::make_shared<AssemblyDebuggerCtrl>(m_appContext);
std::shared_ptr<TransactionListView> tr = std::make_shared<TransactionListView>(m_appContext);
QObject::connect(tr->model(), &TransactionListModel::transactionStarted, debug.get(), &AssemblyDebuggerCtrl::runTransaction);
QObject::connect(m_doc, &QTextDocument::contentsChanged, [=]() { m_appContext->codeModel()->registerCodeChange(m_doc->toPlainText()); });
initExtension(debug);
initExtension(tr);
}
@ -103,6 +99,15 @@ void CodeEditorExtensionManager::setEditor(QQuickItem* _editor)
{
this->loadEditor(_editor);
this->initExtensions();
auto args = QApplication::arguments();
if (args.length() > 1)
{
QString path = args[1];
QFile file(path);
if (file.exists() && file.open(QFile::ReadOnly))
m_doc->setPlainText(file.readAll());
}
}
void CodeEditorExtensionManager::setRightTabView(QQuickItem* _tabView)

5
mix/CodeEditorExtensionManager.h

@ -33,6 +33,8 @@ namespace dev
namespace mix
{
class AppContext;
class CodeEditorExtensionManager: public QObject
{
Q_OBJECT
@ -42,7 +44,7 @@ class CodeEditorExtensionManager: public QObject
Q_PROPERTY(QQuickItem* rightTabView MEMBER m_rightTabView WRITE setRightTabView)
public:
CodeEditorExtensionManager() {}
CodeEditorExtensionManager();
~CodeEditorExtensionManager();
void initExtensions();
void initExtension(std::shared_ptr<Extension>);
@ -56,6 +58,7 @@ private:
QQuickItem* m_tabView;
QQuickItem* m_rightTabView;
QTextDocument* m_doc;
AppContext* m_appContext;
void loadEditor(QQuickItem*);
};

55
mix/CodeModel.cpp

@ -20,6 +20,13 @@
* Ethereum IDE client.
*/
#include <sstream>
#include <QDebug>
#include <QApplication>
#include <libsolidity/CompilerStack.h>
#include <libsolidity/SourceReferenceFormatter.h>
#include <libevmcore/Instruction.h>
#include "QContractDefinition.h"
#include "CodeModel.h"
namespace dev
@ -32,12 +39,27 @@ void BackgroundWorker::queueCodeChange(int _jobId, QString const& _content)
m_model->runCompilationJob(_jobId, _content);
}
CodeModel::CodeModel(QObject* _parent) : QObject(_parent), m_backgroundWorker(this)
CompilationResult::CompilationResult(const solidity::CompilerStack& _compiler, QObject *_parent):
QObject(_parent), m_successfull(true),
m_contract(new QContractDefinition(&_compiler.getContractDefinition(std::string()))),
m_bytes(_compiler.getBytecode()),
m_assemblyCode(QString::fromStdString((dev::eth::disassemble(m_bytes))))
{}
CompilationResult::CompilationResult(CompilationResult const& _prev, QString const& _compilerMessage, QObject* _parent):
QObject(_parent), m_successfull(false),
m_contract(_prev.m_contract),
m_compilerMessage(_compilerMessage),
m_bytes(_prev.m_bytes),
m_assemblyCode(_prev.m_assemblyCode)
{}
CodeModel::CodeModel(QObject* _parent) : QObject(_parent),
m_backgroundWorker(this), m_backgroundJobId(0)
{
m_backgroundWorker.moveToThread(&m_backgroundThread);
connect(this, &CodeModel::compilationComplete, this, &CodeModel::onCompilationComplete, Qt::QueuedConnection);
//connect(this, &CodeModel::compilationComplete, this, &CodeModel::onCompilationComplete, Qt::QueuedConnection);
connect(this, &CodeModel::scheduleCompilationJob, &m_backgroundWorker, &BackgroundWorker::queueCodeChange, Qt::QueuedConnection);
m_backgroundThread.start();
}
@ -62,20 +84,31 @@ void CodeModel::registerCodeChange(const QString &_code)
emit scheduleCompilationJob(m_backgroundJobId, _code);
}
void CodeModel::onCompilationComplete(std::shared_ptr<CompilationResult> _compilationResult)
{
m_result.swap(_compilationResult);
}
void CodeModel::runCompilationJob(int _jobId, QString const& _content)
void CodeModel::runCompilationJob(int _jobId, QString const& _code)
{
if (_jobId != m_backgroundJobId)
return; //obsolete job
solidity::CompilerStack cs;
try
{
cs.setSource(_code.toStdString());
cs.compile(false);
std::shared_ptr<CompilationResult> result(new CompilationResult(cs, nullptr));
m_result.swap(result);
qDebug() << QString(QApplication::tr("compilation succeeded"));
}
catch (dev::Exception const& _exception)
{
std::ostringstream error;
solidity::SourceReferenceFormatter::printExceptionInformation(error, _exception, "Error", cs);
std::shared_ptr<CompilationResult> result(new CompilationResult(*m_result, QString::fromStdString(error.str()), nullptr));
m_result.swap(result);
qDebug() << QString(QApplication::tr("compilation failed") + " " + m_result->compilerMessage());
}
emit compilationComplete();
}
}
}

31
mix/CodeModel.h

@ -22,12 +22,19 @@
#pragma once
#include <memory>
#include <QObject>
#include <QThread>
#include <libdevcore/Common.h>
namespace dev
{
namespace solidity
{
class CompilerStack;
}
namespace mix
{
@ -54,14 +61,24 @@ class CompilationResult : public QObject
Q_PROPERTY(QContractDefinition const* contract READ contract)
public:
QContractDefinition const* contract() { return m_contract; }
/// Successfull compilation result constructor
CompilationResult(solidity::CompilerStack const& _compiler, QObject* parent);
/// Failed compilation result constructor
CompilationResult(CompilationResult const& _prev, QString const& _compilerMessage, QObject* parent);
QContractDefinition const* contract() { return m_contract.get(); }
bool successfull() const { return m_successfull; }
QContractDefinition const* contract() const { return m_contract.get(); }
QString compilerMessage() const { return m_compilerMessage; }
dev::bytes const& bytes() const { return m_bytes; }
QString assemblyCode() const { return m_assemblyCode; }
private:
bool m_successfull;
QContractDefinition* m_contract;
QString m_hexCode;
std::shared_ptr<QContractDefinition const> m_contract;
QString m_compilerMessage; ///< @todo: use some structure here
dev::bytes m_bytes;
QString m_assemblyCode;
///@todo syntax highlighting, etc
};
@ -79,19 +96,16 @@ public:
CodeModel(QObject* _parent);
~CodeModel();
CompilationResult* getLastCompilationResult();
std::shared_ptr<CompilationResult> lastCompilationResult() { return m_result; }
signals:
void statusChanged(Status _from, Status _to);
void compilationComplete(std::shared_ptr<CompilationResult> _compilationResult);
void compilationComplete();
void scheduleCompilationJob(int _jobId, QString const& _content);
public slots:
void registerCodeChange(QString const& _code);
private slots:
void onCompilationComplete(std::shared_ptr<CompilationResult> _compilationResult);
private:
void runCompilationJob(int _jobId, QString const& _content);
void stop();
@ -100,7 +114,6 @@ private:
QThread m_backgroundThread;
BackgroundWorker m_backgroundWorker;
int m_backgroundJobId = 0; //protects from starting obsolete compilation job
friend class BackgroundWorker;
};

50
mix/ConstantCompilationCtrl.cpp

@ -27,15 +27,16 @@
#include <QQmlApplicationEngine>
#include <QtCore/QtCore>
#include <QDebug>
#include "ConstantCompilationCtrl.h"
#include "ConstantCompilationModel.h"
#include "QContractDefinition.h"
#include "AppContext.h"
#include "CodeModel.h"
#include "ConstantCompilationCtrl.h"
using namespace dev::mix;
ConstantCompilationCtrl::ConstantCompilationCtrl(QTextDocument* _doc): Extension(ExtensionDisplayBehavior::Tab)
ConstantCompilationCtrl::ConstantCompilationCtrl(AppContext* _context): Extension(_context, ExtensionDisplayBehavior::Tab)
{
m_editor = _doc;
m_compilationModel = std::unique_ptr<ConstantCompilationModel>(new ConstantCompilationModel());
connect(_context->codeModel(), &CodeModel::compilationComplete, this, &ConstantCompilationCtrl::update);
}
QString ConstantCompilationCtrl::contentUrl() const
@ -50,45 +51,32 @@ QString ConstantCompilationCtrl::title() const
void ConstantCompilationCtrl::start() const
{
connect(m_editor, SIGNAL(contentsChange(int,int,int)), this, SLOT(compile()));
}
void ConstantCompilationCtrl::compile()
void ConstantCompilationCtrl::update()
{
QString codeContent = m_editor->toPlainText().replace("\n", "");
if (codeContent.isEmpty())
{
resetOutPut();
return;
}
CompilerResult res = m_compilationModel->compile(m_editor->toPlainText().replace("\t", " "));
writeOutPut(res);
}
auto result = m_ctx->codeModel()->lastCompilationResult();
void ConstantCompilationCtrl::resetOutPut()
{
QObject* status = m_view->findChild<QObject*>("status", Qt::FindChildrenRecursively);
QObject* content = m_view->findChild<QObject*>("content", Qt::FindChildrenRecursively);
status->setProperty("text", "");
content->setProperty("text", "");
}
void ConstantCompilationCtrl::writeOutPut(CompilerResult const& _res)
{
QObject* status = m_view->findChild<QObject*>("status", Qt::FindChildrenRecursively);
QObject* content = m_view->findChild<QObject*>("content", Qt::FindChildrenRecursively);
if (_res.success)
if (result->successfull())
{
status->setProperty("text", "succeeded");
status->setProperty("color", "green");
content->setProperty("text", _res.hexCode);
qDebug() << QString(QApplication::tr("compile succeeded") + " " + _res.hexCode);
content->setProperty("text", result->assemblyCode());
}
else
{
status->setProperty("text", "failure");
status->setProperty("color", "red");
content->setProperty("text", _res.comment);
qDebug() << QString(QApplication::tr("compile failed") + " " + _res.comment);
content->setProperty("text", result->compilerMessage());
}
}
void ConstantCompilationCtrl::resetOutPut()
{
QObject* status = m_view->findChild<QObject*>("status", Qt::FindChildrenRecursively);
QObject* content = m_view->findChild<QObject*>("content", Qt::FindChildrenRecursively);
status->setProperty("text", "");
content->setProperty("text", "");
}

9
mix/ConstantCompilationCtrl.h

@ -19,8 +19,6 @@
#pragma once
#include <QTextDocument>
#include "ConstantCompilationModel.h"
#include "Extension.h"
namespace dev
@ -33,20 +31,17 @@ class ConstantCompilationCtrl: public Extension
Q_OBJECT
public:
ConstantCompilationCtrl(QTextDocument*);
ConstantCompilationCtrl(AppContext* _appContext);
~ConstantCompilationCtrl() {}
void start() const override;
QString title() const override;
QString contentUrl() const override;
private:
QTextDocument* m_editor;
std::unique_ptr<ConstantCompilationModel> m_compilationModel;
void writeOutPut(CompilerResult const&);
void resetOutPut();
public slots:
void compile();
void update();
};
}

66
mix/ConstantCompilationModel.cpp

@ -1,66 +0,0 @@
/*
This file is part of cpp-ethereum.
cpp-ethereum is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
cpp-ethereum is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>.
*/
/** @file ConstantCompilationModel.cpp
* @author Yann yann@ethdev.com
* @date 2014
* Ethereum IDE client.
*/
#include <QApplication>
#include <QObject>
#include <libevm/VM.h>
#include <libsolidity/Scanner.h>
#include <libsolidity/Parser.h>
#include <libsolidity/CompilerStack.h>
#include <libsolidity/SourceReferenceFormatter.h>
#include <libsolidity/NameAndTypeResolver.h>
#include "ConstantCompilationModel.h"
using namespace std;
using namespace dev;
using namespace dev::eth;
using namespace dev::mix;
using namespace dev::solidity;
CompilerResult ConstantCompilationModel::compile(QString _code)
{
dev::solidity::CompilerStack compiler;
dev::bytes m_data;
CompilerResult res;
try
{
m_data = compiler.compile(_code.toStdString(), true);
res.success = true;
res.comment = "ok";
res.hexCode = QString::fromStdString(dev::eth::disassemble(m_data));
res.bytes = m_data;
}
catch (dev::Exception const& _exception)
{
ostringstream error;
solidity::SourceReferenceFormatter::printExceptionInformation(error, _exception, "Error", compiler);
res.success = false;
res.comment = QString::fromStdString(error.str());
res.hexCode = "";
}
catch (...)
{
res.success = false;
res.comment = QApplication::tr("Uncaught exception.");
res.hexCode = "";
}
return res;
}

53
mix/ConstantCompilationModel.h

@ -1,53 +0,0 @@
/*
This file is part of cpp-ethereum.
cpp-ethereum is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
cpp-ethereum is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>.
*/
/** @file ConstantCompilationModel.h
* @author Yann yann@ethdev.com
* @date 2014
* Ethereum IDE client.
*/
#pragma once
#include <libevm/VM.h>
#include <libsolidity/AST.h>
#include <QObject>
namespace dev
{
namespace mix
{
struct CompilerResult
{
QString hexCode;
QString comment;
dev::bytes bytes;
bool success;
};
class ConstantCompilationModel
{
public:
ConstantCompilationModel() {}
~ConstantCompilationModel() {}
CompilerResult compile(QString _code);
};
}
}

6
mix/ContractCallDataEncoder.cpp

@ -46,19 +46,19 @@ void ContractCallDataEncoder::encode(int _functionIndex)
m_encodedData.insert(m_encodedData.end(), i.begin(), i.end());
}
void ContractCallDataEncoder::encode(QVariableDeclaration* _dec, bool _value)
void ContractCallDataEncoder::encode(QVariableDeclaration const* _dec, bool _value)
{
return encode(_dec, QString(formatBool(_value)));
}
void ContractCallDataEncoder::encode(QVariableDeclaration* _dec, QString _value)
void ContractCallDataEncoder::encode(QVariableDeclaration const* _dec, QString _value)
{
int padding = this->padding(_dec->type());
bytes data = padded(jsToBytes(_value.toStdString()), padding);
m_encodedData.insert(m_encodedData.end(), data.begin(), data.end());
}
void ContractCallDataEncoder::encode(QVariableDeclaration* _dec, u256 _value)
void ContractCallDataEncoder::encode(QVariableDeclaration const* _dec, u256 _value)
{
int padding = this->padding(_dec->type());
std::ostringstream s;

6
mix/ContractCallDataEncoder.h

@ -34,10 +34,10 @@ class ContractCallDataEncoder
{
public:
ContractCallDataEncoder();
void encode(QVariableDeclaration* _dec, QString _value);
void encode(QVariableDeclaration* _dec, u256 _value);
void encode(QVariableDeclaration const* _dec, QString _value);
void encode(QVariableDeclaration const* _dec, u256 _value);
QList<QVariableDefinition*> decode(QList<QObject*> _dec, bytes _value);
void encode(QVariableDeclaration* _dec, bool _value);
void encode(QVariableDeclaration const* _dec, bool _value);
void encode(int _functionIndex);
bytes encodedData();

21
mix/Extension.cpp

@ -19,26 +19,27 @@
#include <QMessageBox>
#include <QDebug>
#include <QQmlApplicationEngine>
#include <libevm/VM.h>
#include "Extension.h"
#include "AppContext.h"
using namespace dev;
using namespace dev::mix;
Extension::Extension()
Extension::Extension(AppContext* _context)
{
init();
init(_context);
}
Extension::Extension(ExtensionDisplayBehavior _displayBehavior)
Extension::Extension(AppContext* _context, ExtensionDisplayBehavior _displayBehavior)
{
init();
init(_context);
m_displayBehavior = _displayBehavior;
}
void Extension::init()
void Extension::init(AppContext* _context)
{
m_ctx = AppContext::getInstance();
m_ctx = _context;
m_appEngine = m_ctx->appEngine();
}
@ -49,7 +50,7 @@ void Extension::addTabOn(QObject* _view)
QVariant returnValue;
QQmlComponent* component = new QQmlComponent(
AppContext::getInstance()->appEngine(),
m_appEngine,
QUrl(contentUrl()), _view);
QMetaObject::invokeMethod(_view, "addTab",
@ -65,9 +66,9 @@ void Extension::addContentOn(QObject* _view)
Q_UNUSED(_view);
if (m_displayBehavior == ExtensionDisplayBehavior::ModalDialog)
{
QQmlComponent* component = new QQmlComponent(AppContext::getInstance()->appEngine(), QUrl(contentUrl()), _view);
QObject* dialogWin = AppContext::getInstance()->appEngine()->rootObjects().at(0)->findChild<QObject*>("dialog", Qt::FindChildrenRecursively);
QObject* dialogWinComponent = AppContext::getInstance()->appEngine()->rootObjects().at(0)->findChild<QObject*>("modalDialogContent", Qt::FindChildrenRecursively);
QQmlComponent* component = new QQmlComponent(m_appEngine, QUrl(contentUrl()), _view);
QObject* dialogWin = m_appEngine->rootObjects().at(0)->findChild<QObject*>("dialog", Qt::FindChildrenRecursively);
QObject* dialogWinComponent = m_appEngine->rootObjects().at(0)->findChild<QObject*>("modalDialogContent", Qt::FindChildrenRecursively);
dialogWinComponent->setProperty("sourceComponent", QVariant::fromValue(component));
dialogWin->setProperty("title", title());
QMetaObject::invokeMethod(dialogWin, "open");

11
mix/Extension.h

@ -21,13 +21,16 @@
#include <QApplication>
#include <QQmlComponent>
#include "AppContext.h"
class QQmlApplicationEngine;
namespace dev
{
namespace mix
{
class AppContext;
enum ExtensionDisplayBehavior
{
Tab,
@ -41,8 +44,8 @@ class Extension: public QObject
Q_OBJECT
public:
Extension();
Extension(ExtensionDisplayBehavior _displayBehavior);
Extension(AppContext* _context);
Extension(AppContext* _context, ExtensionDisplayBehavior _displayBehavior);
virtual QString contentUrl() const { return ""; }
virtual QString title() const { return ""; }
virtual void start() const {}
@ -58,7 +61,7 @@ protected:
QQmlApplicationEngine* m_appEngine;
private:
void init();
void init(AppContext* _context);
};
}

8
mix/KeyEventManager.cpp

@ -25,6 +25,11 @@
#include <QKeySequence>
#include "KeyEventManager.h"
namespace dev
{
namespace mix
{
void KeyEventManager::registerEvent(const QObject* _receiver, const char* _slot)
{
QObject::connect(this, SIGNAL(onKeyPressed(int)), _receiver, _slot);
@ -39,3 +44,6 @@ void KeyEventManager::keyPressed(QVariant _event)
{
emit onKeyPressed(_event.toInt());
}
}
}

7
mix/KeyEventManager.h

@ -24,6 +24,11 @@
#include <QObject>
namespace dev
{
namespace mix
{
class KeyEventManager: public QObject
{
Q_OBJECT
@ -40,3 +45,5 @@ public slots:
void keyPressed(QVariant _event);
};
}
}

26
mix/MixApplication.cpp

@ -20,26 +20,22 @@
*/
#include <QDebug>
#include <QQmlApplicationEngine>
#include "CodeEditorExtensionManager.h"
#include "MixApplication.h"
#include "AppContext.h"
using namespace dev::mix;
MixApplication::MixApplication(int _argc, char* _argv[]): QApplication(_argc, _argv)
MixApplication::MixApplication(int _argc, char* _argv[]):
QApplication(_argc, _argv), m_engine(new QQmlApplicationEngine()), m_appContext(new AppContext(m_engine.get()))
{
qmlRegisterType<CodeEditorExtensionManager>("CodeEditorExtensionManager", 1, 0, "CodeEditorExtensionManager");
m_engine->load(QUrl("qrc:/qml/main.qml"));
QObject::connect(this, SIGNAL(lastWindowClosed()), context(), SLOT(quitApplication())); //use to kill ApplicationContext and other stuff
QObject::connect(engine(), SIGNAL(objectCreated(QObject*, QUrl)), context(), SLOT(resourceLoaded(QObject*, QUrl)));
}
bool MixApplication::notify(QObject* _receiver, QEvent* _event)
MixApplication::~MixApplication()
{
try
{
return MixApplication::notify(_receiver, _event);
}
catch (std::exception& _ex)
{
qDebug() << "std::exception was caught " << _ex.what();
}
catch (...)
{
qDebug() << "uncaught exception ";
}
return false;
}

13
mix/MixApplication.h

@ -23,21 +23,30 @@
#pragma once
#include <memory>
#include <QApplication>
class QQmlApplicationEngine;
namespace dev
{
namespace mix
{
class AppContext;
class MixApplication: public QApplication
{
Q_OBJECT
public:
MixApplication(int _argc, char* _argv[]);
virtual ~MixApplication() {}
virtual bool notify(QObject* _receiver, QEvent* _event);
virtual ~MixApplication();
AppContext* context() { return m_appContext.get(); }
QQmlApplicationEngine* engine( ) { return m_engine.get(); }
private:
std::unique_ptr<QQmlApplicationEngine> m_engine;
std::unique_ptr<AppContext> m_appContext;
};
}

6
mix/QBasicNodeDefinition.h

@ -38,11 +38,11 @@ public:
QBasicNodeDefinition(): QObject() {}
~QBasicNodeDefinition() {
}
QBasicNodeDefinition(dev::solidity::Declaration* _d): QObject(), m_dec(_d) {}
QString name() const { return QString::fromStdString(m_dec->getName()); }
QBasicNodeDefinition(dev::solidity::Declaration const* _d): QObject(), m_name(QString::fromStdString(_d->getName())) {}
QString name() const { return m_name; }
protected:
dev::solidity::Declaration* m_dec;
QString m_name;
};
}

22
mix/QContractDefinition.cpp

@ -31,27 +31,13 @@
using namespace dev::solidity;
using namespace dev::mix;
std::shared_ptr<QContractDefinition> QContractDefinition::Contract(QString _source)
QContractDefinition::QContractDefinition(dev::solidity::ContractDefinition const* _contract): QBasicNodeDefinition(_contract)
{
CompilerStack* comp = AppContext::getInstance()->compiler();
comp->addSource("contract", _source.toStdString());
comp->parse();
SourceUnit const& unit = comp->getAST("contract");
ContractDefinition* def = (ContractDefinition*)unit.getNodes().at(0).get();
return std::make_shared<QContractDefinition>(def);
}
QContractDefinition::QContractDefinition(ContractDefinition* _contract): QBasicNodeDefinition(_contract)
{
initQFunctions();
}
void QContractDefinition::initQFunctions()
{
std::vector<FunctionDefinition const*> functions = ((ContractDefinition*)m_dec)->getInterfaceFunctions();
std::vector<FunctionDefinition const*> functions = _contract->getInterfaceFunctions();
for (unsigned i = 0; i < functions.size(); i++)
{
FunctionDefinition* func = (FunctionDefinition*)functions.at(i);
FunctionDefinition const* func = functions.at(i);
m_functions.append(new QFunctionDefinition(func, i));
}
}

10
mix/QContractDefinition.h

@ -34,16 +34,14 @@ namespace mix
class QContractDefinition: public QBasicNodeDefinition
{
Q_OBJECT
Q_PROPERTY(QList<QFunctionDefinition*> functions READ functions)
Q_PROPERTY(QList<QFunctionDefinition const*> functions READ functions)
public:
QContractDefinition(dev::solidity::ContractDefinition* _contract);
QList<QFunctionDefinition*> functions() const { return m_functions; }
static std::shared_ptr<QContractDefinition> Contract(QString _code);
QContractDefinition(dev::solidity::ContractDefinition const* _contract);
QList<QFunctionDefinition const*> functions() const { return m_functions; }
private:
QList<QFunctionDefinition*> m_functions;
void initQFunctions();
QList<QFunctionDefinition const*> m_functions;
};
}

6
mix/QFunctionDefinition.cpp

@ -25,15 +25,15 @@
using namespace dev::solidity;
using namespace dev::mix;
void QFunctionDefinition::initQParameters()
QFunctionDefinition::QFunctionDefinition(dev::solidity::FunctionDefinition const* _f, int _index): QBasicNodeDefinition(_f), m_index(_index)
{
std::vector<std::shared_ptr<VariableDeclaration>> parameters = ((FunctionDefinition*)m_dec)->getParameterList().getParameters();
std::vector<std::shared_ptr<VariableDeclaration>> parameters = _f->getParameterList().getParameters();
for (unsigned i = 0; i < parameters.size(); i++)
{
m_parameters.append(new QVariableDeclaration(parameters.at(i).get()));
}
std::vector<std::shared_ptr<VariableDeclaration>> returnParameters = ((FunctionDefinition*)m_dec)->getReturnParameters();
std::vector<std::shared_ptr<VariableDeclaration>> returnParameters = _f->getReturnParameters();
for (unsigned i = 0; i < returnParameters.size(); i++)
{
m_returnParameters.append(new QVariableDeclaration(returnParameters.at(i).get()));

3
mix/QFunctionDefinition.h

@ -37,7 +37,7 @@ class QFunctionDefinition: public QBasicNodeDefinition
Q_PROPERTY(int index READ index)
public:
QFunctionDefinition(dev::solidity::FunctionDefinition* _f, int _index): QBasicNodeDefinition(_f), m_index(_index) { initQParameters(); }
QFunctionDefinition(dev::solidity::FunctionDefinition const* _f, int _index);
QList<QObject*> parameters() const { return m_parameters; }
QList<QObject*> returnParameters() const { return m_returnParameters; }
int index() const { return m_index; }
@ -46,7 +46,6 @@ private:
QList<QObject*> m_parameters;
QList<QObject*> m_returnParameters;
int m_index;
void initQParameters();
};
}

6
mix/QVariableDeclaration.h

@ -35,8 +35,10 @@ class QVariableDeclaration: public QBasicNodeDefinition
Q_PROPERTY(QString type READ type)
public:
QVariableDeclaration(dev::solidity::VariableDeclaration* _v): QBasicNodeDefinition(_v){}
QString type() const { return QString::fromStdString(((solidity::VariableDeclaration*)m_dec)->getType()->toString()); }
QVariableDeclaration(dev::solidity::VariableDeclaration const* _v): QBasicNodeDefinition(_v), m_type(QString::fromStdString(_v->getType()->toString())) {}
QString type() const { return m_type; }
private:
QString m_type;
};
}

8
mix/QVariableDefinition.h

@ -33,16 +33,16 @@ class QVariableDefinition: public QObject
{
Q_OBJECT
Q_PROPERTY(QString value READ value)
Q_PROPERTY(QVariableDeclaration* declaration READ declaration)
Q_PROPERTY(QVariableDeclaration const* declaration READ declaration)
public:
QVariableDefinition(QVariableDeclaration* _def, QString _value): QObject(_def->parent()), m_value(_value), m_dec(_def) {}
QVariableDefinition(QVariableDeclaration const* _dec, QString _value): QObject(_dec->parent()), m_dec(_dec), m_value(_value) {}
QVariableDeclaration* declaration() const { return m_dec; }
QVariableDeclaration const* declaration() const { return m_dec; }
QString value() const { return m_value; }
private:
QVariableDeclaration* m_dec;
QVariableDeclaration const* m_dec;
QString m_value;
};

76
mix/TransactionListModel.cpp

@ -24,11 +24,13 @@
#include <QQmlEngine>
#include <QTextDocument>
#include <QAbstractListModel>
#include "libdevcore/CommonJS.h"
#include "TransactionListModel.h"
#include "QContractDefinition.h"
#include "QFunctionDefinition.h"
#include "QVariableDeclaration.h"
#include "libdevcore/CommonJS.h"
#include "AppContext.h"
#include "CodeModel.h"
namespace dev
{
@ -54,8 +56,8 @@ TransactionListItem::TransactionListItem(int _index, TransactionSettings const&
m_gas(toQString(_t.gas)), m_gasPrice(toQString(_t.gasPrice))
{}
TransactionListModel::TransactionListModel(QObject* _parent, QTextDocument* _document):
QAbstractListModel(_parent), m_document(_document)
TransactionListModel::TransactionListModel(QObject* _parent, AppContext* _appContext):
QAbstractListModel(_parent), m_appContext(_appContext)
{}
QHash<int, QByteArray> TransactionListModel::roleNames() const
@ -89,43 +91,34 @@ QVariant TransactionListModel::data(QModelIndex const& _index, int _role) const
}
///@todo: get parameters from code model
QList<TransactionParameterItem*> buildParameters(QTextDocument* _document, TransactionSettings const& _transaction, QString const& _functionId)
QList<TransactionParameterItem*> buildParameters(CodeModel* _codeModel, TransactionSettings const& _transaction, QString const& _functionId)
{
QList<TransactionParameterItem*> params;
try
QContractDefinition const* contract = _codeModel->lastCompilationResult()->contract();
auto functions = contract->functions();
for (auto qf : functions)
{
QString code = _document->toPlainText().replace("\n", ""); //TODO: is this required?
std::shared_ptr<QContractDefinition> contract = QContractDefinition::Contract(code);
auto functions = contract->functions();
for (auto qf : functions)
{
QFunctionDefinition const& f = (QFunctionDefinition const&) *qf;
if (f.name() != _functionId)
continue;
QFunctionDefinition const& f = (QFunctionDefinition const&) *qf;
if (f.name() != _functionId)
continue;
auto parameters = f.parameters();
for (auto qp : parameters)
auto parameters = f.parameters();
for (auto qp : parameters)
{
QVariableDeclaration const& p = (QVariableDeclaration const&) *qp;
QString paramValue;
if (f.name() == _transaction.functionId)
{
QVariableDeclaration const& p = (QVariableDeclaration const&) *qp;
QString paramValue;
if (f.name() == _transaction.functionId)
{
auto paramValueIter = _transaction.parameterValues.find(p.name());
if (paramValueIter != _transaction.parameterValues.cend())
paramValue = toQString(paramValueIter->second);
}
TransactionParameterItem* item = new TransactionParameterItem(p.name(), p.type(), paramValue);
QQmlEngine::setObjectOwnership(item, QQmlEngine::JavaScriptOwnership);
params.append(item);
auto paramValueIter = _transaction.parameterValues.find(p.name());
if (paramValueIter != _transaction.parameterValues.cend())
paramValue = toQString(paramValueIter->second);
}
TransactionParameterItem* item = new TransactionParameterItem(p.name(), p.type(), paramValue);
QQmlEngine::setObjectOwnership(item, QQmlEngine::JavaScriptOwnership);
params.append(item);
}
}
catch (boost::exception const&)
{
//TODO:
}
return params;
}
@ -133,19 +126,12 @@ QList<TransactionParameterItem*> buildParameters(QTextDocument* _document, Trans
QList<QString> TransactionListModel::getFunctions()
{
QList<QString> functionNames;
try
{
QString code = m_document->toPlainText().replace("\n", ""); //TODO: is this required?
std::shared_ptr<QContractDefinition> contract(QContractDefinition::Contract(code));
auto functions = contract->functions();
for (auto qf : functions)
{
QFunctionDefinition const& f = (QFunctionDefinition const&) * qf;
functionNames.append(f.name());
}
}
catch (boost::exception const&)
QContractDefinition const* contract = m_appContext->codeModel()->lastCompilationResult()->contract();
auto functions = contract->functions();
for (auto qf : functions)
{
QFunctionDefinition const& f = (QFunctionDefinition const&) * qf;
functionNames.append(f.name());
}
return functionNames;
}
@ -153,7 +139,7 @@ QList<QString> TransactionListModel::getFunctions()
QVariantList TransactionListModel::getParameters(int _index, QString const& _functionId)
{
TransactionSettings const& transaction = (_index >= 0 && _index < (int)m_transactions.size()) ? m_transactions[_index] : TransactionSettings();
auto plist = buildParameters(m_document, transaction, _functionId);
auto plist = buildParameters(m_appContext->codeModel(), transaction, _functionId);
QVariantList vl;
for (QObject* p : plist)
vl.append(QVariant::fromValue(p));

8
mix/TransactionListModel.h

@ -30,13 +30,13 @@
#include <libdevcore/Common.h>
#include <libethcore/CommonEth.h>
class QTextDocument;
namespace dev
{
namespace mix
{
class AppContext;
/// Backend transaction config class
struct TransactionSettings
{
@ -132,7 +132,7 @@ class TransactionListModel: public QAbstractListModel
};
public:
TransactionListModel(QObject* _parent, QTextDocument* _document);
TransactionListModel(QObject* _parent, AppContext* _appContext);
~TransactionListModel() {}
QHash<int, QByteArray> roleNames() const override;
@ -159,7 +159,7 @@ signals:
private:
std::vector<TransactionSettings> m_transactions;
QTextDocument* m_document;
AppContext* m_appContext;
};
}

5
mix/TransactionListView.cpp

@ -29,10 +29,9 @@
#include "TransactionListModel.h"
using namespace dev::mix;
TransactionListView::TransactionListView(QTextDocument* _doc): Extension(ExtensionDisplayBehavior::RightTab)
TransactionListView::TransactionListView(AppContext* _context): Extension(_context, ExtensionDisplayBehavior::RightTab)
{
m_editor = _doc;
m_model.reset(new TransactionListModel(this, _doc));
m_model.reset(new TransactionListModel(this, _context));
m_appEngine->rootContext()->setContextProperty("transactionListModel", m_model.get());
}

4
mix/TransactionListView.h

@ -19,6 +19,7 @@
#pragma once
#include <memory>
#include <QTextDocument>
#include "TransactionListView.h"
#include "Extension.h"
@ -37,7 +38,7 @@ class TransactionListView: public Extension
Q_OBJECT
public:
TransactionListView(QTextDocument*);
TransactionListView(AppContext* _context);
~TransactionListView();
void start() const override;
QString title() const override;
@ -46,7 +47,6 @@ public:
TransactionListModel* model() const { return m_model.get(); }
private:
QTextDocument* m_editor;
std::unique_ptr<TransactionListModel> m_model;
};

13
mix/main.cpp

@ -20,22 +20,11 @@
* Ethereum IDE client.
*/
#include <QApplication>
#include <QQmlApplicationEngine>
#include <QQuickItem>
#include "CodeEditorExtensionManager.h"
#include "AppContext.h"
#include "MixApplication.h"
using namespace dev::mix;
int main(int _argc, char *_argv[])
{
QApplication app(_argc, _argv);
qmlRegisterType<CodeEditorExtensionManager>("CodeEditorExtensionManager", 1, 0, "CodeEditorExtensionManager");
QQmlApplicationEngine* engine = new QQmlApplicationEngine();
AppContext::setApplicationContext(engine);
QObject::connect(&app, SIGNAL(lastWindowClosed()), AppContext::getInstance(), SLOT(quitApplication())); //use to kill ApplicationContext and other stuff
QObject::connect(engine, SIGNAL(objectCreated(QObject*, QUrl)), AppContext::getInstance(), SLOT(resourceLoaded(QObject*, QUrl)));
engine->load(QUrl("qrc:/qml/main.qml"));
MixApplication app(_argc, _argv);
return app.exec();
}

Loading…
Cancel
Save