Subversion Repositories svn1

Rev

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