1 /****************************************************************************
2 * MeshLab                                                           o o     *
3 * A versatile mesh processing toolbox                             o     o   *
4 *                                                                _   O  _   *
5 * Copyright(C) 2004-2008                                                \/)\/    *
6 * Visual Computing Lab                                            /\/|      *
7 * ISTI - Italian National Research Council                           |      *
8 *                                                                    \      *
9 * All rights reserved.                                                      *
10 *                                                                           *
11 * This program is free software; you can redistribute it and/or modify      *
12 * it under the terms of the GNU General Public License as published by      *
13 * the Free Software Foundation; either version 2 of the License, or         *
14 * (at your option) any later version.                                       *
15 *                                                                           *
16 * This program is distributed in the hope that it will be useful,           *
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of            *
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             *
19 * GNU General Public License (http://www.gnu.org/licenses/gpl.txt)          *
20 * for more details.                                                         *
21 *                                                                           *
22 ****************************************************************************/
23 
24 #ifndef MESHLAB_FILTERPARAMETER_H
25 #define MESHLAB_FILTERPARAMETER_H
26 #include <QtCore>
27 #include <QtXml>
28 
29 #include <QMap>
30 #include<QString>
31 #include <QPair>
32 #include <QAction>
33 #include <vcg/math/matrix44.h>
34 #include <vcg/space/color4.h>
35 #include <vcg/math/shot.h>
36 #include <wrap/callback.h>
37 
38 #include "xmlfilterinfo.h"
39 
40 class MeshModel;
41 class MeshDocument;
42 
43 //enum TypeId {BOOL,INT,FLOAT,STRING,MATRIX44F,POINT3F,COLOR,ENUM,MESH,GROUP,FILENAME};
44 //
45 //class Binding
46 //{
47 //public:
48 //	TypeId tid;
49 //	QString name;
50 //	QString value;
51 //};
52 //
53 //class BindingSet
54 //{
55 //public:
56 //	QList<Binding> binds;
57 //
58 //	bool declare(const TypeId id,const QString& nm,const QString& val);
59 //};
60 //
61 //class Environment
62 //{
63 //public:
64 //	BindingSet globals;
65 //	BindingSet locals;
66 //
67 //	int evalInt(const QString& val,bool& conv) const;
68 //	float evalFloat(const QString& val,bool& conv) const;
69 //	bool evalBool(const QString& val,bool& conv) const;
70 //};
71 //
72 //class Decoration
73 //{
74 //public:
75 //	QString fieldDesc;
76 //	QString tooltip;
77 //};
78 
79 class Value
80 {
81 public:
getBool()82 	virtual bool				getBool() const { assert(0); return bool(); }
getInt()83 	virtual int					getInt() const { assert(0); return int(); }
getFloat()84 	virtual float				getFloat() const { assert(0); return float(); }
getString()85 	virtual QString			getString() const { assert(0); return QString(); }
getMatrix44f()86 	virtual vcg::Matrix44f		getMatrix44f() const { assert(0); return vcg::Matrix44f(); }
getPoint3f()87 	virtual vcg::Point3f getPoint3f() const { assert(0); return vcg::Point3f(); }
getShotf()88 	virtual vcg::Shotf  getShotf() const { assert(0); return vcg::Shotf(); }
getColor()89 	virtual QColor		   getColor() const { assert(0); return QColor(); }
getAbsPerc()90 	virtual float		     getAbsPerc() const { assert(0); return float(); }
getEnum()91 	virtual int					 getEnum() const { assert(0); return int(); }
getMesh()92 	virtual MeshModel*   getMesh() const { assert(0); return NULL; }
getFloatList()93 	virtual QList<float> getFloatList() const { assert(0); return QList<float>(); }
getDynamicFloat()94 	virtual float        getDynamicFloat() const { assert(0); return float(); }
getFileName()95 	virtual QString getFileName() const { assert(0); return QString(); }
96 
isBool()97 	virtual bool isBool() const { return false; }
isInt()98 	virtual bool isInt() const { return false; }
isFloat()99 	virtual bool isFloat() const { return false; }
isString()100 	virtual bool isString() const { return false; }
isMatrix44f()101 	virtual bool isMatrix44f() const { return false; }
isPoint3f()102 	virtual bool isPoint3f() const { return false; }
isShotf()103 	virtual bool isShotf() const { return false; }
isColor()104 	virtual bool isColor() const { return false; }
isAbsPerc()105 	virtual bool isAbsPerc() const { return false; }
isEnum()106 	virtual bool isEnum() const { return false; }
isMesh()107 	virtual bool isMesh() const { return false; }
isFloatList()108 	virtual bool isFloatList() const { return false; }
isDynamicFloat()109 	virtual bool isDynamicFloat() const { return false; }
isFileName()110 	virtual bool isFileName() const { return false; }
111 
112 
113 	virtual QString typeName() const = 0;
114 	virtual void	set(const Value& p) = 0;
~Value()115 	virtual ~Value() {}
116 };
117 
118 class BoolValue : public Value
119 {
120 public:
121 	BoolValue(const bool val);
getBool()122 	inline bool getBool() const { return pval; }
isBool()123 	inline bool isBool() const { return true; }
typeName()124 	inline QString typeName() const { return QString("Bool"); }
set(const Value & p)125 	inline void	set(const Value& p) { pval = p.getBool(); }
~BoolValue()126 	~BoolValue() {}
127 private:
128 	bool pval;
129 };
130 
131 class IntValue : public Value
132 {
133 public:
IntValue(const int val)134 	IntValue(const int val) : pval(val) {}
getInt()135 	inline int	getInt() const { return pval; }
isInt()136 	inline bool isInt() const { return true; }
typeName()137 	inline QString typeName() const { return QString("Int"); }
set(const Value & p)138 	inline void	set(const Value& p) { pval = p.getInt(); }
~IntValue()139 	~IntValue() {}
140 private:
141 	int pval;
142 };
143 
144 class FloatValue : public Value
145 {
146 public:
FloatValue(const float val)147 	FloatValue(const float val) :pval(val) {}
getFloat()148 	inline float	getFloat() const { return pval; }
isFloat()149 	inline bool isFloat() const { return true; }
typeName()150 	inline QString typeName() const { return QString("Float"); }
set(const Value & p)151 	inline void	set(const Value& p) { pval = p.getFloat(); }
~FloatValue()152 	~FloatValue() {}
153 private:
154 	float pval;
155 };
156 
157 class StringValue : public Value
158 {
159 public:
StringValue(const QString & val)160 	StringValue(const QString& val) :pval(val) {}
getString()161 	inline QString getString() const { return pval; }
isString()162 	inline bool isString() const { return true; }
typeName()163 	inline QString typeName() const { return QString("String"); }
set(const Value & p)164 	inline void	set(const Value& p) { pval = p.getString(); }
~StringValue()165 	~StringValue() {}
166 private:
167 	QString pval;
168 };
169 
170 class Matrix44fValue : public Value
171 {
172 public:
Matrix44fValue(const vcg::Matrix44f & val)173 	Matrix44fValue(const vcg::Matrix44f& val) :pval(val) {}
Matrix44fValue(const vcg::Matrix44d & val)174 	Matrix44fValue(const vcg::Matrix44d& val) :pval(vcg::Matrix44f::Construct(val)) {}
getMatrix44f()175 	inline vcg::Matrix44f getMatrix44f() const { return pval; }
isMatrix44f()176 	inline bool isMatrix44f() const { return true; }
typeName()177 	inline QString typeName() const { return QString("Matrix44f"); }
set(const Value & p)178 	inline void	set(const Value& p) { pval = p.getMatrix44f(); }
~Matrix44fValue()179 	~Matrix44fValue() {}
180 private:
181 	vcg::Matrix44f pval;
182 };
183 
184 class Point3fValue : public Value
185 {
186 public:
Point3fValue(const vcg::Point3f & val)187 	Point3fValue(const vcg::Point3f& val) : pval(val) {}
Point3fValue(const vcg::Point3d & val)188 	Point3fValue(const vcg::Point3d& val) : pval(vcg::Point3f::Construct(val)) {}
getPoint3f()189 	inline vcg::Point3f getPoint3f() const { return pval; }
isPoint3f()190 	inline bool isPoint3f() const { return true; }
typeName()191 	inline QString typeName() const { return QString("Point3f"); }
set(const Value & p)192 	inline void	set(const Value& p) { pval = p.getPoint3f(); }
~Point3fValue()193 	~Point3fValue() {}
194 private:
195 	vcg::Point3f pval;
196 };
197 
198 class ShotfValue : public Value
199 {
200 public:
ShotfValue(const vcg::Shotf & val)201 	ShotfValue(const vcg::Shotf& val) : pval(val) {}
getShotf()202 	inline vcg::Shotf getShotf() const { return pval; }
isShotf()203 	inline bool isShotf() const { return true; }
typeName()204 	inline QString typeName() const { return QString("Shotf"); }
set(const Value & p)205 	inline void	 set(const Value& p) { pval = p.getShotf(); }
~ShotfValue()206 	~ShotfValue() {}
207 private:
208 	vcg::Shotf pval;
209 };
210 
211 class ColorValue : public Value
212 {
213 public:
ColorValue(QColor val)214 	ColorValue(QColor val) :pval(val) {}
getColor()215 	inline QColor getColor() const { return pval; }
isColor()216 	inline bool isColor() const { return true; }
typeName()217 	inline QString typeName() const { return QString("Color"); }
set(const Value & p)218 	inline void	set(const Value& p) { pval = p.getColor(); }
~ColorValue()219 	~ColorValue() {}
220 private:
221 	QColor pval;
222 };
223 
224 class AbsPercValue : public FloatValue
225 {
226 public:
AbsPercValue(const float val)227 	AbsPercValue(const float val) :FloatValue(val) {}
getAbsPerc()228 	inline float getAbsPerc() const { return getFloat(); }
typeName()229 	inline QString typeName() const { return QString("AbsPerc"); }
isAbsPerc()230 	inline bool isAbsPerc() const { return true; }
~AbsPercValue()231 	~AbsPercValue() {}
232 };
233 
234 class EnumValue : public IntValue
235 {
236 public:
EnumValue(const int val)237 	EnumValue(const int val) :IntValue(val) {}
getEnum()238 	inline int getEnum() const { return getInt(); }
isEnum()239 	inline bool isEnum() const { return true; }
typeName()240 	inline QString typeName() const { return QString("Enum"); }
~EnumValue()241 	~EnumValue() {}
242 };
243 
244 class FloatListValue : public Value
245 {
246 public:
FloatListValue(QList<float> & val)247 	FloatListValue(QList<float>& val) :pval(val) {}
getFloatList()248 	inline QList<float> getFloatList() const { return pval; }
set(const Value & p)249 	inline void	set(const Value& p) { pval = p.getFloatList(); }
typeName()250 	inline QString typeName() const { return QString("FloatList"); }
isFloatList()251 	inline bool isFloatList() const { return true; }
~FloatListValue()252 	~FloatListValue() {}
253 private:
254 	QList<float> pval;
255 };
256 
257 class DynamicFloatValue : public FloatValue
258 {
259 public:
DynamicFloatValue(const float val)260 	DynamicFloatValue(const float val) :FloatValue(val) {}
getDynamicFloat()261 	inline float getDynamicFloat() const { return getFloat(); }
isDynamicFloat()262 	inline bool isDynamicFloat() const { return true; }
typeName()263 	inline QString typeName() const { return QString("DynamicFloat"); }
~DynamicFloatValue()264 	~DynamicFloatValue() {}
265 };
266 
267 class FileValue : public Value
268 {
269 public:
FileValue(QString filename)270 	FileValue(QString filename) :pval(filename) {}
getFileName()271 	inline QString getFileName() const { return pval; }
isFileName()272 	inline bool isFileName() const { return true; }
typeName()273 	inline QString typeName() const { return QString("FileName"); }
set(const Value & p)274 	inline void	set(const Value& p) { pval = p.getFileName(); }
~FileValue()275 	~FileValue() {}
276 private:
277 	QString pval;
278 };
279 
280 class MeshValue : public Value
281 {
282 public:
MeshValue(MeshModel * mesh)283 	MeshValue(MeshModel* mesh) : pval(mesh) {}
getMesh()284 	inline MeshModel* getMesh() const { return pval; }
isMesh()285 	inline bool isMesh() const { return true; }
typeName()286 	inline QString typeName() const { return QString("Mesh"); }
set(const Value & p)287 	inline void	set(const Value& p) { pval = p.getMesh(); }
~MeshValue()288 	~MeshValue() {}
289 
290 private:
291 	MeshModel* pval;
292 };
293 
294 /*************************/
295 
296 //class ParameterDeclaration
297 //{
298 //public:
299 //	const QString name;
300 //	Value* val;
301 //
302 //	virtual void accept(Visitor& v) = 0;
303 //	virtual bool operator==(const ParameterDeclaration& rp) = 0;
304 //	virtual ~RichParameter();
305 //};
306 //
307 //class BoolDeclaration
308 //{
309 //public:
310 //	BoolDeclaration(const QString nm,const bool defval);
311 //	bool operator==(const ParameterDeclaration& rp);
312 //	void accept(Visitor& v);
313 //	~BoolDeclaration();
314 //};
315 //
316 //class IntDeclaration
317 //{
318 //public:
319 //	IntDeclaration(const QString nm,const bool defval);
320 //	bool operator==(const ParameterDeclaration& rp);
321 //	void accept(Visitor& v);
322 //	~IntDeclaration();
323 //};
324 
325 
326 /******************************/
327 
328 class ParameterDecoration
329 {
330 public:
331 	QString fieldDesc;
332 	QString tooltip;
333 	Value* defVal;
334 
335 	ParameterDecoration(Value* defvalue, const QString& desc = QString(), const QString& tltip = QString());
336 
337 	virtual ~ParameterDecoration();
338 
339 };
340 
341 class BoolDecoration : public ParameterDecoration
342 {
343 public:
344 	BoolDecoration(BoolValue* defvalue, const QString& desc = QString(), const QString& tltip = QString());
~BoolDecoration()345 	~BoolDecoration() {}
346 };
347 
348 class IntDecoration : public ParameterDecoration
349 {
350 public:
351 	IntDecoration(IntValue* defvalue, const QString& desc = QString(), const QString& tltip = QString());
~IntDecoration()352 	~IntDecoration() {}
353 };
354 
355 class FloatDecoration : public ParameterDecoration
356 {
357 public:
358 	FloatDecoration(FloatValue* defvalue, const QString& desc = QString(), const QString& tltip = QString());
~FloatDecoration()359 	~FloatDecoration() {}
360 };
361 
362 class StringDecoration : public ParameterDecoration
363 {
364 public:
365 	StringDecoration(StringValue* defvalue, const QString& desc = QString(), const QString& tltip = QString());
~StringDecoration()366 	~StringDecoration() {}
367 };
368 
369 class Matrix44fDecoration : public ParameterDecoration
370 {
371 public:
372 	Matrix44fDecoration(Matrix44fValue* defvalue, const QString& desc = QString(), const QString& tltip = QString());
~Matrix44fDecoration()373 	~Matrix44fDecoration() {}
374 };
375 
376 class Point3fDecoration : public ParameterDecoration
377 {
378 public:
379 	Point3fDecoration(Point3fValue* defvalue, const QString& desc = QString(), const QString& tltip = QString());
~Point3fDecoration()380 	~Point3fDecoration() {}
381 };
382 
383 class ShotfDecoration : public ParameterDecoration
384 {
385 public:
386 	ShotfDecoration(ShotfValue* defvalue, const QString& desc = QString(), const QString& tltip = QString());
~ShotfDecoration()387 	~ShotfDecoration() {}
388 };
389 
390 class ColorDecoration : public ParameterDecoration
391 {
392 public:
393 	ColorDecoration(ColorValue* defvalue, const QString& desc = QString(), const QString& tltip = QString());
~ColorDecoration()394 	~ColorDecoration() {}
395 };
396 
397 class AbsPercDecoration : public ParameterDecoration
398 {
399 public:
400 	AbsPercDecoration(AbsPercValue* defvalue, const float minVal, const float maxVal, const QString& desc = QString(), const QString& tltip = QString());
401 	float min;
402 	float max;
~AbsPercDecoration()403 	~AbsPercDecoration() {}
404 };
405 
406 class EnumDecoration : public ParameterDecoration
407 {
408 public:
409 	EnumDecoration(EnumValue* defvalue, QStringList values, const QString& desc = QString(), const QString& tltip = QString());
410 	QStringList enumvalues;
~EnumDecoration()411 	~EnumDecoration() {}
412 };
413 
414 class FloatListDecoration : public ParameterDecoration
415 {
416 public:
417 	FloatListDecoration(FloatListValue* defvalue, const QString desc = QString(), const QString tltip = QString())
ParameterDecoration(defvalue,desc,tltip)418 		:ParameterDecoration(defvalue, desc, tltip) {}
~FloatListDecoration()419 	~FloatListDecoration() {}
420 };
421 
422 class DynamicFloatDecoration : public ParameterDecoration
423 {
424 public:
425 	DynamicFloatDecoration(DynamicFloatValue* defvalue, const float minVal, const float maxVal, const QString& desc = QString(), const QString& tltip = QString());
~DynamicFloatDecoration()426 	~DynamicFloatDecoration() {};
427 	float min;
428 	float max;
429 };
430 
431 class SaveFileDecoration : public ParameterDecoration
432 {
433 public:
434 	SaveFileDecoration(FileValue* defvalue, const QString& extension, const QString& desc = QString(), const QString& tltip = QString());
~SaveFileDecoration()435 	~SaveFileDecoration() {}
436 
437 	QString ext;
438 };
439 
440 class OpenFileDecoration : public ParameterDecoration
441 {
442 public:
443 	OpenFileDecoration(FileValue* directorydefvalue, const QStringList& extensions, const QString& desc = QString(), const QString& tltip = QString());
~OpenFileDecoration()444 	~OpenFileDecoration() {}
445 
446 	QStringList exts;
447 };
448 
449 
450 class MeshDecoration : public ParameterDecoration
451 {
452 public:
453 	MeshDecoration(MeshValue* defvalue, MeshDocument* doc, const QString& desc = QString(), const QString& tltip = QString());
454 
455 	MeshDecoration(int meshind, MeshDocument* doc, const QString& desc = QString(), const QString& tltip = QString());
456 
457 	//WARNING: IT SHOULD BE USED ONLY BY MESHLABSERVER!!!!!!!
458 	MeshDecoration(int meshind, const QString& desc = QString(), const QString& tooltip = QString());
459 
~MeshDecoration()460 	~MeshDecoration() {}
461 
462 	MeshDocument* meshdoc;
463 	int meshindex;
464 };
465 
466 /******************************/
467 class RichBool;
468 class RichInt;
469 class RichFloat;
470 class RichString;
471 class RichMatrix44f;
472 class RichPoint3f;
473 class RichShotf;
474 class RichColor;
475 class RichAbsPerc;
476 class RichEnum;
477 class RichFloatList;
478 class RichDynamicFloat;
479 class RichOpenFile;
480 class RichSaveFile;
481 class RichMesh;
482 
483 
484 class Visitor
485 {
486 public:
487 
488 	virtual void visit(RichBool& pd) = 0;
489 	virtual void visit(RichInt& pd) = 0;
490 	virtual void visit(RichFloat& pd) = 0;
491 	virtual void visit(RichString& pd) = 0;
492 	virtual void visit(RichMatrix44f& pd) = 0;
493 	virtual void visit(RichPoint3f& pd) = 0;
494 	virtual void visit(RichShotf& pd) = 0;
495 	virtual void visit(RichColor& pd) = 0;
496 	virtual void visit(RichAbsPerc& pd) = 0;
497 	virtual void visit(RichEnum& pd) = 0;
498 	virtual void visit(RichFloatList& pd) = 0;
499 	virtual void visit(RichDynamicFloat& pd) = 0;
500 	virtual void visit(RichOpenFile& pd) = 0;
501 	virtual void visit(RichSaveFile& pd) = 0;
502 	virtual void visit(RichMesh& pd) = 0;
503 
~Visitor()504 	virtual ~Visitor() {}
505 };
506 
507 class RichParameter
508 {
509 public:
510 	const QString name;
511 
512 	Value* val;
513 
514 	ParameterDecoration* pd;
515 
516 	RichParameter(const QString& nm, Value* v, ParameterDecoration* prdec, bool isxmlpar = false);
517 	virtual void accept(Visitor& v) = 0;
518 	virtual bool operator==(const RichParameter& rp) = 0;
519 	virtual ~RichParameter();
520 
isDerivedFromXMLParam()521 	inline bool isDerivedFromXMLParam() { return isxmlparam; }
setIsDerivedFromXMLParam(bool derived)522 	inline void setIsDerivedFromXMLParam(bool derived) { isxmlparam = derived; }
523 
524 private:
525 	bool isxmlparam;
526 };
527 
528 
529 class RichBool : public RichParameter
530 {
531 public:
532 	RichBool(const QString nm, const bool defval);
533 	RichBool(const QString nm, const bool defval, const QString desc);
534 	RichBool(const QString& nm, const bool defval, const QString& desc, const QString& tltip);
535 	RichBool(const QString& nm, const bool val, const bool defval, const QString& desc, const QString& tltip, bool isxmlpar = false);
536 	void accept(Visitor& v);
537 	bool operator==(const RichParameter& rb);
538 
539 	~RichBool();
540 };
541 
542 class RichInt : public RichParameter
543 {
544 public:
545 	RichInt(const QString& nm, const int defval, const QString& desc = QString(), const QString& tltip = QString());
546 	RichInt(const QString& nm, const int val, const int defval, const QString& desc = QString(), const QString& tltip = QString(), bool isxmlpar = false);
547 	void accept(Visitor& v);
548 	bool operator==(const RichParameter& rb);
549 	~RichInt();
550 };
551 
552 class RichFloat : public RichParameter
553 {
554 public:
555 	RichFloat(const QString& nm, const float defval, const QString& desc = QString(), const QString& tltip = QString());
556 	RichFloat(const QString& nm, const float val, const float defval, const QString& desc = QString(), const QString& tltip = QString(), bool isxmlpar = false);
557 	void accept(Visitor& v);
558 	bool operator==(const RichParameter& rb);
559 	~RichFloat();
560 };
561 
562 class RichString : public RichParameter
563 {
564 public:
565 	RichString(const QString& nm, const QString& defval, const QString& desc, const QString& tltip);
566 	RichString(const QString& nm, const QString& defval);
567 	RichString(const QString& nm, const QString& defval, const QString& desc);
568 	RichString(const QString& nm, const QString& val, const QString& defval, const QString& desc, const QString& tltip, bool isxmlpar = false);
569 	void accept(Visitor& v);
570 	bool operator==(const RichParameter& rb);
571 	~RichString();
572 };
573 
574 class RichMatrix44f : public RichParameter
575 {
576 public:
577 	RichMatrix44f(const QString& nm, const vcg::Matrix44f& defval, const QString& desc = QString(), const QString& tltip = QString());
578 	RichMatrix44f(const QString& nm, const vcg::Matrix44d& defval, const QString& desc = QString(), const QString& tltip = QString());
579 	RichMatrix44f(const QString& nm, const vcg::Matrix44f& val, const vcg::Matrix44f& defval, const QString& desc = QString(), const QString& tltip = QString(), bool isxmlpar = false);
580 	void accept(Visitor& v);
581 	bool operator==(const RichParameter& rb);
582 	~RichMatrix44f();
583 };
584 
585 class RichPoint3f : public RichParameter
586 {
587 public:
588 	RichPoint3f(const QString& nm, const vcg::Point3f& defval, const QString& desc = QString(), const QString& tltip = QString());
589 	RichPoint3f(const QString& nm, const vcg::Point3d& defval, const QString& desc = QString(), const QString& tltip = QString());
590 	RichPoint3f(const QString& nm, const vcg::Point3f& val, const vcg::Point3f& defval, const QString& desc = QString(), const QString& tltip = QString(), bool isxmlpar = false);
591 	void accept(Visitor& v);
592 	bool operator==(const RichParameter& rb);
593 	~RichPoint3f();
594 };
595 class RichShotf : public RichParameter
596 {
597 public:
598 	RichShotf(const QString& nm, const vcg::Shotf& defval, const QString& desc = QString(), const QString& tltip = QString());
599 	RichShotf(const QString& nm, const vcg::Shotf& val, const vcg::Shotf& defval, const QString& desc = QString(), const QString& tltip = QString(), bool isxmlpar = false);
600 	void accept(Visitor& v);
601 	bool operator==(const RichParameter& rb);
602 	~RichShotf();
603 };
604 
605 class RichColor : public RichParameter
606 {
607 public:
608 	RichColor(const QString& nm, const QColor& defval);
609 	RichColor(const QString& nm, const QColor& defval, const QString& desc);
610 	RichColor(const QString& nm, const QColor& defval, const QString& desc, const QString& tltip);
611 	RichColor(const QString& nm, const QColor& val, const QColor& defval, const QString& desc, const QString& tltip, bool isxmlpar = false);
612 	void accept(Visitor& v);
613 	bool operator==(const RichParameter& rb);
614 	~RichColor();
615 
616 };
617 
618 class RichAbsPerc : public RichParameter
619 {
620 public:
621 	RichAbsPerc(const QString& nm, const float defval, const float minval, const float maxval, const QString& desc = QString(), const QString& tltip = QString());
622 	RichAbsPerc(const QString& nm, const float val, const float defval, const float minval, const float maxval, const QString& desc = QString(), const QString& tltip = QString(), bool isxmlpar = false);
623 	void accept(Visitor& v);
624 	bool operator==(const RichParameter& rb);
625 	~RichAbsPerc();
626 };
627 
628 class RichEnum : public RichParameter
629 {
630 public:
631 	RichEnum(const QString& nm, const int defval, const QStringList& values, const QString& desc = QString(), const QString& tltip = QString());
632 	RichEnum(const QString& nm, const int val, const int defval, const QStringList& values, const QString& desc = QString(), const QString& tltip = QString(), bool isxmlpar = false);
633 	void accept(Visitor& v);
634 	bool operator==(const RichParameter& rb);
635 	~RichEnum();
636 };
637 
638 class RichMesh : public RichParameter
639 {
640 public:
641 
642 	//lastCreated = new RichMesh(pd.name, pd.val->getMesh(), dec->defVal->getMesh(), dec->meshdoc, dec->fieldDesc, dec->tooltip, pd.isDerivedFromXMLParam());
643 	//else
644 	//	lastCreated = new RichMesh(pd.name, dec->meshindex, pd.isDerivedFromXMLParam());
645 	RichMesh(const QString& nm, MeshModel* defval, MeshDocument* doc, const QString& desc = QString(), const QString& tltip = QString());
646 	RichMesh(const QString& nm, MeshModel* val, MeshModel* defval, MeshDocument* doc, const QString& desc = QString(), const QString& tltip = QString(), bool isxmlpar = false);
647 
648 	RichMesh(const QString& nm, int meshindex, MeshDocument* doc, const QString& desc = QString(), const QString& tltip = QString());
649 
650 	//WARNING: IT SHOULD BE USED ONLY BY MESHLABSERVER!!!!!!!
651 	RichMesh(const QString& nm, int meshind, bool isxmlpar = false);
652 	RichMesh(const QString& nm, int meshind, const QString& desc = QString(), const QString& tltip = QString(), bool isxmlpar = false);
653 
654 	void accept(Visitor& v);
655 	bool operator==(const RichParameter& rb);
656 	~RichMesh();
657 
658 	int meshindex;
659 };
660 
661 class RichFloatList : public RichParameter
662 {
663 public:
664 	RichFloatList(const QString& nm, FloatListValue* v, FloatListDecoration* prdec);
665 	RichFloatList(const QString& nm, FloatListValue* val, FloatListValue* v, FloatListDecoration* prdec, bool isxmlpar = false);
666 	void accept(Visitor& v);
667 	bool operator==(const RichParameter& rb);
668 	~RichFloatList();
669 };
670 
671 class RichDynamicFloat : public RichParameter
672 {
673 public:
674 	RichDynamicFloat(const QString& nm, const float defval, const float minval, const float maxval, const QString& desc = QString(), const QString& tltip = QString());
675 	RichDynamicFloat(const QString& nm, const float val, const float defval, const float minval, const float maxval, const QString& desc = QString(), const QString& tltip = QString(), bool isxmlpar = false);
676 	void accept(Visitor& v);
677 	bool operator==(const RichParameter& rb);
678 	~RichDynamicFloat();
679 
680 };
681 
682 class RichOpenFile : public RichParameter
683 {
684 public:
685 	RichOpenFile(const QString& nm, const QString& directorydefval, const QStringList& exts, const QString& desc = QString(), const QString& tltip = QString(), bool isxmlpar = false);
686 	void accept(Visitor& v);
687 	bool operator==(const RichParameter& rb);
688 	~RichOpenFile();
689 };
690 
691 class RichSaveFile : public RichParameter
692 {
693 public:
694 	RichSaveFile(const QString& nm, const QString& filedefval, const QString& ext, const QString& desc = QString(), const QString& tltip = QString(), bool isxmlpar = false);
695 	void accept(Visitor& v);
696 	bool operator==(const RichParameter& rb);
697 	~RichSaveFile();
698 };
699 
700 
701 
702 /******************************/
703 
704 class RichParameterCopyConstructor : public Visitor
705 {
706 public:
RichParameterCopyConstructor()707 	RichParameterCopyConstructor() {}
708 
709 	void visit(RichBool& pd);
710 	void visit(RichInt& pd);
711 	void visit(RichFloat& pd);
712 	void visit(RichString& pd);
713 	void visit(RichMatrix44f& pd);
714 	void visit(RichPoint3f& pd);
715 	void visit(RichShotf& pd);
716 	void visit(RichColor& pd);
717 	void visit(RichAbsPerc& pd);
718 
719 	void visit(RichEnum& pd);
720 	void visit(RichFloatList& pd);
721 
722 	void visit(RichDynamicFloat& pd);
723 
724 	void visit(RichOpenFile& pd);
725 	void visit(RichSaveFile& pd);
726 	void visit(RichMesh& pd);
727 
~RichParameterCopyConstructor()728 	~RichParameterCopyConstructor() {}
729 
730 	RichParameter* lastCreated;
731 };
732 
733 class RichParameterAdapter
734 {
735 public:
736 	static bool create(const QDomElement& np, RichParameter** par);
737 	static bool create(const QString & namepreamble, const MLXMLPluginInfo::XMLMap & xmlparam, RichParameter ** par);
738 
739 	static QString convertToStringValue(RichParameter& rp);
740 };
741 
742 class RichParameterValueToStringVisitor : public Visitor
743 {
744 public:
RichParameterValueToStringVisitor()745 	RichParameterValueToStringVisitor() : stringvalue() {}
746 
747 	void visit(RichBool& pd);
748 	void visit(RichInt& pd);
749 	void visit(RichFloat& pd);
750 	void visit(RichString& pd);
751 	void visit(RichMatrix44f& pd);
752 	void visit(RichPoint3f& pd);
753 	void visit(RichShotf& pd);
754 	void visit(RichColor& pd);
755 	void visit(RichAbsPerc& pd);
756 
757 	void visit(RichEnum& pd);
758 	void visit(RichFloatList& pd);
759 
760 	void visit(RichDynamicFloat& pd);
761 
762 	void visit(RichOpenFile& pd);
763 	void visit(RichSaveFile& pd);
764 	void visit(RichMesh& pd);
765 
~RichParameterValueToStringVisitor()766 	~RichParameterValueToStringVisitor() {}
767 
768 	QString stringvalue;
769 };
770 
771 
772 class RichParameterXMLVisitor : public Visitor
773 {
774 public:
RichParameterXMLVisitor(QDomDocument & doc)775 	RichParameterXMLVisitor(QDomDocument& doc) : docdom(doc) {}
776 
777 	void visit(RichBool& pd);
778 	void visit(RichInt& pd);
779 	void visit(RichFloat& pd);
780 	void visit(RichString& pd);
781 	void visit(RichMatrix44f& pd);
782 	void visit(RichPoint3f& pd);
783 	void visit(RichShotf& pd);
784 	void visit(RichColor& pd);
785 	void visit(RichAbsPerc& pd);
786 
787 	void visit(RichEnum& pd);
788 	void visit(RichFloatList& pd);
789 
790 	void visit(RichDynamicFloat& pd);
791 
792 	void visit(RichOpenFile& pd);
793 	void visit(RichSaveFile& pd);
794 	void visit(RichMesh& pd);
795 
~RichParameterXMLVisitor()796 	~RichParameterXMLVisitor() {}
797 
798 	QDomDocument docdom;
799 	QDomElement parElem;
800 private:
801 	void fillRichParameterAttribute(const QString& type, const QString& name, const QString& desc, const QString& tooltip, bool isxmlpar);
802 	void fillRichParameterAttribute(const QString& type, const QString& name, const QString& val, const QString& desc, const QString& tooltip, bool isxmlpar);
803 };
804 
805 class RichParameterSet
806 {
807 
808 public:
809 	RichParameterSet();
810 	RichParameterSet(const RichParameterSet& rps);
811 	// The data is just a list of Parameters
812 	//QMap<QString, FilterParameter *> paramMap;
813 	QList<RichParameter*> paramList;
814 	bool isEmpty() const;
815 	RichParameter* findParameter(const QString& name) const;
816 	bool hasParameter(const QString& name) const;
817 
818 
819 	RichParameterSet& operator=(const RichParameterSet& rps);
820 	RichParameterSet& copy(const RichParameterSet& rps);
821 	RichParameterSet& join(const RichParameterSet& rps);
822 	bool operator==(const RichParameterSet& rps);
823 
824 	RichParameterSet& addParam(RichParameter* pd);
825 
826 	//remove a parameter from the set by name
827 	RichParameterSet& removeParameter(const QString& name);
828 
829 	void clear();
830 
831 	void setValue(const QString& name, const Value& val);
832 
833 	bool				getBool(const QString& name) const;
834 	int					getInt(const QString& name) const;
835 	float				getFloat(const QString& name) const;
836 	QString			getString(const QString& name) const;
837 	vcg::Matrix44f		getMatrix44(const QString& name) const;
838 	vcg::Matrix44<MESHLAB_SCALAR>		getMatrix44m(const QString& name) const;
839 	vcg::Point3f getPoint3f(const QString& name) const;
840 	vcg::Point3<MESHLAB_SCALAR> getPoint3m(const QString& name) const;
841 	vcg::Shotf getShotf(const QString& name) const;
842 	vcg::Shot<MESHLAB_SCALAR> getShotm(const QString& name) const;
843 	QColor		   getColor(const QString& name) const;
844 	vcg::Color4b getColor4b(const QString& name) const;
845 	float		     getAbsPerc(const QString& name) const;
846 	int					 getEnum(const QString& name) const;
847 	MeshModel*   getMesh(const QString& name) const;
848 	QList<float> getFloatList(const QString& name) const;
849 	float        getDynamicFloat(const QString& name) const;
850 	QString getOpenFileName(const QString& name) const;
851 	QString getSaveFileName(const QString& name) const;
852 
853 
854 	~RichParameterSet();
855 };
856 
857 /****************************/
858 
859 
860 
861 #endif
862