Subversion Repositories svn1-original

Rev

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

Rev Author Line No. Line
99 david 1
#include "qmconfclass.h"
178 - 2
#include "qmconfig.h"
99 david 3
#include "ui_qmconfclass.h"
103 david 4
#include    "consts.h"
5
#include    "structs.h"
6
#include    "proto.h"
184 - 7
#include "mainwindow.h"
314 david 8
#include "qmTableWidgetItem.h"
99 david 9
 
290 david 10
#include <QDialogButtonBox>
103 david 11
#include "QTableWidgetItem"
111 david 12
#include "spinboxdelegate.h"
13
#include "timedelegate.h"
115 david 14
#include "textdelegate.h"
184 - 15
#include <QMenu>
103 david 16
 
231 - 17
#define COL_ABR 0
18
#define COL_CLASS 1
19
#define COL_TIME 2
20
#define COL_WINNERS 3
21
#define COL_NE 4
22
#define COL_NE_WINNERS 5
23
#define COL_ST_TOTAL 6
232 - 24
#define COL_ST_VALID 7
25
#define COL_ST_DISQ 8
26
#define COL_ST_NONEQ 9
27
#define COL_ST_VET 10
288 david 28
#define COL_ST_CEV 11
29
#define COL_ST_CNE 12
315 david 30
#define COL_INDEX 13
231 - 31
 
315 david 32
#define COL_COUNT 14
231 - 33
 
315 david 34
 
108 - 35
QmConfClass::QmConfClass(QWidget *parent) :
290 david 36
    QWidget(parent)
99 david 37
{
185 - 38
    populating = false;
316 david 39
    dirty = false;
103 david 40
 
290 david 41
    QVBoxLayout *verticalLayout = new QVBoxLayout(this);
42
    verticalLayout->setContentsMargins(0, 0, 0, 0);
43
 
44
    QGroupBox *groupBox = new QGroupBox("Class");
45
    verticalLayout->addWidget(groupBox);
46
    QVBoxLayout *verticalLayout2 = new QVBoxLayout(groupBox);
47
    tableWidget = new QTableWidget(groupBox);
48
    tableWidget->setAlternatingRowColors(true);
49
    tableWidget->setRowCount(config.num_class + 1);
50
    tableWidget->setColumnCount(COL_COUNT);
51
    tableWidget->setContextMenuPolicy(Qt::CustomContextMenu);
52
    tableWidget->horizontalHeader()->setVisible(true);
53
    tableWidget->horizontalHeader()->setDefaultSectionSize(70);
54
    tableWidget->horizontalHeader()->setHighlightSections(true);
294 david 55
    //tableWidget->horizontalHeader()->setStretchLastSection(true);
290 david 56
    tableWidget->verticalHeader()->setVisible(true);
57
    tableWidget->verticalHeader()->setDefaultSectionSize(20);
58
    //tableWidget->setSizePolicy(QSizePolicy::MinimumExpanding,QSizePolicy::MinimumExpanding );
59
    //tableWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
60
    verticalLayout2->addWidget(tableWidget);
61
 
62
    //QSpacerItem *verticalSpacer1;
63
    //verticalSpacer1 = new QSpacerItem(0, 10, QSizePolicy::Expanding, QSizePolicy::Expanding);
64
    //verticalLayout2->addItem(verticalSpacer1);
65
 
66
    QHBoxLayout *horizontalLayout;
67
    horizontalLayout = new QHBoxLayout();
68
    horizontalLayout->setContentsMargins(0, 0, 5, 5);
69
    verticalLayout->addLayout(horizontalLayout);
70
 
71
    QDialogButtonBox *buttonBox = new QDialogButtonBox();
72
    pushButtonRestore = buttonBox->addButton("Restore",QDialogButtonBox::ActionRole );
73
    pushButtonSave = buttonBox->addButton("Save",QDialogButtonBox::ActionRole );
74
    horizontalLayout->addWidget(buttonBox);
75
 
76
 
77
    connect(pushButtonSave, SIGNAL(clicked(bool)), this, SLOT(save()) );
78
    connect(pushButtonRestore, SIGNAL(clicked(bool)), this, SLOT(cancel()) );
79
 
113 david 80
    QStringList labels;
232 - 81
    labels << "Abr" << "Full Name" << "Start Time" << "Winners" << "NE" << "NE Winners";
113 david 82
 
315 david 83
    labels << "Total" << "Valid" <<"Disqual" << "NonEq" << "VetCheck" << "Comp Ev" << " Comp NE";
111 david 84
 
315 david 85
    labels << "Index";
86
 
87
    tableWidget->setHorizontalHeaderLabels(labels);
88
 
290 david 89
    connect(tableWidget, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(ctxMenu(const QPoint &)));
90
    connect(tableWidget, SIGNAL(cellChanged(int,int)), this, SLOT(cellChanged(int,int)));
184 - 91
 
111 david 92
    /*
93
    **  Setup delegated for specialised editing
94
    */
290 david 95
    tableWidget->setItemDelegateForColumn(COL_ABR, new textDelegate(2));
96
    tableWidget->setItemDelegateForColumn(COL_CLASS, new textDelegate(LEN_CLASS_NAME));
97
    tableWidget->setItemDelegateForColumn(COL_TIME, new timeDelegate());
98
    tableWidget->setItemDelegateForColumn(COL_WINNERS, new SpinBoxDelegate(0,50));
99
    tableWidget->setItemDelegateForColumn(COL_NE_WINNERS, new SpinBoxDelegate(0,50));
316 david 100
}
111 david 101
 
316 david 102
/*----------------------------------------------------------------------------
103
** FUNCTION           : showEvent 
104
**
105
** DESCRIPTION        : Called when the page is shown
106
**                      Used to refresh the contents of the display as well
107
**                      as show them for the first time
108
**
109
----------------------------------------------------------------------------*/
110
 
111
void QmConfClass::showEvent ( QShowEvent * event )
112
{
113
    //qDebug("populate::showEvent");
114
    if ( ! event->spontaneous() && !dirty )
115
    {
116
        populate();
117
    }
315 david 118
}
184 - 119
 
315 david 120
/*----------------------------------------------------------------------------
121
** FUNCTION           : populate
122
**
123
** DESCRIPTION        : Populate the display with information
124
**
125
----------------------------------------------------------------------------*/
184 - 126
 
108 - 127
void QmConfClass::populate(void)
103 david 128
{
315 david 129
    bool    reportDataLoaded = false;
130
    t_class_summary data;
131
 
185 - 132
    populating = true;
314 david 133
    tableWidget->clearContents();
317 david 134
    tableWidget->setRowCount(0);
314 david 135
    tableWidget->setSortingEnabled(false);
315 david 136
 
137
    /*
138
    ** Load Report Data if we can
139
    */
140
    if( load_report_data() )
103 david 141
    {
315 david 142
        calc_class_summary( & data );
143
        reportDataLoaded = true;
144
    }
109 - 145
 
315 david 146
    /*
147
    **  Add all the information
148
    */
149
    int ii = 0;
150
    int entryIndex = 0;
151
    for ( ii = 0; ii < MAX_CLASS; ii++)
152
    {
153
        if ( config.team_class[ii].abr[0] )
115 david 154
        {
315 david 155
            // Keep the config item index entry
156
            //  Will need it when we write stiff out
317 david 157
            tableWidget->setRowCount(tableWidget->rowCount() + 1);
158
 
315 david 159
            tableWidget->setItem(entryIndex, COL_INDEX, new qmTwiNumber(ii));
160
 
372 david 161
            tableWidget->setItem(entryIndex, COL_ABR,        new qmTwiEditString(config.team_class[ii].abr ));
162
            tableWidget->setItem(entryIndex, COL_CLASS,      new qmTwiEditString(config.team_class[ii].full_name ));
315 david 163
 
115 david 164
            QTableWidgetItem *item;
165
            item = new QTableWidgetItem();
166
            item->setData(Qt::EditRole,QTime().addSecs(config.team_class[ii].start) );
315 david 167
            tableWidget->setItem(entryIndex, COL_TIME, item);
111 david 168
 
317 david 169
            tableWidget->setItem(entryIndex, COL_WINNERS,    new qmTwiEditNumber(config.class_winners[ii]));
170
            tableWidget->setItem(entryIndex, COL_NE,         new qmTwiEditFlag("",config.nonequestrian_class == 1 + ii));
171
            tableWidget->setItem(entryIndex, COL_NE_WINNERS, new qmTwiEditNumber(config.class_ne_winners[ii]));
185 - 172
 
377 david 173
 
315 david 174
            if (reportDataLoaded)
175
            {
176
                tableWidget->setItem(entryIndex,COL_ST_TOTAL, new qmTwiNumber(data.teamclass[ii+1].total) );
177
                tableWidget->setItem(entryIndex,COL_ST_VALID, new qmTwiNumber(data.teamclass[ii+1].valid) );
178
                tableWidget->setItem(entryIndex,COL_ST_DISQ,  new qmTwiNumber(data.teamclass[ii+1].disqualified));
179
                tableWidget->setItem(entryIndex,COL_ST_NONEQ, new qmTwiNumber(data.teamclass[ii+1].non_equestrian));
180
                tableWidget->setItem(entryIndex,COL_ST_VET,   new qmTwiNumber(data.teamclass[ii+1].vet_check));
181
                tableWidget->setItem(entryIndex,COL_ST_CEV,   new qmTwiNumber(data.teamclass[ii+1].valid_ev));
182
                tableWidget->setItem(entryIndex,COL_ST_CNE,   new qmTwiNumber(data.teamclass[ii+1].valid_ne));
183
            }
184
            entryIndex++;
115 david 185
        }
103 david 186
    }
315 david 187
 
188
    //  Insert Totals
189
    //      Flag that items on this this row is not to be sorted - or at least 
190
    //      sorted at the end
191
    //
192
    if (reportDataLoaded)
193
    {
317 david 194
        tableWidget->setRowCount(tableWidget->rowCount() + 1);
315 david 195
        tableWidget->setItem(entryIndex,COL_ABR,      new qmTwiString("Totals", 1));
328 david 196
 
372 david 197
        tableWidget->setItem(entryIndex, COL_CLASS,         new qmTwiString("",1));
198
        tableWidget->setItem(entryIndex, COL_TIME,          new qmTwiString("",1));
199
        tableWidget->setItem(entryIndex, COL_WINNERS,       new qmTwiString("",1));
200
        tableWidget->setItem(entryIndex, COL_NE,            new qmTwiString("",1));
201
        tableWidget->setItem(entryIndex, COL_NE_WINNERS,    new qmTwiString("",1));
202
        tableWidget->setItem(entryIndex, COL_INDEX,         new qmTwiString("",1));
328 david 203
 
315 david 204
        tableWidget->setItem(entryIndex,COL_ST_TOTAL, new qmTwiNumber(data.total.total, 1));
205
        tableWidget->setItem(entryIndex,COL_ST_VALID, new qmTwiNumber(data.total.valid, 1));
206
        tableWidget->setItem(entryIndex,COL_ST_DISQ,  new qmTwiNumber(data.total.disqualified, 1));
207
        tableWidget->setItem(entryIndex,COL_ST_NONEQ, new qmTwiNumber(data.total.non_equestrian, 1));
208
        tableWidget->setItem(entryIndex,COL_ST_VET,   new qmTwiNumber(data.total.vet_check, 1));
209
        tableWidget->setItem(entryIndex,COL_ST_CEV,   new qmTwiNumber(data.total.valid_ev, 1));
210
        tableWidget->setItem(entryIndex,COL_ST_CNE,   new qmTwiNumber(data.total.valid_ne, 1));
372 david 211
 
212
        // Debug
213
        // tableWidget->setItem(entryIndex, COL_INDEX, new qmTwiNumber(5,2));
214
 
315 david 215
    }
216
 
377 david 217
    checkNeClass();
218
 
372 david 219
    tableWidget->sortByColumn ( COL_INDEX, Qt::AscendingOrder );
220
    tableWidget->setSortingEnabled(true);
315 david 221
    tableWidget->resizeColumnsToContents();
222
    tableWidget->resizeRowsToContents();
223
 
185 - 224
    updateChanged(false);
225
    populating = false;
103 david 226
}
227
 
377 david 228
void QmConfClass::checkNeClass(void)
229
{
230
    QString tip = "Unexpected value. The NE winners are configured on a per-class basis";
231
 
232
    for ( int ii = 0; ii < MAX_CLASS; ii++)
233
    {
234
        int indexEntry = 0;
235
        QTableWidgetItem *item = tableWidget->item ( ii, COL_INDEX );
236
        const QBrush *goldBrush = new QBrush(QColor(255,204,203));
237
 
238
        if (!item)
239
        {
240
            //qDebug("Ignore row:%d", entryIndex);
241
            continue;
242
        }
243
        if ( item->text().length() == 0)
244
        {
245
            //qDebug("Ignore empty row:%d", entryIndex);
246
            continue;
247
        }
248
 
249
        indexEntry = item->text().toInt();
250
        //qDebug("Processing: %d", ii);
251
 
252
        item = tableWidget->item( ii, COL_NE );
253
        if ( item )
254
        {
255
            if ( item->checkState() == Qt::Checked) {
256
 
257
                item = tableWidget->item( ii, COL_WINNERS );
258
                if (item && item->text().length() && item->text().toInt() ) {
259
                    tableWidget->item(ii,COL_WINNERS)->setBackground(*goldBrush);
260
                    tableWidget->item(ii,COL_WINNERS)->setToolTip(tip);
261
                    MainWindow::showMessage(tip);
262
                } else {
263
                    tableWidget->item(ii,COL_WINNERS)->setBackground(Qt::transparent);
264
                    tableWidget->item(ii,COL_WINNERS)->setToolTip("");
265
 
266
                }
267
 
268
                item = tableWidget->item( ii, COL_NE_WINNERS );
269
                if (item && item->text().length() && item->text().toInt() ) {
270
                    tableWidget->item(ii,COL_NE_WINNERS)->setBackground(*goldBrush);
271
                    tableWidget->item(ii,COL_NE_WINNERS)->setToolTip(tip);
272
                    MainWindow::showMessage(tip);
273
 
274
                } else {
275
                    tableWidget->item(ii,COL_NE_WINNERS)->setBackground(Qt::transparent);
276
                    tableWidget->item(ii,COL_NE_WINNERS)->setToolTip("");
277
 
278
                }
279
 
280
            } else {
281
                tableWidget->item(ii,COL_WINNERS)->setBackground(Qt::transparent);
282
                tableWidget->item(ii,COL_WINNERS)->setToolTip("");
283
 
284
                tableWidget->item(ii,COL_NE_WINNERS)->setBackground(Qt::transparent);
285
                tableWidget->item(ii,COL_NE_WINNERS)->setToolTip("");
286
 
287
            }
288
        }
289
    }
290
}
291
 
108 - 292
void QmConfClass::save(void)
103 david 293
{
108 - 294
    /*
295
    **    Copy original data
296
    */
180 - 297
    QmConfig newcfg(config);
108 - 298
 
299
    /*
300
    **  Extract the data from the Widgets
316 david 301
    **  Trap: The Class info is cross ref by index into the table
302
    **        Thus we need to maintain the order in the config.
108 - 303
    */
315 david 304
    for (int entryIndex = 0; entryIndex < tableWidget->rowCount(); entryIndex++)
108 - 305
    {
314 david 306
 
307
        // Check that this is a real Entry or the 'Totals' header
328 david 308
        //      Real rows have a COL_INDEX entry that is not empty
314 david 309
        //
315 david 310
        QTableWidgetItem *item = tableWidget->item ( entryIndex, COL_INDEX );
311
        if (! item)
314 david 312
        {
318 david 313
            //qDebug("Ignore row:%d", entryIndex);
314 david 314
            continue;
315
        }
328 david 316
        if ( item->text().length() == 0)
317
        {
318
            //qDebug("Ignore empty row:%d", entryIndex);
319
            continue;
320
        }
315 david 321
        int ii = item->text().toInt();
318 david 322
        //qDebug("Processing: %d", ii);
314 david 323
 
316 david 324
        /*
317 david 325
        ** This is a new entry - allocate a new index 
326
        **  Scan the entire available space looking for the first empty slot
316 david 327
        */
328
        if (ii < 0)
315 david 329
        {
317 david 330
            for (ii = 0; ii < MAX_CLASS ; ii++)
331
            {
332
                if (newcfg.team_class[ii].abr[0] == 0)
333
                {
334
                    break;
335
                }
336
            }
316 david 337
        }
338
 
339
        if (ii >= MAX_CLASS )
340
        {
341
            qDebug("Ignore row:%d. Class out of range", entryIndex);
315 david 342
            continue;
343
        }
344
 
345
        item = tableWidget->item ( entryIndex, COL_ABR );
115 david 346
        if ( item )
347
        {
348
            strncpy(newcfg.team_class[ii].abr, qPrintable(item->text()), sizeof(newcfg.team_class[ii].abr)-1);
349
        }
350
        else
351
        {
352
            *newcfg.team_class[ii].abr = 0;
353
        }
108 - 354
 
314 david 355
        item = tableWidget->item ( entryIndex, COL_CLASS );
115 david 356
        if ( item )
357
        {
358
            strncpy(newcfg.team_class[ii].full_name, qPrintable(item->text()), sizeof(newcfg.team_class[ii].full_name)-1);
359
        }
360
        else
361
        {
362
            *newcfg.team_class[ii].full_name = 0;
363
        }
112 david 364
 
314 david 365
        item = tableWidget->item( entryIndex, COL_TIME );
115 david 366
        if ( item )
367
        {
199 david 368
            QVariant data = item->data(Qt::EditRole);
369
            if (data.isValid())
370
            {
371
                newcfg.team_class[ii].start = QTime(0,0,0).secsTo(item->data(Qt::EditRole).toTime());
372
            }
373
            else
374
            {
375
                newcfg.team_class[ii].start = -1;
376
            }
115 david 377
        }
378
        else
379
        {
199 david 380
            newcfg.team_class[ii].start = -1;
115 david 381
        }
382
 
314 david 383
        item = tableWidget->item( entryIndex, COL_WINNERS );
115 david 384
        if ( item )
385
        {
386
            newcfg.class_winners[ii] = item->data(Qt::EditRole).toInt();
387
        }
388
        else
389
        {
390
            newcfg.class_winners[ii] = 0;
391
        }
231 - 392
 
314 david 393
        item = tableWidget->item( entryIndex, COL_NE );
185 - 394
        if ( item )
395
        {
396
            if ( item->checkState() == Qt::Checked)
397
            {
398
                newcfg.nonequestrian_class = ii;
399
                strncpy(newcfg.nonequestrian_class_abr, newcfg.team_class[ii].abr, sizeof(newcfg.team_class[ii].abr)-1);
400
            }
401
        }
231 - 402
 
314 david 403
        item = tableWidget->item( entryIndex, COL_NE_WINNERS );
231 - 404
        if ( item )
405
        {
406
            newcfg.class_ne_winners[ii] = item->data(Qt::EditRole).toInt();
407
        }
408
        else
409
        {
410
            newcfg.class_ne_winners[ii] = 0;
411
        }
108 - 412
    }
413
 
185 - 414
    // Validate the data
415
    try
108 - 416
    {
185 - 417
        MainWindow::showMessage( "Saving Config");
108 - 418
 
185 - 419
        /*
420
         **  Now do the Class definitions
421
         */
422
 
423
        for( int i = 0; i < MAX_CLASS; i++ )
108 - 424
        {
185 - 425
            compact( newcfg.team_class[i].abr );
426
            compact( newcfg.team_class[i].full_name );
108 - 427
        }
185 - 428
 
429
        for( int i = 0; i < MAX_CLASS; i++ )
108 - 430
        {
185 - 431
            if( ( newcfg.team_class[i].abr[0] == '\0' ) != ( newcfg.team_class[i].full_name[0] == '\0' ) )
432
            {
433
                throw( "Configuration error. Class without description" );
434
 
435
            }
436
            if( newcfg.team_class[i].abr[0] != '\0' && newcfg.team_class[i].start < 0L )
437
            {
438
                throw( "Configuration error. Bad start time on class" );
439
 
440
            }
108 - 441
        }
442
 
317 david 443
        //  Calculate new max number of classes
444
        //      Scan from the end looking for the last one used
445
        //
446
        for (int i = MAX_CLASS-1; i >= 0; i--)
447
        {
448
            if (newcfg.team_class[i].abr[0])
449
            {
318 david 450
                //qDebug("num_class:%d -> %d", newcfg.num_class, 1+i);
317 david 451
                newcfg.num_class = 1 + i;
452
                break;
453
            }
454
        }
108 - 455
 
185 - 456
        for( int i = newcfg.num_class; i < MAX_CLASS; i++ )
457
            if( newcfg.team_class[i].full_name[0] )
458
            {
317 david 459
                qDebug( "Configuration error: Missing Class name. Gaps not allowed" );
185 - 460
            }
461
 
462
        if( newcfg.num_class == 0 )
108 - 463
        {
185 - 464
            throw( "Error: No categories defined" );
465
 
108 - 466
        }
467
 
316 david 468
        /*
469
        ** Test for duplicate abbreviations 
470
        ** I know its a slow agorithm, but its only a small set 
471
        */
472
        for( int i = 0; i < MAX_CLASS; i++ )
473
        {
474
            if (newcfg.team_class[i].abr[0] != '\0')
475
            {
476
                for (int j = i+1; j < MAX_CLASS; j++)
477
                {
478
                    if (newcfg.team_class[j].abr[0] != '\0')
479
                    {
480
                        if (    newcfg.team_class[i].abr[0] == newcfg.team_class[j].abr[0]
481
                             && newcfg.team_class[i].abr[1] == newcfg.team_class[j].abr[1]
482
                            )
483
                        {
484
                            qDebug("Duplicate abr: %s", newcfg.team_class[i].abr);
485
                            throw( "Error: Duplicate abbreviations detected");
486
                        }
487
                    }
488
                }
489
            }
490
        }
491
 
492
        /*
493
        ** Sanity Test
494
        */
185 - 495
        newcfg.nonequestrian_class = newcfg.lookup_class( newcfg.nonequestrian_class_abr );
496
        if( newcfg.equestrian_leg && newcfg.nonequestrian_class == 0 )
497
            MainWindow::showMessage( "WARNING: Non-equestrian class not found" );
318 david 498
        //qDebug("NE Index is: %d", newcfg.nonequestrian_class );
185 - 499
        /*
500
        **  Sanity test of the data
501
        */
502
        for( int i = 0; i < MAX_CLASS; i++ )
503
        {
504
            if( newcfg.team_class[i].abr[0] != '\0' && newcfg.class_winners[i] == 0 )
505
            {
316 david 506
                if (newcfg.nonequestrian_class != i+1)
507
                {
508
                    MainWindow::showMessage(QString("Warning: Class without winners:")+ newcfg.team_class[i].abr); 
509
                }
185 - 510
            }
115 david 511
        }
512
 
231 - 513
        /*
514
        ** Cannot mix winners for NE class and NE Winners for each class
515
        */
516
        if (newcfg.nonequestrian_class)
517
        {
518
            newcfg.class_ne_winners_by_class = false;
519
            for( int i = 0; i < MAX_CLASS; i++ )
520
            {
232 - 521
                if ( newcfg.class_ne_winners[i])
522
                {
523
                    newcfg.class_ne_winners_by_class = true;
524
                    break;
525
                }
231 - 526
            }
527
            if (newcfg.class_winners[newcfg.nonequestrian_class - 1] && newcfg.class_ne_winners_by_class )
528
            {
529
                MainWindow::showMessage( QString("Should not mix NE winners by each class and by NE Class"));
530
                //throw( "Error: Cannot mix NE winners by each class and by NE Class" );
531
            }
532
        }
533
 
534
 
108 - 535
        config = newcfg;
180 - 536
        config.write_config();
185 - 537
        updateChanged(false);
538
 
316 david 539
        // Force re-populate so that the index field is now correct
540
        populate();
541
 
542
 
108 - 543
    }
317 david 544
    catch (const char * str )
185 - 545
    {
546
        MainWindow::showMessage(str);
547
    }
108 - 548
 
103 david 549
}
550
 
108 - 551
void QmConfClass::cancel(void)
103 david 552
{
553
    populate();
554
}
555
 
108 - 556
QmConfClass::~QmConfClass()
99 david 557
{
290 david 558
 
99 david 559
}
560
 
184 - 561
void QmConfClass::ctxMenu(const QPoint & pos)
562
{
318 david 563
    //qDebug("Context Menu");
184 - 564
    QMenu *menu = new QMenu;
316 david 565
    menu->addAction(tr("New Category"), this, SLOT(ctxMenuAddRow()));
566
 
567
    /*
317 david 568
    **      Determine if we can delete an item
569
    **          Can delete a category we added in this session
570
    **          Can delete one if it has no teams using it.
316 david 571
    */
290 david 572
    QTableWidgetItem *item = tableWidget->itemAt(pos);
184 - 573
    if (item)
574
    {
316 david 575
        int row = item->row();
318 david 576
        //qDebug("Item is at row:%d", row);
316 david 577
        QTableWidgetItem *indexItem = tableWidget->item ( row, COL_INDEX );
578
        if (indexItem)
579
        {
580
            int index = indexItem->text().toInt();
318 david 581
            //qDebug("Item is at row:%d, Index: %d", row, index);
316 david 582
            if (index < 0)
583
            {
317 david 584
                menu->addAction(tr("Delete Newly added Category"), this, SLOT(ctxMenuDeleteRow())); 
316 david 585
            }
317 david 586
            else
587
            {
588
                QTableWidgetItem *itemTotalCount = tableWidget->item ( row, COL_ST_TOTAL );
589
                if (itemTotalCount)
590
                {
591
                    int count = itemTotalCount->text().toInt();
592
                    if (count == 0)
593
                    {
594
                        menu->addAction(tr("Delete Category - its not used"), this, SLOT(ctxMenuDeleteRow()));  
595
                    }
596
                }
597
 
598
            }
316 david 599
        }
184 - 600
    }
317 david 601
    menu->exec(tableWidget->mapToGlobal(pos));
184 - 602
}
603
 
604
void QmConfClass::ctxMenuDeleteRow(void)
605
{
316 david 606
    //
607
    //  Assume that if the menu was shown, then we can delete it
608
    // 
290 david 609
    //qDebug ("DELETE ROW: %d", tableWidget->currentRow () );
317 david 610
    //tableWidget->removeCellWidget(tableWidget->currentRow (), COL_ABR);
611
    //tableWidget->removeRow(tableWidget->currentRow ());
612
    tableWidget->item(tableWidget->currentRow (), COL_ABR)->setText("");
613
    tableWidget->item(tableWidget->currentRow (), COL_CLASS)->setText("");
318 david 614
    tableWidget->hideRow(tableWidget->currentRow ());
193 - 615
    updateChanged(true);
184 - 616
}
617
 
618
void QmConfClass::ctxMenuAddRow(void)
619
{
317 david 620
    tableWidget->setSortingEnabled(false);
290 david 621
    tableWidget->setRowCount( 1+ tableWidget->rowCount());
328 david 622
 
623
    /*
624
    **  Insert non-editable fields in the status part of the table
625
    */
316 david 626
    tableWidget->setItem(tableWidget->rowCount() - 1, COL_INDEX, new qmTwiNumber(-1));
328 david 627
    for (int ii= COL_ST_TOTAL; ii < COL_INDEX; ii++)
628
    {
629
        tableWidget->setItem(tableWidget->rowCount() - 1, ii, new qmTwiString(""));
630
    }
184 - 631
}
632
 
185 - 633
void QmConfClass::cellChanged(int row,int col)
634
{
635
    if ( populating )
636
        return;
316 david 637
    if (col == COL_INDEX)
638
        return;
639
 
640
    updateChanged(true); 
185 - 641
    populating = true;
642
    //qDebug("Cell changed: %d, %d", row, col);
231 - 643
    if (col == COL_NE)
185 - 644
    {
290 david 645
        for (int ii = 0; ii < tableWidget->rowCount(); ii++)
185 - 646
        {
290 david 647
            QTableWidgetItem *item = tableWidget->item(ii, COL_NE);
185 - 648
            if (item)
649
            {
650
                item->setCheckState(ii == row ? Qt::Checked : Qt::Unchecked);
651
            }
652
        }
653
    }
377 david 654
 
655
    // Highlight wonky config
656
    if (col == COL_NE || col == COL_NE_WINNERS || col == COL_WINNERS) {
657
        checkNeClass();
658
    }
659
 
185 - 660
    populating = false;
661
}
662
 
663
void QmConfClass::updateChanged(bool newDirty)
664
{
665
    if (newDirty != dirty)
666
    {
667
        dirty = newDirty;
668
        if (dirty)
669
        {
290 david 670
            pushButtonSave->setEnabled(true);
671
            pushButtonSave->setStyleSheet("background-color: rgb(255, 0, 0);");
185 - 672
        }
673
        else
674
        {
290 david 675
            pushButtonSave->setEnabled(false);
676
            pushButtonSave->setStyleSheet("");
185 - 677
        }
678
    }
679
}
680
 
108 - 681
void QmConfClass::changeEvent(QEvent *e)
99 david 682
{
683
    QWidget::changeEvent(e);
684
    switch (e->type()) {
290 david 685
 
99 david 686
    default:
687
        break;
688
    }
689
}