diff --git a/src/meshlab/filterScriptDialog.h b/src/meshlab/filterScriptDialog.h index dd3b90990..4d6d163ea 100644 --- a/src/meshlab/filterScriptDialog.h +++ b/src/meshlab/filterScriptDialog.h @@ -20,6 +20,9 @@ * for more details. * * * ****************************************************************************/ +#ifndef FILTER_SCRIPT_DIALOG_H +#define FILTER_SCRIPT_DIALOG_H + #include #include "../common/filterscript.h" @@ -79,4 +82,6 @@ public: private: Ui::scriptEditor* ui; QString code; -}; \ No newline at end of file +}; + +#endif \ No newline at end of file diff --git a/src/meshlab/mainwindow.h b/src/meshlab/mainwindow.h index d5269e23b..1392e167a 100644 --- a/src/meshlab/mainwindow.h +++ b/src/meshlab/mainwindow.h @@ -86,6 +86,7 @@ private slots: void delCurrentRaster(); void endEdit(); void updateDocumentScriptBindings(); + void loadAndInsertXMLPlugin(const QString& xmlpath,const QString& scriptname); //void evaluateExpression(const Expression& exp,Value** res); public: diff --git a/src/meshlab/mainwindow_Init.cpp b/src/meshlab/mainwindow_Init.cpp index 8cd1f6772..5eb2eb445 100644 --- a/src/meshlab/mainwindow_Init.cpp +++ b/src/meshlab/mainwindow_Init.cpp @@ -65,7 +65,7 @@ MainWindow::MainWindow() connect(mdiarea, SIGNAL(subWindowActivated(QMdiSubWindow *)),this, SLOT(updateDocumentScriptBindings())); connect(mdiarea, SIGNAL(subWindowActivated(QMdiSubWindow *)),this, SLOT(interruptButtonVisibility())); connect(plugingui,SIGNAL(scriptCodeExecuted(const QScriptValue&,const int,const QString&)),this,SLOT(scriptCodeExecuted(const QScriptValue&,const int,const QString&))); - + connect(plugingui,SIGNAL(insertXMLPluginRequested(const QString&,const QString& )),this,SLOT(loadAndInsertXMLPlugin(const QString&,const QString&))); httpReq=new QHttp(this); //connect(httpReq, SIGNAL(requestFinished(int,bool)), this, SLOT(connectionFinished(int,bool))); connect(httpReq, SIGNAL(done(bool)), this, SLOT(connectionDone(bool))); @@ -371,9 +371,9 @@ void MainWindow::createActions() connect(showScriptEditAct, SIGNAL(triggered()), this, SLOT(showScriptEditor())); - //showFilterEditAct = new QAction(tr("XML Plugin Editor GUI"),this); - //showFilterEditAct->setEnabled(true); - //connect(showFilterEditAct, SIGNAL(triggered()), this, SLOT(showXMLPluginEditorGui())); + /*showFilterEditAct = new QAction(tr("XML Plugin Editor GUI"),this); + showFilterEditAct->setEnabled(true); + connect(showFilterEditAct, SIGNAL(triggered()), this, SLOT(showXMLPluginEditorGui()));*/ //////////////Action Menu Preferences ///////////////////////////////////////////////////////////////////// setCustomizeAct = new QAction(tr("&Options..."),this); @@ -495,11 +495,13 @@ void MainWindow::createMenus() //////////////////// Menu Filter ////////////////////////////////////////////////////////////////////////// filterMenu = menuBar()->addMenu(tr("Fi<ers")); - filterMenu->addAction(lastFilterAct); - filterMenu->addAction(showFilterScriptAct); - filterMenu->addAction(showScriptEditAct); + fillFilterMenu(); + //filterMenu = menuBar()->addMenu(tr("Fi<ers")); + //filterMenu->addAction(lastFilterAct); + //filterMenu->addAction(showFilterScriptAct); + //filterMenu->addAction(showScriptEditAct); //filterMenu->addAction(showFilterEditAct); - filterMenu->addSeparator(); + //filterMenu->addSeparator(); //////////////////// Menu Render ////////////////////////////////////////////////////////////////////////// @@ -583,7 +585,7 @@ void MainWindow::createMenus() helpMenu->addAction(submitBugAct); helpMenu->addAction(checkUpdatesAct); - fillFilterMenu(); + //fillFilterMenu(); fillEditMenu(); fillRenderMenu(); fillDecorateMenu(); @@ -596,6 +598,12 @@ void MainWindow::createMenus() void MainWindow::fillFilterMenu() { + filterMenu->clear(); + filterMenu->addAction(lastFilterAct); + filterMenu->addAction(showFilterScriptAct); + filterMenu->addAction(showScriptEditAct); + //filterMenu->addAction(showFilterEditAct); + filterMenu->addSeparator(); // Connects the events of the actions within colorize to the method which shows their tooltip filterMenuSelect = filterMenu->addMenu(tr("Selection")); filterMenuClean = filterMenu->addMenu(tr("Cleaning and Repairing")); diff --git a/src/meshlab/mainwindow_RunTime.cpp b/src/meshlab/mainwindow_RunTime.cpp index 42a4a4235..440ebb977 100644 --- a/src/meshlab/mainwindow_RunTime.cpp +++ b/src/meshlab/mainwindow_RunTime.cpp @@ -2164,4 +2164,13 @@ void MainWindow::updateDocumentScriptBindings() plugingui->setDocument(meshDoc()); PM.updateDocumentScriptBindings(*meshDoc()); } +} + +void MainWindow::loadAndInsertXMLPlugin(const QString& xmlpath,const QString& scriptname) +{ + if ((xmldialog != NULL) && (xmldialog->isVisible())) + this->xmldialog->close(); + PM.deleteXMLPlugin(scriptname); + PM.loadXMLPlugin(xmlpath); + fillFilterMenu(); } \ No newline at end of file diff --git a/src/meshlab/xmlgeneratorgui.cpp b/src/meshlab/xmlgeneratorgui.cpp index 3a9bcb162..a7820533f 100644 --- a/src/meshlab/xmlgeneratorgui.cpp +++ b/src/meshlab/xmlgeneratorgui.cpp @@ -428,8 +428,8 @@ FilterGeneratorTab::FilterGeneratorTab(const QString& filtername,QWidget* parent ui->guiframe->setFilterName(filtername); ui->jsframe->setVisible(true); ui->jsframe->setStyleSheet("QFrame { background-color:rgb(189,215,255); border-radius: 4px; } QTextEdit {background-color: white;}"); + //ui->jscode->setAutoFormatting(QTextEdit::AutoAll); layout()->setAlignment(Qt::AlignTop); - connect(ui->guibut,SIGNAL(released()),this,SLOT(guiButtonClicked())); connect(ui->jsbut,SIGNAL(released()),this,SLOT(jsButtonClicked())); connect(ui->guiframe,SIGNAL(filterNameUpdated(const QString&,QWidget*)),this,SIGNAL(filterNameUpdated(const QString&,QWidget*))); @@ -477,7 +477,7 @@ void FilterGeneratorTab::paintEvent( QPaintEvent* p ) void FilterGeneratorTab::collectInfo( MLXMLFilterSubTree& filter ) { - filter.filterinfo[MLXMLElNames::filterJSCodeTag] = ui->jscode->toPlainText (); + filter.filterinfo[MLXMLElNames::filterJSCodeTag] = "jscode->toPlainText () + "]]>"; ui->guiframe->collectInfo(filter); } @@ -497,54 +497,10 @@ void FilterGeneratorTab::setCode( const QString& code ) ui->jscode->setPlainText(code); } -QScriptValue FilterGeneratorTab::executeCode(MeshDocument* doc) -{ - if (doc != NULL) - { - env.pushContext(); - MeshDocumentSI* currentDocInterface = new MeshDocumentSI(doc); - QScriptValue val = env.newQObject(currentDocInterface); - env.globalObject().setProperty(ScriptAdapterGenerator::meshDocVarName(),val); - QScriptValue result = env.evaluate(getCode()); - env.popContext(); - return result; - } - else - throw MeshLabException("System Error: A valid MeshLabDocument has not correctly been associated with PluginGeneratorGUI. Code cannot be executed."); - - return QScriptValue(); -} - -void FilterGeneratorTab::initLibInEnv(PluginManager& pm ) -{ - QStringList liblist = ScriptAdapterGenerator::javaScriptLibraryFiles(); - int ii = 0; - while(ii < liblist.size()) - { - QFile lib(liblist[ii]); - if (!lib.open(QFile::ReadOnly)) - qDebug("Warning: Library %s has not been loaded.",qPrintable(liblist[ii])); - QByteArray libcode = lib.readAll(); - QScriptValue res = env.evaluate(QString(libcode)); - if (res.isError()) - throw JavaScriptException("Library " + liblist[ii] + " generated a JavaScript Error: " + res.toString() + "\n"); - ++ii; - } - QScriptValue applyFun = env.newFunction(PluginInterfaceApplyXML, &pm); - env.globalObject().setProperty("_applyFilter", applyFun); - - QString st = pm.pluginsCode(); - QScriptValue res = env.evaluate(QString(pm.pluginsCode())); - if (res.isError()) - throw JavaScriptException("A Plugin-bridge-code generated a JavaScript Error: " + res.toString() + "\n"); -} - /*" + gaycolor.red() + "," + gaycolor.green() + "," + gaycolor.blue() + "*/ PluginGeneratorGUI::PluginGeneratorGUI(PluginManager& pman,QWidget* parent ) -:QDockWidget(parent),init(false),plugname(),author(),mail(),doc(NULL),PM(pman) +:QDockWidget(parent),init(false),plugscriptname(),author(),mail(),doc(NULL),PM(pman),finfo(QApplication::applicationDirPath()) { - QFileInfo fi(QApplication::applicationFilePath()); - directory.setCurrent(fi.absolutePath()); QFrame* f = new QFrame(this); QGridLayout* lay = new QGridLayout(); tabs = new QTabWidget(this); @@ -635,11 +591,6 @@ void PluginGeneratorGUI::menuSelection( QAction* act) removeFilter(); break; } - case MN_EXPORTFILTERINPLUGIN: - { - exportFilterInPlugin(); - break; - } case MN_NEWXMLPLUGIN: { newXMLPlugin(); @@ -684,9 +635,6 @@ void PluginGeneratorGUI::createContextMenu() QAction* actremfilt = menu->addAction("Remove Current Filter"); actremfilt->setData(QVariant(MN_REMOVEFILTER)); menu->addSeparator(); - QAction* actexpfilt = menu->addAction("Export Filter Inside Existing Plugin..."); - actexpfilt->setData(QVariant(MN_EXPORTFILTERINPLUGIN)); - menu->addSeparator(); QAction* actnewplug = menu->addAction("New XML Plugin"); actnewplug->setData(QVariant(MN_NEWXMLPLUGIN)); QAction* actloadplug = menu->addAction("Load XML Plugin..."); @@ -754,7 +702,7 @@ void PluginGeneratorGUI::addNewFilter() namelist.push_back(tabs->tabText(ii)); QString tmpname = UsefulGUIFunctions::generateUniqueDefaultName("Filter",namelist); FilterGeneratorTab* tb = new FilterGeneratorTab(tmpname,this); - tb->initLibInEnv(PM); + //tb->initLibInEnv(PM); tabs->addTab(tb,tmpname); connect(tb,SIGNAL(filterNameUpdated(const QString&,QWidget*)),this,SLOT(updateTabTitle(const QString&,QWidget*))); connect(tb,SIGNAL(validateFilterName(const QString&,FilterGeneratorGUI*)),this,SLOT(validateFilterName(const QString&,FilterGeneratorGUI*))); @@ -765,35 +713,44 @@ void PluginGeneratorGUI::removeFilter() tabs->removeTab(tabs->currentIndex()); } -void PluginGeneratorGUI::exportFilterInPlugin() -{ - //throw std::exception("The method or operation is not implemented."); -} - void PluginGeneratorGUI::newXMLPlugin() { - //throw std::exception("The method or operation is not implemented."); + QMessageBox::StandardButton ret=QMessageBox::question(this, tr("MeshLab"), tr("Project '%1' modified.\n\nClose without saving?").arg(finfo.fileName()), + QMessageBox::Yes|QMessageBox::No, + QMessageBox::No); + if(ret==QMessageBox::No) // don't close please! + return; + int count = tabs->count(); + for(int ii = 0;ii < count;++ii) + removeFilter(); + this->author =""; + this->mail = ""; + this->plugscriptname =""; + finfo.setFile(QApplication::applicationDirPath()); + addNewFilter(); } void PluginGeneratorGUI::saveXMLPlugin() { - //throw std::exception("The method or operation is not implemented."); + if (finfo.isFile()) + save(finfo.absoluteFilePath(),false); + else + saveAsXMLPlugin(); } void PluginGeneratorGUI::loadScriptCode() { - QFileDialog* lddiag = new QFileDialog(this,tr("Load Script File"),directory.absolutePath(), tr("Script File (*.js)")); + QFileDialog* lddiag = new QFileDialog(this,tr("Load Script File"),finfo.absolutePath(), tr("Script File (*.js)")); lddiag->setAcceptMode(QFileDialog::AcceptOpen); lddiag->exec(); QStringList files = lddiag->selectedFiles(); delete lddiag; if (files.size() != 1) return; - QString fileName = files[0]; - QFileInfo finfo(files[0]); - QFile file(fileName); + QFile file(files[0]); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) - qDebug("Warning: File %s has not been loaded.",qPrintable(fileName)); + qDebug("Warning: File %s has not been loaded.",qPrintable(files[0])); + finfo.setFile(files[0]); QByteArray code = file.readAll(); file.close(); FilterGeneratorTab* tb = tab(tabs->currentIndex()); @@ -804,10 +761,11 @@ void PluginGeneratorGUI::loadScriptCode() void PluginGeneratorGUI::saveScriptCode() { - QString filename = QFileDialog::getSaveFileName(this,tr("Save Script File"),directory.absolutePath(),tr("Script File (*.js)")); + QString filename = QFileDialog::getSaveFileName(this,tr("Save Script File"),finfo.absolutePath(),tr("Script File (*.js)")); QFile file(filename); if (!file.open(QFile::WriteOnly | QIODevice::Text)) qDebug("Warning: File %s has not been saved.",qPrintable(filename)); + finfo.setFile(filename); FilterGeneratorTab* tb = tab(tabs->currentIndex()); if (tb != NULL) { @@ -819,12 +777,12 @@ void PluginGeneratorGUI::saveScriptCode() void PluginGeneratorGUI::saveAsXMLPlugin() { - QFileDialog* saveDiag = new QFileDialog(this,tr("Save XML Plugin File"),directory.absolutePath(), tr("MeshLab XML Plugin (*.xml)")); + QFileDialog* saveDiag = new QFileDialog(this,tr("Save XML Plugin File"),finfo.absolutePath(), tr("MeshLab XML Plugin (*.xml)")); #if defined(Q_OS_MAC) saveDiag->setOption(QFileDialog::DontUseNativeDialog,true); #endif QLabel* namelab = new QLabel(tr("JScript Plugin Name"),saveDiag); - QLineEdit* jsline= new QLineEdit(plugname,saveDiag); + QLineEdit* jsline= new QLineEdit(plugscriptname,saveDiag); QLabel* authlab = new QLabel(tr("Author Name"),saveDiag); QLineEdit* authline= new QLineEdit(author,saveDiag); QLabel* maillab = new QLabel(tr("Author e-Mail"),saveDiag); @@ -843,33 +801,35 @@ void PluginGeneratorGUI::saveAsXMLPlugin() saveDiag->setAcceptMode(QFileDialog::AcceptSave); saveDiag->exec(); - plugname = jsline->text(); + plugscriptname = jsline->text(); author = authline->text(); mail = mailline->text(); QStringList files = saveDiag->selectedFiles(); if (files.size() != 1) return; QString fileName = files[0]; - QFileInfo finfo(files[0]); - MLXMLPluginInfo::XMLMapList ls; + save(fileName,cpp->isChecked()); /*for(int ii = 0;ii < tabs->count();++ii) { XMLFilterInfo::XMLMap mp; collectFilterInfo(mp); ls.push_back(mp); }*/ + delete saveDiag; +} + +void PluginGeneratorGUI::save( const QString& filepath,const bool generatecpp) +{ MLXMLTree tree; collectInfo(tree); - QString xml = generateXML(tree); - - if (cpp->isChecked()) + if (generatecpp) { QDir dir(finfo.absolutePath()); QString cppcode = MLXMLUtilityFunctions::generateCPP(finfo.baseName(),tree); QFileInfo cppinfo(finfo.absolutePath() + "/" +finfo.baseName() + ".cpp"); QString cppoldfilename = UsefulGUIFunctions::generateBackupName(cppinfo); dir.rename(cppinfo.fileName(),cppoldfilename); - + QFile cppfile(cppinfo.absoluteFilePath()); if (!cppfile.open(QIODevice::WriteOnly | QIODevice::Text)) return; @@ -888,22 +848,24 @@ void PluginGeneratorGUI::saveAsXMLPlugin() outh << hcode; hfile.close(); } + QString xml = generateXML(tree); //QDomDocument has been introduced only in order to indent the xml code QDomDocument doc; bool ret = doc.setContent(xml,false); xml = doc.toString(); - QFile file(fileName); + QFile file(filepath); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) return; QTextStream out(&file); out << xml; file.close(); - delete saveDiag; + finfo.setFile(filepath); } + void PluginGeneratorGUI::loadXMLPlugin() { - QString file = QFileDialog::getOpenFileName(this,"Load XML Plugin",directory.absolutePath(),QString("*.xml")); + QString file = QFileDialog::getOpenFileName(this,"Load XML Plugin",finfo.absolutePath(),QString("*.xml")); if (!file.isEmpty()) { MLXMLTree tree; @@ -911,6 +873,7 @@ void PluginGeneratorGUI::loadXMLPlugin() MLXMLPluginInfo* plug = MLXMLPluginInfo::createXMLPluginInfo(file,MLXMLUtilityFunctions::xmlSchemaFile(),msg); if (plug != NULL) { + finfo.setFile(file); MLXMLUtilityFunctions::loadMeshLabXML(tree,*plug); importInfo(tree); } @@ -922,13 +885,14 @@ void PluginGeneratorGUI::loadXMLPlugin() void PluginGeneratorGUI::insertPluginInMeshLab() { - //throw std::exception("The method or operation is not implemented."); + saveXMLPlugin(); + emit insertXMLPluginRequested(finfo.absoluteFilePath(),plugscriptname); } void PluginGeneratorGUI::collectInfo(MLXMLTree& tree ) { tree.interfaceinfo[MLXMLElNames::mfiVersion] = MLXMLElNames::mfiCurrentVersion; - tree.plugin.pluginfo[MLXMLElNames::pluginScriptName] = plugname; + tree.plugin.pluginfo[MLXMLElNames::pluginScriptName] = plugscriptname; tree.plugin.pluginfo[MLXMLElNames::pluginAuthor] = author; tree.plugin.pluginfo[MLXMLElNames::pluginEmail] = mail; for(int ii = 0;ii < tabs->count();++ii) @@ -982,7 +946,7 @@ int PluginGeneratorGUI::getPageIndexOfWidget( QWidget* wid ) void PluginGeneratorGUI::importInfo( const MLXMLTree& tree ) { - plugname = tree.plugin.pluginfo[MLXMLElNames::pluginScriptName]; + plugscriptname = tree.plugin.pluginfo[MLXMLElNames::pluginScriptName]; author = tree.plugin.pluginfo[MLXMLElNames::pluginAuthor]; mail = tree.plugin.pluginfo[MLXMLElNames::pluginEmail]; int nwtab = tree.plugin.filters.size() - tabs->count(); diff --git a/src/meshlab/xmlgeneratorgui.h b/src/meshlab/xmlgeneratorgui.h index 17f1c6285..29de9cdfe 100644 --- a/src/meshlab/xmlgeneratorgui.h +++ b/src/meshlab/xmlgeneratorgui.h @@ -123,27 +123,22 @@ public: void collectInfo(MLXMLFilterSubTree& filter); void importInfo(const MLXMLFilterSubTree& tree); - void initLibInEnv(PluginManager& pm); QString getCode() const; void setCode(const QString& code); - QScriptValue executeCode(MeshDocument* md); protected: void paintEvent(QPaintEvent* p); private slots: void jsButtonClicked(); void guiButtonClicked(); - //void filterNameValidationRequest(const QString& name); - //void parentDocked( Qt::DockWidgetArea area); + signals: void filterNameUpdated(const QString& fname,QWidget* wid); void validateFilterName(const QString& fname,FilterGeneratorGUI* wid); private: - //void expandCollapse(bool& exp,PrimitiveButton* pb,QFrame* fr ); void expandCollapse(const bool exp,PrimitiveButton* pb,QFrame* fr ); - Env env; bool jsexp; bool guiexp; Ui::FilterCreatorTab* ui; @@ -166,14 +161,13 @@ private slots: void updateTabTitle(const QString& name,QWidget* wid); void validateFilterName(const QString& name,FilterGeneratorGUI* wid); private: - enum MenuOption {MN_ADDFILTER,MN_REMOVEFILTER,MN_EXPORTFILTERINPLUGIN,MN_EXECUTECODE,MN_LOADCODE,MN_SAVECODE,MN_NEWXMLPLUGIN,MN_SAVEXMLPLUGIN,MN_SAVEASXMLPLUGIN,MN_LOADXMLPLUGIN,MN_INSERTPLUGINMESHLAB}; + enum MenuOption {MN_ADDFILTER,MN_REMOVEFILTER,MN_EXECUTECODE,MN_LOADCODE,MN_SAVECODE,MN_NEWXMLPLUGIN,MN_SAVEXMLPLUGIN,MN_SAVEASXMLPLUGIN,MN_LOADXMLPLUGIN,MN_INSERTPLUGINMESHLAB}; void createContextMenu(); void executeCurrentCode(); void loadScriptCode(); void saveScriptCode(); void addNewFilter(); void removeFilter(); - void exportFilterInPlugin(); void newXMLPlugin(); void saveXMLPlugin(); void saveAsXMLPlugin(); @@ -183,19 +177,21 @@ private: QString generateXML(const MLXMLTree& tree); void collectInfo(MLXMLTree& tree); void importInfo(const MLXMLTree& tree); + void save( const QString& filepath,const bool generatecpp); FilterGeneratorTab* tab(int ii); - QString plugname; + QString plugscriptname; QString author; QString mail; QMenu* menu; QTabWidget* tabs; bool init; - QDir directory; + QFileInfo finfo; MeshDocument* doc; PluginManager& PM; signals: void scriptCodeExecuted(const QScriptValue& val,const int time,const QString&); + void insertXMLPluginRequested(const QString& filename,const QString& plugscriptname); }; #endif \ No newline at end of file