Subversion Repositories svn1

Rev

Rev 185 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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