UltraScan III
us_select_edits.cpp
Go to the documentation of this file.
1 
3 #include "us_select_edits.h"
4 #include "us_settings.h"
5 #include "us_gui_settings.h"
6 #include "us_matrix.h"
7 #include "us_investigator.h"
8 #include "us_passwd.h"
9 #include "us_db2.h"
10 #include "us_dataIO.h"
11 #include "us_util.h"
12 #include "us_editor.h"
13 #include "us_constants.h"
14 
15 // Main constructor with flags for edit, latest-edit and local-data
16 
17 US_SelectEdits::US_SelectEdits( bool dbase, QStringList& edIDs )
18  : US_WidgetsDialog( 0, 0 ), editIDs( edIDs )
19 {
20  sel_db = dbase;
21 
22  setWindowTitle( tr( "Select Run(s) with Edits as Models Pre-Filter (%1)" )
23  .arg( sel_db ? "DB" : "Local" ) );
24  setPalette ( US_GuiSettings::frameColor() );
25  setMinimumSize( 480, 300 );
26 
27  // Main layout
28  QVBoxLayout* main = new QVBoxLayout( this );
29  main->setContentsMargins( 2, 2, 2, 2 );
30  main->setSpacing ( 2 );
31 
32  // Top layout: buttons and fields above list widget
33  QGridLayout* top = new QGridLayout;
34  int ddstate = sel_db ? US_Disk_DB_Controls::DB
36 
37  dkdb_cntrls = new US_Disk_DB_Controls( ddstate );
38  connect( dkdb_cntrls, SIGNAL( changed ( bool ) ),
39  this, SLOT ( update_disk_db( bool ) ) );
40 
41  pb_invest = us_pushbutton( tr( "Select Investigator" ) );
42  QString invnum = QString::number( US_Settings::us_inv_ID() ) + ": ";
43  QString invusr = US_Settings::us_inv_name();
44  le_invest = us_lineedit( invnum + invusr, 0, true );
45  connect( pb_invest, SIGNAL( clicked() ),
46  SLOT ( get_person() ) );
47 
48  // Search line
49  QLabel* lb_filtdata = us_label( tr( "Search" ) );
51 
52  int row = 0;
53  top->addLayout( dkdb_cntrls, row++, 0, 1, 4 );
54  top->addWidget( pb_invest, row, 0, 1, 2 );
55  top->addWidget( le_invest, row++, 2, 1, 2 );
56  top->addWidget( lb_filtdata, row, 0, 1, 1 );
57  top->addWidget( le_dfilter, row++, 1, 1, 3 );
58 
59  connect( le_dfilter, SIGNAL( textChanged( const QString& ) ),
60  SLOT ( search ( const QString& ) ) );
61 
62  main->addLayout( top );
63 
65 
66  QStringList headers;
67  headers << "Run" << "Date" << "dbID" << "Label";
68  tw_data = new QTableWidget( 20, 4, this );
69  tw_data->setFrameStyle ( QFrame::NoFrame );
70  tw_data->setPalette ( US_GuiSettings::editColor() );
71  tw_data->setFont ( font );
72  tw_data->setSelectionMode ( QAbstractItemView::ExtendedSelection );
73  tw_data->setSelectionBehavior( QAbstractItemView::SelectRows );
74  tw_data->setHorizontalHeaderLabels( headers );
75  tw_data->verticalHeader()->hide();
76  tw_data->setShowGrid ( false );
77  tw_data->setColumnWidth( 0, 250 );
78  tw_data->setColumnWidth( 1, 100 );
79  tw_data->setColumnWidth( 2, 50 );
80  tw_data->setColumnWidth( 3, 350 );
81 
82  main->addWidget( tw_data );
83 
84  // Button Row
85  QHBoxLayout* buttons = new QHBoxLayout;
86 
87  QPushButton* pb_help = us_pushbutton( tr( "Help" ) );
88  connect( pb_help, SIGNAL( clicked() ), SLOT( help() ) );
89  buttons->addWidget( pb_help );
90 
91  QPushButton* pb_cancel = us_pushbutton( tr( "Cancel" ) );
92  connect( pb_cancel, SIGNAL( clicked() ), SLOT( cancelled() ) );
93  buttons->addWidget( pb_cancel );
94 
95  QPushButton* pb_accept = us_pushbutton( tr( "Select PreFilter(s)" ) );
96  connect( pb_accept, SIGNAL( clicked() ), SLOT( accepted() ) );
97  buttons->addWidget( pb_accept );
98 
99  main->addLayout( buttons );
100 
101  // List from disk or db source
102  list_data();
103  resize( 720, 360 );
104 }
105 
106 void US_SelectEdits::search( const QString& search_string )
107 {
108  bool have_search = ! search_string.isEmpty();
109  QFont tw_font( US_Widgets::fixedFont().family(),
111  QFontMetrics* fm = new QFontMetrics( tw_font );
112  int rowht = fm->height() + 2;
113  tw_data->clearContents();
114  tw_data->setSortingEnabled( false );
115 
116  for ( int ii = 0; ii < rlabels.size(); ii++ )
117  {
118  QTableWidgetItem* twi;
119  QString runID = rlabels.at( ii );
120 
121  if ( have_search &&
122  ! runID.contains( search_string, Qt::CaseInsensitive ) )
123  continue;
124 
125  twi = new QTableWidgetItem( runID );
126  twi->setFlags( twi->flags() ^ Qt::ItemIsEditable );
127  tw_data->setItem ( ii, 0, twi );
128  twi = new QTableWidgetItem( runmap[ runID ].date );
129  twi->setFlags( twi->flags() ^ Qt::ItemIsEditable );
130  tw_data->setItem ( ii, 1, twi );
131  twi = new QTableWidgetItem( runmap[ runID ].DB_id );
132  twi->setFlags( twi->flags() ^ Qt::ItemIsEditable );
133  tw_data->setItem ( ii, 2, twi );
134  twi = new QTableWidgetItem( runmap[ runID ].label );
135  twi->setFlags( twi->flags() ^ Qt::ItemIsEditable );
136  tw_data->setItem ( ii, 3, twi );
137 
138  tw_data->setRowHeight( ii, rowht );
139  }
140 
141  tw_data->setSortingEnabled( true );
142  tw_data->sortByColumn( 1, Qt::DescendingOrder );
143  tw_data->resizeColumnsToContents();
144  tw_data->adjustSize();
145  int twwid = size().width() - 4;
146  int twhgt = qMax( height(), tw_data->size().height() );
147  tw_data->resize( twwid, twhgt );
148  qApp->processEvents();
149 }
150 
151 // List data choices (from db or disk)
153 {
154  QFont tw_font( US_Widgets::fixedFont().family(),
156  QFontMetrics* fm = new QFontMetrics( tw_font );
157  int rowht = fm->height() + 2;
158  editmap.clear();
159  rlabels.clear();
160 
161  if ( sel_db ) // Scan database data
162  {
163  scan_dbase_edit();
164  }
165  else // Scan local disk data
166  {
167  scan_local_edit();
168  }
169 
170  tw_data->clearContents();
171 
172  if ( rlabels.size() == 0 )
173  {
174  QString clabel = tr( "No data found." );
175  tw_data->setItem ( 0, 0, new QTableWidgetItem( clabel ) );
176  return;
177  }
178 
179  tw_data->setSortingEnabled( false );
180  tw_data->setRowCount( rlabels.size() );
181 
182  for ( int ii = 0; ii < rlabels.size(); ii++ )
183  { // Propagate list widget with labels
184  QString runID = rlabels.at( ii );
185 
186  tw_data->setItem( ii, 0, new QTableWidgetItem( runID ) );
187  tw_data->setItem( ii, 1,
188  new QTableWidgetItem( runmap[ runID ].date ) );
189  tw_data->setItem( ii, 2,
190  new QTableWidgetItem( runmap[ runID ].DB_id ) );
191  tw_data->setItem( ii, 3,
192  new QTableWidgetItem( runmap[ runID ].label ) );
193 
194  tw_data->setRowHeight( ii, rowht );
195  }
196 
197  tw_data->setSortingEnabled( true );
198  tw_data->sortByColumn( 1, Qt::DescendingOrder );
199  tw_data->resizeColumnsToContents();
200  tw_data->adjustSize();
201  int twwid = size().width() - 4;
202  int twhgt = qMax( height(), tw_data->size().height() );
203  tw_data->resize( twwid, twhgt );
204  qApp->processEvents();
205 }
206 
207 // Cancel button: no editIDs returned
209 {
210  editIDs.clear();
211  reject();
212  close();
213 }
214 
215 // Accept button: set up to return editID pre-filter information
217 {
218  editIDs.clear();
219 
220  QList< QTableWidgetItem* > selitems = tw_data->selectedItems();
221 
222  if ( selitems.size() == 0 )
223  {
224  QMessageBox::information( this,
225  tr( "No Data Selected" ),
226  tr( "You have not selected any data.\nSelect or Cancel" ) );
227  return;
228  }
229 
230  // Get and return editIDs from selected runID items
231  elabels = editmap.keys();
232 
233  for ( int ii = 0; ii < selitems.size(); ii++ )
234  { // Loop thru selected runIDs
235  QTableWidgetItem* twi = selitems.at( ii );
236  if ( twi->column() != 0 )
237  {
238  int row = twi->row();
239  twi = tw_data->item( row, 0 );
240  }
241  QString rlabel = twi->text() + " :";
242 
243  // Get a list of edit items whose label contains runID label
244  QStringList elabs = elabels.filter( rlabel );
245 
246  for ( int jj = 0; jj < elabs.size(); jj++ )
247  { // Return editIDs from each edit in a run
248  QString editID = editmap[ elabs[ jj ] ].editID;
249 
250  if ( ! editIDs.contains( editID ) )
251  editIDs << editID;
252  }
253  }
254 qDebug() << "Acpt: editIDs size" << editIDs.size();
255 qDebug() << "Acpt: editIDs" << editIDs;
256 
257  accept(); // Signal that selection was accepted
258  close();
259 }
260 
261 // Scan database for edit sets
263 {
264 //qDebug() << "ScDB:TM:00: " << QTime::currentTime().toString("hh:mm:ss:zzzz");
265  US_Passwd pw;
266  US_DB2 db( pw.getPasswd() );
267 
268  if ( db.lastErrno() != US_DB2::OK )
269  {
270  QMessageBox::information( this,
271  tr( "DB Connection Problem" ),
272  tr( "There was an error connecting to the database:\n" )
273  + db.lastError() );
274  return;
275  }
276 
277  QApplication::setOverrideCursor( QCursor( Qt::WaitCursor ) );
278  QStringList query;
279  QString invID = QString::number( US_Settings::us_inv_ID() );
280 
281  // Build a mapping of experiment labels to experiment DB ids
282  QMap< QString, QString > explabs;
283  query.clear();
284  query << "get_experiment_desc" << invID;
285 
286  db.query( query );
287 
288  while ( db.next() )
289  {
290  QString expID = db.value( 0 ).toString();
291  QString label = db.value( 4 ).toString();
292  explabs[ expID ] = label;
293  }
294 qDebug() << "ScDB: explabs size" << explabs.size();
295 
296  // Now fill in data description objects for edits
297  query.clear();
298  query << "all_editedDataIDs" << invID;
299 
300 //qDebug() << "ScDB:TM:01: " << QTime::currentTime().toString("hh:mm:ss:zzzz");
301  db.query( query );
302 
303  while ( db.next() )
304  {
305  QString recID = db.value( 0 ).toString();
306 
307 //qDebug() << "ScDB:TM:03: " << QTime::currentTime().toString("hh:mm:ss:zzzz");
308  QString descrip = db.value( 1 ).toString();
309  QString filename = db.value( 2 ).toString().replace( "\\", "/" );
310  QString expID = db.value( 4 ).toString();
311  QString date = US_Util::toUTCDatetimeText( db.value( 5 )
312  .toDateTime().toString( Qt::ISODate ), true )
313  .section( " ", 0, 0 );
314  QString recGUID = db.value( 9 ).toString();
315  QString filebase = filename.section( "/", -1, -1 );
316  QString runID = descrip.isEmpty() ? filebase.section( ".", 0, -7 )
317  : descrip;
318  QString editID = filebase.section( ".", -6, -6 );
319  QString tripID = filebase.section( ".", -4, -2 );
320 
321 //qDebug() << "ScDB:TM:04: " << QTime::currentTime().toString("hh:mm:ss:zzzz");
322  QString key = runID + " : " + tripID + " : " + editID;
323 
324  edesc.key = key;
325  edesc.runID = runID;
326  edesc.label = explabs[ expID ];
327 qDebug() << "edesc key" << key << "expID" << expID << "label" << edesc.label;
328  edesc.editID = recID;
329  edesc.date = date;
330  edesc.DB_id = expID;
331 
332  editmap[ key ] = edesc;
333 //qDebug() << "ScDB:TM:06: " << QTime::currentTime().toString("hh:mm:ss:zzzz");
334  }
335 //qDebug() << "ScDB:TM:88: " << QTime::currentTime().toString("hh:mm:ss:zzzz");
336 qDebug() << "ScDB: editmap size" << editmap.size();
337 
338  build_runids();
339 
340  QApplication::restoreOverrideCursor();
341  QApplication::restoreOverrideCursor();
342 //qDebug() << "ScDB:TM:99: " << QTime::currentTime().toString("hh:mm:ss:zzzz");
343 }
344 
345 // Scan local disk for edit sets
347 {
348  QString rdir = US_Settings::resultDir();
349  QStringList aucdirs = QDir( rdir ).entryList(
350  QDir::AllDirs | QDir::NoDotAndDotDot, QDir::Name );
351 
352  QStringList aucfilt( "*.auc" );
353  QStringList edtfilt;
354  QStringList edtfiles;
355  QStringList aucfiles;
356  QApplication::setOverrideCursor( QCursor( Qt::WaitCursor ) );
357 
358  for ( int ii = 0; ii < aucdirs.size(); ii++ )
359  {
360  QString subdir = rdir + "/" + aucdirs.at( ii );
361  QDir dirRun( subdir );
362  QStringList aucfiles = QDir( subdir ).entryList(
363  aucfilt, QDir::Files, QDir::Name );
364 
365  if ( aucfiles.size() < 1 )
366  continue;
367 
368  QString aucfbase = aucfiles.at( 0 );
369  QString aucfname = subdir + "/" + aucfbase;
370  QString runID = aucfbase.section( ".", 0, -6 );
371  QString subType = aucfbase.section( ".", -5, -5 );
372  QString tripl = aucfbase.section( ".", -4, -2 );
373  QString explabel = runID;
374  QString expID = "";
375 
376  edtfilt.clear();
377  edtfilt << runID + "." + subType + ".xml";
378  edtfiles = dirRun.entryList( edtfilt, QDir::Files, QDir::Name );
379  if ( edtfiles.size() != 1 )
380  continue;
381 
382  QString expfpath = subdir + "/" + edtfiles[ 0 ];
383  QFile fileri( expfpath );
384 //qDebug() << "ScLo: ii fn" << ii << expfpath;
385 
386  if ( fileri.open( QIODevice::ReadOnly | QIODevice::Text ) )
387  { // Read the experiment XML and get experiment label
388  QXmlStreamReader xml( &fileri );
389  QXmlStreamAttributes attr;
390 
391  while( ! xml.atEnd() )
392  {
393  xml.readNext();
394 
395  if ( xml.isStartElement() )
396  {
397  if ( xml.name() == "experiment" )
398  {
399  attr = xml.attributes();
400  expID = attr.value( "id" ).toString();
401 //qDebug() << "ScLo: expID" << expID;
402  }
403 
404  else if ( xml.name() == "label" )
405  {
406  xml.readNext();
407  explabel = xml.text().toString();
408  break;
409  }
410  }
411  }
412 
413  fileri.close();
414  }
415 
416  edtfilt.clear();
417  edtfilt << runID + ".*." + subType + ".*.xml";
418  edtfiles = dirRun.entryList( edtfilt, QDir::Files, QDir::Name );
419  edtfiles.sort();
420 
421  if ( edtfiles.size() < 1 )
422  continue;
423 
424  for ( int jj = 0; jj < edtfiles.size(); jj++ )
425  {
426  QString filebase = edtfiles.at( jj );
427  QString filename = subdir + "/" + filebase;
428  QString runID = filebase.section( ".", 0, -7 );
429  QString editID = filebase.section( ".", -6, -6 );
430  editID = ( editID.length() == 12 && editID.startsWith( "20" ) ) ?
431  editID.mid( 2 ) : editID;
432  QString tripID = filebase.section( ".", -4, -2 );
433  QString key = runID + " : " + tripID + " : " + editID;
434  QString date = US_Util::toUTCDatetimeText( QFileInfo( filename )
435  .lastModified().toUTC().toString( Qt::ISODate ), true )
436  .section( " ", 0, 0 );
437 
438  QFile filei( filename );
439 
440  if ( ! filei.open( QIODevice::ReadOnly | QIODevice::Text ) )
441  continue;
442 
443  QXmlStreamReader xml( &filei );
444  QXmlStreamAttributes a;
445  QString recGUID;
446 
447  while( ! xml.atEnd() )
448  {
449  xml.readNext();
450 
451  if ( xml.isStartElement() )
452  {
453  if ( xml.name() == "editGUID" )
454  {
455  a = xml.attributes();
456  recGUID = a.value( "value" ).toString();
457  }
458  }
459  }
460 
461  filei.close();
462 
463  edesc.key = key;
464  edesc.runID = runID;
465  edesc.label = explabel;
466  edesc.editID = recGUID;
467  edesc.date = date;
468  edesc.DB_id = expID;
469 
470  editmap[ key ] = edesc;
471  }
472  }
473 
474  build_runids();
475 
476  QApplication::restoreOverrideCursor();
477  QApplication::restoreOverrideCursor();
478 }
479 
480 // Build the runID list from full edit map
482 {
483  elabels = editmap.keys();
484 
485  // Add "unassigned" entry
486  QString runID = "Unassigned";
487  QString ekey = runID + " : 0.Z.280 : 1";
488  edesc.key = ekey;
489  edesc.runID = runID;
490  edesc.label = "Manual/Custom/Global";
491  edesc.editID = "1";
492  edesc.date = "2011/01/01";
493  edesc.DB_id = "0";
494  elabels << ekey;
495  editmap[ ekey ] = edesc;
496 
497  // Build the runID list
498 qDebug() << "BldR: elabels size" << elabels.size();
499  rlabels.clear();
500  runmap .clear();
501 
502  for ( int ii = 0; ii < elabels.size(); ii++ )
503  {
504  ekey = elabels.at( ii );
505  runID = editmap[ ekey ].runID;
506 qDebug() << "BldR: ii ekey runID" << ii << ekey << runID;
507 
508  if ( ! rlabels.contains( runID ) )
509  {
510  rlabels << runID;
511  runmap[ runID ] = editmap[ ekey ];
512 qDebug() << "BldR: *UNIQUE* runID";
513  }
514  }
515 qDebug() << "BldR: rlabels size" << rlabels.size();
516 qDebug() << "BldR: runmap size" << runmap.size();
517 }
518 
519 
520 // Investigator button clicked: get investigator from dialog
522 {
523  int invID = US_Settings::us_inv_ID();
524  US_Investigator* dialog = new US_Investigator( true, invID );
525 
526  connect( dialog, SIGNAL( investigator_accepted( int ) ),
527  SLOT( update_person( int ) ) );
528 
529  dialog->exec();
530 }
531 
532 // Slot to handle accept in investigator dialog
534 {
535  QString number = ( ID > 0 ) ? QString::number( ID ) + ": " : "";
536  le_invest->setText( number + US_Settings::us_inv_name() );
537 
538  list_data();
539 }
540 
541 // Slot to handle accept in investigator dialog
543 {
544  emit dkdb_changed( isDB );
545 
546  sel_db = isDB;
547  editmap.clear();
548  rlabels.clear();
549 
550  if ( isDB ) // Scan database
551  {
552  scan_dbase_edit();
553  setWindowTitle(
554  tr( "Select Run(s) with Edits as Models Pre-Filter (DB)" ) );
555  }
556  else // Scan local disk data
557  {
558  scan_local_edit();
559  setWindowTitle(
560  tr( "Select Run(s) with Edits as Models Pre-Filter (Local)" ) );
561  }
562 
563  list_data();
564 
565  QString sfilt = le_dfilter->text();
566  if ( ! sfilt.isEmpty() )
567  search( sfilt );
568 }
569