Subversion Repositories svn1-original

Rev

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