Subversion Repositories svn1-original

Rev

Rev 324 | Rev 369 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 324 Rev 363
Line 2... Line 2...
2
#include "qmdialoguploadlegtimes_ui.cpp"
2
#include "qmdialoguploadlegtimes_ui.cpp"
3
#include "QTableWidgetItem"
3
#include "QTableWidgetItem"
4
#include "QFile"
4
#include "QFile"
5
#include "QString"
5
#include "QString"
6
#include "QFileDialog"
6
#include "QFileDialog"
-
 
7
#include "QClipboard"
-
 
8
#include "QRegExp"
7
#include "mainwindow.h"
9
#include "mainwindow.h"
8
#include "QTextStream"
10
#include "QTextStream"
9
#include "timedelegate.h"
11
#include "timedelegate.h"
10
#include "qmconfig.h"
12
#include "qmconfig.h"
11
 
13
 
Line 21... Line 23...
21
    setSizeGripEnabled(true);
23
    setSizeGripEnabled(true);
22
    ui->legNumber->setMaximum(config.num_legs);
24
    ui->legNumber->setMaximum(config.num_legs);
23
 
25
 
24
    // Connect up buttons
26
    // Connect up buttons
25
    connect(ui->load, SIGNAL(clicked()), this, SLOT(load()));
27
    connect(ui->load, SIGNAL(clicked()), this, SLOT(load()));
-
 
28
    connect(ui->fromClip, SIGNAL(clicked()), this, SLOT(fromClip()));
-
 
29
    connect(ui->clear, SIGNAL(clicked()), this, SLOT(clear()));
26
    connect(ui->cancel,SIGNAL(clicked()), this, SLOT(close()));
30
    connect(ui->cancel,SIGNAL(clicked()), this, SLOT(close()));
27
    connect(ui->update,SIGNAL(clicked()), this, SLOT(update()));
31
    connect(ui->update,SIGNAL(clicked()), this, SLOT(update()));
28
    connect(ui->deltaTime, SIGNAL(valueChanged(int)), this, SLOT(updateDeltaDisplay()));
32
    connect(ui->deltaTime, SIGNAL(timeChanged(QTime)), this, SLOT(updateDeltaDisplay()));
29
    connect(ui->hideOk, SIGNAL(clicked()), this, SLOT(updateDeltaDisplay()));
33
    connect(ui->hideOk, SIGNAL(clicked()), this, SLOT(updateDeltaDisplay()));
30
 
34
 
31
 
35
 
32
    // Set up the table
36
    // Set up the table
33
    // First column is not a 'time' column
37
    // First column is not a 'time' column
Line 59... Line 63...
59
 
63
 
60
    // Insert Time Delegate
64
    // Insert Time Delegate
61
    ui->tableWidget->setItemDelegateForColumn(col, new timeDelegate());
65
    ui->tableWidget->setItemDelegateForColumn(col, new timeDelegate());
62
}
66
}
63
 
67
 
-
 
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
-
 
105
        QRegExp ("^(\\d+)\\s+\\d+-\\d+-\\d+\\s+(\\d+:\\d+:\\d+)\\.\\d+$"),  // 022 2019-08-01 12:13:14.123
-
 
106
        QRegExp ("^\\d+,(\\d+),(\\d+:\\d+:\\d+)$"),                         // 001,022,12:13:14
-
 
107
    };
-
 
108
 
-
 
109
    for( unsigned int idx = 0 ; idx <(sizeof(lineFormats)/sizeof(*lineFormats)); idx++ )
-
 
110
    {
-
 
111
        if(lineFormats[idx].indexIn(line) == 0)
-
 
112
        {
-
 
113
            parts = lineFormats[idx].capturedTexts();
-
 
114
        }
-
 
115
    }
-
 
116
 
-
 
117
    if ( parts.empty())
-
 
118
    {
-
 
119
        qDebug("Funny Line regex: %s", qPrintable(line));
-
 
120
        return;
-
 
121
    }
-
 
122
 
-
 
123
    QString first = parts.value(1);
-
 
124
    if ( parts.count() != 3)
-
 
125
    {
-
 
126
        qDebug("Funny Line parts: %s", qPrintable(line));
-
 
127
        return;
-
 
128
    }
-
 
129
 
-
 
130
    bool ok;
-
 
131
    int team = first.toInt(&ok);
-
 
132
    if ( ! ok || team <= 0 || team > 999 )
-
 
133
    {
-
 
134
        qDebug("Bad Team Number: %s", qPrintable(line));
-
 
135
        return;
-
 
136
    }
-
 
137
    if (team > ui->tableWidget->rowCount())
-
 
138
    {
-
 
139
        ui->tableWidget->setRowCount(team);
-
 
140
    }
-
 
141
 
-
 
142
    QTableWidgetItem *item = ui->tableWidget->item(team-1,0);
-
 
143
    if (!item)
-
 
144
    {
-
 
145
        item = new QTableWidgetItem(QString::number(team));
-
 
146
        item->setFlags(item->flags() & ~(Qt::ItemIsEditable|Qt::ItemIsDragEnabled|Qt::ItemIsDropEnabled));
-
 
147
        ui->tableWidget->setItem(team-1,0,item);
-
 
148
        item->setData(Qt::ToolTipRole,"Team Number");
-
 
149
 
-
 
150
        item = new QTableWidgetItem("");
-
 
151
        item->setFlags(item->flags() & ~(Qt::ItemIsEditable|Qt::ItemIsDragEnabled|Qt::ItemIsDropEnabled));
-
 
152
        ui->tableWidget->setItem(team-1,1,item);
-
 
153
        item->setData(Qt::ToolTipRole,"Max delta");
-
 
154
 
-
 
155
        item = new QTableWidgetItem("");
-
 
156
        item->setFlags(item->flags() & ~(Qt::ItemIsDragEnabled|Qt::ItemIsDropEnabled));
-
 
157
        ui->tableWidget->setItem(team-1,2,item);
-
 
158
        item->setData(Qt::ToolTipRole,"Use this data");
-
 
159
    }
-
 
160
 
-
 
161
    //  Insert the time at the first available slot
-
 
162
    //  Scan for max an min as we go
-
 
163
    int ii;
-
 
164
    QTableWidgetItem *titem = NULL;
-
 
165
    QTime ltime = QTime::fromString(parts.value(2),"hh:mm:ss");
-
 
166
    unsigned int lsecs = QTime(0,0,0).secsTo(ltime);
-
 
167
    if ( lsecs <= 0)
-
 
168
    {
-
 
169
        qDebug("Funny Line: %s", qPrintable(line));
-
 
170
        return;
-
 
171
    }
-
 
172
    //qDebug("Tead: %d, Secs: %d", team, lsecs );
-
 
173
    unsigned int min_time = lsecs;
-
 
174
    unsigned int max_time = lsecs;
-
 
175
    bool empty_cell_found = false;
-
 
176
 
-
 
177
    for (ii=3 ; ii <= ui->tableWidget->columnCount() - 1; ii++)
-
 
178
    {
-
 
179
        titem = ui->tableWidget->item(team-1,ii);
-
 
180
        if (! titem)
-
 
181
        {
-
 
182
            // Empty cell found
-
 
183
            empty_cell_found = true;
-
 
184
            break;
-
 
185
        }
-
 
186
 
-
 
187
        QTime entry = titem->data(Qt::EditRole).toTime();
-
 
188
        unsigned int secs = QTime(0,0,0).secsTo(entry);
-
 
189
        if ( secs < min_time )
-
 
190
            min_time = secs;
-
 
191
        if (secs > max_time)
-
 
192
            max_time = secs;
-
 
193
    }
-
 
194
 
-
 
195
    // No space found for the data - add a new column
-
 
196
    if ( ! empty_cell_found )
-
 
197
    {
-
 
198
        addColumn("Time");
-
 
199
        ii = ui->tableWidget->columnCount() - 1;
-
 
200
    }
-
 
201
 
-
 
202
    // Insert data into cell
-
 
203
    titem = new QTableWidgetItem();
-
 
204
    titem->setData(Qt::EditRole, ltime);
-
 
205
    titem->setFlags(titem->flags() & ~(Qt::ItemIsEditable|Qt::ItemIsDragEnabled|Qt::ItemIsDropEnabled));
-
 
206
    ui->tableWidget->setItem(team-1,ii,titem);
-
 
207
    //qDebug("Team: %d, %d of %d", team-1, ii, ui->tableWidget->columnCount() );
-
 
208
 
-
 
209
    if (ii == 3)
-
 
210
    {
-
 
211
        titem = new QTableWidgetItem();
-
 
212
        titem->setData(Qt::EditRole, ltime);
-
 
213
        ui->tableWidget->setItem(team-1,2,titem);
-
 
214
        titem->setBackgroundColor(QColor(0,255,0,30));
-
 
215
    }
-
 
216
 
-
 
217
    int delta = max_time - min_time;
-
 
218
    if ( delta )
-
 
219
    {
-
 
220
        ui->tableWidget->item(team-1,1)->setData(Qt::EditRole, QTime().addSecs(delta));
-
 
221
    }
-
 
222
}
-
 
223
 
64
void QmDialogUploadLegTimes::load(void)
224
void QmDialogUploadLegTimes::load(void)
65
{
225
{
66
    QString fileName = QFileDialog::getOpenFileName(this, tr("Load File"),
226
    QString fileName = QFileDialog::getOpenFileName(this, tr("Load File"),
67
                                                 appSettings->value("LegTimeUpload/LastFile",filepath).toString(),
227
                                                 appSettings->value("LegTimeUpload/LastFile",filepath).toString(),
68
                                                 tr("Legs (*leg*);;Data (*.leg);;All (*.*)"),
228
                                                 tr("Legs (*leg*);;Data (*.leg);;Text (*.txt);;Csv (*.csv);;All (*.*)"),
69
                                                 0,
229
                                                 0,
70
                                                 QFileDialog::ReadOnly);
230
                                                 QFileDialog::ReadOnly);
71
    if ( fileName.isEmpty() )
231
    if ( fileName.isEmpty() )
72
    {
232
    {
73
        MainWindow::showMessage("No File Specified");
233
        MainWindow::showMessage("No File Specified");
Line 90... Line 250...
90
    ui->tableWidget->clearContents();
250
    ui->tableWidget->clearContents();
91
    ui->tableWidget->setRowCount(0);
251
    ui->tableWidget->setRowCount(0);
92
 
252
 
93
 
253
 
94
    // Process Each line of the file
254
    // Process Each line of the file
95
    //  Format is TeamNumber Time
255
    //  Format (original) is TeamNumber Time
-
 
256
    //  Format (alternate) is TeamNumber Date Time
-
 
257
    //                                       Time has milliseconds
96
    QTextStream in(&file);
258
    QTextStream in(&file);
97
    while (!in.atEnd())
259
    while (!in.atEnd())
98
    {
260
    {
99
        QString line = in.readLine();
261
        processOneLine(in.readLine());
100
        line = line.trimmed();             // Remove leading and training White Space
-
 
101
        QStringList parts = line.split(" ");
-
 
102
        QString first = parts.value(0);
-
 
103
        if ( parts.count() != 2)
-
 
104
        {
-
 
105
            qDebug("Funny Line: %s", qPrintable(line));
-
 
106
            continue;
-
 
107
        }
-
 
108
 
-
 
109
        bool ok;
-
 
110
        int team = first.toInt(&ok);
-
 
111
        if ( ! ok || team <= 0 )
-
 
112
            continue;
-
 
113
        if (team > ui->tableWidget->rowCount())
-
 
114
        {
-
 
115
            ui->tableWidget->setRowCount(team);
-
 
116
        }
-
 
117
 
-
 
118
        QTableWidgetItem *item = ui->tableWidget->item(team-1,0);
-
 
119
        if (!item)
-
 
120
        {
-
 
121
            item = new QTableWidgetItem(QString::number(team));
-
 
122
            item->setFlags(item->flags() & ~(Qt::ItemIsEditable|Qt::ItemIsDragEnabled|Qt::ItemIsDropEnabled));
-
 
123
            ui->tableWidget->setItem(team-1,0,item);
-
 
124
            item->setData(Qt::ToolTipRole,"Team Number");
-
 
125
 
-
 
126
            item = new QTableWidgetItem("");
-
 
127
            item->setFlags(item->flags() & ~(Qt::ItemIsEditable|Qt::ItemIsDragEnabled|Qt::ItemIsDropEnabled));
-
 
128
            ui->tableWidget->setItem(team-1,1,item);
-
 
129
            item->setData(Qt::ToolTipRole,"Max delta");
-
 
130
 
-
 
131
            item = new QTableWidgetItem("");
-
 
132
            item->setFlags(item->flags() & ~(Qt::ItemIsDragEnabled|Qt::ItemIsDropEnabled));
-
 
133
            ui->tableWidget->setItem(team-1,2,item);
-
 
134
            item->setData(Qt::ToolTipRole,"Use this data");
-
 
135
        }
-
 
136
 
-
 
137
        //  Insert the time at the first available slot
-
 
138
        //  Scan for max an min as we go
-
 
139
        int ii;
-
 
140
        QTableWidgetItem *titem = NULL;
-
 
141
        QTime ltime = QTime::fromString(parts.value(1),"hh:mm:ss");
-
 
142
        unsigned int lsecs = QTime(0,0,0).secsTo(ltime);
-
 
143
        if ( lsecs <= 0)
-
 
144
        {
-
 
145
            qDebug("Funny Line: %s", qPrintable(line));
-
 
146
            continue;
-
 
147
        }
-
 
148
        //qDebug("Tead: %d, Secs: %d", team, lsecs );
-
 
149
        unsigned int min_time = lsecs;
-
 
150
        unsigned int max_time = lsecs;
-
 
151
        bool empty_cell_found = false;
-
 
152
 
-
 
153
        for (ii=3 ; ii <= ui->tableWidget->columnCount() - 1; ii++)
-
 
154
        {
-
 
155
            titem = ui->tableWidget->item(team-1,ii);
-
 
156
            if (! titem)
-
 
157
            {
-
 
158
                // Empty cell found
-
 
159
                empty_cell_found = true;
-
 
160
                break;
-
 
161
            }
-
 
162
 
-
 
163
            QTime entry = titem->data(Qt::EditRole).toTime();
-
 
164
            unsigned int secs = QTime(0,0,0).secsTo(entry);
-
 
165
            if ( secs < min_time )
-
 
166
                min_time = secs;
-
 
167
            if (secs > max_time)
-
 
168
                max_time = secs;
-
 
169
        }
-
 
170
 
-
 
171
        // No space found for the data - add a new column
-
 
172
        if ( ! empty_cell_found )
-
 
173
        {
-
 
174
            addColumn("Time");
-
 
175
            ii = ui->tableWidget->columnCount() - 1;
-
 
176
        }
-
 
177
 
-
 
178
        // Insert data into cell
-
 
179
        titem = new QTableWidgetItem();
-
 
180
        titem->setData(Qt::EditRole, ltime);
-
 
181
        titem->setFlags(titem->flags() & ~(Qt::ItemIsEditable|Qt::ItemIsDragEnabled|Qt::ItemIsDropEnabled));
-
 
182
        ui->tableWidget->setItem(team-1,ii,titem);
-
 
183
        //qDebug("Team: %d, %d of %d", team-1, ii, ui->tableWidget->columnCount() );
-
 
184
 
-
 
185
        if (ii == 3)
-
 
186
        {
-
 
187
            titem = new QTableWidgetItem();
-
 
188
            titem->setData(Qt::EditRole, ltime);
-
 
189
            ui->tableWidget->setItem(team-1,2,titem);
-
 
190
            titem->setBackgroundColor(QColor(0,255,0,30));
-
 
191
        }
-
 
192
 
-
 
193
        int delta = max_time - min_time;
-
 
194
        if ( delta )
-
 
195
        {
-
 
196
            ui->tableWidget->item(team-1,1)->setData(Qt::EditRole, QTime().addSecs(delta));
-
 
197
        }
-
 
198
    }
262
    }
199
 
263
 
200
    // Update Error information
264
    // Update Error information
201
    updateDeltaDisplay();
265
    updateDeltaDisplay();
202
 
266
 
Line 204... Line 268...
204
 
268
 
205
void QmDialogUploadLegTimes::updateDeltaDisplay( void )
269
void QmDialogUploadLegTimes::updateDeltaDisplay( void )
206
{
270
{
207
    bool isFlagged = false;
271
    bool isFlagged = false;
208
    QTime maxDelta(0,0,0,0);
272
    QTime maxDelta(0,0,0,0);
209
    QTime delta = QTime().addSecs(ui->deltaTime->value());
273
    QTime delta = ui->deltaTime->time();
-
 
274
    //qDebug("New Delta: %s", qPrintable(ui->deltaTime->time().toString()));
210
    for ( int ii = 0; ii < ui->tableWidget->rowCount(); ii++)
275
    for ( int ii = 0; ii < ui->tableWidget->rowCount(); ii++)
211
    {
276
    {
212
        bool show = true;
277
        bool show = true;
213
        QTableWidgetItem *item;
278
        QTableWidgetItem *item;
214
        item = ui->tableWidget->item(ii, 1);
279
        item = ui->tableWidget->item(ii, 1);