Subversion Repositories svn1-original

Rev

Rev 152 | Rev 154 | 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 file

    QFile file(efile);
    if ( ! file.open(QIODevice::ReadOnly | QIODevice::Text) )
    {
        MainWindow::showMessage("Cannot open external data file");
        return;
    }
    MainWindow::showMessage("Loading External Data");

    // Insert column headers
    ui->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 file
    QTextStream 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 Space
         line.remove(0xA0);                 // M$ special uglyness

         QStringList 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 number
         ui->tableWidget->setItem(ii, 0, new QTableWidgetItem(first));
         parts.removeFirst();

         // Extract Team Name
         ui->tableWidget->setItem(ii, 1, new QTableWidgetItem( parts.value(0) ) );
         parts.removeFirst();

         // Extract Team Cat
         QTableWidgetItem *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 competitor
             ui->tableWidget->setItem(ii, 3+yy, new QTableWidgetItem( parts.value(0)));
             parts.removeFirst();

             // Posible age - if its a number
             int 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 errors
    if (bad_cat)
    {
        MainWindow::showMessage("Invalid Categories in data");
    }

    // Connect up buttons

    connect (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 );

                // Name
                item = ui->tableWidget->item(ii,1);
                if (item)
                {
                    strncpy(team_buf.name , qPrintable(item->data(Qt::EditRole).toString()), sizeof(team_buf.name));
                }

                // Category
                item = 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 ages
                int 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 errors
    if (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 headings
    out << "\"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;
        }
    }
}