Subversion Repositories svn1

Rev

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

Rev Author Line No. Line
142 david 1
/*============================================================================
2
**
3
**  Project/Product : 
4
**  Filename        : qmteamdisplay.cpp
5
**  Author(s)       : DDP
6
**
7
**  Description     : Display and Update Team Information
8
**
9
**
10
**  Information     :
11
**   Compiler       : ANSI C++
12
**   Target         : 
13
**
14
***==========================================================================*/
15
 
126 david 16
#include "qmteamdisplay.h"
17
#include "ui_qmteamdisplay.h"
112 david 18
#include "spinboxdelegate.h"
19
#include "timedelegate.h"
20
#include "textdelegate.h"
21
 
142 david 22
/*----------------------------------------------------------------------------
23
** FUNCTION           : qmTeamDisplay
24
**
25
** DESCRIPTION        : Construct a new widget
26
**
27
**
28
** INPUTS             :
29
**
30
** RETURNS            :
31
**
32
----------------------------------------------------------------------------*/
33
 
34
 
255 - 35
qmTeamDisplay::qmTeamDisplay(QWidget *parent, int initialTeam, bool useDone) :
112 david 36
    QWidget(parent),
126 david 37
    ui(new Ui::QmTeamDisplay)
112 david 38
{
39
    ui->setupUi(this);
40
    team = 0;
177 - 41
    dirty = true;
255 - 42
    populating = false;
43
    enableDone = useDone;
112 david 44
 
45
    /*
46
    ** Populate the Combo Box
47
    ** Should do more often
48
    */
49
    for ( int ii = 0; ii < config.num_class ; ii++)
50
    {
51
        ui->category->addItem(config.team_class[ii].full_name, ii);
52
    }
53
    ui->category->setCurrentIndex(-1);
54
 
142 david 55
    /*
56
    **  Set delegates to assist in editing the members table
57
    **      Name
58
    **      Sex
59
    **      Age
60
    */
113 david 61
    ui->members->setItemDelegateForColumn(0, new textDelegate(MAX_PERSON_NAME));
62
    ui->members->setItemDelegateForColumn(2, new SpinBoxDelegate(0,120));
112 david 63
 
121 david 64
    /*
65
    ** Insert widgets for the Team Times
66
    */
142 david 67
    for ( int ii = 1 ; ii <= config.num_legs; ii++)
118 david 68
    {
126 david 69
        lt[ii] = new QmLegTimes(ii, config.leg_name[ii-1]);
119 david 70
        ui->legTime_layout->addWidget(lt[ii]);
121 david 71
        connect (lt[ii], SIGNAL(dataChanged()), this, SLOT(recalculateTimes()) );
118 david 72
    }
123 - 73
    lt[0] = new QmLegTimes(0, "Overall Event");
74
    ui->legTime_layout->addWidget(lt[0]);
118 david 75
 
142 david 76
    /*
77
    **  Connect up various signals
78
    */
177 - 79
    connect(ui->pushButtonSave, SIGNAL(clicked()), this, SLOT(save()) );
80
    connect(ui->pushButtonRestore, SIGNAL(clicked()), this, SLOT(cancel()) );
112 david 81
    connect(ui->teamNumber, SIGNAL(valueChanged(int)), this, SLOT(populate(int)) );
177 - 82
 
259 - 83
    connect(ui->name, SIGNAL(textEdited(QString)), this, SLOT(changed()) );
177 - 84
    connect(ui->category , SIGNAL(currentIndexChanged(int)), this, SLOT(changed()));
180 - 85
    connect(ui->category , SIGNAL(currentIndexChanged(int)), this, SLOT(updateCategory()));
177 - 86
    connect(ui->members , SIGNAL(cellChanged(int,int)), this, SLOT(changed()));
87
    connect(ui->disqualified , SIGNAL(clicked(bool)), this, SLOT(changed()));
241 - 88
    connect(ui->nonEquestrian , SIGNAL(clicked(bool)), this, SLOT(recalculateTimes()));
177 - 89
    connect(ui->disabled , SIGNAL(clicked(bool)), this, SLOT(changed()));
225 - 90
    connect(ui->VetCheck , SIGNAL(clicked(bool)), this, SLOT(changed()));
177 - 91
 
92
    updateChanged(false);
255 - 93
    populate(initialTeam ? initialTeam : config.min_team);
112 david 94
}
95
 
142 david 96
/*----------------------------------------------------------------------------
97
** FUNCTION           : ~qmTeamDisplay
98
**
99
** DESCRIPTION        : Destructor
100
**
101
**
102
** INPUTS             :
103
**
104
** RETURNS            :
105
**
106
----------------------------------------------------------------------------*/
107
 
126 david 108
qmTeamDisplay::~qmTeamDisplay()
112 david 109
{
110
    delete ui;
111
}
112
 
142 david 113
/*----------------------------------------------------------------------------
255 - 114
** FUNCTION           : blockSignals
115
**
116
** DESCRIPTION        : Block signal from widgets that set Changed
117
**                      while populating the display
118
**
119
**
120
** INPUTS             : state - New blocking state
121
**
122
** RETURNS            : Nothing
123
**
124
----------------------------------------------------------------------------*/
125
 
126
void qmTeamDisplay::blockSignals(bool state)
127
{
128
//    ui->pushButtonSave->blockSignals(state);
129
//    ui->pushButtonRestore->blockSignals(state);
130
//    ui->teamNumber->blockSignals(state);
131
 
132
    ui->name->blockSignals(state);
133
    ui->category->blockSignals(state);
134
    ui->members->blockSignals(state);
135
    ui->disqualified->blockSignals(state);
136
    ui->nonEquestrian->blockSignals(state);
137
    ui->disabled->blockSignals(state);
138
    ui->VetCheck->blockSignals(state);
139
 
140
    for ( int ii = 0 ; ii <= config.num_legs; ii++)
141
    {
142
        lt[ii]->blockSignals(state);
143
    }
144
}
145
 
146
 
147
 
148
/*----------------------------------------------------------------------------
142 david 149
** FUNCTION           : populate
150
**
151
** DESCRIPTION        : Populate the widget with data
152
**
153
**
154
** INPUTS             : team_number         - Team number to use
155
**
156
** RETURNS            :
157
**
158
----------------------------------------------------------------------------*/
159
 
126 david 160
void qmTeamDisplay::populate(int team_number)
112 david 161
{
142 david 162
    /*
163
    **  Update the spinner that describes the current team number
164
    */
177 - 165
    populating = true;
255 - 166
    blockSignals(true);
142 david 167
 
138 david 168
    ui->teamNumber->setMaximum(config.max_team);
215 - 169
    ui->teamNumber->setMinimum(config.min_team);
139 david 170
    ui->teamNumber->setValue(team_number);
112 david 171
    team = team_number;
142 david 172
 
173
    /*
174
    **  Read in team data
175
    **  This will persist within this widget
176
    */
112 david 177
    g_record( team, &team_buf );
178
 
179
    /*
180
    ** Basic Data
181
    */
182
    ui->name->setText( team_buf.name );
183
    ui->category_abr->setText( config.team_class[team_buf.teamclass - 1].abr );
184
    ui->category->setCurrentIndex(team_buf.teamclass - 1);
123 - 185
    //TODO: Link update of combo box to the abreviation display
112 david 186
 
136 - 187
    ui->disqualified->setCheckState(team_buf.flags.disqualified ? Qt::Checked : Qt::Unchecked);
188
    ui->nonEquestrian->setCheckState(team_buf.flags.non_equestrian ? Qt::Checked : Qt::Unchecked);
138 david 189
    ui->disabled->setCheckState( !team_buf.flags.valid ? Qt::Checked : Qt::Unchecked);
225 - 190
    ui->VetCheck->setCheckState( team_buf.flags.vet_check ? Qt::Checked : Qt::Unchecked);
136 - 191
 
112 david 192
    /*
193
    ** Team Member data
142 david 194
    **       Name
195
    **      Sex
196
    **      Age
112 david 197
    */
138 david 198
    int age_sum = 0;
112 david 199
    for ( int ii = 0; ii < config.num_legs; ii ++)
200
    {
201
         QTableWidgetItem *item;
202
        ui->members->setItem(ii, 0, new QTableWidgetItem(team_buf.members[ii].name) );
203
 
204
        item = new QTableWidgetItem();
138 david 205
        item->setFlags(Qt::ItemIsTristate | item->flags());
112 david 206
        enum Qt::CheckState sex;
207
        switch ( team_buf.members[ii].sex )
208
        {
113 david 209
            case male:   sex = Qt::Unchecked;        break;
210
            case female: sex = Qt::Checked;          break;
211
            default:     sex = Qt::PartiallyChecked; break;
112 david 212
        }
138 david 213
        //qDebug("RSex:%d, %d, %d, %d", team, ii, sex, team_buf.members[ii].sex);
112 david 214
        item->setCheckState(sex );
215
        ui->members->setItem(ii, 1, item );
216
 
217
        item = new QTableWidgetItem();
218
        item->setData(Qt::EditRole,team_buf.members[ii].age);
219
        ui->members->setItem(ii, 2, item );
138 david 220
 
221
        /*
222
        **  Sum ages
223
        **  -1 indicates invalid age
224
        */
225
        if ( age_sum >= 0 )
226
        {
227
            ushort age = team_buf.members[ii].age;
228
            if ( age > 0 && age < 255 )
229
            {
230
                age_sum += age;
231
            }
232
            else
233
            {
234
                age_sum = -1;
235
            }
236
        }
112 david 237
    }
142 david 238
    ui->members->resizeColumnsToContents();
138 david 239
 
142 david 240
    /*
241
    **  Mainatainthe display of total age
242
    */
138 david 243
    if ( age_sum <= 0 )
244
    {
245
        ui->totalAge->setText("--");
246
    }
247
    else
248
    {
249
        ui->totalAge->setText(QString::number(age_sum));
250
    }
251
 
119 david 252
 
253
    /*
254
    ** Leg Times
255
    */
123 - 256
    for ( int ii = 0 ; ii <= config.num_legs; ii++)
119 david 257
    {
123 - 258
        lt[ii]->setData(&team_buf.leg[ii]);
119 david 259
    }
177 - 260
 
255 - 261
    updateChanged(false);
182 - 262
    populating = false;
255 - 263
    blockSignals(false);
264
 
112 david 265
}
266
 
180 - 267
void qmTeamDisplay::updateCategory(void)
268
{
269
     ui->category_abr->setText( config.team_class[ui->category->currentIndex()].abr );
270
}
271
 
142 david 272
/*----------------------------------------------------------------------------
273
** FUNCTION           : recalculateTimes
274
**
275
** DESCRIPTION        : Recalculate and update all the times for the legs
276
**
277
**
278
** INPUTS             : None
279
**
280
** RETURNS            :
281
**
282
----------------------------------------------------------------------------*/
283
 
126 david 284
void qmTeamDisplay::recalculateTimes( void )
121 david 285
{
123 - 286
    for ( int ii = 0 ; ii <= config.num_legs; ii++)
121 david 287
    {
123 - 288
        lt[ii]->getData(&team_buf.leg[ii]);
121 david 289
    }
241 - 290
    suckData();
121 david 291
    set_times( &team_buf );
292
    test_times( &team_buf, 0 );
123 - 293
    for ( int ii = 0 ; ii <= config.num_legs; ii++)
121 david 294
    {
123 - 295
        lt[ii]->setData(&team_buf.leg[ii]);
121 david 296
    }
177 - 297
 
298
    // Flag data as changed
299
    changed();
121 david 300
}
301
 
142 david 302
/*----------------------------------------------------------------------------
241 - 303
** FUNCTION           : suckData
142 david 304
**
241 - 305
** DESCRIPTION        : Save the data back to memory
142 david 306
**
307
** INPUTS             :
308
**
309
** RETURNS            :
310
**
311
----------------------------------------------------------------------------*/
312
 
241 - 313
void qmTeamDisplay::suckData(void)
112 david 314
{
121 david 315
    /*
316
    ** Extract data from the widgets
317
    ** The time stuff is done on the fly as it changes
318
    */
123 - 319
    strncpy(team_buf.name , qPrintable(ui->name->text()), sizeof(team_buf.name));
320
    team_buf.teamclass = ui->category->currentIndex() + 1;
321
 
136 - 322
    team_buf.flags.disqualified =  ( ui->disqualified->checkState () == Qt::Checked);
323
    team_buf.flags.non_equestrian =  ( ui->nonEquestrian->checkState () == Qt::Checked);
138 david 324
    team_buf.flags.valid =  ( ui->disabled->checkState () != Qt::Checked);
225 - 325
    team_buf.flags.vet_check =  ( ui->VetCheck->checkState () == Qt::Checked);
136 - 326
 
123 - 327
    /*
328
    ** Extract Team Member Data
329
    */
330
    for ( int ii = 0; ii < config.num_legs; ii ++)
331
    {
332
        QTableWidgetItem *item;
333
        item = ui->members->item ( ii, 0 );
334
        strncpy(team_buf.members[ii].name , qPrintable(item->text()), sizeof(team_buf.members[ii].name));
335
 
336
        //TODO: Make Sex edit work
337
        item = ui->members->item ( ii, 1 );
138 david 338
        enum Qt::CheckState sex = item->checkState();
339
        switch (sex)
123 - 340
        {
341
            case Qt::Unchecked: team_buf.members[ii].sex = male;  break;
342
            case Qt::Checked: team_buf.members[ii].sex = female; break;
343
            default: team_buf.members[ii].sex = unknown; break;
344
        }
138 david 345
        //qDebug("WSex:%d, %d, %d, %d", team, ii, sex, team_buf.members[ii].sex);
123 - 346
 
347
        item = ui->members->item ( ii, 2 );
348
        team_buf.members[ii].age = item->data(Qt::EditRole).toInt();
349
 
350
    }
241 - 351
}
123 - 352
 
241 - 353
/*----------------------------------------------------------------------------
354
** FUNCTION           : save
355
**
356
** DESCRIPTION        : Save the data back to disk
255 - 357
**                      Also called if nothing to save - ie Done Mode
241 - 358
**
359
** INPUTS             :
360
**
361
** RETURNS            :
362
**
363
----------------------------------------------------------------------------*/
364
 
365
void qmTeamDisplay::save(void)
366
{
255 - 367
    if ( dirty )
368
    {
369
        /*
370
        ** Save the record back to disk
371
        */
372
        suckData();
373
        put_team_record( team, &team_buf );
374
        populate(team);
375
    }
376
    else
377
    {
378
        if ( enableDone )
379
            emit dialogDone(1);
380
    }
112 david 381
}
382
 
142 david 383
/*----------------------------------------------------------------------------
384
** FUNCTION           : cancel
385
**
386
** DESCRIPTION        : Kill of any edited data
387
**                      Redisplay the team data
388
**
389
** INPUTS             :
390
**
391
** RETURNS            :
392
**
393
----------------------------------------------------------------------------*/
394
 
395
 
126 david 396
void qmTeamDisplay::cancel(void)
112 david 397
{
398
    populate(team);
399
}
400
 
177 - 401
void qmTeamDisplay::changed(void)
402
{
255 - 403
//QObject * who = sender () ;
404
//qDebug ("Changed: %p", who);
177 - 405
    if (populating)
406
        return;
407
    updateChanged(true);
255 - 408
 
177 - 409
}
410
 
411
void qmTeamDisplay::updateChanged(bool newDirty)
412
{
255 - 413
    //qDebug("updateChanged: %d, %d -> %d", populating, dirty, newDirty );
177 - 414
    if (newDirty != dirty)
415
    {
416
        dirty = newDirty;
417
        if (dirty)
418
        {
419
            ui->Changed->setVisible(true);
420
            ui->teamNumber->setEnabled(false);
421
            ui->pushButtonSave->setEnabled(true);
226 - 422
            ui->pushButtonSave->setStyleSheet("background-color: rgb(255, 0, 0);");
255 - 423
            ui->pushButtonSave->setText("Save");
301 david 424
 
425
            //  Only valid when within a dialog
426
            //  Now have the dialog swallow <return>
427
            //ui->pushButtonSave->setDefault(true);
177 - 428
        }
429
        else
430
        {
431
            ui->Changed->setVisible(false);
432
            ui->teamNumber->setEnabled(true);
255 - 433
            //ui->pushButtonSave->setEnabled(false);
226 - 434
            ui->pushButtonSave->setStyleSheet("");
255 - 435
 
436
            if ( enableDone )
437
                ui->pushButtonSave->setText("Done");
177 - 438
        }
439
    }
440
}
441
 
142 david 442
/*----------------------------------------------------------------------------
443
** FUNCTION           : changeEvent
444
**
445
** DESCRIPTION        :
446
**
447
**
448
** INPUTS             :
449
**
450
** RETURNS            :
451
**
452
----------------------------------------------------------------------------*/
453
 
126 david 454
void qmTeamDisplay::changeEvent(QEvent *e)
112 david 455
{
210 - 456
//qDebug("qmTeamDisplay ChangeEvent: %d",e->type());
112 david 457
    QWidget::changeEvent(e);
458
    switch (e->type()) {
459
    case QEvent::LanguageChange:
460
        ui->retranslateUi(this);
461
        break;
462
    default:
463
        break;
464
    }
465
}