Gav Wood
10 years ago
38 changed files with 774 additions and 762 deletions
@ -0,0 +1,69 @@ |
|||
/*
|
|||
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 QVariableDeclaration.app
|
|||
* @author Yann yann@ethdev.com |
|||
* @author Arkadiy Paronyan arkadiy@ethdev.com |
|||
* @date 2015 |
|||
*/ |
|||
|
|||
#include "QVariableDeclaration.h" |
|||
#include "CodeModel.h" |
|||
|
|||
namespace dev |
|||
{ |
|||
namespace mix |
|||
{ |
|||
|
|||
QVariableDeclaration::QVariableDeclaration(QObject* _parent, solidity::VariableDeclaration const* _v): |
|||
QBasicNodeDefinition(_parent, _v), |
|||
m_type(new QSolidityType(this, CodeModel::nodeType(_v->getType().get()))) |
|||
{ |
|||
} |
|||
|
|||
QVariableDeclaration::QVariableDeclaration(QObject* _parent, std::string const& _name, SolidityType const& _type): |
|||
QBasicNodeDefinition(_parent, _name), |
|||
m_type(new QSolidityType(_parent, _type)) |
|||
{ |
|||
} |
|||
|
|||
QVariableDeclaration::QVariableDeclaration(QObject* _parent, std::string const& _name, solidity::Type const* _type): |
|||
QBasicNodeDefinition(_parent, _name), |
|||
m_type(new QSolidityType(this, CodeModel::nodeType(_type))) |
|||
{ |
|||
} |
|||
|
|||
QSolidityType::QSolidityType(QObject* _parent, SolidityType const& _type): |
|||
QObject(_parent), |
|||
m_type(_type) |
|||
{ |
|||
} |
|||
|
|||
QVariantList QSolidityType::members() const |
|||
{ |
|||
QVariantList members; |
|||
if (m_type.type == Type::Struct) |
|||
for (auto const& structMember: m_type.members) |
|||
members.push_back(QVariant::fromValue(new QVariableDeclaration(parent(), structMember.name.toStdString(), structMember.type))); |
|||
if (m_type.type == Type::Enum) |
|||
for (auto const& enumName: m_type.enumNames) |
|||
members.push_back(QVariant::fromValue(enumName)); |
|||
return members; |
|||
} |
|||
|
|||
} |
|||
} |
|||
|
@ -1,145 +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 QVariableDefinition.h
|
|||
* @author Yann yann@ethdev.com |
|||
* @date 2014 |
|||
*/ |
|||
|
|||
#include <libdevcore/CommonData.h> |
|||
#include <libethcore/CommonJS.h> |
|||
#include "QVariableDefinition.h" |
|||
|
|||
using namespace dev::mix; |
|||
int QVariableDefinitionList::rowCount(const QModelIndex& _parent) const |
|||
{ |
|||
Q_UNUSED(_parent); |
|||
return m_def.size(); |
|||
} |
|||
|
|||
QVariant QVariableDefinitionList::data(const QModelIndex& _index, int _role) const |
|||
{ |
|||
if (_role != Qt::DisplayRole) |
|||
return QVariant(); |
|||
|
|||
int i = _index.row(); |
|||
if (i < 0 || i >= m_def.size()) |
|||
return QVariant(QVariant::Invalid); |
|||
|
|||
return QVariant::fromValue(m_def.at(i)); |
|||
} |
|||
|
|||
QHash<int, QByteArray> QVariableDefinitionList::roleNames() const |
|||
{ |
|||
QHash<int, QByteArray> roles; |
|||
roles[Qt::DisplayRole] = "variable"; |
|||
return roles; |
|||
} |
|||
|
|||
QVariableDefinition* QVariableDefinitionList::val(int _idx) |
|||
{ |
|||
if (_idx < 0 || _idx >= m_def.size()) |
|||
return nullptr; |
|||
return m_def.at(_idx); |
|||
} |
|||
|
|||
/*
|
|||
* QIntType |
|||
*/ |
|||
void QIntType::setValue(dev::bigint _value) |
|||
{ |
|||
m_bigIntvalue = _value; |
|||
std::stringstream str; |
|||
str << std::dec << m_bigIntvalue; |
|||
m_value = QString::fromStdString(str.str()); |
|||
} |
|||
|
|||
dev::bytes QIntType::encodeValue() |
|||
{ |
|||
dev::bigint i(value().toStdString()); |
|||
bytes ret(32); |
|||
toBigEndian((u256)i, ret); |
|||
return ret; |
|||
} |
|||
|
|||
void QIntType::decodeValue(dev::bytes const& _rawValue) |
|||
{ |
|||
dev::u256 un = dev::fromBigEndian<dev::u256>(_rawValue); |
|||
if (un >> 255) |
|||
setValue(-s256(~un + 1)); |
|||
else |
|||
setValue(un); |
|||
} |
|||
|
|||
/*
|
|||
* QHashType |
|||
*/ |
|||
dev::bytes QHashType::encodeValue() |
|||
{ |
|||
QByteArray bytesAr = value().toLocal8Bit(); |
|||
bytes r = bytes(bytesAr.begin(), bytesAr.end()); |
|||
return padded(r, 32); |
|||
} |
|||
|
|||
void QHashType::decodeValue(dev::bytes const& _rawValue) |
|||
{ |
|||
std::string _ret = asString(unpadLeft(_rawValue)); |
|||
setValue(QString::fromStdString(_ret)); |
|||
} |
|||
|
|||
/*
|
|||
* QRealType |
|||
*/ |
|||
dev::bytes QRealType::encodeValue() |
|||
{ |
|||
return bytes(); |
|||
} |
|||
|
|||
void QRealType::decodeValue(dev::bytes const& _rawValue) |
|||
{ |
|||
Q_UNUSED(_rawValue); |
|||
} |
|||
|
|||
/*
|
|||
* QStringType |
|||
*/ |
|||
dev::bytes QStringType::encodeValue() |
|||
{ |
|||
QByteArray b = value().toUtf8(); |
|||
bytes r = bytes(b.begin(), b.end()); |
|||
return paddedRight(r, 32); |
|||
} |
|||
|
|||
void QStringType::decodeValue(dev::bytes const& _rawValue) |
|||
{ |
|||
setValue(QString::fromUtf8((char*)_rawValue.data())); |
|||
} |
|||
|
|||
/*
|
|||
* QBoolType |
|||
*/ |
|||
dev::bytes QBoolType::encodeValue() |
|||
{ |
|||
return padded(jsToBytes(value().toStdString()), 32); |
|||
} |
|||
|
|||
void QBoolType::decodeValue(dev::bytes const& _rawValue) |
|||
{ |
|||
byte ret = _rawValue.at(_rawValue.size() - 1); |
|||
bool boolRet = (ret == byte(1)); |
|||
m_boolValue = boolRet; |
|||
m_value = m_boolValue ? "1" : "0"; |
|||
} |
@ -0,0 +1,66 @@ |
|||
/*
|
|||
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 SolidityType.h
|
|||
* @author Yann yann@ethdev.com |
|||
* @author Arkadiy Paronyan arkadiy@ethdev.com |
|||
* @date 2015 |
|||
* Ethereum IDE client. |
|||
*/ |
|||
|
|||
#pragma once |
|||
|
|||
#include <QString> |
|||
#include <vector> |
|||
|
|||
namespace dev |
|||
{ |
|||
namespace mix |
|||
{ |
|||
|
|||
struct SolidityDeclaration; |
|||
|
|||
//Type info extracted from solidity AST
|
|||
struct SolidityType |
|||
{ |
|||
enum Type //keep in sync with QSolidity::Type
|
|||
{ |
|||
SignedInteger, |
|||
UnsignedInteger, |
|||
Hash, //TODO: remove
|
|||
Bool, |
|||
Address, |
|||
Bytes, |
|||
Enum, |
|||
Struct |
|||
}; |
|||
Type type; |
|||
unsigned size; //in bytes,
|
|||
bool array; |
|||
bool dynamicSize; |
|||
QString name; |
|||
std::vector<SolidityDeclaration> members; //for struct
|
|||
std::vector<QString> enumNames; //for enum
|
|||
}; |
|||
|
|||
struct SolidityDeclaration |
|||
{ |
|||
QString name; |
|||
SolidityType type; |
|||
}; |
|||
|
|||
} |
|||
} |
@ -1,7 +0,0 @@ |
|||
import QtQuick 2.0 |
|||
import org.ethereum.qml.QBoolType 1.0 |
|||
|
|||
QBoolType |
|||
{ |
|||
} |
|||
|
@ -1,7 +0,0 @@ |
|||
import QtQuick 2.0 |
|||
import org.ethereum.qml.QHashType 1.0 |
|||
|
|||
QHashType |
|||
{ |
|||
} |
|||
|
@ -1,7 +0,0 @@ |
|||
import QtQuick 2.0 |
|||
import org.ethereum.qml.QIntType 1.0 |
|||
|
|||
QIntType |
|||
{ |
|||
} |
|||
|
@ -1,7 +0,0 @@ |
|||
import QtQuick 2.0 |
|||
import org.ethereum.qml.QRealType 1.0 |
|||
|
|||
QRealType |
|||
{ |
|||
} |
|||
|
@ -1,7 +0,0 @@ |
|||
import QtQuick 2.0 |
|||
import org.ethereum.qml.QStringType 1.0 |
|||
|
|||
QStringType |
|||
{ |
|||
} |
|||
|
@ -0,0 +1,90 @@ |
|||
import QtQuick 2.0 |
|||
import QtQuick.Controls 1.1 |
|||
import QtQuick.Layouts 1.1 |
|||
import org.ethereum.qml.QSolidityType 1.0 |
|||
|
|||
Column |
|||
{ |
|||
id: root |
|||
property alias members: repeater.model //js array |
|||
property var value : { } |
|||
Layout.fillWidth: true |
|||
|
|||
Repeater |
|||
{ |
|||
id: repeater |
|||
visible: model.length > 0 |
|||
Layout.fillWidth: true |
|||
RowLayout |
|||
{ |
|||
id: row |
|||
height: 20 + (members[index].type.category === QSolidityType.Struct ? (20 * members[index].type.members.length) : 0) |
|||
Layout.fillWidth: true |
|||
DefaultLabel { |
|||
height: 20 |
|||
id: typeLabel |
|||
text: modelData.type.name |
|||
Layout.preferredWidth: 50 |
|||
} |
|||
|
|||
DefaultLabel { |
|||
id: nameLabel |
|||
text: modelData.name |
|||
Layout.preferredWidth: 80 |
|||
} |
|||
|
|||
DefaultLabel { |
|||
id: equalLabel |
|||
text: "=" |
|||
Layout.preferredWidth: 15 |
|||
} |
|||
Loader |
|||
{ |
|||
id: typeLoader |
|||
Layout.preferredWidth: 150 |
|||
sourceComponent: |
|||
{ |
|||
var t = modelData.type.category; |
|||
if (t === QSolidityType.SignedInteger || t === QSolidityType.UnsignedInteger) |
|||
return Qt.createComponent("qrc:/qml/QIntTypeView.qml"); |
|||
else if (t === QSolidityType.Bool) |
|||
return Qt.createComponent("qrc:/qml/QBoolTypeView.qml"); |
|||
else if (t === QSolidityType.Bytes) |
|||
return Qt.createComponent("qrc:/qml/QStringTypeView.qml"); |
|||
else if (t === QSolidityType.Hash || t === QSolidityType.Address) |
|||
return Qt.createComponent("qrc:/qml/QHashTypeView.qml"); |
|||
else if (t === QSolidityType.Struct) |
|||
return Qt.createComponent("qrc:/qml/StructView.qml"); |
|||
else |
|||
return undefined; |
|||
} |
|||
onLoaded: |
|||
{ |
|||
var ptype = members[index].type; |
|||
var pname = members[index].name; |
|||
var vals = value; |
|||
if (ptype.category === QSolidityType.Struct && !item.members) { |
|||
item.value = getValue(); |
|||
item.members = ptype.members; |
|||
} |
|||
else |
|||
item.value = getValue(); |
|||
|
|||
item.onValueChanged.connect(function() { |
|||
vals[pname] = item.value; |
|||
valueChanged(); |
|||
}); |
|||
} |
|||
|
|||
function getValue() |
|||
{ |
|||
if (value && value[modelData.name] !== undefined) |
|||
return value[modelData.name]; |
|||
else if (modelData.type.category === QSolidityType.Struct) |
|||
return {}; |
|||
return ""; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,39 @@ |
|||
import QtQuick 2.2 |
|||
import QtQuick.Controls 1.1 |
|||
import QtQuick.Controls.Styles 1.1 |
|||
import QtQuick.Layouts 1.1 |
|||
import "." |
|||
|
|||
DebugInfoList |
|||
{ |
|||
id: storage |
|||
collapsible: true |
|||
title : qsTr("Storage") |
|||
componentDelegate: structComp |
|||
|
|||
Component |
|||
{ |
|||
id: structComp |
|||
ScrollView |
|||
{ |
|||
property alias members: typeLoader.members; |
|||
property alias value: typeLoader.value; |
|||
anchors.fill: parent |
|||
StructView |
|||
{ |
|||
id: typeLoader |
|||
members: [] |
|||
value: {} |
|||
Layout.preferredWidth: parent.width |
|||
} |
|||
} |
|||
} |
|||
|
|||
function setData(members, values) { |
|||
storage.item.value = {}; |
|||
storage.item.members = []; |
|||
storage.item.value = values; //TODO: use a signal for this? |
|||
storage.item.members = members; |
|||
} |
|||
} |
|||
|
Loading…
Reference in new issue