Subversion Repositories svn1-original

Rev

Rev 214 | Rev 229 | Go to most recent revision | Details | Compare with Previous | 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"
21
 
146 david 22
/*----------------------------------------------------------------------------
23
** FUNCTION           : qmTeamDisplay
24
**
25
** DESCRIPTION        : Construct a new widget
26
**
27
**
28
** INPUTS             :
29
**
30
** RETURNS            :
31
**
32
----------------------------------------------------------------------------*/
33
 
34
 
130 david 35
qmTeamDisplay::qmTeamDisplay(QWidget *parent) :
116 david 36
    QWidget(parent),
130 david 37
    ui(new Ui::QmTeamDisplay)
116 david 38
{
39
    ui->setupUi(this);
40
    team = 0;
181 - 41
    dirty = true;
42
    populating = true;
116 david 43
 
44
    /*
45
    ** Populate the Combo Box
46
    ** Should do more often
47
    */
48
    for ( int ii = 0; ii < config.num_class ; ii++)
49
    {
50
        ui->category->addItem(config.team_class[ii].full_name, ii);
51
    }
52
    ui->category->setCurrentIndex(-1);
53
 
146 david 54
    /*
55
    **  Set delegates to assist in editing the members table
56
    **      Name
57
    **      Sex
58
    **      Age
59
    */
117 david 60
    ui->members->setItemDelegateForColumn(0, new textDelegate(MAX_PERSON_NAME));
61
    ui->members->setItemDelegateForColumn(2, new SpinBoxDelegate(0,120));
116 david 62
 
125 david 63
    /*
64
    ** Insert widgets for the Team Times
65
    */
146 david 66
    for ( int ii = 1 ; ii <= config.num_legs; ii++)
122 david 67
    {
130 david 68
        lt[ii] = new QmLegTimes(ii, config.leg_name[ii-1]);
123 david 69
        ui->legTime_layout->addWidget(lt[ii]);
125 david 70
        connect (lt[ii], SIGNAL(dataChanged()), this, SLOT(recalculateTimes()) );
122 david 71
    }
127 - 72
    lt[0] = new QmLegTimes(0, "Overall Event");
73
    ui->legTime_layout->addWidget(lt[0]);
122 david 74
 
146 david 75
    /*
76
    **  Connect up various signals
77
    */
181 - 78
    connect(ui->pushButtonSave, SIGNAL(clicked()), this, SLOT(save()) );
79
    connect(ui->pushButtonRestore, SIGNAL(clicked()), this, SLOT(cancel()) );
116 david 80
    connect(ui->teamNumber, SIGNAL(valueChanged(int)), this, SLOT(populate(int)) );
181 - 81
 
82
    connect(ui->name, SIGNAL(editingFinished()), this, SLOT(changed()));
83
    connect(ui->category , SIGNAL(currentIndexChanged(int)), this, SLOT(changed()));
184 - 84
    connect(ui->category , SIGNAL(currentIndexChanged(int)), this, SLOT(updateCategory()));
181 - 85
    connect(ui->members , SIGNAL(cellChanged(int,int)), this, SLOT(changed()));
86
    connect(ui->disqualified , SIGNAL(clicked(bool)), this, SLOT(changed()));
87
    connect(ui->nonEquestrian , SIGNAL(clicked(bool)), this, SLOT(changed()));
88
    connect(ui->disabled , SIGNAL(clicked(bool)), this, SLOT(changed()));
89
 
90
    updateChanged(false);
91
    populating = false;
219 - 92
    populate(config.min_team);
116 david 93
}
94
 
146 david 95
/*----------------------------------------------------------------------------
96
** FUNCTION           : ~qmTeamDisplay
97
**
98
** DESCRIPTION        : Destructor
99
**
100
**
101
** INPUTS             :
102
**
103
** RETURNS            :
104
**
105
----------------------------------------------------------------------------*/
106
 
130 david 107
qmTeamDisplay::~qmTeamDisplay()
116 david 108
{
109
    delete ui;
110
}
111
 
146 david 112
/*----------------------------------------------------------------------------
113
** FUNCTION           : populate
114
**
115
** DESCRIPTION        : Populate the widget with data
116
**
117
**
118
** INPUTS             : team_number         - Team number to use
119
**
120
** RETURNS            :
121
**
122
----------------------------------------------------------------------------*/
123
 
130 david 124
void qmTeamDisplay::populate(int team_number)
116 david 125
{
146 david 126
    /*
127
    **  Update the spinner that describes the current team number
128
    */
181 - 129
    populating = true;
146 david 130
 
142 david 131
    ui->teamNumber->setMaximum(config.max_team);
219 - 132
    ui->teamNumber->setMinimum(config.min_team);
143 david 133
    ui->teamNumber->setValue(team_number);
116 david 134
    team = team_number;
146 david 135
 
136
    /*
137
    **  Read in team data
138
    **  This will persist within this widget
139
    */
116 david 140
    g_record( team, &team_buf );
141
 
142
    /*
143
    ** Basic Data
144
    */
145
    ui->name->setText( team_buf.name );
146
    ui->category_abr->setText( config.team_class[team_buf.teamclass - 1].abr );
147
    ui->category->setCurrentIndex(team_buf.teamclass - 1);
127 - 148
    //TODO: Link update of combo box to the abreviation display
116 david 149
 
140 - 150
    ui->disqualified->setCheckState(team_buf.flags.disqualified ? Qt::Checked : Qt::Unchecked);
151
    ui->nonEquestrian->setCheckState(team_buf.flags.non_equestrian ? Qt::Checked : Qt::Unchecked);
142 david 152
    ui->disabled->setCheckState( !team_buf.flags.valid ? Qt::Checked : Qt::Unchecked);
140 - 153
 
116 david 154
    /*
155
    ** Team Member data
146 david 156
    **       Name
157
    **      Sex
158
    **      Age
116 david 159
    */
142 david 160
    int age_sum = 0;
116 david 161
    for ( int ii = 0; ii < config.num_legs; ii ++)
162
    {
163
         QTableWidgetItem *item;
164
        ui->members->setItem(ii, 0, new QTableWidgetItem(team_buf.members[ii].name) );
165
 
166
        item = new QTableWidgetItem();
142 david 167
        item->setFlags(Qt::ItemIsTristate | item->flags());
116 david 168
        enum Qt::CheckState sex;
169
        switch ( team_buf.members[ii].sex )
170
        {
117 david 171
            case male:   sex = Qt::Unchecked;        break;
172
            case female: sex = Qt::Checked;          break;
173
            default:     sex = Qt::PartiallyChecked; break;
116 david 174
        }
142 david 175
        //qDebug("RSex:%d, %d, %d, %d", team, ii, sex, team_buf.members[ii].sex);
116 david 176
        item->setCheckState(sex );
177
        ui->members->setItem(ii, 1, item );
178
 
179
        item = new QTableWidgetItem();
180
        item->setData(Qt::EditRole,team_buf.members[ii].age);
181
        ui->members->setItem(ii, 2, item );
142 david 182
 
183
        /*
184
        **  Sum ages
185
        **  -1 indicates invalid age
186
        */
187
        if ( age_sum >= 0 )
188
        {
189
            ushort age = team_buf.members[ii].age;
190
            if ( age > 0 && age < 255 )
191
            {
192
                age_sum += age;
193
            }
194
            else
195
            {
196
                age_sum = -1;
197
            }
198
        }
116 david 199
    }
146 david 200
    ui->members->resizeColumnsToContents();
142 david 201
 
146 david 202
    /*
203
    **  Mainatainthe display of total age
204
    */
142 david 205
    if ( age_sum <= 0 )
206
    {
207
        ui->totalAge->setText("--");
208
    }
209
    else
210
    {
211
        ui->totalAge->setText(QString::number(age_sum));
212
    }
213
 
123 david 214
 
215
    /*
216
    ** Leg Times
217
    */
127 - 218
    for ( int ii = 0 ; ii <= config.num_legs; ii++)
123 david 219
    {
127 - 220
        lt[ii]->setData(&team_buf.leg[ii]);
123 david 221
    }
181 - 222
 
186 - 223
    populating = false;
181 - 224
    updateChanged(false);
116 david 225
}
226
 
184 - 227
void qmTeamDisplay::updateCategory(void)
228
{
229
     ui->category_abr->setText( config.team_class[ui->category->currentIndex()].abr );
230
}
231
 
146 david 232
/*----------------------------------------------------------------------------
233
** FUNCTION           : recalculateTimes
234
**
235
** DESCRIPTION        : Recalculate and update all the times for the legs
236
**
237
**
238
** INPUTS             : None
239
**
240
** RETURNS            :
241
**
242
----------------------------------------------------------------------------*/
243
 
130 david 244
void qmTeamDisplay::recalculateTimes( void )
125 david 245
{
127 - 246
    for ( int ii = 0 ; ii <= config.num_legs; ii++)
125 david 247
    {
127 - 248
        lt[ii]->getData(&team_buf.leg[ii]);
125 david 249
    }
250
    set_times( &team_buf );
251
    test_times( &team_buf, 0 );
127 - 252
    for ( int ii = 0 ; ii <= config.num_legs; ii++)
125 david 253
    {
127 - 254
        lt[ii]->setData(&team_buf.leg[ii]);
125 david 255
    }
181 - 256
 
257
    // Flag data as changed
258
    changed();
125 david 259
}
260
 
146 david 261
/*----------------------------------------------------------------------------
262
** FUNCTION           : save
263
**
264
** DESCRIPTION        : Save the data back to disk
265
**
266
** INPUTS             :
267
**
268
** RETURNS            :
269
**
270
----------------------------------------------------------------------------*/
271
 
130 david 272
void qmTeamDisplay::save(void)
116 david 273
{
125 david 274
    /*
275
    ** Extract data from the widgets
276
    ** The time stuff is done on the fly as it changes
277
    */
127 - 278
    strncpy(team_buf.name , qPrintable(ui->name->text()), sizeof(team_buf.name));
279
    team_buf.teamclass = ui->category->currentIndex() + 1;
280
 
140 - 281
    team_buf.flags.disqualified =  ( ui->disqualified->checkState () == Qt::Checked);
282
    team_buf.flags.non_equestrian =  ( ui->nonEquestrian->checkState () == Qt::Checked);
142 david 283
    team_buf.flags.valid =  ( ui->disabled->checkState () != Qt::Checked);
140 - 284
 
127 - 285
    /*
286
    ** Extract Team Member Data
287
    */
288
    for ( int ii = 0; ii < config.num_legs; ii ++)
289
    {
290
        QTableWidgetItem *item;
291
        item = ui->members->item ( ii, 0 );
292
        strncpy(team_buf.members[ii].name , qPrintable(item->text()), sizeof(team_buf.members[ii].name));
293
 
294
        //TODO: Make Sex edit work
295
        item = ui->members->item ( ii, 1 );
142 david 296
        enum Qt::CheckState sex = item->checkState();
297
        switch (sex)
127 - 298
        {
299
            case Qt::Unchecked: team_buf.members[ii].sex = male;  break;
300
            case Qt::Checked: team_buf.members[ii].sex = female; break;
301
            default: team_buf.members[ii].sex = unknown; break;
302
        }
142 david 303
        //qDebug("WSex:%d, %d, %d, %d", team, ii, sex, team_buf.members[ii].sex);
127 - 304
 
305
        item = ui->members->item ( ii, 2 );
306
        team_buf.members[ii].age = item->data(Qt::EditRole).toInt();
307
 
308
    }
309
 
310
    /*
311
    ** Save the record back to disk
312
    */
313
    put_team_record( team, &team_buf );
142 david 314
    populate(team);
116 david 315
}
316
 
146 david 317
/*----------------------------------------------------------------------------
318
** FUNCTION           : cancel
319
**
320
** DESCRIPTION        : Kill of any edited data
321
**                      Redisplay the team data
322
**
323
** INPUTS             :
324
**
325
** RETURNS            :
326
**
327
----------------------------------------------------------------------------*/
328
 
329
 
130 david 330
void qmTeamDisplay::cancel(void)
116 david 331
{
332
    populate(team);
333
}
334
 
181 - 335
void qmTeamDisplay::changed(void)
336
{
337
    if (populating)
338
        return;
339
    updateChanged(true);
340
//qDebug ("Changed");
341
}
342
 
343
void qmTeamDisplay::updateChanged(bool newDirty)
344
{
219 - 345
    //qDebug("updateChanged: %d -> %d", newDirty, dirty);
181 - 346
    if (newDirty != dirty)
347
    {
348
        dirty = newDirty;
349
        if (dirty)
350
        {
351
            ui->Changed->setVisible(true);
352
            ui->teamNumber->setEnabled(false);
353
            ui->pushButtonSave->setEnabled(true);
354
        }
355
        else
356
        {
357
            ui->Changed->setVisible(false);
358
            ui->teamNumber->setEnabled(true);
359
            ui->pushButtonSave->setEnabled(false);
360
        }
361
    }
362
}
363
 
146 david 364
/*----------------------------------------------------------------------------
365
** FUNCTION           : changeEvent
366
**
367
** DESCRIPTION        :
368
**
369
**
370
** INPUTS             :
371
**
372
** RETURNS            :
373
**
374
----------------------------------------------------------------------------*/
375
 
130 david 376
void qmTeamDisplay::changeEvent(QEvent *e)
116 david 377
{
214 - 378
//qDebug("qmTeamDisplay ChangeEvent: %d",e->type());
116 david 379
    QWidget::changeEvent(e);
380
    switch (e->type()) {
381
    case QEvent::LanguageChange:
382
        ui->retranslateUi(this);
383
        break;
384
    default:
385
        break;
386
    }
387
}