Changeset 50 in tspsg-svn for trunk


Ignore:
Timestamp:
Aug 3, 2009, 5:15:46 PM (15 years ago)
Author:
laleppa
Message:

+ Implemented File/Save? action.
+ Added "Save Solution" and "Back to Task" buttons to Solution tab for better usability.

  • Increased maximum number of cities to 20. Solving for 18-20 cities is already takes much time, so I thought it doesn't make sense to increase more.
  • Columns and rows are now resized to contents on all platforms.
Location:
trunk
Files:
1 added
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/resources/tspsg.qrc

    r45 r50  
    33        <file>about.bmp</file>
    44        <file>icon.png</file>
     5        <file>icons/back.png</file>
    56        <file>icons/button_cancel.png</file>
    67        <file>icons/button_ok.png</file>
  • trunk/src/globals.h

    r42 r50  
    3838#define DEF_RAND_MIN 1
    3939#define DEF_RAND_MAX 10
     40#define DEF_NUM_CITIES 5
    4041#define DEF_OFFSET 100
    4142#define DEF_FONT_FAMILY "Courier New"
     
    5657#define ZKT_VERSION quint8(1)
    5758
     59// Maximum available number of cities
     60#define MAX_NUM_CITIES 20
    5861// This value means infinity :-)
    5962#ifndef INFINITY
     
    6366#define INFSTR "---"
    6467
     68// Let's check that default number of cities is sane (<= MAX_NUM_CITIES)
     69#if DEF_NUM_CITIES > MAX_NUM_CITIES
     70        #undef DEF_NUM_CITIES
     71        #define DEF_NUM_CITIES MAX_NUM_CITIES
     72#endif
     73
    6574#endif // GLOBALS_H
  • trunk/src/mainwindow.cpp

    r47 r50  
    4646        actionSettingsLanguageEnglish->setActionGroup(groupSettingsLanguageList);
    4747        loadLangList();
    48         spinCities->setValue(settings->value("NumCities",5).toInt());
     48        spinCities->setMaximum(MAX_NUM_CITIES);
    4949        actionSettingsLanguageAutodetect->setChecked(settings->value("Language","").toString().isEmpty());
    5050        connect(actionFileNew,SIGNAL(triggered()),this,SLOT(actionFileNewTriggered()));
    5151        connect(actionFileOpen,SIGNAL(triggered()),this,SLOT(actionFileOpenTriggered()));
     52        connect(actionFileSave,SIGNAL(triggered()),this,SLOT(actionFileSaveTriggered()));
    5253        connect(actionFileSaveAsTask,SIGNAL(triggered()),this,SLOT(actionFileSaveAsTaskTriggered()));
    5354        connect(actionFileSaveAsSolution,SIGNAL(triggered()),this,SLOT(actionFileSaveAsSolutionTriggered()));
     
    6263        connect(buttonSolve,SIGNAL(clicked()),this,SLOT(buttonSolveClicked()));
    6364        connect(buttonRandom,SIGNAL(clicked()),this,SLOT(buttonRandomClicked()));
     65        connect(buttonBackToTask,SIGNAL(clicked()),this,SLOT(buttonBackToTaskClicked()));
    6466        connect(spinCities,SIGNAL(valueChanged(int)),this,SLOT(spinCitiesValueChanged(int)));
     67        setCentralWidget(tabWidget);
    6568QRect rect = geometry();
    66         setCentralWidget(tabWidget);
    6769#ifndef Q_OS_WINCE
    6870        if (settings->value("SavePos",false).toBool()) {
     
    8284        qsrand(QDateTime().currentDateTime().toTime_t());
    8385        tspmodel = new CTSPModel();
    84         tspmodel->setNumCities(spinCities->value());
    85         taskView->setModel(tspmodel);
    8686        connect(tspmodel,SIGNAL(numCitiesChanged(int)),this,SLOT(numCitiesChanged(int)));
    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) && (tspmodel->loadTask(QCoreApplication::arguments().at(1)))) {
     89        if ((QCoreApplication::arguments().count() > 1) && (tspmodel->loadTask(QCoreApplication::arguments().at(1))))
    9090                setFileName(QCoreApplication::arguments().at(1));
    91                 setWindowModified(false);
    92         } else
     91        else {
    9392                setFileName();
    94 #ifdef Q_OS_WINCE
     93                spinCities->setValue(settings->value("NumCities",DEF_NUM_CITIES).toInt());
     94        }
     95        taskView->setModel(tspmodel);
     96        setWindowModified(false);
    9597        taskView->resizeColumnsToContents();
    9698        taskView->resizeRowsToContents();
    97 #endif // Q_OS_WINCE
    9899}
    99100
    100101void MainWindow::enableSolutionActions(bool enable)
    101102{
     103        buttonSaveSolution->setEnabled(enable);
    102104        actionFileSaveAsSolution->setEnabled(enable);
    103105        solutionText->setEnabled(enable);
     
    173175void MainWindow::spinCitiesValueChanged(int n)
    174176{
    175 #ifdef Q_OS_WINCE
    176177int count = tspmodel->numCities();
    177 #endif // Q_OS_WINCE
    178178        tspmodel->setNumCities(n);
    179 #ifdef Q_OS_WINCE
    180179        if (n > count)
    181180                for (int k = count; k < n; k++) {
     
    183182                        taskView->resizeRowToContents(k);
    184183                }
    185 #endif // Q_OS_WINCE
    186184}
    187185
     
    204202                return;
    205203        tspmodel->clear();
    206 #ifdef Q_OS_WINCE
    207204        taskView->resizeColumnsToContents();
    208205        taskView->resizeRowsToContents();
    209 #endif
    210206        setFileName();
    211207        setWindowModified(false);
     
    238234        }
    239235        setFileName(files.first());
    240 #ifdef Q_OS_WINCE
    241236        taskView->resizeColumnsToContents();
    242237        taskView->resizeRowsToContents();
    243 #endif
    244238        tabWidget->setCurrentIndex(0);
    245239        setWindowModified(false);
     
    247241        enableSolutionActions(false);
    248242        QApplication::restoreOverrideCursor();
     243}
     244
     245void MainWindow::actionFileSaveTriggered()
     246{
     247        if ((fileName == trUtf8("Untitled") + ".tspt") || (!fileName.endsWith(".tspt",Qt::CaseInsensitive)))
     248                saveTask();
     249        else {
     250                QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
     251                if (tspmodel->saveTask(fileName))
     252                        setWindowModified(false);
     253                QApplication::restoreOverrideCursor();
     254        }
    249255}
    250256
     
    350356        tspmodel->randomize();
    351357        setWindowModified(true);
    352 #ifdef Q_OS_WINCE
    353358        taskView->resizeColumnsToContents();
    354359        taskView->resizeRowsToContents();
    355 #endif // Q_OS_WINCE
     360}
     361
     362void MainWindow::buttonBackToTaskClicked()
     363{
     364        tabWidget->setCurrentIndex(0);
    356365}
    357366
     
    395404        }
    396405CTSPSolver solver;
    397 sStep *root = solver.solve(spinCities->value(),matrix);
     406sStep *root = solver.solve(n,matrix,this);
    398407        if (!root)
    399408                return;
     
    542551void MainWindow::numCitiesChanged(int nCities)
    543552{
     553        blockSignals(true);
    544554        spinCities->setValue(nCities);
    545 }
     555        blockSignals(false);
     556}
  • trunk/src/mainwindow.h

    r47 r50  
    4646        void actionFileNewTriggered();
    4747        void actionFileOpenTriggered();
     48        void actionFileSaveTriggered();
    4849        void actionFileSaveAsTaskTriggered();
    4950        void actionFileSaveAsSolutionTriggered();
     
    5859        void buttonSolveClicked();
    5960        void buttonRandomClicked();
     61        void buttonBackToTaskClicked();
    6062        void spinCitiesValueChanged(int);
    6163        void numCitiesChanged(int);
     
    6365private:
    6466        QSettings *settings;
     67#ifndef Q_OS_WINCE
    6568        QPrinter *printer;
     69#endif // Q_OS_WINCE
    6670        CTSPModel *tspmodel;
    6771        QString fileName;
  • trunk/src/tspmodel.cpp

    r49 r50  
    206206        if (loadError(ds->status()))
    207207                return false;
    208         // Cities number
     208        // Number of cities
    209209quint16 size;
    210210        *ds >> size;
    211211        if (loadError(ds->status()))
    212212                return false;
    213         if (size < 3) {
     213        if ((size < 3) || (size > MAX_NUM_CITIES)) {
    214214                QMessageBox(QMessageBox::Critical,trUtf8("Task Load"),trUtf8("Unable to load task:") + "\n" + trUtf8("Unexpected data read.\nFile is possibly corrupted."),QMessageBox::Ok).exec();
    215215                return false;
    216216        }
    217         if (nCities != size)
     217        if (nCities != size) {
     218                setNumCities(size);
    218219                emit numCitiesChanged(size);
    219         // Costs
     220        }
     221        // Travel costs
    220222        for (int r = 0; r < size; r++)
    221223                for (int c = 0; c < size; c++)
     
    246248                return false;
    247249        }
    248         // Cities number
     250        // Number of cities
    249251quint8 size;
    250252        ds->readRawData(reinterpret_cast<char *>(&size),1);
     
    255257                return false;
    256258        }
    257         if (nCities != size)
     259        if (nCities != size) {
     260                setNumCities(size);
    258261                emit numCitiesChanged(size);
    259         // Costs
     262        }
     263        // Travel costs
    260264double val;
    261265        for (int r = 0; r < 5; r++)
  • trunk/src/tspmodel.h

    r47 r50  
    5454        quint16 nCities;
    5555        bool loadError(QDataStream::Status);
     56        bool loadTSPT(QDataStream *);
    5657        bool loadZKT(QDataStream *);
    57         bool loadTSPT(QDataStream *);
    5858        int rand(int, int) const;
    5959};
  • trunk/src/tspsolver.cpp

    r42 r50  
    9797        for (int r = 0; r < nCities; r++)
    9898                for (int c = 0; c < nCities; c++)
    99                         if ((matrix[r][c] == 0) && !forbidden.values(r).contains(c)) {
     99//                      if ((matrix[r][c] == 0) && !forbidden.values(r).contains(c)) {
     100                        if (matrix[r][c] == 0) {
    100101                                sum = findMinInRow(r,matrix,c) + findMinInCol(c,matrix,r);
    101102                                if (sum > h) {
     
    154155int nRow, nCol;
    155156        while (route.size() < nCities) {
    156                 forbidden.clear();
     157//              forbidden.clear();
    157158                step->alts = findCandidate(step->matrix,nRow,nCol,s);
    158159                while (hasSubCycles(nRow,nCol)) {
    159                         forbidden[nRow] = nCol;
     160//                      forbidden[nRow] = nCol;
    160161                        step->matrix[nRow][nCol] = INFINITY;
    161162                        step->price += align(step->matrix);
     
    204205        }
    205206
    206         pd.reset();
     207        if (!root && !pd.wasCanceled()) {
     208                pd.reset();
     209                QMessageBox(QMessageBox::Warning,trUtf8("Solution Result"),trUtf8("Unable to find solution.\nMaybe, this task has no solutions."),QMessageBox::Ok,parent).exec();
     210        }
     211
    207212        qApp->processEvents();
    208213
    209         if (!root && !pd.wasCanceled()) {
    210                 QMessageBox(QMessageBox::Warning,trUtf8("Solution Result"),trUtf8("This task has no solution."),QMessageBox::Ok,parent).exec();
    211         }
    212 
    213214        return root;
    214215}
  • trunk/src/tspsolver.h

    r46 r50  
    5353        sStep *root;
    5454        QHash<int,int> route;
    55         QHash<int,int> forbidden;
     55//      QHash<int,int> forbidden;
    5656        double align(tMatrix &);
    5757        void cleanup();
  • trunk/src/version.h

    r45 r50  
    4545#endif // BUILD_NUMBER == 65535
    4646
    47 // "Converting" number to string
     47// "Converting" x to quoted string
    4848#define QUOTE_X(x) #x
    4949#define QUOTE(x) QUOTE_X(x)
  • trunk/ui/mainwindow.ce.ui

    r48 r50  
    1010    <x>0</x>
    1111    <y>0</y>
    12     <width>225</width>
    13     <height>322</height>
     12    <width>247</width>
     13    <height>339</height>
    1414   </rect>
    1515  </property>
    1616  <property name="windowTitle">
    17    <string>Travelling Salesman Problem[*]</string>
     17   <string>Travelling Salesman Problem</string>
    1818  </property>
    1919  <property name="windowIcon">
     
    3030      <x>9</x>
    3131      <y>9</y>
    32       <width>207</width>
    33       <height>248</height>
     32      <width>221</width>
     33      <height>261</height>
    3434     </rect>
    3535    </property>
     
    112112          <property name="minimum">
    113113           <number>3</number>
    114           </property>
    115           <property name="maximum">
    116            <number>5</number>
    117114          </property>
    118115          <property name="value">
     
    220217       </widget>
    221218      </item>
     219      <item>
     220       <layout class="QHBoxLayout" name="horizontalLayout">
     221        <item>
     222         <widget class="QPushButton" name="buttonSaveSolution">
     223          <property name="enabled">
     224           <bool>false</bool>
     225          </property>
     226          <property name="cursor">
     227           <cursorShape>PointingHandCursor</cursorShape>
     228          </property>
     229          <property name="statusTip">
     230           <string>Save solution to a file</string>
     231          </property>
     232          <property name="text">
     233           <string>Save Solution</string>
     234          </property>
     235          <property name="icon">
     236           <iconset resource="../resources/tspsg.qrc">
     237            <normaloff>:/images/icons/filesaveas.png</normaloff>:/images/icons/filesaveas.png</iconset>
     238          </property>
     239         </widget>
     240        </item>
     241        <item>
     242         <spacer name="horizontalSpacer">
     243          <property name="orientation">
     244           <enum>Qt::Horizontal</enum>
     245          </property>
     246          <property name="sizeHint" stdset="0">
     247           <size>
     248            <width>40</width>
     249            <height>20</height>
     250           </size>
     251          </property>
     252         </spacer>
     253        </item>
     254        <item>
     255         <widget class="QPushButton" name="buttonBackToTask">
     256          <property name="cursor">
     257           <cursorShape>PointingHandCursor</cursorShape>
     258          </property>
     259          <property name="statusTip">
     260           <string>Go back to Task tab</string>
     261          </property>
     262          <property name="text">
     263           <string>Back to Task</string>
     264          </property>
     265          <property name="icon">
     266           <iconset resource="../resources/tspsg.qrc">
     267            <normaloff>:/images/icons/back.png</normaloff>:/images/icons/back.png</iconset>
     268          </property>
     269         </widget>
     270        </item>
     271       </layout>
     272      </item>
    222273     </layout>
    223274    </widget>
     
    229280     <x>0</x>
    230281     <y>0</y>
    231      <width>225</width>
     282     <width>247</width>
    232283     <height>22</height>
    233284    </rect>
     
    247298     </property>
    248299     <property name="title">
    249       <string>Save &amp;As...</string>
     300      <string>Save &amp;As</string>
    250301     </property>
    251302     <property name="icon">
     
    363414   </property>
    364415   <property name="statusTip">
    365     <string>Save solution steps and graph</string>
     416    <string>Save solution to a file</string>
    366417   </property>
    367418  </action>
     
    437488    <string>Open help contents</string>
    438489   </property>
     490   <property name="shortcut">
     491    <string>Ctrl+F1</string>
     492   </property>
    439493  </action>
    440494  <action name="actionHelpContextual">
     
    452506    <string>Open context help</string>
    453507   </property>
     508   <property name="shortcut">
     509    <string>F1</string>
     510   </property>
    454511  </action>
    455512  <action name="actionHelpAbout">
     
    496553   <property name="statusTip">
    497554    <string>Save task to file</string>
    498    </property>
    499    <property name="shortcut">
    500     <string>Ctrl+S</string>
    501555   </property>
    502556  </action>
     
    526580   </property>
    527581   <property name="text">
     582    <string notr="true">&amp;English</string>
     583   </property>
     584   <property name="iconText">
    528585    <string notr="true">English</string>
    529586   </property>
    530    <property name="iconText">
    531     <string notr="true">English</string>
    532    </property>
    533587  </action>
    534588  <action name="actionFileSave">
    535    <property name="enabled">
    536     <bool>false</bool>
    537    </property>
    538589   <property name="icon">
    539590    <iconset resource="../resources/tspsg.qrc">
     
    548599   <property name="statusTip">
    549600    <string>Save current task</string>
     601   </property>
     602   <property name="shortcut">
     603    <string>Ctrl+S</string>
    550604   </property>
    551605  </action>
     
    589643   </hints>
    590644  </connection>
     645  <connection>
     646   <sender>buttonBackToTask</sender>
     647   <signal>clicked()</signal>
     648   <receiver>actionFileSaveAsSolution</receiver>
     649   <slot>trigger()</slot>
     650   <hints>
     651    <hint type="sourcelabel">
     652     <x>172</x>
     653     <y>299</y>
     654    </hint>
     655    <hint type="destinationlabel">
     656     <x>-1</x>
     657     <y>-1</y>
     658    </hint>
     659   </hints>
     660  </connection>
    591661 </connections>
    592662</ui>
  • trunk/ui/mainwindow.ui

    r48 r50  
    77    <x>0</x>
    88    <y>0</y>
    9     <width>491</width>
    10     <height>400</height>
     9    <width>502</width>
     10    <height>407</height>
    1111   </rect>
    1212  </property>
     
    2424      <x>0</x>
    2525      <y>0</y>
    26       <width>481</width>
    27       <height>311</height>
     26      <width>287</width>
     27      <height>298</height>
    2828     </rect>
    2929    </property>
     
    100100          <property name="minimum">
    101101           <number>3</number>
    102           </property>
    103           <property name="maximum">
    104            <number>5</number>
    105102          </property>
    106103          <property name="value">
     
    208205       </widget>
    209206      </item>
     207      <item>
     208       <layout class="QHBoxLayout" name="horizontalLayout">
     209        <item>
     210         <widget class="QPushButton" name="buttonSaveSolution">
     211          <property name="enabled">
     212           <bool>false</bool>
     213          </property>
     214          <property name="cursor">
     215           <cursorShape>PointingHandCursor</cursorShape>
     216          </property>
     217          <property name="statusTip">
     218           <string>Save solution to a file</string>
     219          </property>
     220          <property name="text">
     221           <string>Save Solution</string>
     222          </property>
     223          <property name="icon">
     224           <iconset resource="../resources/tspsg.qrc">
     225            <normaloff>:/images/icons/filesaveas.png</normaloff>:/images/icons/filesaveas.png</iconset>
     226          </property>
     227         </widget>
     228        </item>
     229        <item>
     230         <spacer name="horizontalSpacer">
     231          <property name="orientation">
     232           <enum>Qt::Horizontal</enum>
     233          </property>
     234          <property name="sizeHint" stdset="0">
     235           <size>
     236            <width>40</width>
     237            <height>20</height>
     238           </size>
     239          </property>
     240         </spacer>
     241        </item>
     242        <item>
     243         <widget class="QPushButton" name="buttonBackToTask">
     244          <property name="cursor">
     245           <cursorShape>PointingHandCursor</cursorShape>
     246          </property>
     247          <property name="statusTip">
     248           <string>Go back to Task tab</string>
     249          </property>
     250          <property name="text">
     251           <string>Back to Task</string>
     252          </property>
     253          <property name="icon">
     254           <iconset resource="../resources/tspsg.qrc">
     255            <normaloff>:/images/icons/back.png</normaloff>:/images/icons/back.png</iconset>
     256          </property>
     257         </widget>
     258        </item>
     259       </layout>
     260      </item>
    210261     </layout>
    211262    </widget>
     
    217268     <x>0</x>
    218269     <y>0</y>
    219      <width>491</width>
     270     <width>502</width>
    220271     <height>22</height>
    221272    </rect>
     
    232283    <widget class="QMenu" name="menuFileSaveAs">
    233284     <property name="title">
    234       <string>Save &amp;As...</string>
     285      <string>Save &amp;As</string>
    235286     </property>
    236287     <property name="icon">
     
    379430    <string>&amp;Solution...</string>
    380431   </property>
     432   <property name="iconText">
     433    <string>Solution...</string>
     434   </property>
    381435   <property name="toolTip">
    382436    <string>Save solution</string>
    383437   </property>
    384438   <property name="statusTip">
    385     <string>Save solution steps and graph</string>
     439    <string>Save solution to a file</string>
    386440   </property>
    387441  </action>
     
    457511    <string>Open help contents</string>
    458512   </property>
     513   <property name="shortcut">
     514    <string>Ctrl+F1</string>
     515   </property>
    459516  </action>
    460517  <action name="actionHelpContextual">
     
    472529    <string>Open context help</string>
    473530   </property>
     531   <property name="shortcut">
     532    <string>F1</string>
     533   </property>
    474534  </action>
    475535  <action name="actionHelpAbout">
     
    512572   <property name="statusTip">
    513573    <string>Save task to file</string>
    514    </property>
    515    <property name="shortcut">
    516     <string>Ctrl+S</string>
    517574   </property>
    518575  </action>
     
    542599   </property>
    543600   <property name="text">
     601    <string notr="true">&amp;English</string>
     602   </property>
     603   <property name="iconText">
    544604    <string notr="true">English</string>
    545605   </property>
    546    <property name="iconText">
    547     <string notr="true">English</string>
    548    </property>
    549606  </action>
    550607  <action name="actionFileSave">
    551    <property name="enabled">
    552     <bool>false</bool>
    553    </property>
    554608   <property name="icon">
    555609    <iconset resource="../resources/tspsg.qrc">
     
    567621   <property name="statusTip">
    568622    <string>Save current task</string>
     623   </property>
     624   <property name="shortcut">
     625    <string>Ctrl+S</string>
    569626   </property>
    570627  </action>
     
    605662   </hints>
    606663  </connection>
     664  <connection>
     665   <sender>buttonSaveSolution</sender>
     666   <signal>clicked()</signal>
     667   <receiver>actionFileSaveAsSolution</receiver>
     668   <slot>trigger()</slot>
     669   <hints>
     670    <hint type="sourcelabel">
     671     <x>58</x>
     672     <y>327</y>
     673    </hint>
     674    <hint type="destinationlabel">
     675     <x>-1</x>
     676     <y>-1</y>
     677    </hint>
     678   </hints>
     679  </connection>
    607680 </connections>
    608681</ui>
Note: See TracChangeset for help on using the changeset viewer.