#include "OptionsPanel.h" #include "CfgMap.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //Added by qt3to4: #include #include #include #include fileBrwsManager::fileBrwsManager(QWidget *parent, int type, QWidget *textField) : QObject(parent){ m_type = type; m_textField = textField; m_wparent = parent; } fileBrwsManager::~fileBrwsManager(){ } void fileBrwsManager::browse(){ QLineEdit *ledt = dynamic_cast(m_textField); if(ledt==0) return; QString qpath = QString::null; if(m_type==2) qpath = ledt->text(); QStringList filter; filter += "Any file (*.*)"; QFileDialog fdia(m_wparent,"Specify output folder for file",qpath); fdia.setNameFilters(filter); if(m_type==2) fdia.setFileMode(QFileDialog::Directory); else fdia.setFileMode(QFileDialog::ExistingFile); if(fdia.exec() == QDialog::Accepted){ QStringList files = fdia.selectedFiles(); if (!files.isEmpty()){ qpath = files[0]; qpath.replace("\\", "/"); if(m_type==3){ int ind = qpath.lastIndexOf("/"); if(ind>=0) qpath = qpath.right(qpath.length()-ind-1); } ledt->setText(qpath); } } } optionsPanel::optionsPanel( PixLib::Config &in_cfg, QWidget* parent, const char* name, bool modal, Qt::WFlags fl , bool subGrps, bool embed, bool useScrollbar) : QDialog (parent, name, modal, fl), m_config(in_cfg), m_embed(embed), m_useScrollbar(useScrollbar) { if ( !name ) setName( "optionsPanel" ); setCaption("STControl Options"); Q3VBoxLayout *BaseLayout = new Q3VBoxLayout( this, 11, 6, "BaseLayout"); Q3HBoxLayout *layout1 = new Q3HBoxLayout( 0, 0, 6, "layout1"); Q3VBoxLayout *layout2 = new Q3VBoxLayout( 0, 0, 6, "layout2"); m_tabwidget = new QTabWidget( this, "tabwidget" ); layout2->addWidget(m_tabwidget); for (int i=0; isetSpacing(4); verticalLayout->setMargin(11); verticalLayout->setObjectName(QString::fromUtf8("verticalLayout")); QScrollArea *scrollArea = 0; if(m_useScrollbar){ scrollArea = new QScrollArea(tabFillBox); scrollArea->setObjectName(QString::fromUtf8("scrollArea")); scrollArea->setWidgetResizable(true); } QWidget *TabPage = new QWidget(); TabPage->setObjectName(QString::fromUtf8("TabPage")); TabPage->setGeometry(QRect(0, 0, 618, 976)); int nitems = fillTab(TabPage, grp); if(nitems>0){ if(m_useScrollbar){ scrollArea->setWidget(TabPage); verticalLayout->addWidget(scrollArea); }else verticalLayout->addWidget(TabPage); m_tabwidget->insertTab( tabFillBox, grp.name().c_str()); } else delete tabFillBox; } if(subGrps) loadSubConf(m_config); saveB = new QPushButton( this, "saveButton" ); layout1->addWidget(saveB); saveB->setText("Save"); QSpacerItem *spacer1 = new QSpacerItem( 41, 21, QSizePolicy::Expanding, QSizePolicy::Minimum ); layout1->addItem( spacer1 ); cancB = new QPushButton( this, "cancelButton" ); layout1->addWidget(cancB); cancB->setText("Cancel"); QSpacerItem *spacer2 = new QSpacerItem( 21, 41, QSizePolicy::Minimum, QSizePolicy::Expanding ); layout1->addItem( spacer2 ); layout2->addLayout( layout1 ); BaseLayout->addLayout( layout2 ); resize( QSize(450, 250).expandedTo(minimumSizeHint()) ); connect( saveB, SIGNAL( clicked() ), this, SLOT( save() ) ); connect( cancB, SIGNAL( clicked() ), this, SLOT( reject() ) ); } optionsPanel::~optionsPanel(){ for(std::map::iterator it=m_handles.begin(); it!=m_handles.end(); it++){ CfgMap *map = dynamic_cast(it->second); if(map!=0){ for(uint i=0;inCol();i++){ delete[] (map->m_extData[i]); map->m_extData[i]=0; } delete[] map->m_extData; } } } void optionsPanel::loadSubConf(PixLib::Config &inConf) { for(int j=0;jsetSpacing(4); verticalLayout->setMargin(11); verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"+ QString::number(inConf.size()+i))); QScrollArea *scrollArea = 0; if(m_useScrollbar){ scrollArea = new QScrollArea(tabFillBox); scrollArea->setObjectName(QString::fromUtf8("scrollArea"+ QString::number(inConf.size()+i))); scrollArea->setWidgetResizable(true); } QWidget *TabPage = new QWidget(); TabPage->setObjectName(QString::fromUtf8("TabPage"+ QString::number(inConf.size()+i))); TabPage->setGeometry(QRect(0, 0, 618, 976)); int nitems = fillTab(TabPage, grp, inConf.subConfig(j).name().c_str()); if(nitems>0){ if(m_useScrollbar){ scrollArea->setWidget(TabPage); verticalLayout->addWidget(scrollArea); } else verticalLayout->addWidget(TabPage); m_tabwidget->insertTab( tabFillBox,(inConf.subConfig(j).name()+"-"+grp.name()).c_str()); }else delete tabFillBox; } loadSubConf(inConf.subConfig(j)); } } void optionsPanel::save(){ // save to cfg for(std::map::iterator it=m_handles.begin(); it!=m_handles.end(); it++){ if(it->first.substr(it->first.length()-4,4)!="_exp"){ // exclude exponent spin box from ConfObj::FLOAT std::string cfgN,grpN, objN; ConfObj *objptr; cfgN = it->first; grpN = it->first; objN = it->first; unsigned int pos = (unsigned int)grpN.find(" / "); if(pos!=(unsigned int)std::string::npos){ cfgN.erase(pos,grpN.length()-pos); grpN.erase(0,pos+3); objN.erase(0,pos+3); pos = (unsigned int)grpN.find("_"); if(pos!=(unsigned int)std::string::npos){ grpN.erase(pos,grpN.length()-pos); objN.erase(0,pos+1); } objptr = &(m_config.subConfig(cfgN)[grpN][objN]); } else{ pos = (unsigned int)grpN.find("_"); if(pos!=(unsigned int)std::string::npos){ grpN.erase(pos,grpN.length()-pos); objN.erase(0,pos+1); } objptr = &(m_config[grpN][objN]); } ConfObj &obj = *objptr; switch(obj.type()){ case ConfObj::STRING: ((ConfString&) obj).m_value = ((QLineEdit*)it->second)->text().latin1(); break; case ConfObj::BOOL: ((ConfBool&) obj).m_value = ((QCheckBox*)it->second)->isChecked(); break; case ConfObj::INT: WriteIntConf(((ConfInt&) obj), ((QSpinBox*)it->second)->value()); break; case ConfObj::FLOAT:{ QDoubleSpinBox *mval = (QDoubleSpinBox*)it->second; QSpinBox *eval = (QSpinBox*) m_handles[it->first+"_exp"]; if(eval!=0) ((ConfFloat&)obj).m_value = (float)(mval->value()*pow(10.,(double)eval->value())); else{ // printf("ERROR retrieving exponent box for %s\n", it->first.c_str()); ((ConfFloat&)obj).m_value = (float) mval->value(); } break;} case ConfObj::LIST:{ int read_val = (int) ((ConfList&)obj).m_symbols[((QComboBox*)it->second)->currentText().latin1()]; switch( ((ConfList&)obj).subtype() ){ case ConfList::S32: *((int *)((ConfList&)obj).m_value) = (int) read_val; break; case ConfList::U32: *((unsigned int *)((ConfList&)obj).m_value) = (unsigned int) read_val; break; case ConfList::S16: *((short int *)((ConfList&)obj).m_value) = (short int) read_val; break; case ConfList::U16: *((unsigned short int *)((ConfList&)obj).m_value) = (unsigned short int) read_val; break; case ConfList::S8: *((char *)((ConfList&)obj).m_value) = (char) read_val; break; case ConfList::U8: *((unsigned char *)((ConfList&)obj).m_value) = (unsigned char) read_val; break; default: break; } break;} case ConfObj::VECTOR: if(((ConfVector&)obj).subtype()==ConfVector::INT){ std::vector &tmpVec = ((ConfVector&)obj).valueVInt(); tmpVec.clear(); for(int i=0;i<((Q3Table*)it->second)->numRows(); i++) tmpVec.push_back(((Q3Table*)it->second)->text(i,0).toInt()); } if(((ConfVector&)obj).subtype()==ConfVector::UINT){ std::vector &tmpVec = ((ConfVector&)obj).valueVUint(); tmpVec.clear(); for(int i=0;i<((Q3Table*)it->second)->numRows(); i++) tmpVec.push_back(((Q3Table*)it->second)->text(i,0).toUInt()); } if(((ConfVector&)obj).subtype()==ConfVector::FLOAT){ std::vector &tmpVec = ((ConfVector&)obj).valueVFloat(); tmpVec.clear(); for(int i=0;i<((Q3Table*)it->second)->numRows(); i++){ tmpVec.push_back(((Q3Table*)it->second)->text(i,0).toFloat()); } } break; case ConfObj::MATRIX:{ CfgMap *map = (CfgMap*)it->second; ConfMatrix &mapobj = (ConfMatrix&)obj; uint nCol = map->nCol(); uint nRow = map->nRow(); if(mapobj.subtype()==ConfMatrix::U16){ std::vector temp; for(uint row=0;rowm_extData[col][nRow-row-1]); } } ((ConfMask *)mapobj.m_value)->set(temp); }else if(mapobj.subtype()==ConfMatrix::U1){ std::vector temp; for(uint row=0;rowm_extData[col][nRow-row-1]); } } ((ConfMask *)mapobj.m_value)->set(temp); } break;} default: break; } } } // close panel if(!m_embed) accept(); } int optionsPanel::fillTab(QWidget *tab, ConfGroup &cgrp, const char *subcfg_name){ Q3VBoxLayout *layout1 = new Q3VBoxLayout( tab, 0, 6, "mainlayout"); int retVal = 0; for (int i=0; iaddWidget(label); QSpacerItem *spacer = new QSpacerItem( 41, 21, QSizePolicy::Expanding, QSizePolicy::Minimum ); layout1->addItem( spacer ); QWidget *tmpWgt=0, *expWgt=0; QPushButton *pbhandle=0; switch(obj.type()){ case ConfObj::STRING:{ tmpWgt = (QWidget*) new QLineEdit(tab,"te"+QString::number(i)); ((QLineEdit*)tmpWgt)->setText(((ConfString&)obj).value().c_str()); ((QLineEdit*)tmpWgt)->setFrameShape( QLineEdit::LineEditPanel ); ((QLineEdit*)tmpWgt)->setFrameShadow( QLineEdit::Sunken ); if((int)obj.name().find("passw")!=(int)std::string::npos) ((QLineEdit*)tmpWgt)->setEchoMode(QLineEdit::Password); m_handles.insert(std::make_pair((subcfg_name==0)?obj.name().c_str():(std::string(subcfg_name)+" / "+obj.name()).c_str(),tmpWgt)); int type = ((ConfString&)obj).getType(); if(type>0){ pbhandle = new QPushButton("...",tab); fileBrwsManager *fbm = new fileBrwsManager(this, type, tmpWgt); QObject::connect(pbhandle, SIGNAL(clicked()), fbm, SLOT(browse())); } break;} case ConfObj::BOOL:{ tmpWgt = (QWidget*) new QCheckBox("On/Off",tab,"rb"+QString::number(i)); ((QCheckBox*)tmpWgt)->setChecked(((ConfBool&)obj).value()); m_handles.insert(std::make_pair((subcfg_name==0)?obj.name().c_str():(std::string(subcfg_name)+" / "+obj.name()).c_str(),tmpWgt)); break;} case ConfObj::INT:{ tmpWgt = (QWidget*) new QSpinBox(tab,"sb"+QString::number(i)); ((QSpinBox*)tmpWgt)->setMaxValue(9999999); ((QSpinBox*)tmpWgt)->setMinValue(-9999999); ((QSpinBox*)tmpWgt)->setValue(((ConfInt&)obj).value()); m_handles.insert(std::make_pair((subcfg_name==0)?obj.name().c_str():(std::string(subcfg_name)+" / "+obj.name()).c_str(),tmpWgt)); break;} case ConfObj::FLOAT:{ tmpWgt = (QWidget*) new QDoubleSpinBox(tab);//,"dsb"+QString::number(i)); // add int spin box for exponent to handle small numbers expWgt = new QSpinBox(tab); ((QDoubleSpinBox*)tmpWgt)->setRange(-9999999, 9999999); ((QDoubleSpinBox*)tmpWgt)->setDecimals(6); ((QSpinBox*)expWgt)->setRange(-20,20); double value = (double)((ConfFloat&)obj).value(); int expon = 0; if(fabs(value)<1e-3){ expon = (int) log10f(value); value /= pow(10.,(double)expon); } ((QDoubleSpinBox*)tmpWgt)->setValue(value); ((QSpinBox*)expWgt)->setValue(expon); m_handles.insert(std::make_pair((subcfg_name==0)?obj.name().c_str():(std::string(subcfg_name)+" / "+obj.name()).c_str(),tmpWgt)); m_handles.insert(std::make_pair((subcfg_name==0)?(obj.name()+"_exp").c_str():(std::string(subcfg_name)+" / "+obj.name()+"_exp").c_str(),expWgt)); break;} case ConfObj::LIST:{ QComboBox *cbhandle = new QComboBox(tab, "cb"+QString::number(i)); //cbhandle->setEditable(true); tmpWgt = (QWidget*)cbhandle; int currID=0; std::map::const_iterator mapIT; for(mapIT = ((ConfList&)obj).m_symbols.begin(); mapIT != ((ConfList&)obj).m_symbols.end();mapIT++){ cbhandle->insertItem(mapIT->first.c_str()); if(mapIT->first==((ConfList&)obj).sValue()) currID = cbhandle->count()-1; } cbhandle->setCurrentItem(currID); m_handles.insert(std::make_pair((subcfg_name==0)?obj.name().c_str():(std::string(subcfg_name)+" / "+obj.name()).c_str(),tmpWgt)); break;} case ConfObj::VECTOR:{ if(((ConfVector&)obj).subtype()==ConfVector::INT || ((ConfVector&)obj).subtype()==ConfVector::UINT || ((ConfVector&)obj).subtype()==ConfVector::FLOAT){ Q3HBoxLayout *layout3 = new Q3HBoxLayout( 0, 0, 6, "layouttable"+QString::number(i)); Q3Table *table = new Q3Table( tab, "tbl"+QString::number(i) ); layout3->addWidget(table); QSpinBox *sb = new QSpinBox(tab, "sb"+QString::number(i)); layout3->addWidget(sb); unsigned int vsize=0; void *vecPtr = 0; if(((ConfVector&)obj).subtype()==ConfVector::INT){ std::vector &tmpVec = ((ConfVector&)obj).valueVInt(); vecPtr = (void*)&tmpVec; vsize = tmpVec.size(); } if(((ConfVector&)obj).subtype()==ConfVector::UINT){ std::vector &tmpVec = ((ConfVector&)obj).valueVUint(); vecPtr = (void*)&tmpVec; vsize = tmpVec.size(); } if(((ConfVector&)obj).subtype()==ConfVector::FLOAT){ std::vector &tmpVec = ((ConfVector&)obj).valueVFloat(); vecPtr = (void*)&tmpVec; vsize = tmpVec.size(); } table->setNumRows(vsize); sb->setValue(vsize); table->setNumCols(1); for(unsigned int j=0;jsetText(j,0,QString::number(((std::vector*)vecPtr)->at(j))); if(((ConfVector&)obj).subtype()==ConfVector::UINT) table->setText(j,0,QString::number(((std::vector*)vecPtr)->at(j))); if(((ConfVector&)obj).subtype()==ConfVector::FLOAT) table->setText(j,0,QString::number((double)((std::vector*)vecPtr)->at(j),'g')); } connect(sb, SIGNAL(valueChanged(int)), table, SLOT(setNumRows(int))); tmpWgt = 0; layout2->addLayout(layout3); m_handles.insert(std::make_pair((subcfg_name==0)?obj.name().c_str():(std::string(subcfg_name)+" / "+obj.name()).c_str(),(QWidget*)table)); } else tmpWgt = (QWidget*) new QLabel("unhandled ConfObj::VECTOR type",tab,"label_dummy"+QString::number(i)); break;} case ConfObj::MATRIX:{ pbhandle = new QPushButton("Edit",tab); ConfMatrix &mapobj = (ConfMatrix&)obj; unsigned int nCol = 1; unsigned int nRow = 1; uint **mydata = 0; if(mapobj.subtype()==ConfMatrix::U16){ std::vector mmask; // T/FDAC ((ConfMask *)mapobj.m_value)->get(mmask); nCol = ((ConfMask *)mapobj.m_value)->get().size(); nRow = ((ConfMask *)mapobj.m_value)->get().front().size(); mydata = new uint*[nCol]; for(uint k=0;k::iterator it, itEnd=mmask.end(); int i=0; for(it=mmask.begin(); it!=itEnd; it++){ mydata[i%nCol][nRow-1-i/nCol] = (uint)(*it); i++; } }else if(mapobj.subtype()==ConfMatrix::U1){ std::vector mmask; ((ConfMask *)mapobj.m_value)->get(mmask); nCol = ((ConfMask *)mapobj.m_value)->get().size(); nRow = ((ConfMask *)mapobj.m_value)->get().front().size(); mydata = new uint*[nCol]; for(uint k=0;k::iterator it, itEnd=mmask.end(); int i=0; for(it=mmask.begin(); it!=itEnd; it++){ mydata[i%nCol][nRow-1-i/nCol] = (uint)(*it); i++; } } else{ tmpWgt = 0; break; } // re-draw with smaller pixel sizes than default (last two arguments in constructor) // - temp, only OK for FE-I4 pix. registers, must be made more general CfgMap *mapedt = new CfgMap(mydata, ((mapobj.subtype()==ConfMatrix::U1)?1:63), nCol, nRow, this, 0, 0, 0, 0, 6, 1); QObject::connect(pbhandle, SIGNAL(clicked()), mapedt, SLOT(exec())); tmpWgt = (QWidget*)mapedt; m_handles.insert(std::make_pair((subcfg_name==0)?obj.name().c_str():(std::string(subcfg_name)+" / "+obj.name()).c_str(),tmpWgt)); break;} default: tmpWgt = (QWidget*) new QLabel("unhandled ConfObj type",tab,"label_dummy"+QString::number(i)); } if(pbhandle!=0 && obj.type()==ConfObj::MATRIX) layout2->addWidget(pbhandle); if(tmpWgt!=0) layout2->addWidget(tmpWgt); if(pbhandle!=0 && obj.type()!=ConfObj::MATRIX) layout2->addWidget(pbhandle); if(expWgt!=0){ QLabel *elab = new QLabel("E",tab); layout2->addWidget(elab); layout2->addWidget(expWgt); } layout1->addLayout(layout2); } } return retVal; }