Changeset 67 in tspsg-svn for trunk/src/tspmodel.cpp


Ignore:
Timestamp:
Oct 24, 2009, 3:37:48 PM (15 years ago)
Author:
laleppa
Message:
  • Finished documentation.
  • Sorted all functions in .cpp files according to order of their declaration in .h files.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/tspmodel.cpp

    r59 r67  
    2424#include "tspmodel.h"
    2525
     26/*!
     27 * \brief Class constructor.
     28 * \param parent The parent of the table model.
     29 */
    2630CTSPModel::CTSPModel(QObject *parent)
    2731        : QAbstractTableModel(parent), nCities(0)
     
    3034}
    3135
    32 inline int CTSPModel::rand(int min, int max) const
    33 {
    34         return min + (int)(((float)qrand() / RAND_MAX) * max);
    35 }
    36 
    37 int CTSPModel::rowCount(const QModelIndex &) const
     36/*!
     37 * \brief Resets the table, setting all its elements to 0.
     38 *
     39 * \sa randomize()
     40 */
     41void CTSPModel::clear()
     42{
     43        for (int r = 0; r < nCities; r++)
     44                for (int c = 0; c < nCities; c++)
     45                        if (r != c)
     46                                table[r][c] = 0;
     47        emit dataChanged(index(0,0),index(nCities - 1,nCities - 1));
     48}
     49
     50/*!
     51 * \brief Returns the column count in the table.
     52 * \return Number of columns in the table.
     53 *
     54 *  Actually, this function returns the number of cities in the current task.
     55 *
     56 * \sa numCities(), rowCount()
     57 */
     58int CTSPModel::columnCount(const QModelIndex &) const
    3859{
    3960        return nCities;
    4061}
    4162
    42 int CTSPModel::columnCount(const QModelIndex &) const
    43 {
    44         return nCities;
    45 }
    46 
    47 QVariant CTSPModel::headerData(int section, Qt::Orientation orientation, int role) const
    48 {
    49         if (role == Qt::DisplayRole) {
    50                 if (orientation == Qt::Vertical)
    51                         return trUtf8("City %1").arg(section + 1);
    52                 else
    53                         return trUtf8("%1").arg(section + 1);
    54         }
    55         return QVariant();
    56 }
    57 
     63/*!
     64 * \brief Returns the data stored under the given \a role for the item referred to by the \a index.
     65 * \param index An item index to get data from.
     66 * \param role The role to get data for.
     67 * \return Corresponding data.
     68 *
     69 * \sa setData(), headerData()
     70 */
    5871QVariant CTSPModel::data(const QModelIndex &index, int role) const
    5972{
     
    7184                                return trUtf8(INFSTR);
    7285                        else
    73                                 // HACK: Converting to string to prevent spinbox in edit mode
     86//! \hack HACK: Converting to string to prevent spinbox in edit mode
    7487                                return QVariant(table[index.row()][index.column()]).toString();
    7588                else
     
    8093}
    8194
     95/*!
     96 * \brief Returns the item flags for the given \a index.
     97 * \param index An item index to get flags from.
     98 * \return Corresponding item flags.
     99 */
     100Qt::ItemFlags CTSPModel::flags(const QModelIndex &index) const
     101{
     102Qt::ItemFlags flags = QAbstractItemModel::flags(index);
     103        if (index.row() != index.column())
     104                flags |= Qt::ItemIsEditable;
     105        return flags;
     106}
     107
     108/*!
     109 * \brief Returns the data for the given \a role and \a section in the header with the specified \a orientation.
     110 * \param section The section to get header data for.
     111 * \param orientation The orientation to get header data for.
     112 * \param role The role to get header data for.
     113 * \return Corresponding header data.
     114 *
     115 *  For horizontal headers, the section number corresponds to the column number of items shown beneath it. For vertical headers, the section number typically to the row number of items shown alongside it.
     116 */
     117QVariant CTSPModel::headerData(int section, Qt::Orientation orientation, int role) const
     118{
     119        if (role == Qt::DisplayRole) {
     120                if (orientation == Qt::Vertical)
     121                        return trUtf8("City %1").arg(section + 1);
     122                else
     123                        return trUtf8("%1").arg(section + 1);
     124        }
     125        return QVariant();
     126}
     127
     128/*!
     129 * \brief Loads a task from \a fname.
     130 * \param fname The name of the file to be loaded.
     131 * \return \c true on success, otherwise \c false.
     132 *
     133 * \sa saveTask()
     134 */
     135bool CTSPModel::loadTask(QString fname)
     136{
     137        QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
     138QFile f(fname);
     139        if (!f.open(QIODevice::ReadOnly)) {
     140                QApplication::restoreOverrideCursor();
     141                QMessageBox(QMessageBox::Critical,trUtf8("Task Load"),QString(trUtf8("Unable to open task file.\nError: %1")).arg(f.errorString()),QMessageBox::Ok).exec();
     142                return false;
     143        }
     144QDataStream ds(&f);
     145        ds.setVersion(QDataStream::Qt_4_4);
     146quint32 sig;
     147        ds >> sig;
     148        if (loadError(ds.status())) {
     149                return false;
     150        }
     151        ds.device()->reset();
     152        if (sig == TSPT) {
     153                if (!loadTSPT(&ds)) {
     154                        f.close();
     155                        return false;
     156                }
     157        } else if ((sig >> 16) == ZKT) {
     158                if (!loadZKT(&ds)) {
     159                        f.close();
     160                        return false;
     161                }
     162        } else {
     163                f.close();
     164                QApplication::restoreOverrideCursor();
     165                QMessageBox(QMessageBox::Critical,trUtf8("Task Load"),trUtf8("Unable to load task:") + "\n" + trUtf8("Unknown file format or file is corrupted."),QMessageBox::Ok).exec();
     166                return false;
     167        }
     168        f.close();
     169        QApplication::restoreOverrideCursor();
     170        return true;
     171}
     172
     173/*!
     174 * \brief Returns the number of cities.
     175 * \return Number of cities in the current task.
     176 *
     177 * \sa columnCount(), rowCount(), setNumCities()
     178 */
     179quint16 CTSPModel::numCities() const
     180{
     181        return nCities;
     182}
     183
     184/*!
     185 * \brief Randomizes the table by setting all its values to random ones.
     186 *
     187 *  Uses TSPSG settings to determine random values range.
     188 *
     189 * \sa clear()
     190 */
     191void CTSPModel::randomize()
     192{
     193int randMin = settings->value("MinCost",DEF_RAND_MIN).toInt();
     194int randMax = settings->value("MaxCost",DEF_RAND_MAX).toInt();
     195        for (int r = 0; r < nCities; r++)
     196                for (int c = 0; c < nCities; c++)
     197                        if (r != c)
     198                                table[r][c] = rand(randMin,randMax);
     199        emit dataChanged(index(0,0),index(nCities - 1,nCities - 1));
     200}
     201
     202/*!
     203 * \brief Returns the row count in the table.
     204 * \return Number of rows in the table.
     205 *
     206 *  Actually, this function returns the number of cities in the current task.
     207 *
     208 * \sa columnCount(), numCities()
     209 */
     210int CTSPModel::rowCount(const QModelIndex &) const
     211{
     212        return nCities;
     213}
     214
     215/*!
     216 * \brief Saves current task to \a fname.
     217 * \param fname The name of the file to seve to.
     218 * \return \c true on success, otherwise \c false.
     219 *
     220 * \sa loadTask()
     221 */
     222bool CTSPModel::saveTask(QString fname)
     223{
     224        QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
     225QFile f(fname);
     226        if (!f.open(QIODevice::WriteOnly)) {
     227                QApplication::restoreOverrideCursor();
     228                QMessageBox(QMessageBox::Critical,trUtf8("Task Save"),QString(trUtf8("Unable to create task file.\nError: %1\nMaybe, file is read-only?")).arg(f.errorString()),QMessageBox::Ok).exec();
     229                return false;
     230        }
     231QDataStream ds(&f);
     232        ds.setVersion(QDataStream::Qt_4_4);
     233        if (f.error() != QFile::NoError) {
     234                f.close();
     235                QApplication::restoreOverrideCursor();
     236                QMessageBox(QMessageBox::Critical,trUtf8("Task Save"),trUtf8("Unable to save task.\nError: %1").arg(f.errorString()),QMessageBox::Ok).exec();
     237                return false;
     238        }
     239        // File signature
     240        ds << TSPT;
     241        if (f.error() != QFile::NoError) {
     242                f.close();
     243                QApplication::restoreOverrideCursor();
     244                QMessageBox(QMessageBox::Critical,trUtf8("Task Save"),trUtf8("Unable to save task.\nError: %1").arg(f.errorString()),QMessageBox::Ok).exec();
     245                return false;
     246        }
     247        // File version
     248        ds << TSPT_VERSION;
     249        if (f.error() != QFile::NoError) {
     250                f.close();
     251                QApplication::restoreOverrideCursor();
     252                QMessageBox(QMessageBox::Critical,trUtf8("Task Save"),trUtf8("Unable to save task.\nError: %1").arg(f.errorString()),QMessageBox::Ok).exec();
     253                return false;
     254        }
     255        // File metadata version
     256        ds << TSPT_META_VERSION;
     257        if (f.error() != QFile::NoError) {
     258                f.close();
     259                QApplication::restoreOverrideCursor();
     260                QMessageBox(QMessageBox::Critical,trUtf8("Task Save"),trUtf8("Unable to save task.\nError: %1").arg(f.errorString()),QMessageBox::Ok).exec();
     261                return false;
     262        }
     263        // Metadata
     264        ds << OSID;
     265        if (f.error() != QFile::NoError) {
     266                f.close();
     267                QApplication::restoreOverrideCursor();
     268                QMessageBox(QMessageBox::Critical,trUtf8("Task Save"),trUtf8("Unable to save task.\nError: %1").arg(f.errorString()),QMessageBox::Ok).exec();
     269                return false;
     270        }
     271        // Number of cities
     272        ds << nCities;
     273        if (f.error() != QFile::NoError) {
     274                f.close();
     275                QApplication::restoreOverrideCursor();
     276                QMessageBox(QMessageBox::Critical,trUtf8("Task Save"),trUtf8("Unable to save task.\nError: %1").arg(f.errorString()),QMessageBox::Ok).exec();
     277                return false;
     278        }
     279        // Costs
     280        for (int r = 0; r < nCities; r++)
     281                for (int c = 0; c < nCities; c++)
     282                        if (r != c) {
     283                                ds << table[r][c];
     284                                if (f.error() != QFile::NoError) {
     285                                        f.close();
     286                                        QApplication::restoreOverrideCursor();
     287                                        QMessageBox(QMessageBox::Critical,trUtf8("Task Save"),trUtf8("Unable to save task.\nError: %1").arg(f.errorString()),QMessageBox::Ok).exec();
     288                                        return false;
     289                                }
     290                        }
     291        f.close();
     292        QApplication::restoreOverrideCursor();
     293        return true;
     294}
     295
     296/*!
     297 * \brief Sets the \a role data for the item at \a index to \a value.
     298 * \param index The index of the item to set data at.
     299 * \param value The value of the item data to be set.
     300 * \param role The role of the item to set data for.
     301 * \return \c true on success, otherwise \c false.
     302 *
     303 * \sa data()
     304 */
    82305bool CTSPModel::setData(const QModelIndex &index, const QVariant &value, int role)
    83306{
     
    101324}
    102325
    103 Qt::ItemFlags CTSPModel::flags(const QModelIndex &index) const
    104 {
    105 Qt::ItemFlags flags = QAbstractItemModel::flags(index);
    106         if (index.row() != index.column())
    107                 flags |= Qt::ItemIsEditable;
    108         return flags;
    109 }
    110 
    111 quint16 CTSPModel::numCities() const
    112 {
    113         return nCities;
    114 }
    115 
     326/*!
     327 * \brief Sets number of cities in the current task to \a n.
     328 * \param n Number of cities to set to.
     329 *
     330 * \sa numCities()
     331 */
    116332void CTSPModel::setNumCities(int n)
    117333{
     
    130346}
    131347
    132 void CTSPModel::clear()
    133 {
    134         for (int r = 0; r < nCities; r++)
    135                 for (int c = 0; c < nCities; c++)
    136                         if (r != c)
    137                                 table[r][c] = 0;
    138         emit dataChanged(index(0,0),index(nCities - 1,nCities - 1));
    139 }
     348/* Privates **********************************************************/
    140349
    141350inline bool CTSPModel::loadError(QDataStream::Status status)
     
    152361        QApplication::restoreOverrideCursor();
    153362        QMessageBox(QMessageBox::Critical,trUtf8("Task Load"),trUtf8("Unable to load task:") + "\n" + err,QMessageBox::Ok).exec();
    154         return true;
    155 }
    156 
    157 bool CTSPModel::loadTask(QString fname)
    158 {
    159         QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
    160 QFile f(fname);
    161         if (!f.open(QIODevice::ReadOnly)) {
    162                 QApplication::restoreOverrideCursor();
    163                 QMessageBox(QMessageBox::Critical,trUtf8("Task Load"),QString(trUtf8("Unable to open task file.\nError: %1")).arg(f.errorString()),QMessageBox::Ok).exec();
    164                 return false;
    165         }
    166 QDataStream ds(&f);
    167         ds.setVersion(QDataStream::Qt_4_4);
    168 quint32 sig;
    169         ds >> sig;
    170         if (loadError(ds.status())) {
    171                 return false;
    172         }
    173         ds.device()->reset();
    174         if (sig == TSPT) {
    175                 if (!loadTSPT(&ds)) {
    176                         f.close();
    177                         return false;
    178                 }
    179         } else if ((sig >> 16) == ZKT) {
    180                 if (!loadZKT(&ds)) {
    181                         f.close();
    182                         return false;
    183                 }
    184         } else {
    185                 f.close();
    186                 QApplication::restoreOverrideCursor();
    187                 QMessageBox(QMessageBox::Critical,trUtf8("Task Load"),trUtf8("Unable to load task:") + "\n" + trUtf8("Unknown file format or file is corrupted."),QMessageBox::Ok).exec();
    188                 return false;
    189         }
    190         f.close();
    191         QApplication::restoreOverrideCursor();
    192363        return true;
    193364}
     
    295466}
    296467
    297 bool CTSPModel::saveTask(QString fname)
    298 {
    299         QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
    300 QFile f(fname);
    301         if (!f.open(QIODevice::WriteOnly)) {
    302                 QApplication::restoreOverrideCursor();
    303                 QMessageBox(QMessageBox::Critical,trUtf8("Task Save"),QString(trUtf8("Unable to create task file.\nError: %1\nMaybe, file is read-only?")).arg(f.errorString()),QMessageBox::Ok).exec();
    304                 return false;
    305         }
    306 QDataStream ds(&f);
    307         ds.setVersion(QDataStream::Qt_4_4);
    308         if (f.error() != QFile::NoError) {
    309                 f.close();
    310                 QApplication::restoreOverrideCursor();
    311                 QMessageBox(QMessageBox::Critical,trUtf8("Task Save"),trUtf8("Unable to save task.\nError: %1").arg(f.errorString()),QMessageBox::Ok).exec();
    312                 return false;
    313         }
    314         // File signature
    315         ds << TSPT;
    316         if (f.error() != QFile::NoError) {
    317                 f.close();
    318                 QApplication::restoreOverrideCursor();
    319                 QMessageBox(QMessageBox::Critical,trUtf8("Task Save"),trUtf8("Unable to save task.\nError: %1").arg(f.errorString()),QMessageBox::Ok).exec();
    320                 return false;
    321         }
    322         // File version
    323         ds << TSPT_VERSION;
    324         if (f.error() != QFile::NoError) {
    325                 f.close();
    326                 QApplication::restoreOverrideCursor();
    327                 QMessageBox(QMessageBox::Critical,trUtf8("Task Save"),trUtf8("Unable to save task.\nError: %1").arg(f.errorString()),QMessageBox::Ok).exec();
    328                 return false;
    329         }
    330         // File metadata version
    331         ds << TSPT_META_VERSION;
    332         if (f.error() != QFile::NoError) {
    333                 f.close();
    334                 QApplication::restoreOverrideCursor();
    335                 QMessageBox(QMessageBox::Critical,trUtf8("Task Save"),trUtf8("Unable to save task.\nError: %1").arg(f.errorString()),QMessageBox::Ok).exec();
    336                 return false;
    337         }
    338         // Metadata
    339         ds << OSID;
    340         if (f.error() != QFile::NoError) {
    341                 f.close();
    342                 QApplication::restoreOverrideCursor();
    343                 QMessageBox(QMessageBox::Critical,trUtf8("Task Save"),trUtf8("Unable to save task.\nError: %1").arg(f.errorString()),QMessageBox::Ok).exec();
    344                 return false;
    345         }
    346         // Number of cities
    347         ds << nCities;
    348         if (f.error() != QFile::NoError) {
    349                 f.close();
    350                 QApplication::restoreOverrideCursor();
    351                 QMessageBox(QMessageBox::Critical,trUtf8("Task Save"),trUtf8("Unable to save task.\nError: %1").arg(f.errorString()),QMessageBox::Ok).exec();
    352                 return false;
    353         }
    354         // Costs
    355         for (int r = 0; r < nCities; r++)
    356                 for (int c = 0; c < nCities; c++)
    357                         if (r != c) {
    358                                 ds << table[r][c];
    359                                 if (f.error() != QFile::NoError) {
    360                                         f.close();
    361                                         QApplication::restoreOverrideCursor();
    362                                         QMessageBox(QMessageBox::Critical,trUtf8("Task Save"),trUtf8("Unable to save task.\nError: %1").arg(f.errorString()),QMessageBox::Ok).exec();
    363                                         return false;
    364                                 }
    365                         }
    366         f.close();
    367         QApplication::restoreOverrideCursor();
    368         return true;
    369 }
    370 
    371 void CTSPModel::randomize()
    372 {
    373 int randMin = settings->value("MinCost",DEF_RAND_MIN).toInt();
    374 int randMax = settings->value("MaxCost",DEF_RAND_MAX).toInt();
    375         for (int r = 0; r < nCities; r++)
    376                 for (int c = 0; c < nCities; c++)
    377                         if (r != c)
    378                                 table[r][c] = rand(randMin,randMax);
    379         emit dataChanged(index(0,0),index(nCities - 1,nCities - 1));
    380 }
     468inline int CTSPModel::rand(int min, int max) const
     469{
     470        return min + (int)(((float)qrand() / RAND_MAX) * max);
     471}
Note: See TracChangeset for help on using the changeset viewer.