From bcc9cf2b787ba42b6d4c2dbcf85646fb89e64a02 Mon Sep 17 00:00:00 2001 From: Guido Ranzuglia granzuglia Date: Wed, 18 Nov 2009 16:56:43 +0000 Subject: [PATCH] completely new CustomDialog form --- src/meshlab/customDialog.cpp | 102 ++++++++++++++++++++++++-------- src/meshlab/customDialog.h | 13 +++-- src/meshlab/stdpardialog.cpp | 110 ++++++++++++++++++++++++++++++++++- src/meshlab/stdpardialog.h | 38 ++++++++++++ 4 files changed, 231 insertions(+), 32 deletions(-) diff --git a/src/meshlab/customDialog.cpp b/src/meshlab/customDialog.cpp index 4d4ad4ab7..841364972 100644 --- a/src/meshlab/customDialog.cpp +++ b/src/meshlab/customDialog.cpp @@ -31,46 +31,87 @@ using namespace vcg; CustomDialog::CustomDialog(RichParameterSet& curparset, RichParameterSet& defparset, QWidget * parent) :QDialog(parent),curParSet(curparset),defParSet(defparset) { + maxlen[0] = 0; + maxlen[1] = 0; setModal(false); closebut = new QPushButton("Close",this); //QVBoxLayout* layout = new QVBoxLayout(parent); QGridLayout* layout = new QGridLayout(parent); setLayout(layout); - listwid = new QListWidget(this); - for(int ii = 0;ii < curParSet.paramList.size();++ii) + tw = new QTableWidget(curParSet.paramList.size(),2,this); + fillTable(); + int totlen = 0; + for (unsigned int jj =0; jj < 2;++jj) { - //butt = new QPushButton(richparset.paramList.at(ii)->name,this); - QListWidgetItem* item = new QListWidgetItem(curParSet.paramList.at(ii)->name,listwid); - mp.insert(item,curParSet.paramList.at(ii)); - //connect(butt,SIGNAL(clicked()),this,SLOT(openSubDialog())); + tw->setColumnWidth(jj,maxlen[jj]); + totlen += maxlen[jj]; } - layout->addWidget(listwid,0,0,1,4); - layout->addWidget(closebut,1,3); - connect(listwid,SIGNAL(itemClicked(QListWidgetItem*)),this,SLOT(openSubDialog(QListWidgetItem*))); + + setMinimumWidth(totlen); + layout->addWidget(tw,0,0,1,5); + layout->addWidget(closebut,1,4,1,1); + connect(tw,SIGNAL(itemDoubleClicked(QTableWidgetItem* )),this,SLOT(openSubDialog(QTableWidgetItem*))); connect(closebut,SIGNAL(clicked()),this,SLOT(close())); } -void CustomDialog::openSubDialog( QListWidgetItem* itm ) +void CustomDialog::openSubDialog( QTableWidgetItem* itm ) { - QMap::iterator it = mp.find(itm); - if (it != mp.end()) - { - RichParameter *defPar = defParSet.findParameter(it.value()->name); - SettingDialog* setdial = new SettingDialog(it.value(),defPar,this); - connect(setdial,SIGNAL(applySettingSignal()),this,SIGNAL(applyCustomSetting())); - setdial->exec(); - delete setdial; - } + int rprow = tw->row(itm); + RichParameter *defPar = defParSet.findParameter(vrp[rprow]->name); + SettingDialog* setdial = new SettingDialog(vrp[rprow],defPar,this); + connect(setdial,SIGNAL(applySettingSignal()),this,SIGNAL(applyCustomSetting())); + connect(setdial,SIGNAL(applySettingSignal()),this,SLOT(updateSettings())); + setdial->exec(); + delete setdial; +} + +void CustomDialog::updateSettings() +{ + fillTable(); } CustomDialog::~CustomDialog() { - delete listwid; + delete tw; delete closebut; //RichParameter will be destroyed elsewhere //for(QMap::iterator it = mp.begin();it != mp.end();it++) // delete it.key(); } + +void CustomDialog::fillTable() +{ + RichParameterToQTableWidgetItemConstructor v; + QStringList slst; + slst.push_back("Variable Name"); + slst.push_back("Variable Value"); + tw->setHorizontalHeaderLabels(slst); + tw->setWordWrap(false); + tw->verticalHeader()->hide(); + + tw->horizontalHeader()->setResizeMode(tw->columnCount() - 1, QHeaderView::Stretch); + + int sz = tw->font().pointSize(); + for(int ii = 0;ii < curParSet.paramList.size();++ii) + { + QTableWidgetItem* item = new QTableWidgetItem(curParSet.paramList.at(ii)->name); + item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled |Qt::ItemIsDropEnabled |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled); + + if (maxlen[0] < item->text().size() * sz) + maxlen[0] = item->text().size() * sz; + //item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); + + tw->setItem(ii,0,item); + //butt = new QPushButton(richparset.paramList.at(ii)->name,this); + + curParSet.paramList[ii]->accept(v); + v.lastCreated->setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled |Qt::ItemIsDropEnabled |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled); + tw->setItem(ii,1,v.lastCreated); + if (maxlen[1] < v.lastCreated->text().size() * sz) + maxlen[1] = v.lastCreated->text().size() * sz; + vrp.push_back(curParSet.paramList.at(ii)); + } +} //Maybe a MeshDocument parameter is needed. See loadFrameContent definition SettingDialog::SettingDialog( RichParameter* currentPar, RichParameter* defaultPar, QWidget* parent /*= 0*/ ) :QDialog(parent),frame(this),tmppar(NULL),curPar(currentPar),defPar(defaultPar) @@ -79,25 +120,28 @@ SettingDialog::SettingDialog( RichParameter* currentPar, RichParameter* defaultP savebut = new QPushButton("Save",this); resetbut = new QPushButton("Reset",this); applybut = new QPushButton("Apply",this); + loadbut = new QPushButton("Load",this); closebut = new QPushButton("Close",this); QGridLayout* dialoglayout = new QGridLayout(parent); dialoglayout->addWidget(savebut,1,0); dialoglayout->addWidget(resetbut,1,1); - dialoglayout->addWidget(applybut,1,2); - dialoglayout->addWidget(closebut,1,3); + dialoglayout->addWidget(loadbut,1,2); + dialoglayout->addWidget(applybut,1,3); + dialoglayout->addWidget(closebut,1,4); RichParameterCopyConstructor cp; curPar->accept(cp); tmppar = cp.lastCreated; frame.loadFrameContent(tmppar); - dialoglayout->addWidget(&frame,0,0,1,4); + dialoglayout->addWidget(&frame,0,0,1,5); dialoglayout->setSizeConstraint(QLayout::SetFixedSize); setLayout(dialoglayout); connect(applybut,SIGNAL(clicked()),this,SLOT(apply())); connect(resetbut,SIGNAL(clicked()),this,SLOT(reset())); connect(savebut,SIGNAL(clicked()),this,SLOT(save())); + connect(loadbut,SIGNAL(clicked()),this,SLOT(load())); connect(closebut,SIGNAL(clicked()),this,SLOT(close())); } @@ -112,6 +156,7 @@ void SettingDialog::save() qDebug("Writing into Settings param with name %s and content ****%s****",qPrintable(tmppar->name),qPrintable(docstring)); QSettings setting; setting.setValue(tmppar->name,QVariant(docstring)); + tmppar->pd->defVal->set(*tmppar->val); } void SettingDialog::apply() @@ -124,10 +169,16 @@ void SettingDialog::apply() void SettingDialog::reset() { - assert(frame.stdfieldwidgets.size() == 1); qDebug("resetting the value of param %s to the hardwired default",qPrintable(curPar->name)); + tmppar->val->set(*defPar->val); + assert(frame.stdfieldwidgets.size() == 1); + frame.stdfieldwidgets.at(0)->setWidgetValue(*tmppar->val); + apply(); +} - curPar->val->set(*defPar->val); +void SettingDialog::load() +{ + assert(frame.stdfieldwidgets.size() == 1); frame.stdfieldwidgets.at(0)->resetValue(); } @@ -138,5 +189,6 @@ SettingDialog::~SettingDialog() delete resetbut; delete applybut; delete closebut; + delete loadbut; //RichParameter Value will be destroyed elsewhere } \ No newline at end of file diff --git a/src/meshlab/customDialog.h b/src/meshlab/customDialog.h index 3327dbf3a..83765ec16 100644 --- a/src/meshlab/customDialog.h +++ b/src/meshlab/customDialog.h @@ -65,6 +65,7 @@ public slots: void save(); void reset(); void apply(); + void load(); signals: void applySettingSignal(); @@ -78,6 +79,7 @@ private: QPushButton* applybut; QPushButton* resetbut; QPushButton* closebut; + QPushButton* loadbut; }; class CustomDialog : public QDialog @@ -89,16 +91,19 @@ public: //void loadCurrentSetting(RichParameterSet& parset); public slots: - void openSubDialog(QListWidgetItem* itm); - + void openSubDialog(QTableWidgetItem* itm); + void updateSettings(); signals: void applyCustomSetting(); private: + void fillTable(); + RichParameterSet& curParSet; RichParameterSet& defParSet; - QListWidget* listwid; - QMap mp; + QTableWidget* tw; + QVector vrp; void dispatch(const RichParameter& par); QPushButton* closebut; + int maxlen[2]; }; diff --git a/src/meshlab/stdpardialog.cpp b/src/meshlab/stdpardialog.cpp index 790f50176..177eee678 100644 --- a/src/meshlab/stdpardialog.cpp +++ b/src/meshlab/stdpardialog.cpp @@ -453,6 +453,11 @@ void AbsPercWidget::resetWidgetValue() setValue(rp->pd->defVal->getAbsPerc(),absd->min,absd->max); } +void AbsPercWidget::setWidgetValue( const Value& nv ) +{ + const AbsPercDecoration* absd = reinterpret_cast(&(rp->pd)); + setValue(nv.getAbsPerc(),absd->min,absd->max); +} /******************************************/ // Point3fWidget Implementation @@ -564,9 +569,11 @@ void Point3fWidget::resetWidgetValue() coordSB[ii]->setText(QString::number(rp->pd->defVal->getPoint3f()[ii],'g',3)); } - - - +void Point3fWidget::setWidgetValue( const Value& nv ) +{ + for(unsigned int ii = 0; ii < 3;++ii) + coordSB[ii]->setText(QString::number(nv.getPoint3f()[ii],'g',3)); +} ComboWidget::ComboWidget(QWidget *p, RichParameter* rpar) :MeshLabWidget(p,rpar) { } @@ -630,6 +637,10 @@ void EnumWidget::resetWidgetValue() enumCombo->setCurrentIndex(rp->pd->defVal->getEnum()); } +void EnumWidget::setWidgetValue( const Value& nv ) +{ + enumCombo->setCurrentIndex(nv.getEnum()); +} /******************************************/ //MeshEnumWidget Implementation @@ -689,6 +700,12 @@ void MeshWidget::resetWidgetValue() enumCombo->setCurrentIndex(defaultMeshIndex); } +void MeshWidget::setWidgetValue( const Value& nv ) +{ + //WARNING!!!!! I HAVE TO THINK CAREFULLY ABOUT THIS FUNCTION!!! + assert(0); + //enumCombo->setCurrentIndex(md->meshList(nv.getMesh()); +} /****************************************** QVariantListWidget Implementation @@ -965,6 +982,10 @@ void DynamicFloatWidget::resetWidgetValue() valueLE->setText(QString::number(rp->pd->defVal->getFloat())); } +void DynamicFloatWidget::setWidgetValue( const Value& nv ) +{ + valueLE->setText(QString::number(nv.getFloat())); +} /****************************/ Value& MeshLabWidget::getWidgetValue() { @@ -1040,6 +1061,11 @@ BoolWidget::~BoolWidget() delete cb; } +void BoolWidget::setWidgetValue( const Value& nv ) +{ + cb->setChecked(nv.getBool()); +} + //connect(qle,SIGNAL(editingFinished()),this,SIGNAL(parameterChanged())); LineEditWidget::LineEditWidget( QWidget* p,RichParameter* rpar ) :MeshLabWidget(p,rpar) @@ -1075,6 +1101,10 @@ void IntWidget::resetWidgetValue() lned->setText(QString::number(rp->val->getInt())); } +void IntWidget::setWidgetValue( const Value& nv ) +{ + lned->setText(QString::number(nv.getInt())); +} // FloatWidget::FloatWidget( QWidget* p,RichFloat* rpar ) :LineEditWidget(p,rpar) @@ -1092,6 +1122,10 @@ void FloatWidget::resetWidgetValue() lned->setText(QString::number(rp->val->getFloat(),'g',3)); } +void FloatWidget::setWidgetValue( const Value& nv ) +{ + lned->setText(QString::number(nv.getFloat(),'g',3)); +} StringWidget::StringWidget( QWidget* p,RichString* rpar ) :LineEditWidget(p,rpar) @@ -1109,6 +1143,10 @@ void StringWidget::resetWidgetValue() lned->setText(rp->val->getString()); } +void StringWidget::setWidgetValue( const Value& nv ) +{ + lned->setText(nv.getString()); +} //Matrix44fWidget::Matrix44fWidget( QWidget* p,RichMatrix44f* rpar ) //:MeshLabWidget(p,rb) @@ -1167,6 +1205,10 @@ void SaveFileWidget::resetWidgetValue() { } +void SaveFileWidget::setWidgetValue( const Value& nv ) +{ + +} /* ql = new QLabel(fpi.fieldDesc,this); ql->setToolTip(fpi.fieldToolTip); @@ -1254,8 +1296,70 @@ ColorWidget::~ColorWidget() delete descLabel; } +void ColorWidget::setWidgetValue( const Value& nv ) +{ + QColor cl = nv.getColor(); + pickcol = cl; + updateColorInfo(cl); +} /* void GetFileNameWidget::launchGetFileNameDialog() { }*/ + +void RichParameterToQTableWidgetItemConstructor::visit( RichBool& pd ) +{ + if (pd.val->getBool()) + lastCreated = new QTableWidgetItem("true"/*,lst*/); + else + lastCreated = new QTableWidgetItem("false"/*,lst*/); + +} + +void RichParameterToQTableWidgetItemConstructor::visit( RichInt& pd ) +{ + lastCreated = new QTableWidgetItem(QString::number(pd.val->getInt())/*,lst*/); +} + +void RichParameterToQTableWidgetItemConstructor::visit( RichFloat& pd ) +{ + lastCreated = new QTableWidgetItem(QString::number(pd.val->getFloat())/*,lst*/); +} + +void RichParameterToQTableWidgetItemConstructor::visit( RichString& pd ) +{ + lastCreated = new QTableWidgetItem(pd.val->getString()/*,lst*/); +} + +void RichParameterToQTableWidgetItemConstructor::visit( RichPoint3f& pd ) +{ + vcg::Point3f pp = pd.val->getPoint3f(); + QString pst = "P3(" + QString::number(pp.X()) + "," + QString::number(pp.Y()) + "," + QString::number(pp.Z()) + ")"; + lastCreated = new QTableWidgetItem(pst/*,lst*/); +} + +void RichParameterToQTableWidgetItemConstructor::visit( RichColor& pd ) +{ + QPixmap pix(10,10); + pix.fill(pd.val->getColor()); + QIcon ic(pix); + lastCreated = new QTableWidgetItem(ic,""/*,lst*/); +} + +void RichParameterToQTableWidgetItemConstructor::visit( RichAbsPerc& pd ) +{ + lastCreated = new QTableWidgetItem(QString::number(pd.val->getAbsPerc())/*,lst*/); +} + +void RichParameterToQTableWidgetItemConstructor::visit( RichEnum& pd ) +{ + lastCreated = new QTableWidgetItem(QString::number(pd.val->getEnum())/*,lst*/); +} + +void RichParameterToQTableWidgetItemConstructor::visit( RichDynamicFloat& pd ) +{ + lastCreated = new QTableWidgetItem(QString::number(pd.val->getDynamicFloat())/*,lst*/); +} + + diff --git a/src/meshlab/stdpardialog.h b/src/meshlab/stdpardialog.h index 4807a482a..735d62347 100644 --- a/src/meshlab/stdpardialog.h +++ b/src/meshlab/stdpardialog.h @@ -92,6 +92,7 @@ Added standard plugin window support #include "interfaces.h" #include + class MeshLabWidget : public QWidget { Q_OBJECT @@ -100,6 +101,7 @@ public: virtual void resetWidgetValue() = 0; virtual void collectWidgetValue() = 0; + virtual void setWidgetValue(const Value& nv) = 0; virtual ~MeshLabWidget(); void resetValue(); Value& getWidgetValue(); @@ -121,6 +123,7 @@ public: ~BoolWidget(); void collectWidgetValue(); void resetWidgetValue(); + void setWidgetValue(const Value& nv); }; @@ -135,6 +138,7 @@ public: ~LineEditWidget(); virtual void collectWidgetValue() = 0; virtual void resetWidgetValue() = 0; + virtual void setWidgetValue(const Value& nv) = 0; }; @@ -146,6 +150,7 @@ public: ~IntWidget(){} void collectWidgetValue(); void resetWidgetValue(); + void setWidgetValue(const Value& nv); }; @@ -157,6 +162,7 @@ public: ~FloatWidget(){} void collectWidgetValue(); void resetWidgetValue(); + void setWidgetValue(const Value& nv); }; @@ -168,6 +174,7 @@ public: ~StringWidget(){} void collectWidgetValue(); void resetWidgetValue(); + void setWidgetValue(const Value& nv); }; //class Matrix44fWidget : public MeshLabWidget @@ -209,6 +216,7 @@ public: void collectWidgetValue(); void resetWidgetValue(); + void setWidgetValue(const Value& nv); }; @@ -229,6 +237,7 @@ class ColorWidget : public MeshLabWidget void collectWidgetValue(); void resetWidgetValue(); + void setWidgetValue(const Value& nv); void initWidgetValue(); private: @@ -258,6 +267,7 @@ public: void collectWidgetValue(); void resetWidgetValue(); + void setWidgetValue(const Value& nv); private: void setValue(float val, float minV, float maxV); @@ -296,6 +306,7 @@ public: void collectWidgetValue(); void resetWidgetValue(); + void setWidgetValue(const Value& nv); public slots: void getPoint(); @@ -329,6 +340,7 @@ public: void collectWidgetValue(); void resetWidgetValue(); + void setWidgetValue(const Value& nv); public slots: void setValue(int newv); @@ -365,6 +377,7 @@ public: void Init(QWidget *p,int newEnum, QStringList values); virtual void collectWidgetValue() = 0; virtual void resetWidgetValue() = 0; + virtual void setWidgetValue(const Value& nv) = 0; int getIndex(); void setIndex(int newEnum); @@ -386,6 +399,7 @@ public: void collectWidgetValue(); void resetWidgetValue(); + void setWidgetValue(const Value& nv); //returns the number of items in the list int getSize(); @@ -403,6 +417,7 @@ public: ~MeshWidget(){}; void collectWidgetValue(); void resetWidgetValue(); + void setWidgetValue(const Value& nv); MeshModel * getMesh(); void setMesh(MeshModel * newMesh); @@ -624,6 +639,29 @@ private: }; +class RichParameterToQTableWidgetItemConstructor : public Visitor +{ +public: + RichParameterToQTableWidgetItemConstructor(/*QListWidget* widlst*/):/*lst(widlst),*/lastCreated(NULL){} + + void visit(RichBool& pd); + void visit(RichInt& pd); + void visit(RichFloat& pd); + void visit(RichString& pd); + void visit(RichMatrix44f& pd){assert(0);}; + void visit(RichPoint3f& pd); + void visit(RichColor& pd); + void visit(RichAbsPerc& pd); + void visit(RichEnum& pd); + void visit(RichFloatList& pd){assert(0);}; + void visit(RichDynamicFloat& pd); + void visit(RichOpenFile& pd){assert(0);}; + void visit(RichSaveFile& pd){assert(0);}; + void visit(RichMesh& pd){assert(0);}; + + /*QListWidget* lst;*/ + QTableWidgetItem* lastCreated; +};