Subversion Repositories svn1

Rev

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

Rev Author Line No. Line
95 david 1
#include "qmconfclass.h"
174 - 2
#include "qmconfig.h"
95 david 3
#include "ui_qmconfclass.h"
99 david 4
#include    "consts.h"
5
#include    "structs.h"
6
#include    "proto.h"
180 - 7
#include "mainwindow.h"
95 david 8
 
99 david 9
#include "QTableWidgetItem"
107 david 10
#include "spinboxdelegate.h"
11
#include "timedelegate.h"
111 david 12
#include "textdelegate.h"
180 - 13
#include <QMenu>
99 david 14
 
227 - 15
#define COL_ABR 0
16
#define COL_CLASS 1
17
#define COL_TIME 2
18
#define COL_WINNERS 3
19
#define COL_NE 4
20
#define COL_NE_WINNERS 5
21
#define COL_ST_TOTAL 6
22
#define COL_ST_DISQ 7
23
#define COL_ST_NONEQ 8
24
#define COL_ST_VET 9
25
#define COL_COUNT 10
26
 
27
 
104 - 28
QmConfClass::QmConfClass(QWidget *parent) :
95 david 29
    QWidget(parent),
104 - 30
    ui(new Ui::QmConfClass)
95 david 31
{
32
    ui->setupUi(this);
181 - 33
    populating = false;
34
    connect(ui->pushButtonSave, SIGNAL(clicked(bool)), this, SLOT(save()) );
35
    connect(ui->pushButtonRestore, SIGNAL(clicked(bool)), this, SLOT(cancel()) );
99 david 36
 
109 david 37
    QStringList labels;
227 - 38
         labels << "Abr" << "Full Name" << "Start Time" << "Winners" << "NE" << "NE Winners";
109 david 39
 
107 david 40
 
180 - 41
    ui->tableWidget->setRowCount(config.num_class + 1);
227 - 42
    ui->tableWidget->setColumnCount(COL_COUNT);
180 - 43
    ui->tableWidget->setContextMenuPolicy(Qt::CustomContextMenu);
44
    connect(ui->tableWidget, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(ctxMenu(const QPoint &)));
181 - 45
    connect(ui->tableWidget, SIGNAL(cellChanged(int,int)), this, SLOT(cellChanged(int,int)));
180 - 46
 
47
 
107 david 48
    /*
49
    **  Setup delegated for specialised editing
50
    */
227 - 51
    ui->tableWidget->setItemDelegateForColumn(COL_ABR, new textDelegate(2));
52
    ui->tableWidget->setItemDelegateForColumn(COL_CLASS, new textDelegate(LEN_CLASS_NAME));
53
    ui->tableWidget->setItemDelegateForColumn(COL_TIME, new timeDelegate());
54
    ui->tableWidget->setItemDelegateForColumn(COL_WINNERS, new SpinBoxDelegate(0,50));
55
    ui->tableWidget->setItemDelegateForColumn(COL_NE_WINNERS, new SpinBoxDelegate(0,50));
107 david 56
 
99 david 57
    populate();
180 - 58
 
59
 
60
    // Wire in the status button
61
    connect(ui->statusButton, SIGNAL(clicked()), this, SLOT(updateStatus()));
62
    statusShown = false;
227 - 63
    ui->tableWidget->setColumnHidden(COL_ST_TOTAL, true);
64
    ui->tableWidget->setColumnHidden(COL_ST_DISQ, true);
65
    ui->tableWidget->setColumnHidden(COL_ST_NONEQ, true);
66
    ui->tableWidget->setColumnHidden(COL_ST_VET, true);
180 - 67
 
225 - 68
    labels << "Total" <<"Disqual" << "NonEq" << "VetCheck";
180 - 69
 
70
    ui->tableWidget->setHorizontalHeaderLabels(labels);
111 david 71
    ui->tableWidget->resizeColumnsToContents();
180 - 72
 
95 david 73
}
74
 
104 - 75
void QmConfClass::populate(void)
99 david 76
{
181 - 77
    populating = true;
180 - 78
    ui->tableWidget->setRowCount(config.num_class + 1);
99 david 79
    for ( int ii = 0; ii < MAX_CLASS; ii++)
80
    {
227 - 81
        ui->tableWidget->setItem(ii, COL_ABR, new QTableWidgetItem(config.team_class[ii].abr) );
82
        ui->tableWidget->setItem(ii, COL_CLASS, new QTableWidgetItem(config.team_class[ii].full_name ));
105 - 83
 
111 david 84
        if ( *config.team_class[ii].abr )
85
        {
86
            QTableWidgetItem *item;
87
            item = new QTableWidgetItem();
88
            item->setData(Qt::EditRole,QTime().addSecs(config.team_class[ii].start) );
227 - 89
            ui->tableWidget->setItem(ii, COL_TIME, item);
107 david 90
 
111 david 91
            item = new QTableWidgetItem();
92
            item->setData(Qt::EditRole,config.class_winners[ii] );
227 - 93
            ui->tableWidget->setItem(ii, COL_WINNERS, item);
181 - 94
 
95
            item = new QTableWidgetItem();
96
            item->setCheckState(config.nonequestrian_class == 1 + ii ? Qt::Checked : Qt::Unchecked);
227 - 97
            ui->tableWidget->setItem(ii, COL_NE, item);
181 - 98
 
227 - 99
            item = new QTableWidgetItem();
100
            item->setData(Qt::EditRole,config.class_ne_winners[ii] );
101
            ui->tableWidget->setItem(ii, COL_NE_WINNERS, item);
111 david 102
        }
99 david 103
    }
181 - 104
    updateChanged(false);
105
    populating = false;
99 david 106
}
107
 
104 - 108
void QmConfClass::save(void)
99 david 109
{
104 - 110
    /*
111
    **    Copy original data
112
    */
176 - 113
    QmConfig newcfg(config);
104 - 114
 
115
    /*
116
    **  Extract the data from the Widgets
117
    */
118
    for ( int ii = 0; ii < MAX_CLASS; ii++)
119
    {
227 - 120
        QTableWidgetItem *item = ui->tableWidget->item ( ii, COL_ABR );
111 david 121
        if ( item )
122
        {
123
            strncpy(newcfg.team_class[ii].abr, qPrintable(item->text()), sizeof(newcfg.team_class[ii].abr)-1);
124
        }
125
        else
126
        {
127
            *newcfg.team_class[ii].abr = 0;
128
        }
104 - 129
 
227 - 130
        item = ui->tableWidget->item ( ii, COL_CLASS );
111 david 131
        if ( item )
132
        {
133
            strncpy(newcfg.team_class[ii].full_name, qPrintable(item->text()), sizeof(newcfg.team_class[ii].full_name)-1);
134
        }
135
        else
136
        {
137
            *newcfg.team_class[ii].full_name = 0;
138
        }
108 david 139
 
227 - 140
        item = ui->tableWidget->item( ii, COL_TIME );
111 david 141
        if ( item )
142
        {
195 david 143
            QVariant data = item->data(Qt::EditRole);
144
            if (data.isValid())
145
            {
146
                newcfg.team_class[ii].start = QTime(0,0,0).secsTo(item->data(Qt::EditRole).toTime());
147
            }
148
            else
149
            {
150
                newcfg.team_class[ii].start = -1;
151
            }
111 david 152
        }
153
        else
154
        {
195 david 155
            newcfg.team_class[ii].start = -1;
111 david 156
        }
157
 
227 - 158
        item = ui->tableWidget->item( ii, COL_WINNERS );
111 david 159
        if ( item )
160
        {
161
            newcfg.class_winners[ii] = item->data(Qt::EditRole).toInt();
162
        }
163
        else
164
        {
165
            newcfg.class_winners[ii] = 0;
166
        }
227 - 167
 
168
        item = ui->tableWidget->item( ii, COL_NE );
181 - 169
        if ( item )
170
        {
171
            if ( item->checkState() == Qt::Checked)
172
            {
173
                newcfg.nonequestrian_class = ii;
174
                strncpy(newcfg.nonequestrian_class_abr, newcfg.team_class[ii].abr, sizeof(newcfg.team_class[ii].abr)-1);
175
            }
176
        }
227 - 177
 
178
        item = ui->tableWidget->item( ii, COL_NE_WINNERS );
179
        if ( item )
180
        {
181
            newcfg.class_ne_winners[ii] = item->data(Qt::EditRole).toInt();
182
        }
183
        else
184
        {
185
            newcfg.class_ne_winners[ii] = 0;
186
        }
104 - 187
    }
188
 
181 - 189
    // Validate the data
190
    try
104 - 191
    {
181 - 192
        MainWindow::showMessage( "Saving Config");
104 - 193
 
181 - 194
        /*
195
         **  Now do the Class definitions
196
         */
197
 
198
        for( int i = 0; i < MAX_CLASS; i++ )
104 - 199
        {
181 - 200
            compact( newcfg.team_class[i].abr );
201
            compact( newcfg.team_class[i].full_name );
104 - 202
        }
181 - 203
 
204
        for( int i = 0; i < MAX_CLASS; i++ )
104 - 205
        {
181 - 206
            if( ( newcfg.team_class[i].abr[0] == '\0' ) != ( newcfg.team_class[i].full_name[0] == '\0' ) )
207
            {
208
                throw( "Configuration error. Class without description" );
209
 
210
            }
211
            if( newcfg.team_class[i].abr[0] != '\0' && newcfg.team_class[i].start < 0L )
212
            {
213
                throw( "Configuration error. Bad start time on class" );
214
 
215
            }
104 - 216
        }
217
 
181 - 218
        newcfg.num_class = 0;
219
        for( int i = 0; i < MAX_CLASS; i++ )
220
            if( newcfg.team_class[i].full_name[0] )
221
                newcfg.num_class++;
104 - 222
 
181 - 223
        for( int i = newcfg.num_class; i < MAX_CLASS; i++ )
224
            if( newcfg.team_class[i].full_name[0] )
225
            {
226
                throw( "Configuration error: Missing Class name. Gaps not allowed" );
227
 
228
            }
229
 
230
        if( newcfg.num_class == 0 )
104 - 231
        {
181 - 232
            throw( "Error: No categories defined" );
233
 
104 - 234
        }
235
 
181 - 236
        newcfg.nonequestrian_class = newcfg.lookup_class( newcfg.nonequestrian_class_abr );
237
        if( newcfg.equestrian_leg && newcfg.nonequestrian_class == 0 )
238
            MainWindow::showMessage( "WARNING: Non-equestrian class not found" );
104 - 239
 
181 - 240
        /*
241
        **  Sanity test of the data
242
        */
243
        for( int i = 0; i < MAX_CLASS; i++ )
244
        {
245
            if( newcfg.team_class[i].abr[0] != '\0' && newcfg.class_winners[i] == 0 )
246
            {
104 - 247
 
181 - 248
                MainWindow::showMessage( QString("Warning: Class without winners:") + newcfg.team_class[i].abr );
249
            }
111 david 250
        }
251
 
227 - 252
        /*
253
        ** Cannot mix winners for NE class and NE Winners for each class
254
        */
255
        if (newcfg.nonequestrian_class)
256
        {
257
            newcfg.class_ne_winners_by_class = false;
258
            for( int i = 0; i < MAX_CLASS; i++ )
259
            {
260
                newcfg.class_ne_winners_by_class = true;
261
                break;
262
            }
263
            if (newcfg.class_winners[newcfg.nonequestrian_class - 1] && newcfg.class_ne_winners_by_class )
264
            {
265
                MainWindow::showMessage( QString("Should not mix NE winners by each class and by NE Class"));
266
                //throw( "Error: Cannot mix NE winners by each class and by NE Class" );
267
            }
268
        }
269
 
270
 
104 - 271
        config = newcfg;
176 - 272
        config.write_config();
181 - 273
        updateChanged(false);
274
 
104 - 275
    }
181 - 276
    catch (const char * str )
277
    {
278
        MainWindow::showMessage(str);
279
    }
104 - 280
 
99 david 281
}
282
 
104 - 283
void QmConfClass::cancel(void)
99 david 284
{
285
    populate();
286
}
287
 
104 - 288
QmConfClass::~QmConfClass()
95 david 289
{
290
    delete ui;
291
}
292
 
180 - 293
void QmConfClass::ctxMenu(const QPoint & pos)
294
{
295
    qDebug("Context Menu");
296
    QMenu *menu = new QMenu;
181 - 297
    QTableWidgetItem *item = ui->tableWidget->itemAt(pos);
180 - 298
    menu->addAction(tr("New Category"), this, SLOT(ctxMenuAddRow()));
299
    if (item)
300
    {
301
        menu->addAction(tr("Delete Category"), this, SLOT(ctxMenuDeleteRow()));
302
    }
303
   menu->exec(ui->tableWidget->mapToGlobal(pos));
304
 
305
}
306
 
307
void QmConfClass::ctxMenuDeleteRow(void)
308
{
309
    //qDebug ("DELETE ROW: %d", ui->tableWidget->currentRow () );
310
    ui->tableWidget->removeRow(ui->tableWidget->currentRow ());
189 - 311
    updateChanged(true);
180 - 312
}
313
 
314
void QmConfClass::ctxMenuAddRow(void)
315
{
316
    ui->tableWidget->setRowCount( 1+ ui->tableWidget->rowCount());
317
}
318
 
319
void QmConfClass::updateStatus(void)
320
{
189 - 321
    populating = true;
180 - 322
    if (!statusShown)
323
    {
227 - 324
        ui->tableWidget->setColumnHidden(COL_ST_TOTAL, false);
325
        ui->tableWidget->setColumnHidden(COL_ST_DISQ, false);
326
        ui->tableWidget->setColumnHidden(COL_ST_NONEQ, false);
327
        ui->tableWidget->setColumnHidden(COL_ST_VET, false);
180 - 328
        statusShown = true;
329
    }
330
 
331
    if( load_report_data() )
332
    {
333
        t_class_summary data;
334
        calc_class_summary( & data );
335
 
336
        // Insert summary data
337
        int ii;
338
        for (ii = 0; ii < config.num_class; ii++)
339
        {
340
            QTableWidgetItem *item;
341
            item = new QTableWidgetItem(QString::number(data.teamclass[ii+1].total));
342
            item->setFlags(Qt::NoItemFlags);
227 - 343
            ui->tableWidget->setItem(ii,COL_ST_TOTAL, item );
180 - 344
 
345
            item = new QTableWidgetItem(QString::number(data.teamclass[ii+1].disqualified)) ;
346
            item->setFlags(Qt::NoItemFlags);
227 - 347
            ui->tableWidget->setItem(ii,COL_ST_DISQ, item);
180 - 348
 
349
            item = new QTableWidgetItem(QString::number(data.teamclass[ii+1].non_equestrian));
350
            item->setFlags(Qt::NoItemFlags);
227 - 351
            ui->tableWidget->setItem(ii,COL_ST_NONEQ, item);
225 - 352
 
353
            item = new QTableWidgetItem(QString::number(data.teamclass[ii+1].vet_check));
354
            item->setFlags(Qt::NoItemFlags);
227 - 355
            ui->tableWidget->setItem(ii,COL_ST_VET, item);
180 - 356
        }
357
 
358
        ui->tableWidget->resizeColumnsToContents();
359
        ui->tableWidget->resizeRowsToContents();
360
    }
189 - 361
    populating = false;
180 - 362
}
363
 
181 - 364
void QmConfClass::cellChanged(int row,int col)
365
{
366
    if ( populating )
367
        return;
368
    updateChanged(true);
369
    populating = true;
370
    //qDebug("Cell changed: %d, %d", row, col);
227 - 371
    if (col == COL_NE)
181 - 372
    {
373
        for (int ii = 0; ii < ui->tableWidget->rowCount(); ii++)
374
        {
227 - 375
            QTableWidgetItem *item = ui->tableWidget->item(ii, COL_NE);
181 - 376
            if (item)
377
            {
378
                item->setCheckState(ii == row ? Qt::Checked : Qt::Unchecked);
379
            }
380
        }
381
    }
382
    populating = false;
383
}
384
 
385
void QmConfClass::updateChanged(bool newDirty)
386
{
387
    if (newDirty != dirty)
388
    {
389
        dirty = newDirty;
390
        if (dirty)
391
        {
392
            ui->pushButtonSave->setEnabled(true);
226 - 393
            ui->pushButtonSave->setStyleSheet("background-color: rgb(255, 0, 0);");
181 - 394
        }
395
        else
396
        {
397
            ui->pushButtonSave->setEnabled(false);
226 - 398
            ui->pushButtonSave->setStyleSheet("");
181 - 399
        }
400
    }
401
}
402
 
104 - 403
void QmConfClass::changeEvent(QEvent *e)
95 david 404
{
405
    QWidget::changeEvent(e);
406
    switch (e->type()) {
407
    case QEvent::LanguageChange:
408
        ui->retranslateUi(this);
409
        break;
410
    default:
411
        break;
412
    }
413
}