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 <