Subversion Repositories svn1

Rev

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