Rev 149 | Rev 151 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
#include "qmdialogloadexternalteams.h"#include "ui_qmdialogloadexternalteams.h"#include "QFile"#include "QTextStream"#include "mainwindow.h"#include <QRegExp>#include "consts.h"#include "structs.h"#include "proto.h"QmDialogLoadExternalTeams::QmDialogLoadExternalTeams(const QString &efile,QWidget *parent) :QDialog(parent),ui(new Ui::QmDialogLoadExternalTeams){ui->setupUi(this);setWindowTitle("Load External Team Data");ui->fileName->setText(efile);// Open the users fileQFile file(efile);if ( ! file.open(QIODevice::ReadOnly | QIODevice::Text) ){MainWindow::showMessage("Cannot open external data file");return;}MainWindow::showMessage("Loading External Data");// Insert column headersui->tableWidget->setColumnCount(3 + ( 2 * config.num_legs) );QStringList labels;labels << "Team" << "Team Name" << "Cat";for (int ii = 1; ii <= config.num_legs; ii++ ){labels += QString("Leg:%1").arg(QString::number(ii));labels += QString("Sex:%1").arg(QString::number(ii));}ui->tableWidget->setHorizontalHeaderLabels(labels);// Process Each line of the fileQTextStream in(&file);int ii = 0;int bad_cat = 0;QRegExp csv_split("\"?,\"?");while (!in.atEnd()){QString line = in.readLine();line = line.trimmed(); // Remove leading and training White Spaceline.remove(0xA0); // M$ special uglynessQStringList parts = line.split(csv_split);QString first = parts.value(0);bool ok;if ( first.isEmpty() )continue;int team = first.toInt(&ok);if ( ! ok || team <= 0 )continue;ui->tableWidget->setRowCount(1+ii);// Insert Team numberui->tableWidget->setItem(ii, 0, new QTableWidgetItem(first));parts.removeFirst();// Extract Team Nameui->tableWidget->setItem(ii, 1, new QTableWidgetItem( parts.value(0) ) );parts.removeFirst();// Extract Team CatQTableWidgetItem *item = new QTableWidgetItem( parts.value(0)) ;ui->tableWidget->setItem(ii, 2, item );if (lookup_class(qPrintable(parts.value(0)), &config ) <= 0 ){item->setBackgroundColor(QColor(200,0,0,50));bad_cat++;}parts.removeFirst();int yy = 0;while ( parts.count() > 0){// Name of competitorui->tableWidget->setItem(ii, 3+yy, new QTableWidgetItem( parts.value(0)));parts.removeFirst();// Posible age - if its a numberint age = parts.value(0).toInt(&ok);if ( ok && age > 0 ){ui->tableWidget->setItem(ii, 4+yy, new QTableWidgetItem( parts.value(0)));parts.removeFirst();}yy += 2;}ii++;}ui->tableWidget->resizeColumnsToContents();// Report errorsif (bad_cat){MainWindow::showMessage("Invalid Categories in data");}// Connect up buttonsconnect (ui->load, SIGNAL(clicked()), this, SLOT(loadData()));}QmDialogLoadExternalTeams::~QmDialogLoadExternalTeams(){delete ui;}void QmDialogLoadExternalTeams::loadData(void){qDebug ("LoadData");team_type team_buf;int bad_cat = 0;for ( int ii = 0; ii < ui->tableWidget->rowCount(); ii++){if ( ui->tableWidget->isRowHidden(ii)){continue;}bool bad = false;QTableWidgetItem *item;item = ui->tableWidget->item(ii,0);if (item){int team = item->data(Qt::EditRole).toInt();if ( team > 0 && team <= config.max_team ){g_record( team, &team_buf );// Nameitem = ui->tableWidget->item(ii,1);if (item){strncpy(team_buf.name , qPrintable(item->data(Qt::EditRole).toString()), sizeof(team_buf.name));}// Categoryitem = ui->tableWidget->item(ii,2);if (item){int category = lookup_class(qPrintable(item->data(Qt::EditRole).toString()), &config );if (category){team_buf.teamclass = category;}else{bad_cat++;bad = true;}}// Team member names and agesint member = 0;for (int yy = 3; yy < ui->tableWidget->columnCount(); yy+= 2, member++){if (member > config.num_legs){break;}item = ui->tableWidget->item(ii,yy);if (item){strncpy(team_buf.members[member].name , qPrintable(item->data(Qt::EditRole).toString()), sizeof(team_buf.members[member].name));}item = ui->tableWidget->item(ii,1+yy);if (item){int age = item->data(Qt::EditRole).toInt();if (age){team_buf.members[member].age = age;}}}put_team_record( team, &team_buf );}else{bad = true;}}else{bad = true;}if (!bad){ui->tableWidget->hideRow(ii);}}// Report errorsif (bad_cat){MainWindow::showMessage("Invalid Categories in data");}}/*========================================================================** Generate team name file** Purpose:* This function is called to Generate team name file in the format* that can be read by the load command** The file contains team number,Team name,Team class* The operator is prompted to enter the name of the file** Parameters:* None** Returns:* Nothing**========================================================================*/void QmDialogLoadExternalTeams::storeData(const QString &efile){QFile file(efile);if ( ! file.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text) ){MainWindow::showMessage("Cannot open external data file");return;}QTextStream out(&file);// Print headingsout << "\"Team Number\"," << "\"Team Name\"," << "\"Class Abr\"";for( int j = 1; j <= config.num_legs; j++ ){out << ",\"Competitor Name\"";out << ",\"Age\"";}out << endl;/** Put the data into the file*/for(int i = config.min_team; i <= config.max_team; i++ ){if( valid_field( i ) && g_record( i, &team_buf ) ){/*** Basic information** - Team number** - Full team name*/out << "\"" << team_buf.numb << "\"";out << ",\"" << team_buf.name << "\"";out << ",\"" <<(team_buf.teamclass == 0 ? "" : config.team_class[team_buf.teamclass - 1].abr) << "\"";for(int j = 1; j <= config.num_legs; j++ ){out << ",\"" << team_buf.members[j-1].name << "\"";out << ",\"" << team_buf.members[j-1].age << "\"";}out <<endl;}}}