Subversion Repositories svn1

Rev

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