diff --git a/src/perl/make_pardialog_source.pl b/src/perl/make_pardialog_source.pl new file mode 100644 --- /dev/null +++ b/src/perl/make_pardialog_source.pl @@ -0,0 +1,303 @@ +#!/usr/bin/perl + +# +# $Id$ +# +# This file is part of the Virtual Leaf. +# +# The Virtual Leaf 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. +# +# The Virtual Leaf 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 the Virtual Leaf. If not, see . +# +# Copyright 2010 Roeland Merks. +# + +# input: parameter file + types +# format: par_name = default_value/type + +# output: C++ source code of class Parameter +# and sample parameter file + +%funname = ( + "double" => "toDouble", + "int" => "toInt", +); + +%typetrans = ( + "double" => "double", + "float" => "double", + "int" => "int", + "bool" => "bool", + "char *" => "char *", + "string" => "char *", + "directory" => "char *", + "doublelist" => "double *", + "label" => "label", + "title" => "title", +); + +$basename = "pardialog"; + +open parfile,"<$ARGV[0]"; +open cppfile,">$basename.cpp"; + +$i=0; +while () { + if (/^#/) { + next; + } + @line=split(/=/); +#ignore empty lines + if ($#line<1) { + next; + } + $param[$i]=$line[0]; + $value_type=$line[1]; + + @typel=split(/ \/ /,$value_type); + $value[$i] = $typel[0]; + $type[$i] = $typel[1]; + + #get rid of spaces + $type[$i] =~ s/ //g; + $type[$i] =~s/\n//g; + $convtype[$i]=$typetrans{$type[$i]}; + $param[$i] =~ s/ //g; + if ($convtype[$i] ne "label" && $convtype[$i] ne "title") { + #get rid of spaces + $value[$i] =~ s/ //g; + } + if ($convtype[$i] eq "char *") { + $value[$i] = "\"$value[$i]\""; + } + #print cppfile "param = $param, value = $value, type = $type\n"; + + $i++; +} + +$lines=$i; + + +print cppfile < +#include +#include +#include +#include + +ParameterDialog::ParameterDialog(QWidget *parent, const char *name, Qt::WindowFlags f) : QDialog(parent,name,false,f) { + extern Parameter par; +END_HEADER + +for ($i=0;$i<$lines;$i++) { + if ($convtype[$i] eq "label" || $convtype[$i] eq "title") { + next; + } + if ($convtype[$i] eq "double *") { + print cppfile " QString $param[$i]_string(\""; + @paramlist = split(/,/,$value[$i]); + for ($j=1;$j<=$#paramlist;$j++) { + print cppfile "%$j,"; + } + print cppfile "%$j\");\n"; + print cppfile " $param[$i]_string = $param[$i]_string"; + for ($j=0;$j<=$#paramlist;$j++) { + print cppfile ".arg(par.$param[$i]\[$j\])"; + } + print cppfile ";\n"; + print cppfile " $param[$i]_edit = new QLineEdit( $param[$i]_string, this, \"$param[$i]_edit\" );\n"; + } else { + if ($convtype[$i] eq "bool") { + print cppfile " $param[$i]_edit = new QLineEdit( QString(\"%1\").arg(sbool(par.$param[$i])), this, \"$param[$i]_edit\" );\n"; + } else { + print cppfile " $param[$i]_edit = new QLineEdit( QString(\"%1\").arg(par.$param[$i]), this, \"$param[$i]_edit\" );\n"; + } + } +} + + +print cppfile <addWidget( new QLabel( \"$value[$i]\", this), $row, $col, 1, 2 );\n"; + $c++; + } else { + if ($convtype[$i] eq "title") { + if ($ntitles) { + print stderr "Sorry, only one title allowed. Aborting source construction...\n"; + exit(1); + } + print cppfile " setWindowTitle( QString( \"$value[$i]\") );\n"; + print cppfile " grid->addWidget( new QLabel( \"

$value[$i]

\",this), $row, $col, 1, -1, Qt::AlignCenter);\n"; + print cppfile " grid->addWidget( new QLabel( \"\", this), $row+1, $col, 1, -1);\n"; + $ntitles++; + } else { + print cppfile " grid->addWidget( new QLabel( \"$param[$i]\", this ),$row, $col );\n"; + print cppfile " grid->addWidget( $param[$i]_edit, $row, $col+1 );\n"; + $c++; + } + } +} + +$row = $numrows+1; +$col = 2*int($i/$numrows); + +print cppfile <addWidget(pb, $row, $col ); + connect( pb, SIGNAL( clicked() ), this, SLOT( write() ) ); + QPushButton *pb2 = new QPushButton( \"&Close\", this ); + grid->addWidget(pb2,$row, $col+1 ); + connect( pb2, SIGNAL( clicked() ), this, SLOT( close() ) ); + QPushButton *pb3 = new QPushButton( \"&Reset\", this ); + grid->addWidget(pb3, $row, $col+2 ); + connect( pb3, SIGNAL( clicked() ), this, SLOT( Reset() ) ); + show(); +}; + +ParameterDialog::~ParameterDialog(void) { +ANOTHER_LABEL + +for ($i=0;$i<$lines;$i++) { + if ($convtype[$i] ne "label" && $convtype[$i] ne "title") { + print cppfile "delete $param[$i]_edit;\n"; + } +} + +print cppfile <text().section(',', $j, $j);\n"; + print cppfile " par.$param[$i]\[$j\] = tmpval.toDouble();\n"; + } + } else { + if ($convtype[$i] eq "bool") { + print cppfile " tmpval = $param[$i]_edit->text().stripWhiteSpace();\n"; + print cppfile " if (tmpval == \"true\" || tmpval == \"yes\" ) par.$param[$i] = true;\n"; + print cppfile " else if (tmpval == \"false\" || tmpval == \"no\") par.$param[$i] = false;\n"; + print cppfile " else {\n"; + print cppfile " if (QMessageBox::question(this, \"Syntax error\", tr(\"Value %1 of parameter %2 is not recognized as Boolean.\\nDo you mean TRUE or FALSE?\").arg(tmpval).arg(\"$param[$i]\"),\"True\",\"False\", QString::null, 0, 1)==0) par.$param[$i]=true;\n"; + print cppfile " else par.$param[$i]=false;\n"; + print cppfile " }\n"; + } else { + if ($convtype[$i] eq "char *") { + print cppfile " par.$param[$i] = strdup((const char *)$param[$i]_edit->text());\n"; + } else { + print cppfile " par.$param[$i] = $param[$i]_edit->text().$funname{$convtype[$i]}();\n"; + } + } + } +} + + + +print cppfile <setText( $param[$i]_string );\n"; + } else { + if ($convtype[$i] eq "bool") { + print cppfile " $param[$i]_edit->setText( QString(\"%1\").arg(sbool(par.$param[$i])));\n"; + } else { + print cppfile " $param[$i]_edit->setText( QString(\"%1\").arg(par.$param[$i]) );\n"; + } + } +} + +print cppfile "}\n\n"; + +# qparameter.h + +open hfile, ">$basename.h"; +print hfile < +#include +#include +#include +#include +#include + +class ParameterDialog : public QDialog { + Q_OBJECT + + public: + ParameterDialog(QWidget *parent=0, const char *name = 0, Qt::WindowFlags f = 0); + virtual ~ParameterDialog(void); + public slots: + void Reset(void); + +private slots: + void write(void); + + private: +END_HEADER2 + +for ($i=0;$i<$lines;$i++) { + if ($convtype[$i] ne "label" && $convtype[$i] ne "title") { + print hfile " QLineEdit *$param[$i]_edit;\n"; + } +} + +print hfile <