QTfrontend/ammoSchemeModel.cpp
author koda
Fri, 13 Aug 2010 02:13:18 +0200
changeset 3737 2ba6ac8a114b
parent 3494 208c5671b202
child 3743 234ce4da76d4
permissions -rw-r--r--
reworked the initialization functions, now it should be safe to update and no more need of spinning wheel at first launch adjusted default zoom value polished lobby interface updated ammosets to new weapons

/*
 * Hedgewars, a free turn based strategy game
 * Copyright (c) 2010 Andrey Korotaev <unC0Rr@gmail.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; version 2 of the License
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
 */

#include <QDebug>
#include <QModelIndex>

#include "ammoSchemeModel.h"
#include "hwconsts.h"

QList<QVariant> defaultScheme = QList<QVariant>()
        << QVariant("Default")     // name           0
        << QVariant(false)         // fortsmode      1
        << QVariant(false)         // team divide    2
        << QVariant(false)         // solid land     3
        << QVariant(false)         // border         4
        << QVariant(false)         // low gravity    5
        << QVariant(false)         // laser sight    6
        << QVariant(false)         // invulnerable   7
        << QVariant(true)          // add mines      8
        << QVariant(false)         // vampiric       9
        << QVariant(false)         // karma          10
        << QVariant(false)         // artillery      11
        << QVariant(true)          // random order   12
        << QVariant(false)         // king           13
        << QVariant(false)         // place hog      14
        << QVariant(false)         // shared ammo    15
        << QVariant(false)         //disable girders 16
        << QVariant(false)         // disable land objects 17
        << QVariant(100)           // damage modfier 18
        << QVariant(45)            // turn time      19
        << QVariant(100)           // init health    20
        << QVariant(15)            // sudden death   21
        << QVariant(5)             // case prob      22
        << QVariant(3)             //  mines time    23
        << QVariant(4)             //  landadds      24
        << QVariant(0)             // mine dud pct   25
        << QVariant(2)             // explosives     26
        ;

AmmoSchemeModel::AmmoSchemeModel(QObject* parent, const QString & fileName) :
    QAbstractTableModel(parent),
    fileConfig(fileName, QSettings::IniFormat)
{
    QStringList predefSchemesNames;
    predefSchemesNames
        << "Default"
        << "Pro Mode"
        << "Shoppa"
        << "Basketball"
        << "Minefield"
        << "Barrel Mayhem"
        << "Tunnel Hogs";

    numberOfDefaultSchemes = predefSchemesNames.size();

    spNames = QStringList()
        << "name"             //  0
        << "fortsmode"        //  1
        << "divteams"         //  2
        << "solidland"        //  3
        << "border"           //  4
        << "lowgrav"          //  5
        << "laser"            //  6
        << "invulnerability"  //  7
        << "mines"            //  8
        << "vampiric"         //  9
        << "karma"            // 10
        << "artillery"        // 11
        << "randomorder"      // 12
        << "king"             // 13
        << "placehog"         // 14
        << "sharedammo"       // 15
        << "disablegirders"   // 16
        << "disablelandobjects" // 17
        << "damagefactor"     // 18
        << "turntime"         // 19
        << "health"           // 20
        << "suddendeath"      // 21
        << "caseprobability"  // 22
        << "minestime"        // 23
        << "landadds"         // 24
        << "minedudpct"       // 25
        << "explosives"       // 26
        ;

    QList<QVariant> proMode;
    proMode
        << predefSchemesNames[1]   // name           0
        << QVariant(false)         // fortsmode      1
        << QVariant(false)         // team divide    2
        << QVariant(false)         // solid land     3
        << QVariant(false)         // border         4
        << QVariant(false)         // low gravity    5
        << QVariant(false)         // laser sight    6
        << QVariant(false)         // invulnerable   7
        << QVariant(false)         // add mines      8
        << QVariant(false)         // vampiric       9
        << QVariant(false)         // karma          10
        << QVariant(false)         // artillery      11
        << QVariant(true)          // random order   12
        << QVariant(false)         // king           13
        << QVariant(false)         // place hog      14
        << QVariant(true)          // shared ammo    15
        << QVariant(false)         //disable girders 16
        << QVariant(false)         // disable land objects 17
        << QVariant(100)           // damage modfier 18
        << QVariant(15)            // turn time      19
        << QVariant(100)           // init health    20
        << QVariant(15)            // sudden death   21
        << QVariant(0)             // case prob      22
        << QVariant(3)             //  mines time    23
        << QVariant(4)             //  landadds      24
        << QVariant(0)             // mine dud pct   25
        << QVariant(2)             // explosives     26
        ;

    QList<QVariant> shoppa;
    shoppa
        << predefSchemesNames[2]   // name           0
        << QVariant(false)         // fortsmode      1
        << QVariant(false)         // team divide    2
        << QVariant(true)          // solid land     3
        << QVariant(true)          // border         4
        << QVariant(false)         // low gravity    5
        << QVariant(false)         // laser sight    6
        << QVariant(false)         // invulnerable   7
        << QVariant(false)         // add mines      8
        << QVariant(false)         // vampiric       9
        << QVariant(false)         // karma          10
        << QVariant(false)         // artillery      11
        << QVariant(true)          // random order   12
        << QVariant(false)         // king           13
        << QVariant(false)         // place hog      14
        << QVariant(true)          // shared ammo    15
        << QVariant(true)          //disable girders 16
        << QVariant(false)         // disable land objects 17
        << QVariant(100)           // damage modfier 18
        << QVariant(30)            // turn time      19
        << QVariant(100)           // init health    20
        << QVariant(50)            // sudden death   21
        << QVariant(1)             // case prob      22
        << QVariant(3)             //  mines time    23
        << QVariant(4)             //  landadds      24
        << QVariant(0)             // mine dud pct   25
        << QVariant(0)             // explosives     26
        ;

    QList<QVariant> basketball;
    basketball
        << predefSchemesNames[3]   // name           0
        << QVariant(false)         // fortsmode      1
        << QVariant(false)         // team divide    2
        << QVariant(true)          // solid land     3
        << QVariant(true)          // border         4
        << QVariant(true)          // low gravity    5
        << QVariant(false)         // laser sight    6
        << QVariant(true)          // invulnerable   7
        << QVariant(false)         // add mines      8
        << QVariant(false)         // vampiric       9
        << QVariant(false)         // karma          10
        << QVariant(false)         // artillery      11
        << QVariant(true)          // random order   12
        << QVariant(false)         // king           13
        << QVariant(false)         // place hog      14
        << QVariant(true)          // shared ammo    15
        << QVariant(true)          //disable girders 16
        << QVariant(false)         // disable land objects 17
        << QVariant(100)           // damage modfier 18
        << QVariant(30)            // turn time      19
        << QVariant(100)           // init health    20
        << QVariant(15)            // sudden death   21
        << QVariant(0)             // case prob      22
        << QVariant(3)             //  mines time    23
        << QVariant(4)             //  landadds      24
        << QVariant(0)             // mine dud pct   25
        << QVariant(0)             // explosives     26
        ;

    QList<QVariant> minefield;
    minefield
        << predefSchemesNames[4]   // name           0
        << QVariant(false)         // fortsmode      1
        << QVariant(false)         // team divide    2
        << QVariant(false)         // solid land     3
        << QVariant(false)         // border         4
        << QVariant(false)         // low gravity    5
        << QVariant(false)         // laser sight    6
        << QVariant(false)         // invulnerable   7
        << QVariant(true)          // add mines      8
        << QVariant(false)         // vampiric       9
        << QVariant(false)         // karma          10
        << QVariant(false)         // artillery      11
        << QVariant(true)          // random order   12
        << QVariant(false)         // king           13
        << QVariant(false)         // place hog      14
        << QVariant(true)          // shared ammo    15
        << QVariant(true)          //disable girders 16
        << QVariant(false)         // disable land objects 17
        << QVariant(150)           // damage modfier 18
        << QVariant(30)            // turn time      19
        << QVariant(50)            // init health    20
        << QVariant(15)            // sudden death   21
        << QVariant(0)             // case prob      22
        << QVariant(0)             //  mines time    23
        << QVariant(80)            //  landadds      24
        << QVariant(0)             // mine dud pct   25
        << QVariant(0)             // explosives     26
        ;

    QList<QVariant> barrelmayhem;
    barrelmayhem
        << predefSchemesNames[5]   // name           0
        << QVariant(false)         // fortsmode      1
        << QVariant(false)         // team divide    2
        << QVariant(false)         // solid land     3
        << QVariant(false)         // border         4
        << QVariant(false)         // low gravity    5
        << QVariant(false)         // laser sight    6
        << QVariant(false)         // invulnerable   7
        << QVariant(false)         // add mines      8
        << QVariant(false)         // vampiric       9
        << QVariant(false)         // karma          10
        << QVariant(false)         // artillery      11
        << QVariant(true)          // random order   12
        << QVariant(false)         // king           13
        << QVariant(false)         // place hog      14
        << QVariant(true)          // shared ammo    15
        << QVariant(false)         //disable girders 16
        << QVariant(false)         // disable land objects 17
        << QVariant(100)           // damage modfier 18
        << QVariant(30)            // turn time      19
        << QVariant(100)           // init health    20
        << QVariant(15)            // sudden death   21
        << QVariant(0)             // case prob      22
        << QVariant(0)             // mines time     23
        << QVariant(0)             // landadds       24
        << QVariant(0)             // mine dud pct   25
        << QVariant(80)            // explosives     26
        ;

    QList<QVariant> tunnelhogs;
    tunnelhogs
        << predefSchemesNames[6]   // name           0
        << QVariant(false)         // fortsmode      1
        << QVariant(false)         // team divide    2
        << QVariant(false)         // solid land     3
        << QVariant(true)          // border         4
        << QVariant(false)         // low gravity    5
        << QVariant(false)         // laser sight    6
        << QVariant(false)         // invulnerable   7
        << QVariant(true)          // add mines      8
        << QVariant(false)         // vampiric       9
        << QVariant(false)         // karma          10
        << QVariant(false)         // artillery      11
        << QVariant(true)          // random order   12
        << QVariant(false)         // king           13
        << QVariant(false)         // place hog      14
        << QVariant(true)          // shared ammo    15
        << QVariant(true)          //disable girders 16
        << QVariant(true)          // disable land objects 17
        << QVariant(100)           // damage modfier 18
        << QVariant(30)            // turn time      19
        << QVariant(100)           // init health    20
        << QVariant(15)            // sudden death   21
        << QVariant(5)             // case prob      22
        << QVariant(3)             // mines time     23
        << QVariant(10)            // landadds       24
        << QVariant(10)            // mine dud pct   25
        << QVariant(10)            // explosives     26
        ;

    schemes.append(defaultScheme);
    schemes.append(proMode);
    schemes.append(shoppa);
    schemes.append(basketball);
    schemes.append(minefield);
    schemes.append(barrelmayhem);
    schemes.append(tunnelhogs);


    int size = fileConfig.beginReadArray("schemes");
    for (int i = 0; i < size; ++i) {
        fileConfig.setArrayIndex(i);

        if (!predefSchemesNames.contains(fileConfig.value(spNames[0]).toString()))
        {
            QList<QVariant> scheme;

            for (int k = 0; k < spNames.size(); ++k)
                scheme << fileConfig.value(spNames[k], defaultScheme[k]);

            schemes.append(scheme);
        }
    }
    fileConfig.endArray();
}

QVariant AmmoSchemeModel::headerData(int section, Qt::Orientation orientation, int role) const
{
    return QVariant();
}

int AmmoSchemeModel::rowCount(const QModelIndex &parent) const
{
    if (parent.isValid())
        return 0;
    else
        return schemes.size();
}

int AmmoSchemeModel::columnCount(const QModelIndex & parent) const
{
    if (parent.isValid())
        return 0;
    else
        return defaultScheme.size();
}

Qt::ItemFlags AmmoSchemeModel::flags(const QModelIndex & index) const
{
    return
        Qt::ItemIsEnabled
        | Qt::ItemIsSelectable
        | Qt::ItemIsEditable;
}

bool AmmoSchemeModel::setData(const QModelIndex & index, const QVariant & value, int role)
{
    if (!index.isValid() || index.row() < numberOfDefaultSchemes
        || index.row() >= schemes.size()
        || index.column() >= defaultScheme.size()
        || role != Qt::EditRole)
        return false;

    schemes[index.row()][index.column()] = value;

    emit dataChanged(index, index);
    return true;
}

bool AmmoSchemeModel::insertRows(int row, int count, const QModelIndex & parent)
{
    beginInsertRows(parent, row, row);

    QList<QVariant> newScheme = defaultScheme;
    newScheme[0] = QVariant(tr("new"));

    schemes.insert(row, newScheme);

    endInsertRows();

    return true;
}

bool AmmoSchemeModel::removeRows(int row, int count, const QModelIndex & parent)
{
    if(count != 1
        || row < numberOfDefaultSchemes
        || row >= schemes.size())
        return false;

    beginRemoveRows(parent, row, row);

    schemes.removeAt(row);

    endRemoveRows();

    return true;
}

QVariant AmmoSchemeModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid() || index.row() < 0
        || index.row() >= schemes.size()
        || index.column() >= defaultScheme.size()
        || (role != Qt::EditRole && role != Qt::DisplayRole)
        )
        return QVariant();

    return schemes[index.row()][index.column()];
}

void AmmoSchemeModel::Save()
{
    fileConfig.beginWriteArray("schemes", schemes.size() - numberOfDefaultSchemes);

    for (int i = 0; i < schemes.size() - numberOfDefaultSchemes; ++i) {
        fileConfig.setArrayIndex(i);

        QList<QVariant> scheme = schemes[i + numberOfDefaultSchemes];

        for (int k = 0; k < scheme.size(); ++k)
            fileConfig.setValue(spNames[k], scheme[k]);
    }
    fileConfig.endArray();
}


NetAmmoSchemeModel::NetAmmoSchemeModel(QObject * parent) :
    QAbstractTableModel(parent)
{
    netScheme = defaultScheme;
}

QVariant NetAmmoSchemeModel::headerData(int section, Qt::Orientation orientation, int role) const
{
    return QVariant();
}

int NetAmmoSchemeModel::rowCount(const QModelIndex & parent) const
{
    if (parent.isValid())
        return 0;
    else
        return 1;
}

int NetAmmoSchemeModel::columnCount(const QModelIndex & parent) const
{
    if (parent.isValid())
        return 0;
    else
        return defaultScheme.size();
}

QVariant NetAmmoSchemeModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid() || index.row() < 0
        || index.row() > 1
        || index.column() >= defaultScheme.size()
        || (role != Qt::EditRole && role != Qt::DisplayRole)
        )
        return QVariant();

    return netScheme[index.column()];
}

void NetAmmoSchemeModel::setNetSchemeConfig(QStringList & cfg)
{
    if(cfg.size() != netScheme.size())
    {
        qWarning("Incorrect scheme cfg size");
        return;
    }

    for(int i = 0; i < cfg.size(); ++i)
        netScheme[i] = QVariant(cfg[i]);

    reset();
}