Browse Source

started CodeModel

cl-refactor
arkpar 10 years ago
parent
commit
a9a85210aa
  1. 81
      mix/CodeModel.cpp
  2. 109
      mix/CodeModel.h

81
mix/CodeModel.cpp

@ -0,0 +1,81 @@
/*
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 CodeModel.cpp
* @author Arkadiy Paronyan arkadiy@ethdev.com
* @date 2014
* Ethereum IDE client.
*/
#include "CodeModel.h"
namespace dev
{
namespace mix
{
void BackgroundWorker::queueCodeChange(int _jobId, QString const& _content)
{
m_model->runCompilationJob(_jobId, _content);
}
CodeModel::CodeModel(QObject* _parent) : QObject(_parent), m_backgroundWorker(this)
{
m_backgroundWorker.moveToThread(&m_backgroundThread);
connect(this, &CodeModel::compilationComplete, this, &CodeModel::onCompilationComplete, Qt::QueuedConnection);
connect(this, &CodeModel::scheduleCompilationJob, &m_backgroundWorker, &BackgroundWorker::queueCodeChange, Qt::QueuedConnection);
m_backgroundThread.start();
}
CodeModel::~CodeModel()
{
stop();
disconnect(this);
}
void CodeModel::stop()
{
///@todo: cancel bg job
m_backgroundThread.exit();
m_backgroundThread.wait();
}
void CodeModel::registerCodeChange(const QString &_code)
{
// launch the background thread
m_backgroundJobId++;
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)
{
if (_jobId != m_backgroundJobId)
return; //obsolete job
}
}
}

109
mix/CodeModel.h

@ -0,0 +1,109 @@
/*
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 CodeModel.h
* @author Arkadiy Paronyan arkadiy@ethdev.com
* @date 2014
* Ethereum IDE client.
*/
#pragma once
#include <QObject>
#include <QThread>
#include <libdevcore/Common.h>
namespace dev
{
namespace mix
{
class CodeModel;
class QContractDefinition;
class BackgroundWorker: public QObject
{
Q_OBJECT
public:
BackgroundWorker(CodeModel* _model): QObject(), m_model(_model) {}
public slots:
void queueCodeChange(int _jobId, QString const& _content);
private:
CodeModel* m_model;
};
class CompilationResult : public QObject
{
Q_OBJECT
Q_PROPERTY(QContractDefinition const* contract READ contract)
public:
QContractDefinition const* contract() { return m_contract; }
private:
bool m_successfull;
QContractDefinition* m_contract;
QString m_hexCode;
QString m_compilerMessage; ///< @todo: use some structure here
dev::bytes m_bytes;
///@todo syntax highlighting, etc
};
class CodeModel : public QObject
{
enum Status
{
Idle,
Compiling,
};
Q_OBJECT
public:
CodeModel(QObject* _parent);
~CodeModel();
CompilationResult* getLastCompilationResult();
signals:
void statusChanged(Status _from, Status _to);
void compilationComplete(std::shared_ptr<CompilationResult> _compilationResult);
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();
std::shared_ptr<CompilationResult> m_result;
QThread m_backgroundThread;
BackgroundWorker m_backgroundWorker;
int m_backgroundJobId = 0; //protects from starting obsolete compilation job
friend class BackgroundWorker;
};
}
}
Loading…
Cancel
Save