Browse Source

m1

cl-refactor
yann300 10 years ago
parent
commit
d84ec425e7
  1. 33
      mix/ApplicationContext.cpp
  2. 23
      mix/ApplicationContext.h
  3. 36
      mix/BasicContent.qml
  4. 94
      mix/CMakeLists.txt
  5. 60
      mix/CodeEditorExtensionMan.cpp
  6. 28
      mix/CodeEditorExtensionMan.h
  7. 88
      mix/ConstantCompilation.cpp
  8. 26
      mix/ConstantCompilation.h
  9. 5
      mix/ContextualTabs.qml
  10. 33
      mix/Feature.cpp
  11. 21
      mix/Feature.h
  12. 47
      mix/MainContent.qml
  13. 29
      mix/Qt47supp.txt
  14. 24
      mix/TabStyle.qml
  15. 19
      mix/main.cpp
  16. 27
      mix/main.qml
  17. 19
      mix/mix.pro
  18. 8
      mix/qml.qrc

33
mix/ApplicationContext.cpp

@ -0,0 +1,33 @@
#include "ApplicationContext.h"
#include <QQmlApplicationEngine>
ApplicationContext* ApplicationContext::m_instance = nullptr;
ApplicationContext::ApplicationContext(QQmlApplicationEngine* _engine)
{
m_applicationEngine = _engine;
}
ApplicationContext::~ApplicationContext()
{
delete m_applicationEngine;
}
ApplicationContext* ApplicationContext::GetInstance()
{
return m_instance;
}
void ApplicationContext::SetApplicationContext(QQmlApplicationEngine* engine)
{
m_instance = new ApplicationContext(engine);
}
QQmlApplicationEngine* ApplicationContext::appEngine(){
return m_applicationEngine;
}
void ApplicationContext::QuitApplication()
{
delete m_instance;
}

23
mix/ApplicationContext.h

@ -0,0 +1,23 @@
#ifndef APPLICATIONCONTEXT_H
#define APPLICATIONCONTEXT_H
#include <QQmlApplicationEngine>
class ApplicationContext : public QObject
{
Q_OBJECT
public:
ApplicationContext(QQmlApplicationEngine*);
~ApplicationContext();
QQmlApplicationEngine* appEngine();
static ApplicationContext* GetInstance();
static void SetApplicationContext(QQmlApplicationEngine*);
private:
static ApplicationContext* m_instance;
QQmlApplicationEngine* m_applicationEngine;
public slots:
void QuitApplication();
};
#endif // APPLICATIONCONTEXT_H

36
mix/BasicContent.qml

@ -0,0 +1,36 @@
import QtQuick 2.3
import QtQuick.Controls 1.2
Rectangle {
anchors.fill: parent
width: parent.width
height: parent.height
color: "lightgray"
Text {
font.pointSize: 7
anchors.left: parent.left
anchors.top: parent.top
anchors.topMargin: 3
anchors.leftMargin: 3
height: 9
font.family: "Sego UI light"
objectName: "status"
id: status
}
TextArea{
readOnly: true
anchors.left: parent.left
anchors.leftMargin: 10
anchors.top: status.bottom
anchors.topMargin: 3
font.pointSize: 7
font.family: "Sego UI light"
height: parent.height * 0.8
width: parent.width - 20
wrapMode: Text.Wrap
backgroundVisible: false
objectName: "content"
id: content
}
}

94
mix/CMakeLists.txt

@ -0,0 +1,94 @@
set(CMAKE_INCLUDE_CURRENT_DIR ON)
aux_source_directory(. SRC_LIST)
include_directories(..)
if (APPLE)
# Add homebrew path for qt5
set(CMAKE_PREFIX_PATH /usr/local/opt/qt5)
include_directories(/usr/local/opt/qt5/include /usr/local/include)
elseif ("${TARGET_PLATFORM}" STREQUAL "w64")
set(SRC_LIST ${SRC_LIST} ../windows/qt_plugin_import.cpp)
include_directories(/usr/x86_64-w64-mingw32/include /usr/x86_64-w64-mingw32/include/QtCore /usr/x86_64-w64-mingw32/include/QtGui /usr/x86_64-w64-mingw32/include/QtQuick /usr/x86_64-w64-mingw32/include/QtQml /usr/x86_64-w64-mingw32/include/QtNetwork /usr/x86_64-w64-mingw32/include/QtWidgets /usr/x86_64-w64-mingw32/include/QtWebKit /usr/x86_64-w64-mingw32/include/QtWebKitWidgets)
elseif (UNIX)
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} ";$ENV{QTDIR}/lib/cmake" /opt/Qt5.3.2/5.3/gcc_64/lib/cmake/Qt5Declarative)
endif ()
find_package(Qt5Core REQUIRED)
find_package(Qt5Gui REQUIRED)
find_package(Qt5Quick REQUIRED)
find_package(Qt5Qml REQUIRED)
find_package(Qt5Network REQUIRED)
find_package(Qt5Widgets REQUIRED)
find_package(Qt5WebKit REQUIRED)
find_package(Qt5WebKitWidgets REQUIRED)
find_package(Qt5Declarative REQUIRED)
#qt5_wrap_ui(ui_Main.h Main.ui)
qt5_add_resources(UI_RESOURCES qml.qrc)
# Set name of binary and add_executable()
file(GLOB HEADERS "*.h")
if (APPLE)
set(EXECUTEABLE mix)
set(BIN_INSTALL_DIR ".")
set(DOC_INSTALL_DIR ".")
set(PROJECT_VERSION "${ETH_VERSION}")
set(MACOSX_BUNDLE_INFO_STRING "${PROJECT_NAME} ${PROJECT_VERSION}")
set(MACOSX_BUNDLE_BUNDLE_VERSION "${PROJECT_NAME} ${PROJECT_VERSION}")
set(MACOSX_BUNDLE_LONG_VERSION_STRING "${PROJECT_NAME} ${PROJECT_VERSION}")
set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${PROJECT_VERSION}")
set(MACOSX_BUNDLE_COPYRIGHT "${PROJECT_COPYRIGHT_YEAR} ${PROJECT_VENDOR}")
set(MACOSX_BUNDLE_GUI_IDENTIFIER "${PROJECT_DOMAIN_SECOND}.${PROJECT_DOMAIN_FIRST}")
set(MACOSX_BUNDLE_BUNDLE_NAME ${EXECUTEABLE})
set(MACOSX_BUNDLE_ICON_FILE mix)
include(BundleUtilities)
add_executable(${EXECUTEABLE} MACOSX_BUNDLE ${SRC_LIST} ${HEADERS} ${UI_RESOURCES})
set_target_properties(${EXECUTEABLE} PROPERTIES MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/EthereumMacOSXBundleInfo.plist.in")
SET_SOURCE_FILES_PROPERTIES(${EXECUTEABLE} PROPERTIES MACOSX_PACKAGE_LOCATION MacOS)
SET_SOURCE_FILES_PROPERTIES(${MACOSX_BUNDLE_ICON_FILE}.icns PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
else ()
set(EXECUTEABLE mix)
add_executable(${EXECUTEABLE} ${SRC_LIST} ${HEADERS} ${UI_RESOURCES})
endif ()
qt5_use_modules(${EXECUTEABLE} Core)# Gui Widgets Network WebKit WebKitWidgets)
target_link_libraries(${EXECUTEABLE} webthree qethereum ethereum evm ethcore devcrypto secp256k1 gmp ${CRYPTOPP_LS} serpent lll solidity evmcore devcore web3jsonrpc jsqrc)
if (APPLE)
# First have qt5 install plugins and frameworks
add_custom_command(TARGET ${EXECUTEABLE} POST_BUILD
COMMAND /usr/local/opt/qt5/bin/macdeployqt ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${EXECUTEABLE}.app
WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
# This tool and next will inspect linked libraries in order to determine which dependencies are required
if (${CMAKE_CFG_INTDIR} STREQUAL ".")
set(APP_BUNDLE_PATH "${CMAKE_CURRENT_BINARY_DIR}/${EXECUTEABLE}.app")
else ()
set(APP_BUNDLE_PATH "${CMAKE_CURRENT_BINARY_DIR}/\$ENV{CONFIGURATION}/${EXECUTEABLE}.app")
endif ()
install(CODE "
include(BundleUtilities)
set(BU_CHMOD_BUNDLE_ITEMS 1)
fixup_bundle(\"${APP_BUNDLE_PATH}\" \"${BUNDLELIBS}\" \"../libqethereum ../libethereum ../secp256k1\")
" COMPONENT RUNTIME )
# Cleanup duplicate libs from macdeployqt
install(CODE "
file(GLOB LINGER_RM \"${APP_BUNDLE_PATH}/Contents/Frameworks/*.dylib\")
if (LINGER_RM)
file(REMOVE \${LINGER_RM})
endif ()
")
elseif (UNIX)
else ()
target_link_libraries(${EXECUTEABLE} boost_system)
target_link_libraries(${EXECUTEABLE} boost_filesystem)
find_package(Threads REQUIRED)
target_link_libraries(${EXECUTEABLE} ${CMAKE_THREAD_LIBS_INIT})
install( TARGETS ${EXECUTEABLE} RUNTIME DESTINATION bin )
endif ()
qt5_use_modules(${EXECUTEABLE} Core Gui Declarative)

60
mix/CodeEditorExtensionMan.cpp

@ -0,0 +1,60 @@
#include <QQuickItem>
#include <QGraphicsObject>
#include <QtDeclarative/QDeclarativeEngine>
#include <QQmlEngine>
#include <QtDeclarative/QDeclarativeView>
#include <QQmlComponent>
#include <QQuickTextDocument>
#include "CodeEditorExtensionMan.h"
#include "ConstantCompilation.h"
#include "features.h"
#include "ApplicationContext.h"
#include <libevm/VM.h>
using namespace dev;
CodeEditorExtensionManager::CodeEditorExtensionManager()
{
}
void CodeEditorExtensionManager::loadEditor(QQuickItem* _editor)
{
if (!_editor)
return;
try{
QVariant doc = _editor->property("textDocument");
if (doc.canConvert<QQuickTextDocument*>()) {
QQuickTextDocument* qqdoc = doc.value<QQuickTextDocument*>();
if (qqdoc) {
m_doc = qqdoc->textDocument();
}
}
}
catch (dev::Exception const& exception){
qDebug() << "unable to load editor: ";
qDebug() << exception.what();
}
}
void CodeEditorExtensionManager::initExtensions()
{
try{
//only one for now
ConstantCompilation* compil = new ConstantCompilation(m_doc);
if (compil->tabUrl() != "")
compil->addContentOn(m_tabView);
compil->start();
}
catch (dev::Exception const& exception){
qDebug() << "unable to load extensions: ";
qDebug() << exception.what();
}
}
void CodeEditorExtensionManager::setEditor(QQuickItem* _editor){
this->loadEditor(_editor);
this->initExtensions();
}
void CodeEditorExtensionManager::setTabView(QQuickItem* _tabView){
m_tabView = _tabView;
}

28
mix/CodeEditorExtensionMan.h

@ -0,0 +1,28 @@
#ifndef CODEEDITOREXTENSIONMANAGER_H
#define CODEEDITOREXTENSIONMANAGER_H
#include <QQuickItem>
#include <QTextDocument>
#include "Feature.h"
class CodeEditorExtensionManager : public QObject
{
Q_OBJECT
Q_PROPERTY(QQuickItem* editor MEMBER m_editor WRITE setEditor)
Q_PROPERTY(QQuickItem* tabView MEMBER m_tabView WRITE setTabView)
public:
CodeEditorExtensionManager();
void initExtensions();
void setEditor(QQuickItem*);
void setTabView(QQuickItem*);
private:
QQuickItem* m_editor;
QQuickItem* m_tabView;
QTextDocument* m_doc;
void loadEditor(QQuickItem*);
};
#endif // CODEEDITOREXTENSIONMANAGER_H

88
mix/ConstantCompilation.cpp

@ -0,0 +1,88 @@
#include "ConstantCompilation.h"
#include <QQuickItem>
#include <QtCore/QFileInfo>
#include <QApplication>
#include <QQmlApplicationEngine>
#include <QtCore/QtCore>
#include <QDebug>
#include <libevm/VM.h>
#include <libsolidity/Scanner.h>
#include <libsolidity/CompilerStack.h>
#include <libsolidity/SourceReferenceFormatter.h>
using namespace std;
using namespace dev;
using namespace dev::eth;
ConstantCompilation::ConstantCompilation(QTextDocument* _doc)
{
m_editor = _doc;
}
QString ConstantCompilation::tabUrl(){
return QStringLiteral("qrc:/BasicContent.qml");
}
void ConstantCompilation::start()
{
connect(m_editor, SIGNAL(contentsChange(int,int,int)), this, SLOT(compile()));
}
QString ConstantCompilation::title()
{
return "compilation";
}
void ConstantCompilation::compile()
{
QString codeContent = m_editor->toPlainText();
if (codeContent == ""){
this->writeOutPut(true, codeContent);
return;
}
dev::solidity::CompilerStack compiler;
dev::bytes m_data;
QString content;
try
{
m_data = compiler.compile(codeContent.toStdString(), true);
content = QString::fromStdString(dev::eth::disassemble(m_data));
this->writeOutPut(true, content);
}
catch (dev::Exception const& exception)
{
ostringstream error;
solidity::SourceReferenceFormatter::printExceptionInformation(error, exception, "Error", compiler.getScanner());
content = QString::fromStdString(error.str()).toHtmlEscaped();
this->writeOutPut(false, content);
}
catch (...)
{
content = "Uncaught exception.";
this->writeOutPut(false, content);
}
}
void ConstantCompilation::writeOutPut(bool _success, QString _content){
QObject* status = m_view->findChild<QObject*>("status", Qt::FindChildrenRecursively);
QObject* content = m_view->findChild<QObject*>("content", Qt::FindChildrenRecursively);
if (_content == ""){
status->setProperty("text", "");
content->setProperty("text", "");
}
else if (_success){
status->setProperty("text", "compile successfull");
status->setProperty("color", "green");
content->setProperty("text", _content);
qDebug() << QString("compile suceeded " + _content);
}
else {
status->setProperty("text", "compile failed");
status->setProperty("color", "red");
content->setProperty("text", _content);
qDebug() << QString("compile failed " + _content);
}
}

26
mix/ConstantCompilation.h

@ -0,0 +1,26 @@
#ifndef CONSTANTCOMPILATION_H
#define CONSTANTCOMPILATION_H
#include <QTextDocument>
#include "Feature.h"
class ConstantCompilation : public Feature
{
Q_OBJECT
public:
ConstantCompilation(QTextDocument* doc);
void start();
QString title();
QString tabUrl();
private:
QTextDocument* m_editor;
void writeOutPut(bool success, QString content);
public Q_SLOTS:
void compile();
};
#endif // CONSTANTCOMPILATION_H

5
mix/ContextualTabs.qml

@ -0,0 +1,5 @@
import QtQuick 2.3
import QtQuick.Controls 1.2

33
mix/Feature.cpp

@ -0,0 +1,33 @@
#include "Feature.h"
#include "ApplicationContext.h"
#include <libevm/VM.h>
#include <QMessageBox>
#include <QDebug>
using namespace dev;
Feature::Feature()
{
}
void Feature::addContentOn(QObject* tabView) {
try{
if (tabUrl() == "")
return;
QVariant returnValue;
QQmlComponent* component = new QQmlComponent(
ApplicationContext::GetInstance()->appEngine(),
QUrl(this->tabUrl()));
QMetaObject::invokeMethod(tabView, "addTab",
Q_RETURN_ARG(QVariant, returnValue),
Q_ARG(QVariant, this->title()),
Q_ARG(QVariant, QVariant::fromValue(component)));
m_view = qvariant_cast<QObject*>(returnValue);
}
catch (dev::Exception const& exception){
qDebug() << exception.what();
}
}

21
mix/Feature.h

@ -0,0 +1,21 @@
#ifndef FEATURE_H
#define FEATURE_H
#include <QApplication>
#include <QQmlComponent>
class Feature : public QObject
{
Q_OBJECT
public:
Feature();
virtual QString tabUrl() { return ""; }
virtual QString title() { return ""; }
void addContentOn(QObject* tabView);
protected:
QObject* m_view;
};
#endif // FEATURE_H

47
mix/MainContent.qml

@ -0,0 +1,47 @@
import QtQuick 2.3
import QtQuick.Controls 1.2
import QtQuick.Layouts 1.0
import QtQuick.Controls.Styles 1.2
import CodeEditorExtensionManager 1.0
Rectangle {
anchors.fill: parent
height: parent.height
width: parent.width;
id:root
SplitView {
anchors.fill: parent
orientation: Qt.Vertical
Rectangle {
anchors.top : parent.top
id: contentView
width: parent.width
height: parent.height * 0.7
TextArea {
id: codeEditor
height: parent.height
font.family: "Verdana"
font.pointSize: 9
width: parent.width
anchors.centerIn: parent
}
}
Rectangle {
anchors.bottom: parent.bottom
id: contextualView
width: parent.width
Layout.minimumHeight: 20
height: parent.height * 0.3
TabView {
id: contextualTabs
antialiasing: true
anchors.fill: parent
style: TabStyle{}
}
}
CodeEditorExtensionManager{
tabView: contextualTabs
editor: codeEditor
}
}
}

29
mix/Qt47supp.txt

@ -0,0 +1,29 @@
{
<insert_a_suppression_name_here>
Memcheck:Cond
fun:_ZN20QSharedMemoryPrivate6detachEv
fun:_ZN13QSharedMemory6detachEv
fun:_ZN13QSharedMemory6setKeyERK7QString
fun:_ZN13QSharedMemoryD1Ev
fun:_ZN20QRasterWindowSurface5flushEP7QWidgetRK7QRegionRK6QPoint
fun:_Z8qt_flushP7QWidgetRK7QRegionP14QWindowSurfaceS0_RK6QPoint
fun:_ZN19QWidgetBackingStore5flushEP7QWidgetP14QWindowSurface
fun:_ZN19QWidgetBackingStore8endPaintERK7QRegionP14QWindowSurfaceP14BeginPaintInfo
fun:_ZN19QWidgetBackingStore4syncEv
fun:_ZN14QWidgetPrivate16syncBackingStoreEv
fun:_ZN7QWidget5eventEP6QEvent
fun:_ZN11QMainWindow5eventEP6QEvent
}
{
<insert_a_suppression_name_here>
Memcheck:Leak
fun:_Znwm
fun:_ZN18QtSimulatorPrivate15connectToServerEv
fun:_ZN18QtSimulatorPrivate19SimulatorConnection18connectToSimulatorEv
fun:_ZN18QtSimulatorPrivate19SimulatorConnection8instanceEv
fun:_ZN9QColormap10initializeEv
fun:_Z7qt_initP19QApplicationPrivatei
fun:_ZN19QApplicationPrivate9constructEv
fun:_ZN12QApplicationC1ERiPPci
fun:main
}

24
mix/TabStyle.qml

@ -0,0 +1,24 @@
import QtQuick 2.3
import QtQuick.Controls 1.2
import QtQuick.Controls.Styles 1.2
TabViewStyle {
frameOverlap: 1
tabBar: Rectangle {
color: "lightgray"
}
tab: Rectangle {
color: "lightsteelblue"
implicitWidth: Math.max(text.width + 4, 80)
implicitHeight: 20
radius: 2
Text {
id: text
anchors.centerIn: parent
text: styleData.title
color: styleData.selected ? "white" : "black"
}
}
frame: Rectangle { color: "steelblue" }
}

19
mix/main.cpp

@ -0,0 +1,19 @@
#include <QApplication>
#include <QQmlApplicationEngine>
#include <QQuickItem>
#include "CodeEditorExtensionMan.h"
#include "ApplicationContext.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QQmlApplicationEngine* engine = new QQmlApplicationEngine();
qmlRegisterType<CodeEditorExtensionManager>("CodeEditorExtensionManager", 1, 0, "CodeEditorExtensionManager");
ApplicationContext::SetApplicationContext(engine);
QObject::connect(&app, SIGNAL(lastWindowClosed()), ApplicationContext::GetInstance(), SLOT(QuitApplication())); //use to kill ApplicationContext and other stuff
engine->load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
}

27
mix/main.qml

@ -0,0 +1,27 @@
import QtQuick 2.3
import QtQuick.Controls 1.2
import QtQuick.Controls.Styles 1.2
import CodeEditorExtensionManager 1.0
ApplicationWindow {
visible: true
width: 1000
height: 480
minimumWidth: 400
minimumHeight: 300
title: qsTr("mix")
menuBar: MenuBar {
Menu {
title: qsTr("File")
MenuItem {
text: qsTr("Exit")
onTriggered: Qt.quit();
}
}
}
MainContent{
}
}

19
mix/mix.pro

@ -0,0 +1,19 @@
TEMPLATE = app
QT += qml quick widgets
SOURCES += main.cpp \
CodeEditorExtensionManager.cpp \
ConstantCompilation.cpp
RESOURCES += qml.qrc
# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH =
# Default rules for deployment.
include(deployment.pri)
HEADERS += \
CodeEditorExtensionManager.h \
ConstantCompilation.h

8
mix/qml.qrc

@ -0,0 +1,8 @@
<RCC>
<qresource prefix="/">
<file>main.qml</file>
<file>BasicContent.qml</file>
<file>TabStyle.qml</file>
<file>MainContent.qml</file>
</qresource>
</RCC>
Loading…
Cancel
Save