Subversion Repositories svn1-original

Rev

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