Subversion Repositories svn1

Rev

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