Subversion Repositories svn1

Rev

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