Subversion Repositories svn1-original

Rev

Rev 142 | Rev 146 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

#include "qmteamdisplay.h"
#include "ui_qmteamdisplay.h"
#include "spinboxdelegate.h"
#include "timedelegate.h"
#include "textdelegate.h"

qmTeamDisplay::qmTeamDisplay(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::QmTeamDisplay)

{
    ui->setupUi(this);
    team = 0;

    /*
    ** Populate the Combo Box
    ** Should do more often
    */
    for ( int ii = 0; ii < config.num_class ; ii++)
    {
        ui->category->addItem(config.team_class[ii].full_name, ii);
    }
    ui->category->setCurrentIndex(-1);

    ui->members->setItemDelegateForColumn(0, new textDelegate(MAX_PERSON_NAME));
  //ui->members->setItemDelegateForColumn(1, new timeDelegate());
    ui->members->setItemDelegateForColumn(2, new SpinBoxDelegate(0,120));

    /*
    ** Insert widgets for the Team Times
    */
    int ii;
    for ( ii = 1 ; ii <= config.num_legs; ii++)
    {
        lt[ii] = new QmLegTimes(ii, config.leg_name[ii-1]);
        ui->legTime_layout->addWidget(lt[ii]);
        connect (lt[ii], SIGNAL(dataChanged()), this, SLOT(recalculateTimes()) );
    }
    lt[0] = new QmLegTimes(0, "Overall Event");
    ui->legTime_layout->addWidget(lt[0]);

    connect(ui->buttonBox, SIGNAL(accepted()), this, SLOT(save()) );
    connect(ui->buttonBox, SIGNAL(rejected()), this, SLOT(cancel()) );
    connect(ui->teamNumber, SIGNAL(valueChanged(int)), this, SLOT(populate(int)) );
}

qmTeamDisplay::~qmTeamDisplay()
{
    delete ui;
}

void qmTeamDisplay::populate(int team_number)
{
    ui->teamNumber->setMaximum(config.max_team);
    ui->teamNumber->setValue(team_number);
    team = team_number;
    g_record( team, &team_buf );

    /*
    ** Basic Data
    */
    ui->name->setText( team_buf.name );
    ui->category_abr->setText( config.team_class[team_buf.teamclass - 1].abr );
    ui->category->setCurrentIndex(team_buf.teamclass - 1);
    //TODO: Link update of combo box to the abreviation display

    ui->disqualified->setCheckState(team_buf.flags.disqualified ? Qt::Checked : Qt::Unchecked);
    ui->nonEquestrian->setCheckState(team_buf.flags.non_equestrian ? Qt::Checked : Qt::Unchecked);
    ui->disabled->setCheckState( !team_buf.flags.valid ? Qt::Checked : Qt::Unchecked);


    /*
    ** Team Member data
    */
    int age_sum = 0;
    for ( int ii = 0; ii < config.num_legs; ii ++)
    {
         QTableWidgetItem *item;
        ui->members->setItem(ii, 0, new QTableWidgetItem(team_buf.members[ii].name) );

        item = new QTableWidgetItem();
        item->setFlags(Qt::ItemIsTristate | item->flags());
        enum Qt::CheckState sex;
        switch ( team_buf.members[ii].sex )
        {
            case male:   sex = Qt::Unchecked;        break;
            case female: sex = Qt::Checked;          break;
            default:     sex = Qt::PartiallyChecked; break;
        }
        //qDebug("RSex:%d, %d, %d, %d", team, ii, sex, team_buf.members[ii].sex);
        item->setCheckState(sex );
        ui->members->setItem(ii, 1, item );

        item = new QTableWidgetItem();
        item->setData(Qt::EditRole,team_buf.members[ii].age);
        ui->members->setItem(ii, 2, item );

        /*
        **  Sum ages
        **  -1 indicates invalid age
        */
        if ( age_sum >= 0 )
        {
            ushort age = team_buf.members[ii].age;
            if ( age > 0 && age < 255 )
            {
                age_sum += age;
            }
            else
            {
                age_sum = -1;
            }
        }
    }

    if ( age_sum <= 0 )
    {
        ui->totalAge->setText("--");
    }
    else
    {
        ui->totalAge->setText(QString::number(age_sum));
    }

    ui->members->resizeColumnsToContents();

    /*
    ** Leg Times
    */
    for ( int ii = 0 ; ii <= config.num_legs; ii++)
    {
        lt[ii]->setData(&team_buf.leg[ii]);
    }
}

void qmTeamDisplay::recalculateTimes( void )
{
    for ( int ii = 0 ; ii <= config.num_legs; ii++)
    {
        lt[ii]->getData(&team_buf.leg[ii]);
    }
    set_times( &team_buf );
    test_times( &team_buf, 0 );
    for ( int ii = 0 ; ii <= config.num_legs; ii++)
    {
        lt[ii]->setData(&team_buf.leg[ii]);
    }
}

void qmTeamDisplay::save(void)
{
    /*
    ** Extract data from the widgets
    ** The time stuff is done on the fly as it changes
    */
    strncpy(team_buf.name , qPrintable(ui->name->text()), sizeof(team_buf.name));
    team_buf.teamclass = ui->category->currentIndex() + 1;

    team_buf.flags.disqualified =  ( ui->disqualified->checkState () == Qt::Checked);
    team_buf.flags.non_equestrian =  ( ui->nonEquestrian->checkState () == Qt::Checked);
    team_buf.flags.valid =  ( ui->disabled->checkState () != Qt::Checked);

    /*
    ** Extract Team Member Data
    */
    for ( int ii = 0; ii < config.num_legs; ii ++)
    {
        QTableWidgetItem *item;
        item = ui->members->item ( ii, 0 );
        strncpy(team_buf.members[ii].name , qPrintable(item->text()), sizeof(team_buf.members[ii].name));

        //TODO: Make Sex edit work
        item = ui->members->item ( ii, 1 );
        enum Qt::CheckState sex = item->checkState();
        switch (sex)
        {
            case Qt::Unchecked: team_buf.members[ii].sex = male;  break;
            case Qt::Checked: team_buf.members[ii].sex = female; break;
            default: team_buf.members[ii].sex = unknown; break;
        }
        //qDebug("WSex:%d, %d, %d, %d", team, ii, sex, team_buf.members[ii].sex);

        item = ui->members->item ( ii, 2 );
        team_buf.members[ii].age = item->data(Qt::EditRole).toInt();

    }
    //TODO : Mainatin age summary

    /*
    ** Save the record back to disk
    */
    put_team_record( team, &team_buf );
    populate(team);
}

void qmTeamDisplay::cancel(void)
{
    populate(team);
}

void qmTeamDisplay::changeEvent(QEvent *e)
{
//qDebug("ChangeEvent: %d",e->type());
    QWidget::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}