#include "qgpythonsandbox.h" #include #include #include #include #include #include #include "qgpythoninterface.h" //typedef QWidget* (*qgp_create_console_t)(QWidget*); typedef QgPythonInterface* (*qgp_instance_t)(void); class QDialog; class StubPython: public QgPythonInterface { public: class StubWidgets: public QgPythonWidgets { public: virtual QWidget* createConsole(QWidget*) override { return 0; } virtual QDialog* createEditDialog(QWidget*) override { return 0; } }; virtual QgPythonWidgets* pythonWidgets() { static StubWidgets stub; return &stub; } virtual PythonQtObjectPtr* mainModule() override { return 0; } virtual PythonQtObjectPtr* createModule(const QString& /*module_name*/) override { return 0; } virtual PythonQtObjectPtr* createModuleFromScript(const QString& , const QString& ) override { return 0; } virtual PythonQtObjectPtr* createModuleFromFile(const QString& , const QString& ) override { return 0; } virtual bool addObject(const QString& , QObject*, PythonQtObjectPtr* /*module*/) override { return 0; } virtual bool evalScript(const QString& , PythonQtObjectPtr* ) override { return 0; } virtual bool evalFile(const QString& , PythonQtObjectPtr* ) override { return 0; } }; class SandboxContext { public: StubPython stubs; bool enable; QWidget* consoleWidget; QDialog* editDialog; QgPythonInterface* pyif; PythonQtObjectPtr* appModule; qgp_instance_t create_instance; QString qglib_name; QString qglib_version; QString qglib_dbg; QString pyhome; QString pylib; QStringList pSymb; SandboxContext(): enable(true), consoleWidget(0), editDialog(0), pyif(&stubs), appModule(0), qglib_name("QgPython"), qglib_version("36"), #if !defined(QT_NO_DEBUG) qglib_dbg("_d") #else qglib_dbg("") #endif { } void py_sethome(const QString s) { pyhome=QDir::toNativeSeparators(s); qputenv("PYTHONHOME", s.toLatin1().constData()); qDebug()<<"PYENV:"<<"PYTHONHOME"<<"="<1) { value=tmp.at(0); value.replace(pattern, pyhome, Qt::CaseInsensitive); value=QDir::toNativeSeparators(value); for(int i=1; imainModule(); return true; } }; QgPythonSandbox::QgPythonSandbox(QObject *parent) : QObject(parent) { initialize(); } void QgPythonSandbox::loadSettings(const QString &file) { QString iniFile=file.isEmpty() ? "./qgpy.ini" : file; QSettings s(iniFile, QSettings::IniFormat); s.beginGroup("qgpy"); if (s.value("enable").isValid()) { bool enable=s.value("enable").toBool(); if (!enable) { sbcx.enable=false; qDebug()<<"QgPy Setting: Python disabled"; } } qDebug()<<"QgPy Settings:"<pythonWidgets(); } QWidget* QgPythonSandbox::createConsoleWidget(QWidget* parent) { if (sbcx.consoleWidget) return sbcx.consoleWidget; if (!initialize()) return 0; sbcx.consoleWidget=sbcx.pyif->pythonWidgets()->createConsole(parent); //create_console(parent); return sbcx.consoleWidget; } QDialog* QgPythonSandbox::createEditDialog(QWidget* parent) { if (sbcx.editDialog) return sbcx.editDialog; if (!initialize()) return 0; sbcx.editDialog=sbcx.pyif->pythonWidgets()->createEditDialog(parent); //create_console(parent); return sbcx.editDialog; } void QgPythonSandbox::addObject(const QString& name, QObject* obj) { sbcx.pyif->addObject(name, obj, sbcx.appModule); } void QgPythonSandbox::addAppObject(const QString& name, QObject* obj) { sbcx.pyif->addObject(name, obj, sbcx.appModule); } //PythonQtObjectPtr QgPython::createMainApplicationModule(const QString& module_name) bool QgPythonSandbox::createModule(const QString& module_name, const QString& file) { sbcx.pyif->createModuleFromFile(module_name, file); return true; } bool QgPythonSandbox::createAppModule(const QString& module_name, const QString& file) { sbcx.appModule=sbcx.pyif->createModuleFromFile(module_name, file); return true; } void QgPythonSandbox::evalScript(const QString& script) { sbcx.pyif->evalScript(script, 0); } void QgPythonSandbox::evalFile(const QString& file) { sbcx.pyif->evalFile(file, 0); }