diff --git a/CMakeLists.txt b/CMakeLists.txt
index d8c517fef..e3a7d9b83 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -158,6 +158,7 @@ if (NOT LANGUAGES)
add_subdirectory(libqethereum)
add_subdirectory(alethzero)
add_subdirectory(third)
+ add_subdirectory(mix)
if(QTQML)
#add_subdirectory(iethxi)
#add_subdirectory(walleth) // resurect once we want to submit ourselves to QML.
@@ -171,3 +172,4 @@ add_test(NAME alltests WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/test COMMAND testet
#unset(TARGET_PLATFORM CACHE)
+
diff --git a/mix/.gitignore b/mix/.gitignore
new file mode 100644
index 000000000..f96209dc3
--- /dev/null
+++ b/mix/.gitignore
@@ -0,0 +1 @@
+*.pro
diff --git a/mix/ApplicationCtx.cpp b/mix/ApplicationCtx.cpp
new file mode 100644
index 000000000..f97478f3c
--- /dev/null
+++ b/mix/ApplicationCtx.cpp
@@ -0,0 +1,36 @@
+/*
+ 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 .
+*/
+/** @file ApplicationCtx.cpp
+ * @author Yann yann@ethdev.com
+ * @date 2014
+ * Provide an access to the current QQmlApplicationEngine which is used to add QML file on the fly.
+ * In the future this class can be extended to add more variable related to the context of the application.
+ */
+
+#include
+#include "ApplicationCtx.h"
+using namespace dev::mix;
+
+ApplicationCtx* ApplicationCtx::Instance = nullptr;
+
+QQmlApplicationEngine* ApplicationCtx::appEngine()
+{
+ return m_applicationEngine;
+}
+
+void ApplicationCtx::setApplicationContext(QQmlApplicationEngine* _engine)
+{
+ if (Instance == nullptr)
+ Instance = new ApplicationCtx(_engine);
+}
diff --git a/mix/ApplicationCtx.h b/mix/ApplicationCtx.h
new file mode 100644
index 000000000..37166ea05
--- /dev/null
+++ b/mix/ApplicationCtx.h
@@ -0,0 +1,55 @@
+/*
+ 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 .
+*/
+/** @file ApplicationCtx.h
+ * @author Yann yann@ethdev.com
+ * @date 2014
+ * Provide an access to the current QQmlApplicationEngine which is used to add QML file on the fly.
+ * In the future this class can be extended to add more variable related to the context of the application.
+ */
+
+#pragma once
+
+#include
+
+namespace dev
+{
+
+namespace mix
+{
+
+class ApplicationCtx: public QObject
+{
+ Q_OBJECT
+
+public:
+ ApplicationCtx(QQmlApplicationEngine* _engine) { m_applicationEngine = _engine; }
+ ~ApplicationCtx() { delete m_applicationEngine; }
+ static ApplicationCtx* getInstance() { return Instance; }
+ static void setApplicationContext(QQmlApplicationEngine* _engine);
+ QQmlApplicationEngine* appEngine();
+
+private:
+ static ApplicationCtx* Instance;
+ QQmlApplicationEngine* m_applicationEngine;
+
+public slots:
+ void quitApplication() { delete Instance; }
+};
+
+}
+
+}
diff --git a/mix/CMakeLists.txt b/mix/CMakeLists.txt
new file mode 100644
index 000000000..da214fd29
--- /dev/null
+++ b/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")
+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)
+
+#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)
diff --git a/mix/CodeEditorExtensionManager.cpp b/mix/CodeEditorExtensionManager.cpp
new file mode 100644
index 000000000..596aea165
--- /dev/null
+++ b/mix/CodeEditorExtensionManager.cpp
@@ -0,0 +1,89 @@
+/*
+ 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 .
+*/
+/** @file CodeEditorExtensionMan.cpp
+ * @author Yann yann@ethdev.com
+ * @date 2014
+ * Ethereum IDE client.
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include "ConstantCompilationCtrl.h"
+#include "features.h"
+#include "ApplicationCtx.h"
+#include "CodeEditorExtensionManager.h"
+using namespace dev::mix;
+
+CodeEditorExtensionManager::~CodeEditorExtensionManager()
+{
+ m_features.clear();
+}
+
+void CodeEditorExtensionManager::loadEditor(QQuickItem* _editor)
+{
+ if (!_editor)
+ return;
+ try
+ {
+ QVariant doc = _editor->property("textDocument");
+ if (doc.canConvert())
+ {
+ QQuickTextDocument* qqdoc = doc.value();
+ if (qqdoc)
+ m_doc = qqdoc->textDocument();
+ }
+ }
+ catch (...)
+ {
+ qDebug() << "unable to load editor: ";
+ }
+}
+
+void CodeEditorExtensionManager::initExtensions()
+{
+ //only one for now
+ std::shared_ptr constantCompilation = std::make_shared(m_doc);
+ if (constantCompilation.get()->contentUrl() != "")
+ {
+ try
+ {
+ constantCompilation.get()->addContentOn(m_tabView);
+ }
+ catch (...)
+ {
+ qDebug() << "Exception when adding content into view.";
+ return;
+ }
+ }
+ constantCompilation.get()->start();
+ m_features.append(constantCompilation);
+}
+
+void CodeEditorExtensionManager::setEditor(QQuickItem* _editor)
+{
+ this->loadEditor(_editor);
+ this->initExtensions();
+}
+
+void CodeEditorExtensionManager::setTabView(QQuickItem* _tabView)
+{
+ m_tabView = _tabView;
+}
diff --git a/mix/CodeEditorExtensionManager.h b/mix/CodeEditorExtensionManager.h
new file mode 100644
index 000000000..2b8402bf2
--- /dev/null
+++ b/mix/CodeEditorExtensionManager.h
@@ -0,0 +1,61 @@
+/*
+ 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 .
+*/
+/** @file CodeEditorExtensionMan.h
+ * @author Yann yann@ethdev.com
+ * @date 2014
+ * Ethereum IDE client.
+ */
+
+#pragma once
+
+#include "memory"
+#include
+#include
+#include
+#include "ConstantCompilationCtrl.h"
+
+namespace dev
+{
+
+namespace mix
+{
+
+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() {}
+ ~CodeEditorExtensionManager();
+ void initExtensions();
+ void setEditor(QQuickItem*);
+ void setTabView(QQuickItem*);
+
+private:
+ QQuickItem* m_editor;
+ QVector> m_features;
+ QQuickItem* m_tabView;
+ QTextDocument* m_doc;
+ void loadEditor(QQuickItem*);
+};
+
+}
+
+}
diff --git a/mix/ConstantCompilationCtrl.cpp b/mix/ConstantCompilationCtrl.cpp
new file mode 100644
index 000000000..06b9c0284
--- /dev/null
+++ b/mix/ConstantCompilationCtrl.cpp
@@ -0,0 +1,97 @@
+/*
+ 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 .
+*/
+/** @file ConstantCompilation.cpp
+ * @author Yann yann@ethdev.com
+ * @date 2014
+ * Ethereum IDE client.
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include "ConstantCompilationCtrl.h"
+#include "ConstantCompilationModel.h"
+using namespace dev::mix;
+
+ConstantCompilationCtrl::ConstantCompilationCtrl(QTextDocument* _doc)
+{
+ m_editor = _doc;
+ m_compilationModel = new ConstantCompilationModel();
+}
+
+ConstantCompilationCtrl::~ConstantCompilationCtrl()
+{
+ delete m_compilationModel;
+}
+
+QString ConstantCompilationCtrl::contentUrl() const
+{
+ return QStringLiteral("qrc:/qml/BasicContent.qml");
+}
+
+QString ConstantCompilationCtrl::title() const
+{
+ return "compiler";
+}
+
+void ConstantCompilationCtrl::start() const
+{
+ connect(m_editor, SIGNAL(contentsChange(int,int,int)), this, SLOT(compile()));
+}
+
+void ConstantCompilationCtrl::compile()
+{
+ QString codeContent = m_editor->toPlainText().replace("\n", "");
+ if (codeContent.isEmpty())
+ {
+ resetOutPut();
+ return;
+ }
+ CompilerResult res = m_compilationModel->compile(m_editor->toPlainText());
+ writeOutPut(res);
+}
+
+void ConstantCompilationCtrl::resetOutPut()
+{
+ QObject* status = m_view->findChild("status", Qt::FindChildrenRecursively);
+ QObject* content = m_view->findChild("content", Qt::FindChildrenRecursively);
+ status->setProperty("text", "");
+ content->setProperty("text", "");
+}
+
+void ConstantCompilationCtrl::writeOutPut(CompilerResult const& _res)
+{
+ QObject* status = m_view->findChild("status", Qt::FindChildrenRecursively);
+ QObject* content = m_view->findChild("content", Qt::FindChildrenRecursively);
+ if (_res.success)
+ {
+ status->setProperty("text", "succeeded");
+ status->setProperty("color", "green");
+ content->setProperty("text", _res.hexCode);
+ qDebug() << QString("compile succeeded " + _res.hexCode);
+ }
+ else
+ {
+ status->setProperty("text", "failure");
+ status->setProperty("color", "red");
+ content->setProperty("text", _res.comment);
+ qDebug() << QString("compile failed " + _res.comment);
+ }
+}
diff --git a/mix/ConstantCompilationCtrl.h b/mix/ConstantCompilationCtrl.h
new file mode 100644
index 000000000..e4661c800
--- /dev/null
+++ b/mix/ConstantCompilationCtrl.h
@@ -0,0 +1,55 @@
+/*
+ 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 .
+*/
+/** @file ConstantCompilation.h
+ * @author Yann yann@ethdev.com
+ * @date 2014
+ * Ethereum IDE client.
+ */
+
+#pragma once
+
+#include
+#include "ConstantCompilationModel.h"
+#include "Extension.h"
+
+namespace dev
+{
+
+namespace mix
+{
+
+class ConstantCompilationCtrl: public Extension
+{
+ Q_OBJECT
+
+public:
+ ConstantCompilationCtrl(QTextDocument*);
+ ~ConstantCompilationCtrl();
+ void start() const override;
+ QString title() const override;
+ QString contentUrl() const override;
+
+private:
+ QTextDocument* m_editor;
+ ConstantCompilationModel* m_compilationModel;
+ void writeOutPut(CompilerResult const&);
+ void resetOutPut();
+
+public Q_SLOTS:
+ void compile();
+};
+
+}
+
+}
diff --git a/mix/ConstantCompilationModel.cpp b/mix/ConstantCompilationModel.cpp
new file mode 100644
index 000000000..e06734f59
--- /dev/null
+++ b/mix/ConstantCompilationModel.cpp
@@ -0,0 +1,61 @@
+/*
+ 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 .
+*/
+/** @file ApplicationCtx.h
+ * @author Yann yann@ethdev.com
+ * @date 2014
+ * Ethereum IDE client.
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include "ConstantCompilationModel.h"
+using namespace std;
+using namespace dev;
+using namespace dev::eth;
+using namespace dev::mix;
+
+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));
+ }
+ catch (dev::Exception const& _exception)
+ {
+ ostringstream error;
+ solidity::SourceReferenceFormatter::printExceptionInformation(error, _exception, "Error", compiler.getScanner());
+ res.success = false;
+ res.comment = QString::fromStdString(error.str()).toHtmlEscaped();
+ res.hexCode = "";
+ }
+ catch (...)
+ {
+ res.success = false;
+ res.comment = "Uncaught exception.";
+ res.hexCode = "";
+ }
+ return res;
+}
diff --git a/mix/ConstantCompilationModel.h b/mix/ConstantCompilationModel.h
new file mode 100644
index 000000000..4a17853f6
--- /dev/null
+++ b/mix/ConstantCompilationModel.h
@@ -0,0 +1,51 @@
+/*
+ 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 .
+*/
+/** @file ApplicationCtx.h
+ * @author Yann yann@ethdev.com
+ * @date 2014
+ * Ethereum IDE client.
+ */
+
+#pragma once
+
+#include
+
+namespace dev
+{
+
+namespace mix
+{
+
+struct CompilerResult
+{
+ QString hexCode;
+ QString comment;
+ bool success;
+};
+
+class ConstantCompilationModel
+{
+
+public:
+ ConstantCompilationModel() {}
+ ~ConstantCompilationModel() {}
+ CompilerResult compile(QString code);
+};
+
+}
+
+}
diff --git a/mix/Extension.cpp b/mix/Extension.cpp
new file mode 100644
index 000000000..5aeb0cc17
--- /dev/null
+++ b/mix/Extension.cpp
@@ -0,0 +1,44 @@
+/*
+ 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 .
+*/
+/** @file Feature.cpp
+ * @author Yann yann@ethdev.com
+ * @date 2014
+ * Ethereum IDE client.
+ */
+
+#include
+#include
+#include
+#include "Extension.h"
+#include "ApplicationCtx.h"
+using namespace dev;
+using namespace dev::mix;
+
+void Extension::addContentOn(QObject* _tabView)
+{
+ if (contentUrl() == "")
+ return;
+
+ QVariant returnValue;
+ QQmlComponent* component = new QQmlComponent(
+ ApplicationCtx::getInstance()->appEngine(),
+ QUrl(this->contentUrl()), _tabView);
+
+ QMetaObject::invokeMethod(_tabView, "addTab",
+ Q_RETURN_ARG(QVariant, returnValue),
+ Q_ARG(QVariant, this->title()),
+ Q_ARG(QVariant, QVariant::fromValue(component)));
+
+ m_view = qvariant_cast(returnValue);
+}
diff --git a/mix/Extension.h b/mix/Extension.h
new file mode 100644
index 000000000..f8fef0aa6
--- /dev/null
+++ b/mix/Extension.h
@@ -0,0 +1,48 @@
+/*
+ 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 .
+*/
+/** @file Feature.h
+ * @author Yann yann@ethdev.com
+ * @date 2014
+ * Ethereum IDE client.
+ */
+
+#pragma once
+
+#include
+#include
+
+namespace dev
+{
+
+namespace mix
+{
+
+class Extension: public QObject
+{
+ Q_OBJECT
+
+public:
+ Extension() {}
+ virtual QString contentUrl() const { return ""; }
+ virtual QString title() const { return ""; }
+ virtual void start() const {}
+ void addContentOn(QObject* tabView);
+
+protected:
+ QObject* m_view;
+};
+
+}
+
+}
diff --git a/mix/MixApplication.cpp b/mix/MixApplication.cpp
new file mode 100644
index 000000000..e67ca1b12
--- /dev/null
+++ b/mix/MixApplication.cpp
@@ -0,0 +1,45 @@
+/*
+ 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 .
+*/
+/** @file main.cpp
+ * @author Yann yann@ethdev.com
+ * @date 2014
+ */
+
+#include
+#include "MixApplication.h"
+using namespace dev::mix;
+
+MixApplication::MixApplication(int _argc, char *_argv[]): QApplication(_argc, _argv)
+{
+}
+
+bool MixApplication::notify(QObject* _receiver, QEvent* _event)
+{
+ try
+ {
+ return MixApplication::notify(_receiver, _event);
+ }
+ catch (std::exception& _ex)
+ {
+ qDebug() << "std::exception was caught " << _ex.what();
+ }
+ catch (...)
+ {
+ qDebug() << "uncaught exception ";
+ }
+ return false;
+}
diff --git a/mix/MixApplication.h b/mix/MixApplication.h
new file mode 100644
index 000000000..fdc506268
--- /dev/null
+++ b/mix/MixApplication.h
@@ -0,0 +1,46 @@
+/*
+ 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 .
+*/
+/** @file main.cpp
+ * @author Yann yann@ethdev.com
+ * @date 2014
+ * This class will be use instead of QApplication to launch the application. the method 'notify' allows to catch all exceptions.
+ * Not use for now: TODO.
+ */
+
+#pragma once
+
+#include
+
+namespace dev
+{
+
+namespace mix
+{
+
+class MixApplication: public QApplication
+{
+ Q_OBJECT
+
+public:
+ MixApplication(int _argc, char* _argv[]);
+ virtual ~MixApplication() {}
+ virtual bool notify(QObject* _receiver, QEvent* _event);
+};
+
+}
+
+}
diff --git a/mix/main.cpp b/mix/main.cpp
new file mode 100644
index 000000000..537941290
--- /dev/null
+++ b/mix/main.cpp
@@ -0,0 +1,40 @@
+/*
+ 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 .
+*/
+/** @file main.cpp
+ * @author Yann yann@ethdev.com
+ * @date 2014
+ * Ethereum IDE client.
+ */
+
+#include
+#include
+#include
+#include "CodeEditorExtensionManager.h"
+#include "ApplicationCtx.h"
+#include "MixApplication.h"
+using namespace dev::mix;
+
+int main(int _argc, char *_argv[])
+{
+ QApplication app(_argc, _argv);
+ qmlRegisterType("CodeEditorExtensionManager", 1, 0, "CodeEditorExtensionManager");
+ QQmlApplicationEngine* engine = new QQmlApplicationEngine();
+ ApplicationCtx::setApplicationContext(engine);
+ QObject::connect(&app, SIGNAL(lastWindowClosed()), ApplicationCtx::getInstance(), SLOT(quitApplication())); //use to kill ApplicationContext and other stuff
+ engine->load(QUrl(QStringLiteral("qrc:/qml/main.qml")));
+ return app.exec();
+}
diff --git a/mix/qml.qrc b/mix/qml.qrc
new file mode 100644
index 000000000..267427ce5
--- /dev/null
+++ b/mix/qml.qrc
@@ -0,0 +1,8 @@
+
+
+ qml/BasicContent.qml
+ qml/main.qml
+ qml/MainContent.qml
+ qml/TabStyle.qml
+
+
diff --git a/mix/qml/BasicContent.qml b/mix/qml/BasicContent.qml
new file mode 100644
index 000000000..0049e6127
--- /dev/null
+++ b/mix/qml/BasicContent.qml
@@ -0,0 +1,35 @@
+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
+ }
+}
diff --git a/mix/qml/MainContent.qml b/mix/qml/MainContent.qml
new file mode 100644
index 000000000..f243b16ac
--- /dev/null
+++ b/mix/qml/MainContent.qml
@@ -0,0 +1,54 @@
+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
+ tabChangesFocus: false
+ Keys.onPressed: {
+ if (event.key === Qt.Key_Tab) {
+ codeEditor.insert(codeEditor.cursorPosition, "\t");
+ event.accepted = true;
+ }
+ }
+ }
+ }
+ 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
+ }
+ }
+}
diff --git a/mix/qml/TabStyle.qml b/mix/qml/TabStyle.qml
new file mode 100644
index 000000000..5f78f8947
--- /dev/null
+++ b/mix/qml/TabStyle.qml
@@ -0,0 +1,23 @@
+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" }
+}
diff --git a/mix/qml/main.qml b/mix/qml/main.qml
new file mode 100644
index 000000000..8a1b86cee
--- /dev/null
+++ b/mix/qml/main.qml
@@ -0,0 +1,24 @@
+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{
+ }
+}