Subversion Repositories svn1

Rev

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