Subversion Repositories svn1

Rev

Rev 320 | Details | Compare with Previous | Last modification | View Log | RSS feed

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