Subversion Repositories svn1-original

Rev

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