#include "MainPanel.h" #include "DBEdtEngine.h" #include "DBTreeView.h" #include "DBTreeItem.h" #include "ConfigTable.h" #include "GeneralDBfunctions.h" #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 #ifndef WIN32 #include #endif MainPanel::MainPanel(DBEdtEngine &in_engine, QWidget* parent, const char* name, Qt::WFlags fl) : Q3MainWindow(parent,name,fl), m_engine(in_engine) // : MainPanelBase(parent,name,fl), m_engine(in_engine) { setupUi(this); QObject::connect(fileNewAction, SIGNAL(activated()), this, SLOT(fileNew())); QObject::connect(fileOpenAction, SIGNAL(activated()), this, SLOT(fileOpen())); QObject::connect(fileCloseAction, SIGNAL(activated()), this, SLOT(fileClose())); QObject::connect(fileExitAction, SIGNAL(activated()), this, SLOT(close())); QObject::connect(editCutAction, SIGNAL(activated()), this, SLOT(editCut())); QObject::connect(editCopyAction, SIGNAL(activated()), this, SLOT(editCopy())); QObject::connect(editPasteAction, SIGNAL(activated()), this, SLOT(editPaste())); QObject::connect(editPasteTreeAction, SIGNAL(activated()), this, SLOT(editPasteTreeAsis())); QObject::connect(actionPaste_rename_Tree, SIGNAL(activated()), this, SLOT(editPasteTreeRename())); QObject::connect(viewButton, SIGNAL(toggled(bool)), this, SLOT(selectView(bool))); QObject::connect(editAdd_DBFieldAction, SIGNAL(activated()), this, SLOT(addDBField())); QObject::connect(editAdd_DBInquireAction, SIGNAL(activated()), this, SLOT(addDBInquire())); QObject::connect(editDelete_DB_objectAction, SIGNAL(activated()), this, SLOT(deleteDBObject())); QObject::connect(fileNewConfigAction, SIGNAL(activated()), this, SLOT(fileNewCfg())); m_userPDB = ""; m_pwdPDB =""; m_currentItem = 0; m_copyItem = 0; m_cutItem = 0; m_split = new QSplitter( this ); vboxLayout->add(m_split); m_leftTreeView = new DBTreeView(m_engine, m_split, "leftview");//centralWidget(), "treeview"); m_rightTreeView = new DBTreeView(m_engine, m_split, "rightview");//centralWidget(), "treeview"); connect(this,SIGNAL(fileListChanged()),m_leftTreeView,SLOT(updateList())); connect(this,SIGNAL(fileListChanged()),m_rightTreeView,SLOT(updateList())); connect(this,SIGNAL(contentChanged()),m_leftTreeView,SLOT(fillView())); connect(this,SIGNAL(contentChanged()),m_rightTreeView,SLOT(fillView())); connect(m_leftTreeView->m_listView,SIGNAL(selectionChanged(Q3ListViewItem*)), this,SLOT(leftSelection(Q3ListViewItem *))); connect(m_rightTreeView->m_listView,SIGNAL(selectionChanged(Q3ListViewItem*)), this,SLOT(rightSelection(Q3ListViewItem *))); connect(m_leftTreeView->m_listView,SIGNAL(rightButtonClicked ( Q3ListViewItem *, const QPoint &, int )), this,SLOT(openEditMenu(Q3ListViewItem *, const QPoint &))); connect(m_rightTreeView->m_listView,SIGNAL(rightButtonClicked ( Q3ListViewItem *, const QPoint &, int )), this,SLOT(openEditMenu(Q3ListViewItem *, const QPoint &))); connect(m_leftTreeView->m_listView,SIGNAL( draggingInto(QMouseEvent *)), this,SLOT(processDrag(QMouseEvent *))); connect(m_rightTreeView->m_listView,SIGNAL( draggingInto(QMouseEvent *)), this,SLOT(processDrag(QMouseEvent *))); connect(m_leftTreeView->m_listView,SIGNAL( droppingInto(QMouseEvent *, Q3ListViewItem *)), this,SLOT(processDrop(QMouseEvent *, Q3ListViewItem *))); connect(m_rightTreeView->m_listView,SIGNAL( droppingInto(QMouseEvent *, Q3ListViewItem *)), this,SLOT(processDrop(QMouseEvent *, Q3ListViewItem *))); showSingle(); } MainPanel::~MainPanel() { fileClose(); } void MainPanel::fileOpen() { fileAction(0); } void MainPanel::fileNew() { fileAction(1); } void MainPanel::fileNewCfg() { fileAction(2); } void MainPanel::fileAction(int actionType) { if(actionType<0 || actionType>2){ QMessageBox::warning(this,"DBeditor MainPanel::fileAction", "Wrong action type: "+QString::number(actionType)+ ". Can only handle these types:\n0: open\n1:create new\n1:create new config"); return; } QString qpath = QString::null; QStringList filter; filter += "RootDB file (*.root)"; filter += "DB ascii-config file (*.cfg)"; filter += "Any file (*.*)"; Q3FileDialog fdia(qpath,QString::null,this,"select_DB_file",TRUE); fdia.setCaption("Specify name of DB file"); fdia.setFilters(filter); switch(actionType){ default: case 0: fdia.setMode(Q3FileDialog::ExistingFile); break; case 2:{ QStringList filter2; filter2 += "RootDB cfg file (*.cfg.root)"; filter2 += "DB ascii-config file (*.cfg)"; filter2 += "Any file (*.*)"; fdia.setFilters(filter2); fdia.setMode(Q3FileDialog::AnyFile); break;} case 1: fdia.setMode(Q3FileDialog::AnyFile); break; } if(fdia.exec() == QDialog::Accepted){ std::stringstream msg; try{ switch(actionType){ default: case 2:{ QString cfgPath = fdia.selectedFile(); int pos=cfgPath.findRev("/"); if(pos>=0) cfgPath = cfgPath.left(pos+1); int retVal = 0; std::vector myGrpData; QString my_fname = fdia.selectedFile(); if(my_fname.right(9)!=".cfg.root") my_fname += ".cfg.root"; retVal = addGroupTable(myGrpData, cfgPath.latin1()); if(retVal==0){ // create file via engine QApplication::setOverrideCursor(Qt::waitCursor); m_engine.createConfig(fdia.selectedFile(), myGrpData); m_engine.addFile(fdia.selectedFile()); QApplication::restoreOverrideCursor(); } break;} case 1: QApplication::setOverrideCursor(Qt::waitCursor); m_engine.createFile(fdia.selectedFile()); QApplication::restoreOverrideCursor(); // do not break, must call addFile from case 0, too case 0: QApplication::setOverrideCursor(Qt::waitCursor); m_engine.addFile(fdia.selectedFile()); QApplication::restoreOverrideCursor(); break; } } catch(SctPixelRod::BaseException& b){ msg << "\""; msg << b; msg << "\""; }catch(...){ msg << "Unknown exception "; } if(msg.str()!=""){ QApplication::restoreOverrideCursor(); QMessageBox::warning(this,"DBeditor MainPanel::fileAction", QString((msg.str()+ "caught on file ").c_str())+ fdia.selectedFile()); return; } } QApplication::setOverrideCursor(Qt::waitCursor); emit fileListChanged(); clearSelection(); QApplication::restoreOverrideCursor(); return; } void MainPanel::fileClose() { std::stringstream msg; QApplication::setOverrideCursor(Qt::waitCursor); try{ m_engine.clearFiles(); } catch(SctPixelRod::BaseException& b){ msg << "\""; msg << b; msg << "\""; }catch(...){ msg << "Unknown exception "; } if(msg.str()!=""){ QApplication::restoreOverrideCursor(); QMessageBox::warning(this,"DBeditor MainPanel::fileClose", QString((msg.str()+ " caught while closing all files.").c_str())); return; } emit fileListChanged(); clearSelection(); QApplication::restoreOverrideCursor(); return; } void MainPanel::showSingle() { m_leftTreeView->show(); m_rightTreeView->hide(); } void MainPanel::showDouble() { m_leftTreeView->show(); m_rightTreeView->show(); } void MainPanel::selectView(bool both) { if(both) showDouble(); else showSingle(); } void MainPanel::rightSelection(Q3ListViewItem *item) { // printf("Right selected %s\n",item->text(0).latin1()); changeCurrent(dynamic_cast(item)); editPasteAction->setEnabled(((m_cutItem!=0 && m_cutItem!=m_currentItem) || (m_copyItem!=0 && m_copyItem!=m_currentItem)) && m_currentItem!=0 && m_currentItem->isInquire()); editPasteTreeAction->setEnabled(m_copyItem!=0 && m_copyItem!=m_currentItem && m_copyItem->isInquire() && m_currentItem!=0 && m_currentItem->isInquire()); actionPaste_rename_Tree->setEnabled(m_copyItem!=0 && m_copyItem!=m_currentItem && m_copyItem->isInquire() && m_currentItem!=0 && m_currentItem->isInquire()); editCopyAction->setEnabled(m_currentItem!=0); editCutAction->setEnabled(m_currentItem!=0 && m_currentItem->isField()); m_leftTreeView->m_listView->clearSelection(); } void MainPanel::leftSelection(Q3ListViewItem *item) { // printf("Left selected %s\n",item->text(0).latin1()); changeCurrent(dynamic_cast(item)); editPasteAction->setEnabled(((m_cutItem!=0 && m_cutItem!=m_currentItem) || (m_copyItem!=0 && m_copyItem!=m_currentItem)) && m_currentItem!=0 && m_currentItem->isInquire()); editPasteTreeAction->setEnabled(m_copyItem!=0 && m_copyItem!=m_currentItem && m_copyItem->isInquire() && m_currentItem!=0 && m_currentItem->isInquire()); actionPaste_rename_Tree->setEnabled(m_copyItem!=0 && m_copyItem!=m_currentItem && m_copyItem->isInquire() && m_currentItem!=0 && m_currentItem->isInquire()); editCopyAction->setEnabled(m_currentItem!=0); editCutAction->setEnabled(m_currentItem!=0 && m_currentItem->isField()); m_rightTreeView->m_listView->clearSelection(); } void MainPanel::clearSelection() { changeCurrent(0); m_rightTreeView->m_listView->clearSelection(); m_leftTreeView->m_listView->clearSelection(); } void MainPanel::changeCurrent(DBTreeItem *item) { m_currentItem = item; // enable appropriate edit functions for inquires only editAdd_DBFieldAction->setEnabled(m_currentItem!=0 && m_currentItem->isInquire()); editAdd_DBInquireAction->setEnabled(m_currentItem!=0 && m_currentItem->isInquire()); editDelete_DB_objectAction->setEnabled(m_currentItem!=0);// && m_currentItem->isField()); } void MainPanel::addDBField() { if(m_currentItem==0){ QMessageBox::warning(this,"DBeditor MainPanel::addDBInquire", "Current DBTreeItem-pointer is NULL."); return; } std::stringstream msg; try{ m_currentItem->addDBField(); }catch(SctPixelRod::BaseException& b){ msg << "\""; msg << b; msg << "\""; }catch(...){ msg << "Unknown exception "; } if(msg.str()!=""){ QMessageBox::warning(this,"DBeditor MainPanel::addDBField", QString((msg.str()+ "caught while adding field.").c_str())); return; } emit contentChanged(); } void MainPanel::addDBInquire() { if(m_currentItem==0){ QMessageBox::warning(this,"DBeditor MainPanel::addDBInquire", "Current DBTreeItem-pointer is NULL."); return; } std::stringstream msg; try{ m_currentItem->addDBInquire(); }catch(SctPixelRod::BaseException& b){ msg << "\""; msg << b; msg << "\""; }catch(...){ msg << "Unknown exception "; } if(msg.str()!=""){ QMessageBox::warning(this,"DBeditor MainPanel::addDBInquire", QString((msg.str()+ "caught while adding inquire.").c_str())); return; } emit contentChanged(); } void MainPanel::deleteDBObject() { if(m_currentItem==0){ QMessageBox::warning(this,"DBeditor MainPanel::deleteDBObject", "Current DBTreeItem-pointer is NULL."); return; } std::stringstream msg; try{ m_currentItem->deleteDBObject(); }catch(SctPixelRod::BaseException& b){ msg << "\""; msg << b; msg << "\""; }catch(...){ msg << "Unknown exception "; } if(msg.str()!=""){ QMessageBox::warning(this,"DBeditor MainPanel::deleteDBObject", QString((msg.str()+ "caught while adding inquire.").c_str())); return; } emit contentChanged(); } void MainPanel::openEditMenu(Q3ListViewItem *item, const QPoint &point) { changeCurrent(dynamic_cast(item)); editMenu->exec(point); } void MainPanel::editCopy() { m_copyItem = m_currentItem; m_cutItem = 0; } void MainPanel::editCut() { m_copyItem = 0; m_cutItem = m_currentItem; } void MainPanel::editPaste() { DBTreeItem *item = m_copyItem; if(item==0) item = m_cutItem; if(item==0 || m_currentItem==0) return; QApplication::setOverrideCursor(Qt::waitCursor); std::stringstream msg; try{ if(item->isInquire()) m_currentItem->addDBInquireOnly(item); else if(item->isField()) m_currentItem->addDBField(item); else{ QApplication::restoreOverrideCursor(); QMessageBox::warning(this,"DBeditor MainPanel::addDBInquire","copy/cut object is of unknown type."); return; } // this was actually a cut&paste, so delete copied item if(m_cutItem!=0) item->deleteDBObject(); }catch(SctPixelRod::BaseException& b){ msg << "\""; msg << b; msg << "\""; }catch(...){ msg << "Unknown exception "; } if(msg.str()!=""){ QApplication::restoreOverrideCursor(); QMessageBox::warning(this,"DBeditor MainPanel::addDBInquire", QString((msg.str()+ "caught while adding inquire.").c_str())); return; } QApplication::restoreOverrideCursor(); emit contentChanged(); if(m_cutItem!=0) editPasteAction->setEnabled(false); m_cutItem = 0; } void MainPanel::editPasteTree(bool rename) { DBTreeItem *item = m_copyItem; if(item==0 || m_currentItem==0) return; QApplication::setOverrideCursor(Qt::waitCursor); std::stringstream msg; try{ if(item->isInquire()){ QString newName=""; if(rename){ RenameWin rnw(this," ", TRUE, Qt::WType_TopLevel); std::string dname = item->getDecName(); int pos = dname.find_last_of("/"); if(pos!=(int)std::string::npos) dname.erase(pos, dname.length()-pos); PixLib::getDecNameCore(dname); newName = dname.c_str(); while(std::string(newName.latin1())==dname){ newName = (dname+"_copy").c_str(); rnw.Name->validateAndSet(newName,newName.length(), 0, newName.length()); rnw.Name->setFocus(); QApplication::restoreOverrideCursor(); if(rnw.exec()) newName = rnw.Name->text(); if(std::string(newName.latin1())==dname) QMessageBox::warning(this,"DBeditor MainPanel::editPasteTree","old and new names are identical, please try again"); QApplication::setOverrideCursor(Qt::waitCursor); } } m_currentItem->addDBInquire(item,true,rename?newName.latin1():0); }else{ QApplication::restoreOverrideCursor(); QMessageBox::warning(this,"DBeditor MainPanel::editPasteTree","Can't tree-copy DBFIeld"); return; } }catch(SctPixelRod::BaseException& b){ msg << "\""; msg << b; msg << "\""; }catch(...){ msg << "Unknown exception "; } if(msg.str()!=""){ QApplication::restoreOverrideCursor(); QMessageBox::warning(this,"DBeditor MainPanel::addDBInquire", QString((msg.str()+ "caught while adding inquire.").c_str())); return; } QApplication::restoreOverrideCursor(); emit contentChanged(); m_cutItem = 0; } void MainPanel::processDrag(QMouseEvent *evt) { //printf("processing drag %d %d\n",evt->globalX(),evt->globalY()); int myx = x()+m_split->x()+m_rightTreeView->x()+m_rightTreeView->m_listView->x()+ m_rightTreeView->m_listView->viewport()->x(); int myy = y()+m_split->y()+m_rightTreeView->y()+m_rightTreeView->m_listView->y()+ m_rightTreeView->m_listView->viewport()->y(); if(evt->globalX()>myx && evt->globalX()<(myx+m_rightTreeView->m_listView->viewport()->width()) && evt->globalY()>myy && evt->globalY()<(myy+m_rightTreeView->m_listView->viewport()->height())){ QPoint p((evt->globalX()-myx-m_rightTreeView->m_listView->viewport()->x()), (evt->globalY()-myy-m_rightTreeView->m_listView->viewport()->y())); QMouseEvent newevt(evt->type(),p,evt->button(),evt->state()); m_rightTreeView->m_listView->myDrag(&newevt); } myx = x()+m_split->x()+m_leftTreeView->x()+m_leftTreeView->m_listView->x()+ m_leftTreeView->m_listView->viewport()->x(); myy = y()+m_split->y()+m_leftTreeView->y()+m_leftTreeView->m_listView->y()+ m_leftTreeView->m_listView->viewport()->y(); if(evt->globalX()>myx && evt->globalX()<(myx+m_leftTreeView->m_listView->viewport()->width()) && evt->globalY()>myy && evt->globalY()<(myy+m_leftTreeView->m_listView->viewport()->height())){ QPoint p((evt->globalX()-myx-m_leftTreeView->m_listView->viewport()->x()), (evt->globalY()-myy-m_leftTreeView->m_listView->viewport()->y())); QMouseEvent newevt(evt->type(),p,evt->button(),evt->state()); m_leftTreeView->m_listView->myDrag(&newevt); } } void MainPanel::processDrop(QMouseEvent *evt, Q3ListViewItem *item) { // printf("processing drop\n"); int myx = x()+m_split->x()+m_rightTreeView->x()+m_rightTreeView->m_listView->x()+ m_rightTreeView->m_listView->viewport()->x(); int myy = y()+m_split->y()+m_rightTreeView->y()+m_rightTreeView->m_listView->y()+ m_rightTreeView->m_listView->viewport()->y(); if(evt->globalX()>myx && evt->globalX()<(myx+m_rightTreeView->m_listView->viewport()->width()) && evt->globalY()>myy && evt->globalY()<(myy+m_rightTreeView->m_listView->viewport()->height()) && m_rightTreeView->m_listView->getDragState()){ m_copyItem = dynamic_cast(item); m_currentItem = m_rightTreeView->m_listView->getDragItem(); bool do_tree=false; if(m_copyItem!=0 && m_copyItem->isInquire()){ // ask user if (s)he want to copy entire tree do_tree = (bool)QMessageBox::question(this,"drop action", "Drop inquire as bare entry or the entire tree?", "Bare","Tree"); } if(do_tree) editPasteTree(false); else editPaste(); } myx = x()+m_split->x()+m_leftTreeView->x()+m_leftTreeView->m_listView->x()+ m_leftTreeView->m_listView->viewport()->x(); myy = y()+m_split->y()+m_leftTreeView->y()+m_leftTreeView->m_listView->y()+ m_leftTreeView->m_listView->viewport()->y(); if(evt->globalX()>myx && evt->globalX()<(myx+m_leftTreeView->m_listView->viewport()->width()) && evt->globalY()>myy && evt->globalY()<(myy+m_leftTreeView->m_listView->viewport()->height()) && m_leftTreeView->m_listView->getDragState()){ m_copyItem = dynamic_cast(item); m_currentItem = m_leftTreeView->m_listView->getDragItem(); bool do_tree=false; if(m_copyItem!=0 && m_copyItem->isInquire()){ // ask user if (s)he want to copy entire tree do_tree = (bool)QMessageBox::question(this,"drop action", "Drop inquire as bare entry or the entire tree?", "Bare","Tree"); } if(do_tree) editPasteTree(false); else editPaste(); } m_rightTreeView->m_listView->resetDrag(); m_leftTreeView->m_listView->resetDrag(); } int MainPanel::addGroupTable(std::vector &inGrpData, const char *cfgPath) { int retVal = 11; // special code for requesting another ROD panel QString oldPath=""; if(cfgPath!=0) oldPath=cfgPath; while(retVal==11){ ConfigTable cfgtab(m_engine.getApp(),this,"cfgtab"); cfgtab.configPath->setText( oldPath); cfgtab.m_userPDB = m_userPDB; cfgtab.m_passwdPDB = m_pwdPDB; retVal = cfgtab.exec(); m_userPDB = cfgtab.m_userPDB; m_pwdPDB = cfgtab.m_passwdPDB; oldPath = cfgtab.configPath->text(); if(retVal==QDialog::Accepted || retVal==11){ QApplication::setOverrideCursor(Qt::waitCursor); PixLib::grpData myGrpData; // add group bool isOK; myGrpData.myROD.slot = cfgtab.rodSlot->value(); myGrpData.myROD.mode = cfgtab.rodSpeed->currentItem(); myGrpData.myROD.IPfile = ""; myGrpData.myROD.IDfile = ""; myGrpData.myROD.Xfile = ""; Q3Process *getenv = new Q3Process(this); getenv->addArgument("printenv"); getenv->addArgument("ROD_DAQ"); getenv->start(); while(getenv->isRunning()); QString fname, path = getenv->readLineStdout(); delete getenv; if(!path.isEmpty()){ path += "/Dsp/Pixel/Binary/"; myGrpData.myROD.IPfile = path.latin1(); myGrpData.myROD.IDfile = path.latin1(); myGrpData.myROD.Xfile = path.latin1(); } myGrpData.myROD.IPfile += "sdsp6713_ipram.bin"; myGrpData.myROD.IDfile += "sdsp6713_idram.bin"; myGrpData.myROD.Xfile += "sdsp6713_xcode.bin"; for(int fID=0;fID<8;fID++){ for(int linkID=0;linkID<4;linkID++){ myGrpData.myROD.fmtLinkMap[fID][linkID] = linkID; if(fID==2 || fID==6) myGrpData.myROD.fmtLinkMap[fID][linkID]+=8; } } // load BOC config if requested myGrpData.myBOC.haveBoc = false; myGrpData.myBOC.haveBoc = true; myGrpData.myBOC.mode = myGrpData.myROD.mode; if(myGrpData.myBOC.mode==2) myGrpData.myBOC.mode=3; myGrpData.cfgType = (int)cfgtab.configRootDB->isChecked(); // load module config oldPath = cfgtab.configPath->text(); PixLib::modData myModD; for(int i=0;i<(int)cfgtab.moduleTable->numRows();i++){ if(!cfgtab.moduleTable->text(i,10).isEmpty()){ if(cfgtab.configRootDB->isChecked()) myModD.fname = (cfgtab.configPath->text()+"M"+cfgtab.moduleTable->text(i,0)+"/").latin1(); else myModD.fname = (cfgtab.configPath->text()+"M"+cfgtab.moduleTable->text(i,0)+ "/configs/").latin1(); Q3ComboTableItem *tabIt = dynamic_cast(cfgtab.moduleTable->item(i,10)); if(tabIt==0) myModD.fname += cfgtab.moduleTable->text(i,10).latin1(); else myModD.fname += tabIt->currentText().latin1(); myModD.modname = cfgtab.moduleTable->text(i,0).latin1(); myModD.connName= cfgtab.moduleTable->text(i,11).latin1(); myModD.modID = i; myModD.grpID = cfgtab.moduleTable->text(i,3).toInt(&isOK); myModD.active = true; myModD.roType = myGrpData.myROD.mode; // modules and ROD/BOC should have same r/o speed myModD.inLink = cfgtab.moduleTable->text(i,5).toInt(&isOK); unsigned int in_stream= myModD.inLink%12; unsigned int tx_board = myModD.inLink/12; if(tx_board<4) myGrpData.myBOC.used_in_links[tx_board].push_back(in_stream); for(int olID=0;olID<4;olID++){ QString tmpStrg = cfgtab.moduleTable->text(i,6+olID); if(tmpStrg.isEmpty()){ if(olID>0) myModD.outLink[olID] = myModD.outLink[olID-1]; else myModD.outLink[olID] = 0; }else{ tmpStrg.remove(0,2); myModD.outLink[olID] = 16*(cfgtab.moduleTable->text(i,6+olID).left(1).toInt(&isOK))+tmpStrg.toInt(&isOK); } } myModD.slot = cfgtab.moduleTable->text(i,4).toInt(&isOK); myModD.pp0 = cfgtab.PP0Box->currentItem(); if(cfgtab.moduleTable->text(i,1).isEmpty()){ myModD.assyType = 0; // undef myModD.assyID = 0; myModD.pos_on_assy = 0; } else{ myModD.assyID = cfgtab.moduleTable->text(i,1).toInt(&isOK); myModD.pos_on_assy = cfgtab.moduleTable->text(i,2).toInt(&isOK); if(myModD.assyID<9000) myModD.assyType = 1; // stave else myModD.assyType = 2; // sector } myGrpData.myMods.push_back(myModD); } } inGrpData.push_back(myGrpData); QApplication::restoreOverrideCursor(); } } if(inGrpData.size()==0) return 1; return 0; }