/*============================================================================ ** ** Project/Product : ** Filename : qmteamdisplay.cpp ** Author(s) : DDP ** ** Description : Display and Update Team Information ** ** ** Information : ** Compiler : ANSI C++ ** Target : ** ***==========================================================================*/ #include "qmteamdisplay.h" #include "ui_qmteamdisplay.h" #include "spinboxdelegate.h" #include "timedelegate.h" #include "textdelegate.h" /*---------------------------------------------------------------------------- ** FUNCTION : qmTeamDisplay ** ** DESCRIPTION : Construct a new widget ** ** ** INPUTS : ** ** RETURNS : ** ----------------------------------------------------------------------------*/ qmTeamDisplay::qmTeamDisplay(QWidget *parent) : QWidget(parent), ui(new Ui::QmTeamDisplay) { ui->setupUi(this); team = 0; dirty = true; populating = true; /* ** 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); /* ** Set delegates to assist in editing the members table ** Name ** Sex ** Age */ ui->members->setItemDelegateForColumn(0, new textDelegate(MAX_PERSON_NAME)); ui->members->setItemDelegateForColumn(2, new SpinBoxDelegate(0,120)); /* ** Insert widgets for the Team Times */ for ( int 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 up various signals */ connect(ui->pushButtonSave, SIGNAL(clicked()), this, SLOT(save()) ); connect(ui->pushButtonRestore, SIGNAL(clicked()), this, SLOT(cancel()) ); connect(ui->teamNumber, SIGNAL(valueChanged(int)), this, SLOT(populate(int)) ); connect(ui->name, SIGNAL(editingFinished()), this, SLOT(changed())); connect(ui->category , SIGNAL(currentIndexChanged(int)), this, SLOT(changed())); connect(ui->category , SIGNAL(currentIndexChanged(int)), this, SLOT(updateCategory())); connect(ui->members , SIGNAL(cellChanged(int,int)), this, SLOT(changed())); connect(ui->disqualified , SIGNAL(clicked(bool)), this, SLOT(changed())); connect(ui->nonEquestrian , SIGNAL(clicked(bool)), this, SLOT(changed())); connect(ui->disabled , SIGNAL(clicked(bool)), this, SLOT(changed())); connect(ui->VetCheck , SIGNAL(clicked(bool)), this, SLOT(changed())); updateChanged(false); populating = false; populate(config.min_team); } /*---------------------------------------------------------------------------- ** FUNCTION : ~qmTeamDisplay ** ** DESCRIPTION : Destructor ** ** ** INPUTS : ** ** RETURNS : ** ----------------------------------------------------------------------------*/ qmTeamDisplay::~qmTeamDisplay() { delete ui; } /*---------------------------------------------------------------------------- ** FUNCTION : populate ** ** DESCRIPTION : Populate the widget with data ** ** ** INPUTS : team_number - Team number to use ** ** RETURNS : ** ----------------------------------------------------------------------------*/ void qmTeamDisplay::populate(int team_number) { /* ** Update the spinner that describes the current team number */ populating = true; ui->teamNumber->setMaximum(config.max_team); ui->teamNumber->setMinimum(config.min_team); ui->teamNumber->setValue(team_number); team = team_number; /* ** Read in team data ** This will persist within this widget */ 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); ui->VetCheck->setCheckState( team_buf.flags.vet_check ? Qt::Checked : Qt::Unchecked); /* ** Team Member data ** Name ** Sex ** Age */ 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; } } } ui->members->resizeColumnsToContents(); /* ** Mainatainthe display of total age */ if ( age_sum <= 0 ) { ui->totalAge->setText("--"); } else { ui->totalAge->setText(QString::number(age_sum)); } /* ** Leg Times */ for ( int ii = 0 ; ii <= config.num_legs; ii++) { lt[ii]->setData(&team_buf.leg[ii]); } populating = false; updateChanged(false); } void qmTeamDisplay::updateCategory(void) { ui->category_abr->setText( config.team_class[ui->category->currentIndex()].abr ); } /*---------------------------------------------------------------------------- ** FUNCTION : recalculateTimes ** ** DESCRIPTION : Recalculate and update all the times for the legs ** ** ** INPUTS : None ** ** RETURNS : ** ----------------------------------------------------------------------------*/ 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]); } // Flag data as changed changed(); } /*---------------------------------------------------------------------------- ** FUNCTION : save ** ** DESCRIPTION : Save the data back to disk ** ** INPUTS : ** ** RETURNS : ** ----------------------------------------------------------------------------*/ 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); team_buf.flags.vet_check = ( ui->VetCheck->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(); } /* ** Save the record back to disk */ put_team_record( team, &team_buf ); populate(team); } /*---------------------------------------------------------------------------- ** FUNCTION : cancel ** ** DESCRIPTION : Kill of any edited data ** Redisplay the team data ** ** INPUTS : ** ** RETURNS : ** ----------------------------------------------------------------------------*/ void qmTeamDisplay::cancel(void) { populate(team); } void qmTeamDisplay::changed(void) { if (populating) return; updateChanged(true); //qDebug ("Changed"); } void qmTeamDisplay::updateChanged(bool newDirty) { //qDebug("updateChanged: %d -> %d", newDirty, dirty); if (newDirty != dirty) { dirty = newDirty; if (dirty) { ui->Changed->setVisible(true); ui->teamNumber->setEnabled(false); ui->pushButtonSave->setEnabled(true); ui->pushButtonSave->setStyleSheet("background-color: rgb(255, 0, 0);"); } else { ui->Changed->setVisible(false); ui->teamNumber->setEnabled(true); ui->pushButtonSave->setEnabled(false); ui->pushButtonSave->setStyleSheet(""); } } } /*---------------------------------------------------------------------------- ** FUNCTION : changeEvent ** ** DESCRIPTION : ** ** ** INPUTS : ** ** RETURNS : ** ----------------------------------------------------------------------------*/ void qmTeamDisplay::changeEvent(QEvent *e) { //qDebug("qmTeamDisplay ChangeEvent: %d",e->type()); QWidget::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: ui->retranslateUi(this); break; default: break; } }