Subversion Repositories svn1-original

Rev

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