filter reloading and a lot of other stuff have been added

This commit is contained in:
Guido Ranzuglia granzuglia 2011-11-22 16:36:41 +00:00
parent bf88b40fdc
commit d0f75d78ff
6 changed files with 87 additions and 104 deletions

View File

@ -20,6 +20,9 @@
* for more details. *
* *
****************************************************************************/
#ifndef FILTER_SCRIPT_DIALOG_H
#define FILTER_SCRIPT_DIALOG_H
#include <QDialog>
#include "../common/filterscript.h"
@ -79,4 +82,6 @@ public:
private:
Ui::scriptEditor* ui;
QString code;
};
};
#endif

View File

@ -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:

View File

@ -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&lters"));
filterMenu->addAction(lastFilterAct);
filterMenu->addAction(showFilterScriptAct);
filterMenu->addAction(showScriptEditAct);
fillFilterMenu();
//filterMenu = menuBar()->addMenu(tr("Fi&lters"));
//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"));

View File

@ -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();
}

View File

@ -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] = "<![CDATA[" + ui->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();

View File

@ -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