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