Subversion Repositories svn1-original

Rev

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