Rev 186 | Rev 219 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
/*============================================================================**** 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()));updateChanged(false);populating = false;}/*----------------------------------------------------------------------------** 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->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 displayui->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** 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 changedchanged();}/*----------------------------------------------------------------------------** 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);/*** 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 workitem = 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){if (newDirty != dirty){dirty = newDirty;if (dirty){ui->Changed->setVisible(true);ui->teamNumber->setEnabled(false);ui->pushButtonSave->setEnabled(true);}else{ui->Changed->setVisible(false);ui->teamNumber->setEnabled(true);ui->pushButtonSave->setEnabled(false);}}}/*----------------------------------------------------------------------------** 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;}}