Subversion Repositories svn1-original

Rev

Rev 345 | Rev 347 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
157 david 1
#include "qmdialoguploadlegtimes.h"
310 david 2
#include "qmdialoguploadlegtimes_ui.cpp"
157 david 3
#include "QTableWidgetItem"
4
#include "QFile"
5
#include "QString"
6
#include "QFileDialog"
7
#include "mainwindow.h"
8
#include "QTextStream"
9
#include "timedelegate.h"
324 david 10
#include "qmconfig.h"
157 david 11
 
12
#include    "consts.h"
13
#include    "structs.h"
14
#include    "proto.h"
15
 
16
QmDialogUploadLegTimes::QmDialogUploadLegTimes(QWidget *parent) :
17
    QDialog(parent),
18
    ui(new Ui::QmDialogUploadLegTimes)
19
{
20
    ui->setupUi(this);
310 david 21
    setSizeGripEnabled(true);
157 david 22
    ui->legNumber->setMaximum(config.num_legs);
23
 
24
    // Connect up buttons
25
    connect(ui->load, SIGNAL(clicked()), this, SLOT(load()));
26
    connect(ui->cancel,SIGNAL(clicked()), this, SLOT(close()));
159 - 27
    connect(ui->update,SIGNAL(clicked()), this, SLOT(update()));
346 david 28
    connect(ui->deltaTime, SIGNAL(timeChanged(QTime)), this, SLOT(updateDeltaDisplay()));
189 - 29
    connect(ui->hideOk, SIGNAL(clicked()), this, SLOT(updateDeltaDisplay()));
157 david 30
 
31
 
32
    // Set up the table
249 - 33
    // First column is not a 'time' column
34
    ui->tableWidget->setColumnCount(1);
35
    ui->tableWidget->setHorizontalHeaderItem ( 0, new QTableWidgetItem ("Team"));
36
    addColumn("Delta");
37
    addColumn("Used");
38
    addColumn("Time");
157 david 39
 
249 - 40
    // Wire up the table
41
    connect(ui->tableWidget,SIGNAL(itemDoubleClicked (QTableWidgetItem*)), this,SLOT(itemActivated(QTableWidgetItem*)));
157 david 42
 
249 - 43
    // Init status
44
    ui->status->setText("Load Leg File");
157 david 45
}
46
 
47
QmDialogUploadLegTimes::~QmDialogUploadLegTimes()
48
{
49
    delete ui;
50
}
51
 
249 - 52
void QmDialogUploadLegTimes::addColumn(QString hdr)
53
{
54
    int col = ui->tableWidget->columnCount();
55
    ui->tableWidget->insertColumn(col);
56
 
57
    // Insert header
58
    ui->tableWidget->setHorizontalHeaderItem ( col, new QTableWidgetItem (hdr));
59
 
60
    // Insert Time Delegate
61
    ui->tableWidget->setItemDelegateForColumn(col, new timeDelegate());
62
}
63
 
157 david 64
void QmDialogUploadLegTimes::load(void)
65
{
66
    QString fileName = QFileDialog::getOpenFileName(this, tr("Load File"),
324 david 67
                                                 appSettings->value("LegTimeUpload/LastFile",filepath).toString(),
345 david 68
                                                 tr("Legs (*leg*);;Data (*.leg);;Text (*.txt);;All (*.*)"),
157 david 69
                                                 0,
70
                                                 QFileDialog::ReadOnly);
71
    if ( fileName.isEmpty() )
72
    {
73
        MainWindow::showMessage("No File Specified");
74
        return;
75
    }
76
 
324 david 77
    appSettings->setValue("LegTimeUpload/LastFile", fileName); 
78
 
79
 
157 david 80
    // Open the file
81
 
82
    QFile file(fileName);
83
    if ( ! file.open(QIODevice::ReadOnly | QIODevice::Text) )
84
    {
85
        MainWindow::showMessage("Cannot open Leg Data file");
86
        return;
87
    }
159 - 88
    ui->status->setText("Loading Data");
157 david 89
    // Insert column headers
90
    ui->tableWidget->clearContents();
91
    ui->tableWidget->setRowCount(0);
92
 
93
 
94
    // Process Each line of the file
345 david 95
    //  Format (original) is TeamNumber Time
96
    //  Format (alternate) is TeamNumber Date Time
97
    //                                       Time has milliseconds
157 david 98
    QTextStream in(&file);
99
    while (!in.atEnd())
100
    {
345 david 101
        QStringList parts;
157 david 102
        QString line = in.readLine();
103
        line = line.trimmed();             // Remove leading and training White Space
345 david 104
 
105
        QRegExp rxOriginal("^(\\d+)\\s+(\\d+:\\d+:\\d+)$");
106
        QRegExp rxAlternate("^(\\d+)\\s+\\d+-\\d+-\\d+\\s+(\\d+:\\d+:\\d+)\\.\\d+$");
107
 
108
        if(rxOriginal.indexIn(line) == 0)
189 - 109
        {
345 david 110
            parts = rxOriginal.capturedTexts();
111
        }
112
        else if (rxAlternate.indexIn(line) == 0)
113
        {
114
            parts = rxAlternate.capturedTexts();
115
        }
116
        else
117
        {
118
            qDebug("Funny Line regex: %s", qPrintable(line));
189 - 119
            continue;
120
        }
157 david 121
 
345 david 122
        QString first = parts.value(1);
123
        if ( parts.count() != 3)
124
        {
125
            qDebug("Funny Line parts: %s", qPrintable(line));
126
            continue;
127
        }
128
 
157 david 129
        bool ok;
130
        int team = first.toInt(&ok);
131
        if ( ! ok || team <= 0 )
132
            continue;
133
        if (team > ui->tableWidget->rowCount())
134
        {
135
            ui->tableWidget->setRowCount(team);
136
        }
137
 
138
        QTableWidgetItem *item = ui->tableWidget->item(team-1,0);
139
        if (!item)
140
        {
141
            item = new QTableWidgetItem(QString::number(team));
142
            item->setFlags(item->flags() & ~(Qt::ItemIsEditable|Qt::ItemIsDragEnabled|Qt::ItemIsDropEnabled));
143
            ui->tableWidget->setItem(team-1,0,item);
158 david 144
            item->setData(Qt::ToolTipRole,"Team Number");
145
 
146
            item = new QTableWidgetItem("");
147
            item->setFlags(item->flags() & ~(Qt::ItemIsEditable|Qt::ItemIsDragEnabled|Qt::ItemIsDropEnabled));
148
            ui->tableWidget->setItem(team-1,1,item);
149
            item->setData(Qt::ToolTipRole,"Max delta");
191 - 150
 
151
            item = new QTableWidgetItem("");
152
            item->setFlags(item->flags() & ~(Qt::ItemIsDragEnabled|Qt::ItemIsDropEnabled));
153
            ui->tableWidget->setItem(team-1,2,item);
154
            item->setData(Qt::ToolTipRole,"Use this data");
157 david 155
        }
156
 
158 david 157
        //  Insert the time at the first available slot
158
        //  Scan for max an min as we go
157 david 159
        int ii;
160
        QTableWidgetItem *titem = NULL;
345 david 161
        QTime ltime = QTime::fromString(parts.value(2),"hh:mm:ss");
158 david 162
        unsigned int lsecs = QTime(0,0,0).secsTo(ltime);
190 - 163
        if ( lsecs <= 0)
164
        {
165
            qDebug("Funny Line: %s", qPrintable(line));
166
            continue;
167
        }
168
        //qDebug("Tead: %d, Secs: %d", team, lsecs );
158 david 169
        unsigned int min_time = lsecs;
170
        unsigned int max_time = lsecs;
249 - 171
        bool empty_cell_found = false;
158 david 172
 
254 - 173
        for (ii=3 ; ii <= ui->tableWidget->columnCount() - 1; ii++)
157 david 174
        {
175
            titem = ui->tableWidget->item(team-1,ii);
176
            if (! titem)
177
            {
249 - 178
                // Empty cell found
179
                empty_cell_found = true;
157 david 180
                break;
181
            }
158 david 182
 
183
            QTime entry = titem->data(Qt::EditRole).toTime();
184
            unsigned int secs = QTime(0,0,0).secsTo(entry);
185
            if ( secs < min_time )
186
                min_time = secs;
187
            if (secs > max_time)
188
                max_time = secs;
157 david 189
        }
249 - 190
 
191
        // No space found for the data - add a new column
192
        if ( ! empty_cell_found )
193
        {
194
            addColumn("Time");
195
            ii = ui->tableWidget->columnCount() - 1;
196
        }
197
 
198
        // Insert data into cell
158 david 199
        titem = new QTableWidgetItem();
200
        titem->setData(Qt::EditRole, ltime);
191 - 201
        titem->setFlags(titem->flags() & ~(Qt::ItemIsEditable|Qt::ItemIsDragEnabled|Qt::ItemIsDropEnabled));
157 david 202
        ui->tableWidget->setItem(team-1,ii,titem);
248 - 203
        //qDebug("Team: %d, %d of %d", team-1, ii, ui->tableWidget->columnCount() );
157 david 204
 
191 - 205
        if (ii == 3)
206
        {
207
            titem = new QTableWidgetItem();
208
            titem->setData(Qt::EditRole, ltime);
209
            ui->tableWidget->setItem(team-1,2,titem);
210
            titem->setBackgroundColor(QColor(0,255,0,30));
211
        }
212
 
158 david 213
        int delta = max_time - min_time;
214
        if ( delta )
215
        {
216
            ui->tableWidget->item(team-1,1)->setData(Qt::EditRole, QTime().addSecs(delta));
217
        }
157 david 218
    }
219
 
159 - 220
    // Update Error information
189 - 221
    updateDeltaDisplay();
159 - 222
 
157 david 223
}
159 - 224
 
189 - 225
void QmDialogUploadLegTimes::updateDeltaDisplay( void )
159 - 226
{
227
    bool isFlagged = false;
189 - 228
    QTime maxDelta(0,0,0,0);
346 david 229
    QTime delta = ui->deltaTime->time();
230
    //qDebug("New Delta: %s", qPrintable(ui->deltaTime->time().toString()));
159 - 231
    for ( int ii = 0; ii < ui->tableWidget->rowCount(); ii++)
232
    {
189 - 233
        bool show = true;
159 - 234
        QTableWidgetItem *item;
235
        item = ui->tableWidget->item(ii, 1);
236
        if (item)
237
        {
238
            QTime time = item->data(Qt::EditRole).toTime();
189 - 239
            if ( time > maxDelta)
240
            {
241
                maxDelta = time;
242
            }
159 - 243
            if ( time > delta )
244
            {
245
                item->setBackgroundColor(QColor(255,0,0,50));
246
                isFlagged = true;
247
            }
248
            else
249
            {
250
                item->setBackgroundColor(QColor(255,255,255));
189 - 251
                if ( ui->hideOk->isChecked())
252
                {
253
                    show = false;
254
                }
159 - 255
            }
256
        }
189 - 257
 
258
        // Hide if not a valid time and we have no time ebtry for it
259
        if ( !valid_field(ii+1) && item == NULL )
260
        {
261
            show = false;
262
        }
263
        ui->tableWidget->setRowHidden(ii,!show);
264
 
159 - 265
    }
189 - 266
    //ui->maxDeltaTime->setText(QString::number(QTime(0,0,0).secsTo(maxDelta)));
267
    ui->maxDeltaTime->setText(maxDelta.toString("hh:mm:ss"));
159 - 268
    if (isFlagged)
269
    {
270
        ui->status->setText("Large Delta Times");
271
    }
272
    else
273
    {
191 - 274
 
159 - 275
    }
276
}
277
 
278
void QmDialogUploadLegTimes::update(void)
279
{
174 - 280
    team_type   team_buf;
159 - 281
    int leg = ui->legNumber->value() ;
282
    if (leg <= 0 || leg > config.num_legs)
283
    {
284
        ui->status->setText("Must select leg number");
285
        return;
286
    }
287
 
288
    // Insert the first time into the desired leg
289
    for ( int ii = 0; ii < ui->tableWidget->rowCount(); ii++)
290
    {
291
        QTableWidgetItem *item;
292
        item = ui->tableWidget->item(ii, 0);
293
        if (item)
294
        {
295
            int team = item->data(Qt::EditRole).toInt();
296
            if( valid_field( team ) && g_record( team, &team_buf ) )
297
            {
298
                item = ui->tableWidget->item(ii, 2);
299
                if (item)
300
                {
301
                    QTime time = item->data(Qt::EditRole).toTime();
302
                    int secs = QTime(0,0,0).secsTo(time);
303
 
304
                    if ( ui->legStart->isChecked())
305
                    {
306
                        team_buf.leg[leg].start = secs;
307
                        team_buf.leg[leg].manual = TRUE;
308
                    }
309
                    else
310
                    {
311
                        team_buf.leg[leg].end = secs;
312
                    }
313
                    set_times( &team_buf );                 /* Calc start of next leg */
314
                    test_times( &team_buf, 0 );             /* Calc elapsed times etc */
315
                    put_team_record( team, &team_buf );
316
                    ui->tableWidget->hideRow(ii);
317
                }
318
            }
319
        }
320
     }
321
}
191 - 322
 
323
void QmDialogUploadLegTimes::itemActivated ( QTableWidgetItem * uitem )
324
{
248 - 325
    // Use this item for the time, but only if the item is from a 'time' column
326
    if ( uitem->column() >= 3 )
327
    {
328
        QTableWidgetItem *titem = new QTableWidgetItem(*uitem);
329
        titem->setFlags(titem->flags()| Qt::ItemIsEditable);
330
        ui->tableWidget->setItem(uitem->row(),2,titem);
331
        titem->setBackgroundColor(QColor(0,0,255,30));
332
    }
191 - 333
}