Rev 178 | Rev 190 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
#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 buttonsconnect(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 tableui->tableWidget->setColumnCount(5);QStringList labels;labels << "Team" << "Delta" << "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->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 fileQFile file(fileName);if ( ! file.open(QIODevice::ReadOnly | QIODevice::Text) ){MainWindow::showMessage("Cannot open Leg Data file");return;}ui->status->setText("Loading Data");// Insert column headersui->tableWidget->clearContents();ui->tableWidget->setRowCount(0);// Process Each line of the file// Format is TeamNumber TimeQTextStream in(&file);while (!in.atEnd()){QString line = in.readLine();line = line.trimmed(); // Remove leading and training White SpaceQStringList 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");}// Insert the time at the first available slot// Scan for max an min as we goint ii;QTableWidgetItem *titem = NULL;QTime ltime = QTime::fromString(parts.value(1),"hh:mm:ss");unsigned int lsecs = QTime(0,0,0).secsTo(ltime);unsigned int min_time = lsecs;unsigned int max_time = lsecs;for (ii=2 ; 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);ui->tableWidget->setItem(team-1,ii,titem);int delta = max_time - min_time;if ( delta ){ui->tableWidget->item(team-1,1)->setData(Qt::EditRole, QTime().addSecs(delta));}}// Update Error informationupdateDeltaDisplay();}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 itif ( !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{ui->status->setText("");}}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 legfor ( 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);}}}}}