Subversion Repositories svn1-original

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

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