Changeset 47 in tspsg-svn for trunk/src


Ignore:
Timestamp:
Aug 2, 2009, 9:47:45 PM (15 years ago)
Author:
laleppa
Message:

+ Current file name is displayed in main application window header.

  • Created a method for prompt for unsaved changes to unify it throughout the code.
  • Some stylistic README changes.
Location:
trunk/src
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/mainwindow.cpp

    r45 r47  
    8787        connect(tspmodel,SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &)),this,SLOT(dataChanged()));
    8888        connect(tspmodel,SIGNAL(layoutChanged()),this,SLOT(dataChanged()));
    89         if (QCoreApplication::arguments().count() > 1) {
    90                 tspmodel->loadTask(QCoreApplication::arguments().at(1));
     89        if ((QCoreApplication::arguments().count() > 1) && (tspmodel->loadTask(QCoreApplication::arguments().at(1)))) {
     90                setFileName(QCoreApplication::arguments().at(1));
    9191                setWindowModified(false);
    92         }
     92        } else
     93                setFileName();
    9394#ifdef Q_OS_WINCE
    9495        taskView->resizeColumnsToContents();
     
    164165}
    165166
     167void MainWindow::setFileName(QString fileName)
     168{
     169        this->fileName = fileName;
     170        setWindowTitle(QString("%1[*] - %2").arg(QFileInfo(fileName).completeBaseName()).arg(trUtf8("Travelling Salesman Problem")));
     171}
     172
    166173void MainWindow::spinCitiesValueChanged(int n)
    167174{
     
    179186}
    180187
     188bool MainWindow::maybeSave()
     189{
     190        if (!isWindowModified())
     191                return true;
     192int res = QMessageBox(QMessageBox::Warning,trUtf8("Unsaved Changes"),trUtf8("Would you like to save changes in current task?"),QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel,this).exec();
     193        if (res == QMessageBox::Save)
     194                return saveTask();
     195        else if (res == QMessageBox::Cancel)
     196                return false;
     197        else
     198                return true;
     199}
    181200
    182201void MainWindow::actionFileNewTriggered()
    183202{
    184         if (isWindowModified()) {
    185 int res = QMessageBox(QMessageBox::Warning,trUtf8("New Task"),trUtf8("Would you like to save changes in current task?"),QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel,this).exec();
    186                 if ((res == QMessageBox::Cancel) || ((res == QMessageBox::Yes) && !saveTask()))
    187                         return;
    188         }
     203        if (!maybeSave())
     204                return;
    189205        tspmodel->clear();
     206#ifdef Q_OS_WINCE
     207        taskView->resizeColumnsToContents();
     208        taskView->resizeRowsToContents();
     209#endif
     210        setFileName();
    190211        setWindowModified(false);
    191212        tabWidget->setCurrentIndex(0);
     
    196217void MainWindow::actionFileOpenTriggered()
    197218{
    198         if (isWindowModified()) {
    199 int res = QMessageBox(QMessageBox::Warning,trUtf8("Task Open"),trUtf8("Would you like to save changes in current task?"),QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel,this).exec();
    200                 if ((res == QMessageBox::Cancel) || ((res == QMessageBox::Yes) && !saveTask()))
    201                         return;
    202         }
     219        if (!maybeSave())
     220                return;
    203221QFileDialog od(this);
    204222        od.setAcceptMode(QFileDialog::AcceptOpen);
    205223        od.setFileMode(QFileDialog::ExistingFile);
    206224QStringList filters(trUtf8("All Supported Formats") + " (*.tspt *.zkt)");
    207         filters.append(QString(trUtf8("%1 Task Files")).arg("TSPSG") + " (*.tspt)");
    208         filters.append(QString(trUtf8("%1 Task Files")).arg("ZKomModRd") + " (*.zkt)");
     225        filters.append(trUtf8("%1 Task Files").arg("TSPSG") + " (*.tspt)");
     226        filters.append(trUtf8("%1 Task Files").arg("ZKomModRd") + " (*.zkt)");
    209227        filters.append(trUtf8("All Files") + " (*)");
    210228        od.setNameFilters(filters);
     
    212230                return;
    213231QStringList files = od.selectedFiles();
    214         if (files.size() < 1)
    215                 return;
    216         tspmodel->loadTask(files.first());
     232        if (files.empty())
     233                return;
     234        QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
     235        if (!tspmodel->loadTask(files.first())) {
     236                QApplication::restoreOverrideCursor();
     237                return;
     238        }
     239        setFileName(files.first());
     240#ifdef Q_OS_WINCE
     241        taskView->resizeColumnsToContents();
     242        taskView->resizeRowsToContents();
     243#endif
     244        tabWidget->setCurrentIndex(0);
    217245        setWindowModified(false);
    218246        solutionText->clear();
    219247        enableSolutionActions(false);
     248        QApplication::restoreOverrideCursor();
    220249}
    221250
     
    264293QFileDialog sd(this);
    265294        sd.setAcceptMode(QFileDialog::AcceptSave);
    266 QStringList filters(QString(trUtf8("%1 Task File")).arg("TSPSG") + " (*.tspt)");
     295QStringList filters(trUtf8("%1 Task File").arg("TSPSG") + " (*.tspt)");
    267296        filters.append(trUtf8("All Files") + " (*)");
    268297        sd.setNameFilters(filters);
    269298        sd.setDefaultSuffix("tspt");
     299        if (fileName.endsWith(".tspt",Qt::CaseInsensitive))
     300                sd.selectFile(fileName);
     301        else
     302                sd.selectFile(QFileInfo(fileName).canonicalPath() + "/" + QFileInfo(fileName).completeBaseName() + ".tspt");
    270303        if (sd.exec() != QDialog::Accepted)
    271304                return false;
    272305QStringList files = sd.selectedFiles();
    273         if (files.size() < 1)
     306        if (files.empty())
    274307                return false;
     308        QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
    275309        if (tspmodel->saveTask(files.first())) {
     310                setFileName(files.first());
    276311                setWindowModified(false);
     312                QApplication::restoreOverrideCursor();
    277313                return true;
    278         } else
    279                 return false;
     314        }
     315        QApplication::restoreOverrideCursor();
     316        return false;
    280317}
    281318
     
    351388                        row.append(tspmodel->index(r,c).data(Qt::UserRole).toDouble(&ok));
    352389                        if (!ok) {
    353                                 QMessageBox(QMessageBox::Critical,trUtf8("Data error"),QString(trUtf8("Error in cell [Row %1; Column %2]: Invalid data format.")).arg(r + 1).arg(c + 1),QMessageBox::Ok,this).exec();
     390                                QMessageBox(QMessageBox::Critical,trUtf8("Data error"),trUtf8("Error in cell [Row %1; Column %2]: Invalid data format.").arg(r + 1).arg(c + 1),QMessageBox::Ok,this).exec();
    354391                                return;
    355392                        }
     
    467504                        return;
    468505        }
     506bool untitled = (fileName == trUtf8("Untitled") + ".tspt");
    469507        if (loadLanguage(action->data().toString())) {
    470508                settings->setValue("Language",action->data().toString());
    471509                retranslateUi(this);
     510                if (untitled)
     511                        setFileName();
    472512        }
    473513}
     
    475515void MainWindow::closeEvent(QCloseEvent *event)
    476516{
    477         if (isWindowModified()) {
    478 int res = QMessageBox(QMessageBox::Warning,trUtf8("Application Close"),trUtf8("Would you like to save changes in current task?"),QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel,this).exec();
    479                 if ((res == QMessageBox::Cancel) || ((res == QMessageBox::Yes) && !saveTask())) {
    480                         event->ignore();
    481                         return;
    482                 }
     517        if (!maybeSave()) {
     518                event->ignore();
     519                return;
    483520        }
    484521        settings->setValue("NumCities",spinCities->value());
  • trunk/src/mainwindow.h

    r42 r47  
    3838{
    3939        Q_OBJECT
     40
    4041public:
    4142        MainWindow(QWidget *parent = 0);
    4243        void closeEvent(QCloseEvent *);
     44
    4345private slots:
    4446        void actionFileNewTriggered();
     
    5860        void spinCitiesValueChanged(int);
    5961        void numCitiesChanged(int);
     62
    6063private:
    6164        QSettings *settings;
    6265        QPrinter *printer;
    6366        CTSPModel *tspmodel;
     67        QString fileName;
    6468        QActionGroup *groupSettingsLanguageList;
    6569        QStringList output;
     70        void enableSolutionActions(bool enable = true);
     71        void initDocStyleSheet();
    6672        bool loadLanguage(QString lang = "");
    6773        void loadLangList();
    68         void initDocStyleSheet();
     74        bool maybeSave();
     75        void outputMatrix(tMatrix, QStringList &, int nRow = -1, int nCol = -1);
     76        void setFileName(QString fileName = trUtf8("Untitled") + ".tspt");
    6977        bool saveTask();
    70         void outputMatrix(tMatrix, QStringList &, int nRow = -1, int nCol = -1);
    71         void enableSolutionActions(bool enable = true);
    7278};
    7379
  • trunk/src/tspmodel.cpp

    r42 r47  
    154154}
    155155
    156 void CTSPModel::loadTask(QString fname)
     156bool CTSPModel::loadTask(QString fname)
    157157{
    158158QFile f(fname);
    159159        if (!f.open(QIODevice::ReadOnly)) {
    160160                QMessageBox(QMessageBox::Critical,trUtf8("Task Load"),QString(trUtf8("Unable to open task file.\nError: %1")).arg(f.errorString()),QMessageBox::Ok).exec();
    161                 return;
     161                return false;
    162162        }
    163163QDataStream ds(&f);
     
    166166        ds >> sig;
    167167        if (loadError(ds.status()))
    168                 return;
     168                return false;
    169169        ds.device()->reset();
    170170        if (sig == TSPT)
    171                 loadTSPT(&ds);
     171                if (!loadTSPT(&ds)) {
     172                        f.close();
     173                        return false;
     174                }
    172175        else if ((sig >> 16) == ZKT)
    173                 loadZKT(&ds);
    174         else
     176                if (!loadZKT(&ds)) {
     177                        f.close();
     178                        return false;
     179                }
     180        else {
    175181                QMessageBox(QMessageBox::Critical,trUtf8("Task Load"),trUtf8("Unable to load task:") + "\n" + trUtf8("Unknown file format or file is corrupted."),QMessageBox::Ok).exec();
     182                f.close();
     183                return false;
     184        }
    176185        f.close();
    177 }
    178 
    179 void CTSPModel::loadTSPT(QDataStream *ds)
     186        return true;
     187}
     188
     189bool CTSPModel::loadTSPT(QDataStream *ds)
    180190{
    181191        // Skipping signature
    182192        ds->skipRawData(sizeof(TSPT));
    183193        if (loadError(ds->status()))
    184                 return;
     194                return false;
    185195        // File version
    186196quint8 version;
    187197        *ds >> version;
    188198        if (loadError(ds->status()))
    189                 return;
     199                return false;
    190200        if (version > TSPT_VERSION) {
    191201                QMessageBox(QMessageBox::Critical,trUtf8("Task Load"),trUtf8("Unable to load task:") + "\n" + trUtf8("File version is newer than application supports.\nPlease, try to update application."),QMessageBox::Ok).exec();
    192                 return;
     202                return false;
    193203        }
    194204        // Skipping metadata
    195205        ds->skipRawData(TSPT_META_SIZE);
    196206        if (loadError(ds->status()))
    197                 return;
     207                return false;
    198208        // Cities number
    199209quint16 size;
    200210        *ds >> size;
    201211        if (loadError(ds->status()))
    202                 return;
     212                return false;
    203213        if (size < 3) {
    204214                QMessageBox(QMessageBox::Critical,trUtf8("Task Load"),trUtf8("Unable to load task:") + "\n" + trUtf8("Unexpected data read.\nFile is possibly corrupted."),QMessageBox::Ok).exec();
    205                 return;
     215                return false;
    206216        }
    207217        if (nCities != size)
     
    214224                                if (loadError(ds->status())) {
    215225                                        clear();
    216                                         return;
     226                                        return false;
    217227                                }
    218228                        }
    219229        emit dataChanged(index(0,0),index(nCities - 1,nCities - 1));
    220 }
    221 
    222 void CTSPModel::loadZKT(QDataStream *ds)
     230        return true;
     231}
     232
     233bool CTSPModel::loadZKT(QDataStream *ds)
    223234{
    224235        // Skipping signature
    225236        ds->skipRawData(sizeof(ZKT));
    226237        if (loadError(ds->status()))
    227                 return;
     238                return false;
    228239        // File version
    229240quint16 version;
    230241        ds->readRawData(reinterpret_cast<char *>(&version),2);
    231242        if (loadError(ds->status()))
    232                 return;
     243                return false;
    233244        if (version > ZKT_VERSION) {
    234245                QMessageBox(QMessageBox::Critical,trUtf8("Task Load"),trUtf8("Unable to load task:") + "\n" + trUtf8("File version is newer than application supports.\nPlease, try to update application."),QMessageBox::Ok).exec();
    235                 return;
     246                return false;
    236247        }
    237248        // Cities number
     
    239250        ds->readRawData(reinterpret_cast<char *>(&size),1);
    240251        if (loadError(ds->status()))
    241                 return;
     252                return false;
    242253        if ((size < 3) || (size > 5)) {
    243254                QMessageBox(QMessageBox::Critical,trUtf8("Task Load"),trUtf8("Unable to load task:") + "\n" + trUtf8("Unexpected data read.\nFile is possibly corrupted."),QMessageBox::Ok).exec();
    244                 return;
     255                return false;
    245256        }
    246257        if (nCities != size)
     
    254265                                if (loadError(ds->status())) {
    255266                                        clear();
    256                                         return;
     267                                        return false;
    257268                                }
    258269                                table[r][c] = val;
     
    261272                                if (loadError(ds->status())) {
    262273                                        clear();
    263                                         return;
     274                                        return false;
    264275                                }
    265276                        }
    266277        emit dataChanged(index(0,0),index(nCities - 1,nCities - 1));
     278        return true;
    267279}
    268280
  • trunk/src/tspmodel.h

    r46 r47  
    3030{
    3131        Q_OBJECT
     32
    3233public:
    3334        CTSPModel(QObject *parent = 0);
     35        void clear();
     36        int columnCount(const QModelIndex &) const;
     37        QVariant data(const QModelIndex &, int) const;
     38        Qt::ItemFlags flags(const QModelIndex &) const;
     39        QVariant headerData(int, Qt::Orientation, int) const;
     40        bool loadTask(QString);
     41        quint16 numCities() const;
     42        void randomize();
    3443        int rowCount(const QModelIndex &) const;
    35         int columnCount(const QModelIndex &) const;
    36         QVariant headerData(int, Qt::Orientation, int) const;
    37         QVariant data(const QModelIndex &, int) const;
     44        bool saveTask(QString);
    3845        bool setData(const QModelIndex &, const QVariant &, int);
    39         Qt::ItemFlags flags(const QModelIndex &) const;
    40         quint16 numCities() const;
    4146        void setNumCities(int);
    42         void clear();
    43         void loadTask(QString);
    44         bool saveTask(QString);
    45         void randomize();
     47
    4648signals:
    4749        void numCitiesChanged(int);
     50
    4851private:
    4952        QSettings *settings;
    5053        QVector<QVector<double> > table;
    5154        quint16 nCities;
     55        bool loadError(QDataStream::Status);
     56        bool loadZKT(QDataStream *);
     57        bool loadTSPT(QDataStream *);
    5258        int rand(int, int) const;
    53         bool loadError(QDataStream::Status);
    54         void loadZKT(QDataStream *);
    55         void loadTSPT(QDataStream *);
    5659};
    5760
Note: See TracChangeset for help on using the changeset viewer.