Subversion Repositories svn1-original

Rev

Rev 369 | 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"
363 david 7
#include "QClipboard"
8
#include "QRegExp"
157 david 9
#include "mainwindow.h"
10
#include "QTextStream"
11
#include "timedelegate.h"
324 david 12
#include "qmconfig.h"
157 david 13
 
14
#include    "consts.h"
15
#include    "structs.h"
16
#include    "proto.h"
17
 
18
QmDialogUploadLegTimes::QmDialogUploadLegTimes(QWidget *parent) :
19
    QDialog(parent),
20
    ui(new Ui::QmDialogUploadLegTimes)
21
{
22
    ui->setupUi(this);
310 david 23
    setSizeGripEnabled(true);
157 david 24
    ui->legNumber->setMaximum(config.num_legs);
25
 
26
    // Connect up buttons
27
    connect(ui->load, SIGNAL(clicked()), this, SLOT(load()));
363 david 28
    connect(ui->fromClip, SIGNAL(clicked()), this, SLOT(fromClip()));
378 david 29
    connect(ui->fromEvent, SIGNAL(clicked()), this, SLOT(fromEvent()));
363 david 30
    connect(ui->clear, SIGNAL(clicked()), this, SLOT(clear()));
157 david 31
    connect(ui->cancel,SIGNAL(clicked()), this, SLOT(close()));
159 - 32
    connect(ui->update,SIGNAL(clicked()), this, SLOT(update()));
363 david 33
    connect(ui->deltaTime, SIGNAL(timeChanged(QTime)), this, SLOT(updateDeltaDisplay()));
189 - 34
    connect(ui->hideOk, SIGNAL(clicked()), this, SLOT(updateDeltaDisplay()));
378 david 35
    connect(ui->legNumber, SIGNAL(valueChanged(int)), this, SLOT(legNumberChanged(int)));
157 david 36
 
37
 
38
    // Set up the table
249 - 39
    // First column is not a 'time' column
40
    ui->tableWidget->setColumnCount(1);
41
    ui->tableWidget->setHorizontalHeaderItem ( 0, new QTableWidgetItem ("Team"));
42
    addColumn("Delta");
43
    addColumn("Used");
44
    addColumn("Time");
157 david 45
 
249 - 46
    // Wire up the table
47
    connect(ui->tableWidget,SIGNAL(itemDoubleClicked (QTableWidgetItem*)), this,SLOT(itemActivated(QTableWidgetItem*)));
157 david 48
 
249 - 49
    // Init status
50
    ui->status->setText("Load Leg File");
378 david 51
    legNumberChanged(0);
157 david 52
}
53
 
54
QmDialogUploadLegTimes::~QmDialogUploadLegTimes()
55
{
56
    delete ui;
57
}
58
 
249 - 59
void QmDialogUploadLegTimes::addColumn(QString hdr)
60
{
61
    int col = ui->tableWidget->columnCount();
62
    ui->tableWidget->insertColumn(col);
63
 
64
    // Insert header
65
    ui->tableWidget->setHorizontalHeaderItem ( col, new QTableWidgetItem (hdr));
66
 
67
    // Insert Time Delegate
68
    ui->tableWidget->setItemDelegateForColumn(col, new timeDelegate());
69
}
70
 
363 david 71
void QmDialogUploadLegTimes::clear(void)
72
{
73
    ui->tableWidget->clearContents();
74
    ui->tableWidget->setRowCount(0);
75
 
76
    // Update Error information
77
    updateDeltaDisplay();
78
}
79
 
378 david 80
void QmDialogUploadLegTimes::fromEvent(void)
81
{
82
    team_type   team_buf;
83
 
84
    /* Determine the leg to load - from other dialog */
85
    int leg = ui->legNumber->value() ;
86
    if (leg <= 0 || leg > config.num_legs)
87
    {
88
        ui->status->setText("Must select leg number");
89
        return;
90
    }
91
 
92
    ui->status->setText("Load existing data from leg:" + QString::number(leg));
93
    for( int i = config.min_team; i <= config.max_team; i++ )
94
    {
95
        if( valid_field( i ) && g_record( i, &team_buf ) )
96
        {
97
            int secs;
98
            if ( ui->legStart->isChecked()) {
99
                secs = team_buf.leg[leg].start;
100
            } else {
101
                secs = team_buf.leg[leg].end;
102
            }
103
 
104
            QTime data = QTime().addSecs(secs);
105
            //qDebug() << "Team:"<< i << " Time:" << data.toString("hh:mm:ss");
106
            addDataToTable(i, data, true);
107
        }
108
    }
109
 
110
    // Update Error information
111
    updateDeltaDisplay();
112
}
113
 
363 david 114
void QmDialogUploadLegTimes::fromClip(void)
115
{
116
    QClipboard *clipboard = QApplication::clipboard();
117
    QString text = clipboard->text();
118
    if (text.length() > 0) {
119
        QStringList list = text.split(QRegExp("[\\r\\n]"));
120
 
121
        ui->status->setText("Loading Data");
122
        for (int i = 0; i < list.size(); ++i)
123
        {
124
            processOneLine(list.at(i));
125
        }
126
 
127
        // Update Error information
128
        updateDeltaDisplay();
129
    }
130
}
378 david 131
 
363 david 132
void QmDialogUploadLegTimes::processOneLine(QString line)
133
{
134
    QStringList parts;
135
    line = line.trimmed();             // Remove leading and training White Space
136
    if (line.size() <= 0)
137
        return;
138
 
139
    //  An array of possible imput parsers
140
    //
141
    QRegExp lineFormats[] = {
142
        QRegExp ("^(\\d+)\\s+(\\d+:\\d+:\\d+)$"),                           // 022 12:13:14
369 david 143
        QRegExp ("^(\\d+)\\s*,\\s*(\\d+:\\d+:\\d+)$"),                      // 022,12:13:14
363 david 144
        QRegExp ("^(\\d+)\\s+\\d+-\\d+-\\d+\\s+(\\d+:\\d+:\\d+)\\.\\d+$"),  // 022 2019-08-01 12:13:14.123
145
        QRegExp ("^\\d+,(\\d+),(\\d+:\\d+:\\d+)$"),                         // 001,022,12:13:14
369 david 146
        QRegExp ("^\\d+,(\\d+),\\d+,\"(\\d+:\\d+:\\d+)\\.\\d+\"$"),         // 2,22,0,"09:40:09.612"
363 david 147
    };
148
 
149
    for( unsigned int idx = 0 ; idx <(sizeof(lineFormats)/sizeof(*lineFormats)); idx++ )
150
    {
151
        if(lineFormats[idx].indexIn(line) == 0)
152
        {
153
            parts = lineFormats[idx].capturedTexts();
154
        }
155
    }
156
 
157
    if ( parts.empty())
158
    {
159
        qDebug("Funny Line regex: %s", qPrintable(line));
160
        return;
161
    }
162
 
163
    QString first = parts.value(1);
164
    if ( parts.count() != 3)
165
    {
166
        qDebug("Funny Line parts: %s", qPrintable(line));
167
        return;
168
    }
169
 
170
    bool ok;
171
    int team = first.toInt(&ok);
172
    if ( ! ok || team <= 0 || team > 999 )
173
    {
174
        qDebug("Bad Team Number: %s", qPrintable(line));
175
        return;
176
    }
378 david 177
 
178
    addDataToTable(team, QTime::fromString(parts.value(2),"hh:mm:ss"), false);
179
}
180
 
181
void QmDialogUploadLegTimes::addDataToTable(int team, QTime ltime, bool isYellow)
182
{
183
    if ( team <= 0 || team > 999 )
184
    {
185
        //qDebug("Team Number out of range: %s", qPrintable(line));
186
        return;
187
    }
188
 
363 david 189
    if (team > ui->tableWidget->rowCount())
190
    {
191
        ui->tableWidget->setRowCount(team);
192
    }
193
 
194
    QTableWidgetItem *item = ui->tableWidget->item(team-1,0);
195
    if (!item)
196
    {
197
        item = new QTableWidgetItem(QString::number(team));
198
        item->setFlags(item->flags() & ~(Qt::ItemIsEditable|Qt::ItemIsDragEnabled|Qt::ItemIsDropEnabled));
199
        ui->tableWidget->setItem(team-1,0,item);
200
        item->setData(Qt::ToolTipRole,"Team Number");
201
 
202
        item = new QTableWidgetItem("");
203
        item->setFlags(item->flags() & ~(Qt::ItemIsEditable|Qt::ItemIsDragEnabled|Qt::ItemIsDropEnabled));
204
        ui->tableWidget->setItem(team-1,1,item);
205
        item->setData(Qt::ToolTipRole,"Max delta");
206
 
207
        item = new QTableWidgetItem("");
208
        item->setFlags(item->flags() & ~(Qt::ItemIsDragEnabled|Qt::ItemIsDropEnabled));
209
        ui->tableWidget->setItem(team-1,2,item);
210
        item->setData(Qt::ToolTipRole,"Use this data");
211
    }
212
 
213
    //  Insert the time at the first available slot
214
    //  Scan for max an min as we go
215
    int ii;
216
    QTableWidgetItem *titem = NULL;
378 david 217
    //QTime ltime = QTime::fromString(parts.value(2),"hh:mm:ss");
363 david 218
    unsigned int lsecs = QTime(0,0,0).secsTo(ltime);
219
    if ( lsecs <= 0)
220
    {
378 david 221
        //qDebug("Funny Line: %s", qPrintable(line));
363 david 222
        return;
223
    }
224
    //qDebug("Tead: %d, Secs: %d", team, lsecs );
225
    unsigned int min_time = lsecs;
226
    unsigned int max_time = lsecs;
227
    bool empty_cell_found = false;
228
 
229
    for (ii=3 ; ii <= ui->tableWidget->columnCount() - 1; ii++)
230
    {
231
        titem = ui->tableWidget->item(team-1,ii);
232
        if (! titem)
233
        {
234
            // Empty cell found
235
            empty_cell_found = true;
236
            break;
237
        }
238
 
239
        QTime entry = titem->data(Qt::EditRole).toTime();
240
        unsigned int secs = QTime(0,0,0).secsTo(entry);
241
        if ( secs < min_time )
242
            min_time = secs;
243
        if (secs > max_time)
244
            max_time = secs;
245
    }
246
 
247
    // No space found for the data - add a new column
248
    if ( ! empty_cell_found )
249
    {
250
        addColumn("Time");
251
        ii = ui->tableWidget->columnCount() - 1;
252
    }
253
 
254
    // Insert data into cell
255
    titem = new QTableWidgetItem();
256
    titem->setData(Qt::EditRole, ltime);
257
    titem->setFlags(titem->flags() & ~(Qt::ItemIsEditable|Qt::ItemIsDragEnabled|Qt::ItemIsDropEnabled));
258
    ui->tableWidget->setItem(team-1,ii,titem);
378 david 259
 
260
    //  Color if needed
261
    if (isYellow)
262
        titem->setBackgroundColor(QColor(255,255,0,30));
263
 
363 david 264
    //qDebug("Team: %d, %d of %d", team-1, ii, ui->tableWidget->columnCount() );
265
 
266
    if (ii == 3)
267
    {
268
        titem = new QTableWidgetItem();
269
        titem->setData(Qt::EditRole, ltime);
270
        ui->tableWidget->setItem(team-1,2,titem);
271
        titem->setBackgroundColor(QColor(0,255,0,30));
272
    }
273
 
274
    int delta = max_time - min_time;
275
    if ( delta )
276
    {
277
        ui->tableWidget->item(team-1,1)->setData(Qt::EditRole, QTime().addSecs(delta));
278
    }
279
}
280
 
157 david 281
void QmDialogUploadLegTimes::load(void)
282
{
283
    QString fileName = QFileDialog::getOpenFileName(this, tr("Load File"),
324 david 284
                                                 appSettings->value("LegTimeUpload/LastFile",filepath).toString(),
363 david 285
                                                 tr("Legs (*leg*);;Data (*.leg);;Text (*.txt);;Csv (*.csv);;All (*.*)"),
157 david 286
                                                 0,
287
                                                 QFileDialog::ReadOnly);
288
    if ( fileName.isEmpty() )
289
    {
290
        MainWindow::showMessage("No File Specified");
291
        return;
292
    }
293
 
324 david 294
    appSettings->setValue("LegTimeUpload/LastFile", fileName); 
295
 
296
 
157 david 297
    // Open the file
298
 
299
    QFile file(fileName);
300
    if ( ! file.open(QIODevice::ReadOnly | QIODevice::Text) )
301
    {
302
        MainWindow::showMessage("Cannot open Leg Data file");
303
        return;
304
    }
159 - 305
    ui->status->setText("Loading Data");
157 david 306
    // Insert column headers
378 david 307
    //ui->tableWidget->clearContents();
308
    //ui->tableWidget->setRowCount(0);
157 david 309
 
310
 
311
    // Process Each line of the file
363 david 312
    //  Format (original) is TeamNumber Time
313
    //  Format (alternate) is TeamNumber Date Time
314
    //                                       Time has milliseconds
157 david 315
    QTextStream in(&file);
316
    while (!in.atEnd())
317
    {
363 david 318
        processOneLine(in.readLine());
157 david 319
    }
320
 
159 - 321
    // Update Error information
189 - 322
    updateDeltaDisplay();
159 - 323
 
157 david 324
}
159 - 325
 
189 - 326
void QmDialogUploadLegTimes::updateDeltaDisplay( void )
159 - 327
{
328
    bool isFlagged = false;
189 - 329
    QTime maxDelta(0,0,0,0);
363 david 330
    QTime delta = ui->deltaTime->time();
331
    //qDebug("New Delta: %s", qPrintable(ui->deltaTime->time().toString()));
159 - 332
    for ( int ii = 0; ii < ui->tableWidget->rowCount(); ii++)
333
    {
189 - 334
        bool show = true;
159 - 335
        QTableWidgetItem *item;
336
        item = ui->tableWidget->item(ii, 1);
337
        if (item)
338
        {
339
            QTime time = item->data(Qt::EditRole).toTime();
189 - 340
            if ( time > maxDelta)
341
            {
342
                maxDelta = time;
343
            }
159 - 344
            if ( time > delta )
345
            {
346
                item->setBackgroundColor(QColor(255,0,0,50));
347
                isFlagged = true;
348
            }
349
            else
350
            {
351
                item->setBackgroundColor(QColor(255,255,255));
189 - 352
                if ( ui->hideOk->isChecked())
353
                {
354
                    show = false;
355
                }
159 - 356
            }
357
        }
189 - 358
 
359
        // Hide if not a valid time and we have no time ebtry for it
360
        if ( !valid_field(ii+1) && item == NULL )
361
        {
362
            show = false;
363
        }
364
        ui->tableWidget->setRowHidden(ii,!show);
365
 
159 - 366
    }
189 - 367
    //ui->maxDeltaTime->setText(QString::number(QTime(0,0,0).secsTo(maxDelta)));
368
    ui->maxDeltaTime->setText(maxDelta.toString("hh:mm:ss"));
159 - 369
    if (isFlagged)
370
    {
371
        ui->status->setText("Large Delta Times");
372
    }
373
    else
374
    {
191 - 375
 
159 - 376
    }
377
}
378
 
379
void QmDialogUploadLegTimes::update(void)
380
{
174 - 381
    team_type   team_buf;
159 - 382
    int leg = ui->legNumber->value() ;
383
    if (leg <= 0 || leg > config.num_legs)
384
    {
385
        ui->status->setText("Must select leg number");
386
        return;
387
    }
388
 
389
    // Insert the first time into the desired leg
390
    for ( int ii = 0; ii < ui->tableWidget->rowCount(); ii++)
391
    {
392
        QTableWidgetItem *item;
393
        item = ui->tableWidget->item(ii, 0);
394
        if (item)
395
        {
396
            int team = item->data(Qt::EditRole).toInt();
397
            if( valid_field( team ) && g_record( team, &team_buf ) )
398
            {
399
                item = ui->tableWidget->item(ii, 2);
400
                if (item)
401
                {
402
                    QTime time = item->data(Qt::EditRole).toTime();
403
                    int secs = QTime(0,0,0).secsTo(time);
404
 
405
                    if ( ui->legStart->isChecked())
406
                    {
407
                        team_buf.leg[leg].start = secs;
408
                        team_buf.leg[leg].manual = TRUE;
409
                    }
410
                    else
411
                    {
412
                        team_buf.leg[leg].end = secs;
413
                    }
414
                    set_times( &team_buf );                 /* Calc start of next leg */
415
                    test_times( &team_buf, 0 );             /* Calc elapsed times etc */
416
                    put_team_record( team, &team_buf );
417
                    ui->tableWidget->hideRow(ii);
418
                }
419
            }
420
        }
421
     }
422
}
191 - 423
 
424
void QmDialogUploadLegTimes::itemActivated ( QTableWidgetItem * uitem )
425
{
248 - 426
    // Use this item for the time, but only if the item is from a 'time' column
427
    if ( uitem->column() >= 3 )
428
    {
429
        QTableWidgetItem *titem = new QTableWidgetItem(*uitem);
430
        titem->setFlags(titem->flags()| Qt::ItemIsEditable);
431
        ui->tableWidget->setItem(uitem->row(),2,titem);
432
        titem->setBackgroundColor(QColor(0,0,255,30));
433
    }
191 - 434
}
378 david 435
 
436
void QmDialogUploadLegTimes::legNumberChanged(int leg)
437
{
438
    //qDebug() << "Leg:" << leg;
439
    ui->fromEvent->setEnabled(leg != 0);
440
    ui->update->setEnabled( leg != 0);
441
}