#include "qmdialoguploadlegtimes.h" #include "ui_qmdialoguploadlegtimes.h" #include "QTableWidgetItem" #include "QFile" #include "QString" #include "QFileDialog" #include "mainwindow.h" #include "QTextStream" #include "timedelegate.h" #include "consts.h" #include "structs.h" #include "proto.h" QmDialogUploadLegTimes::QmDialogUploadLegTimes(QWidget *parent) : QDialog(parent), ui(new Ui::QmDialogUploadLegTimes) { ui->setupUi(this); ui->legNumber->setMaximum(config.num_legs); // Connect up buttons connect(ui->load, SIGNAL(clicked()), this, SLOT(load())); connect(ui->cancel,SIGNAL(clicked()), this, SLOT(close())); connect(ui->update,SIGNAL(clicked()), this, SLOT(update())); connect(ui->deltaTime, SIGNAL(valueChanged(int)), this, SLOT(updateDeltaDisplay())); connect(ui->hideOk, SIGNAL(clicked()), this, SLOT(updateDeltaDisplay())); // Set up the table ui->tableWidget->setColumnCount(6); QStringList labels; labels << "Team" << "Delta" << "Use" << "Time" << "Time" << "Time"; ui->tableWidget->setHorizontalHeaderLabels(labels); ui->tableWidget->setItemDelegateForColumn(1, new timeDelegate()); ui->tableWidget->setItemDelegateForColumn(2, new timeDelegate()); ui->tableWidget->setItemDelegateForColumn(3, new timeDelegate()); ui->tableWidget->setItemDelegateForColumn(4, new timeDelegate()); ui->tableWidget->setItemDelegateForColumn(5, new timeDelegate()); connect(ui->tableWidget,SIGNAL(itemDoubleClicked (QTableWidgetItem*)), this,SLOT(itemActivated(QTableWidgetItem*))); ui->status->setText("Load Leg File"); } QmDialogUploadLegTimes::~QmDialogUploadLegTimes() { delete ui; } void QmDialogUploadLegTimes::load(void) { QString fileName = QFileDialog::getOpenFileName(this, tr("Load File"), filepath, tr("Legs (*leg*);;Data (*.leg);;All (*.*)"), 0, QFileDialog::ReadOnly); if ( fileName.isEmpty() ) { MainWindow::showMessage("No File Specified"); return; } // Open the file QFile file(fileName); if ( ! file.open(QIODevice::ReadOnly | QIODevice::Text) ) { MainWindow::showMessage("Cannot open Leg Data file"); return; } ui->status->setText("Loading Data"); // Insert column headers ui->tableWidget->clearContents(); ui->tableWidget->setRowCount(0); // Process Each line of the file // Format is TeamNumber Time QTextStream in(&file); while (!in.atEnd()) { QString line = in.readLine(); line = line.trimmed(); // Remove leading and training White Space QStringList parts = line.split(" "); QString first = parts.value(0); if ( parts.count() != 2) { qDebug("Funny Line: %s", qPrintable(line)); continue; } bool ok; int team = first.toInt(&ok); if ( ! ok || team <= 0 ) continue; if (team > ui->tableWidget->rowCount()) { ui->tableWidget->setRowCount(team); } QTableWidgetItem *item = ui->tableWidget->item(team-1,0); if (!item) { item = new QTableWidgetItem(QString::number(team)); item->setFlags(item->flags() & ~(Qt::ItemIsEditable|Qt::ItemIsDragEnabled|Qt::ItemIsDropEnabled)); ui->tableWidget->setItem(team-1,0,item); item->setData(Qt::ToolTipRole,"Team Number"); item = new QTableWidgetItem(""); item->setFlags(item->flags() & ~(Qt::ItemIsEditable|Qt::ItemIsDragEnabled|Qt::ItemIsDropEnabled)); ui->tableWidget->setItem(team-1,1,item); item->setData(Qt::ToolTipRole,"Max delta"); item = new QTableWidgetItem(""); item->setFlags(item->flags() & ~(Qt::ItemIsDragEnabled|Qt::ItemIsDropEnabled)); ui->tableWidget->setItem(team-1,2,item); item->setData(Qt::ToolTipRole,"Use this data"); } // Insert the time at the first available slot // Scan for max an min as we go int ii; QTableWidgetItem *titem = NULL; QTime ltime = QTime::fromString(parts.value(1),"hh:mm:ss"); unsigned int lsecs = QTime(0,0,0).secsTo(ltime); if ( lsecs <= 0) { qDebug("Funny Line: %s", qPrintable(line)); continue; } //qDebug("Tead: %d, Secs: %d", team, lsecs ); unsigned int min_time = lsecs; unsigned int max_time = lsecs; for (ii=3 ; ii < ui->tableWidget->columnCount(); ii++) { titem = ui->tableWidget->item(team-1,ii); if (! titem) { break; } QTime entry = titem->data(Qt::EditRole).toTime(); unsigned int secs = QTime(0,0,0).secsTo(entry); if ( secs < min_time ) min_time = secs; if (secs > max_time) max_time = secs; } titem = new QTableWidgetItem(); titem->setData(Qt::EditRole, ltime); titem->setFlags(titem->flags() & ~(Qt::ItemIsEditable|Qt::ItemIsDragEnabled|Qt::ItemIsDropEnabled)); ui->tableWidget->setItem(team-1,ii,titem); if (ii == 3) { titem = new QTableWidgetItem(); titem->setData(Qt::EditRole, ltime); ui->tableWidget->setItem(team-1,2,titem); titem->setBackgroundColor(QColor(0,255,0,30)); } int delta = max_time - min_time; if ( delta ) { ui->tableWidget->item(team-1,1)->setData(Qt::EditRole, QTime().addSecs(delta)); } } // Update Error information updateDeltaDisplay(); } void QmDialogUploadLegTimes::updateDeltaDisplay( void ) { bool isFlagged = false; QTime maxDelta(0,0,0,0); QTime delta = QTime().addSecs(ui->deltaTime->value()); for ( int ii = 0; ii < ui->tableWidget->rowCount(); ii++) { bool show = true; QTableWidgetItem *item; item = ui->tableWidget->item(ii, 1); if (item) { QTime time = item->data(Qt::EditRole).toTime(); if ( time > maxDelta) { maxDelta = time; } if ( time > delta ) { item->setBackgroundColor(QColor(255,0,0,50)); isFlagged = true; } else { item->setBackgroundColor(QColor(255,255,255)); if ( ui->hideOk->isChecked()) { show = false; } } } // Hide if not a valid time and we have no time ebtry for it if ( !valid_field(ii+1) && item == NULL ) { show = false; } ui->tableWidget->setRowHidden(ii,!show); } //ui->maxDeltaTime->setText(QString::number(QTime(0,0,0).secsTo(maxDelta))); ui->maxDeltaTime->setText(maxDelta.toString("hh:mm:ss")); if (isFlagged) { ui->status->setText("Large Delta Times"); } else { } } void QmDialogUploadLegTimes::update(void) { team_type team_buf; int leg = ui->legNumber->value() ; if (leg <= 0 || leg > config.num_legs) { ui->status->setText("Must select leg number"); return; } // Insert the first time into the desired leg for ( int ii = 0; ii < ui->tableWidget->rowCount(); ii++) { QTableWidgetItem *item; item = ui->tableWidget->item(ii, 0); if (item) { int team = item->data(Qt::EditRole).toInt(); if( valid_field( team ) && g_record( team, &team_buf ) ) { item = ui->tableWidget->item(ii, 2); if (item) { QTime time = item->data(Qt::EditRole).toTime(); int secs = QTime(0,0,0).secsTo(time); if ( ui->legStart->isChecked()) { team_buf.leg[leg].start = secs; team_buf.leg[leg].manual = TRUE; } else { team_buf.leg[leg].end = secs; } set_times( &team_buf ); /* Calc start of next leg */ test_times( &team_buf, 0 ); /* Calc elapsed times etc */ put_team_record( team, &team_buf ); ui->tableWidget->hideRow(ii); } } } } } void QmDialogUploadLegTimes::itemActivated ( QTableWidgetItem * uitem ) { // Use this item for the time QTableWidgetItem *titem = new QTableWidgetItem(*uitem); titem->setFlags(titem->flags()| Qt::ItemIsEditable); ui->tableWidget->setItem(uitem->row(),2,titem); titem->setBackgroundColor(QColor(0,0,255,30)); }