Subversion Repositories svn1-original

Rev

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