Rev 324 | Blame | Compare with Previous | Last modification | View Log | RSS feed
#include "qmdialoguploadlegtimes.h"#include "qmdialoguploadlegtimes_ui.cpp"#include "QTableWidgetItem"#include "QFile"#include "QString"#include "QFileDialog"#include "mainwindow.h"#include "QTextStream"#include "timedelegate.h"#include "qmconfig.h"#include "consts.h"#include "structs.h"#include "proto.h"QmDialogUploadLegTimes::QmDialogUploadLegTimes(QWidget *parent) :QDialog(parent),ui(new Ui::QmDialogUploadLegTimes){ui->setupUi(this);setSizeGripEnabled(true);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 table// First column is not a 'time' columnui->tableWidget->setColumnCount(1);ui->tableWidget->setHorizontalHeaderItem ( 0, new QTableWidgetItem ("Team"));addColumn("Delta");addColumn("Used");addColumn("Time");// Wire up the tableconnect(ui->tableWidget,SIGNAL(itemDoubleClicked (QTableWidgetItem*)), this,SLOT(itemActivated(QTableWidgetItem*)));// Init statusui->status->setText("Load Leg File");}QmDialogUploadLegTimes::~QmDialogUploadLegTimes(){delete ui;}void QmDialogUploadLegTimes::addColumn(QString hdr){int col = ui->tableWidget->columnCount();ui->tableWidget->insertColumn(col);// Insert headerui->tableWidget->setHorizontalHeaderItem ( col, new QTableWidgetItem (hdr));// Insert Time Delegateui->tableWidget->setItemDelegateForColumn(col, new timeDelegate());}void QmDialogUploadLegTimes::load(void){QString fileName = QFileDialog::getOpenFileName(this, tr("Load File"),appSettings->value("LegTimeUpload/LastFile",filepath).toString(),tr("Legs (*leg*);;Data (*.leg);;All (*.*)"),0,QFileDialog::ReadOnly);if ( fileName.isEmpty() ){MainWindow::showMessage("No File Specified");return;}appSettings->setValue("LegTimeUpload/LastFile", fileName);// 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");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 goint 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;bool empty_cell_found = false;for (ii=3 ; ii <= ui->tableWidget->columnCount() - 1; ii++){titem = ui->tableWidget->item(team-1,ii);if (! titem){// Empty cell foundempty_cell_found = true;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;}// No space found for the data - add a new columnif ( ! empty_cell_found ){addColumn("Time");ii = ui->tableWidget->columnCount() - 1;}// Insert data into celltitem = new QTableWidgetItem();titem->setData(Qt::EditRole, ltime);titem->setFlags(titem->flags() & ~(Qt::ItemIsEditable|Qt::ItemIsDragEnabled|Qt::ItemIsDropEnabled));ui->tableWidget->setItem(team-1,ii,titem);//qDebug("Team: %d, %d of %d", team-1, ii, ui->tableWidget->columnCount() );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 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{}}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);}}}}}void QmDialogUploadLegTimes::itemActivated ( QTableWidgetItem * uitem ){// Use this item for the time, but only if the item is from a 'time' columnif ( uitem->column() >= 3 ){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));}}