source: tspsg/src/mainwindow.cpp @ 2b9257627c

0.1.3.145-beta1-symbian0.1.4.170-beta2-bb10appveyorimgbotreadme
Last change on this file since 2b9257627c was 993d5af6f6, checked in by Oleksii Serdiuk, 15 years ago

+ Opening task file
+ Saving task file

  • Translations update to reflect recent changes.
  • Property mode set to 100644
File size: 11.3 KB
RevLine 
[5515c2c2a7]1/*
[bb994a7ff8]2 *  TSPSG - TSP Solver and Generator
[5354a01311]3 *  Copyright (C) 2007-2009 Lёppa <contacts[at]oleksii[dot]name>
[003e4193be]4 *
[bb994a7ff8]5 *  $Id$
6 *  $URL$
[5515c2c2a7]7 *
[bb994a7ff8]8 *  This file is part of TSPSG.
[5515c2c2a7]9 *
[bb994a7ff8]10 *  TSPSG is free software: you can redistribute it and/or modify
11 *  it under the terms of the GNU General Public License as published by
12 *  the Free Software Foundation, either version 3 of the License, or
13 *  (at your option) any later version.
[5515c2c2a7]14 *
[bb994a7ff8]15 *  TSPSG is distributed in the hope that it will be useful,
16 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
17 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 *  GNU General Public License for more details.
[5515c2c2a7]19 *
[bb994a7ff8]20 *  You should have received a copy of the GNU General Public License
21 *  along with TSPSG.  If not, see <http://www.gnu.org/licenses/>.
[5515c2c2a7]22 */
23
24#include "mainwindow.h"
25
26MainWindow::MainWindow(QWidget *parent)
[aecdf994f9]27        : QMainWindow(parent)
[5515c2c2a7]28{
[665d32434f]29        settings = new QSettings(QSettings::IniFormat,QSettings::UserScope,"TSPSG","tspsg");
[899d1b8e15]30        loadLanguage();
31        setupUi(this);
32#ifndef Q_OS_WINCE
33        printer = new QPrinter();
34#endif // Q_OS_WINCE
35        groupSettingsLanguageList = new QActionGroup(this);
[ac4cb71650]36        actionSettingsLanguageEnglish->setData("en");
37        actionSettingsLanguageEnglish->setActionGroup(groupSettingsLanguageList);
[899d1b8e15]38        loadLangList();
[665d32434f]39        spinCities->setValue(settings->value("NumCities",5).toInt());
[899d1b8e15]40        actionSettingsLanguageAutodetect->setChecked(settings->value("Language","").toString().isEmpty());
41        connect(actionFileNew,SIGNAL(triggered()),this,SLOT(actionFileNewTriggered()));
[993d5af6f6]42        connect(actionFileOpen,SIGNAL(triggered()),this,SLOT(actionFileOpenTriggered()));
43        connect(actionFileSaveTask,SIGNAL(triggered()),this,SLOT(actionFileSaveTaskTriggered()));
[899d1b8e15]44        connect(actionSettingsPreferences,SIGNAL(triggered()),this,SLOT(actionSettingsPreferencesTriggered()));
45        connect(actionSettingsLanguageAutodetect,SIGNAL(triggered(bool)),this,SLOT(actionSettingsLanguageAutodetectTriggered(bool)));
46        connect(groupSettingsLanguageList,SIGNAL(triggered(QAction *)),this,SLOT(groupSettingsLanguageListTriggered(QAction *)));
47        connect(actionHelpAbout,SIGNAL(triggered()),this,SLOT(actionHelpAboutTriggered()));
[5354a01311]48#ifndef Q_OS_WINCE
[899d1b8e15]49        connect(actionFilePrintSetup,SIGNAL(triggered()),this,SLOT(actionFilePrintSetupTriggered()));
[5354a01311]50#endif // Q_OS_WINCE
[899d1b8e15]51        connect(buttonSolve,SIGNAL(clicked()),this,SLOT(buttonSolveClicked()));
52        connect(buttonRandom,SIGNAL(clicked()),this,SLOT(buttonRandomClicked()));
53        connect(spinCities,SIGNAL(valueChanged(int)),this,SLOT(spinCitiesValueChanged(int)));
[5354a01311]54QRect rect = geometry();
55#ifdef Q_OS_WINCE
56        // HACK: Fix for all tabWidget elements becoming "unclickable" if making it central widget.
57        rect.setSize(QApplication::desktop()->availableGeometry().size());
58        rect.setHeight(rect.height() - (QApplication::desktop()->screenGeometry().height() - QApplication::desktop()->availableGeometry().height()));
59        tabWidget->resize(rect.width(),rect.height() - toolBar->size().height());
60#else
[665d32434f]61        if (settings->value("SavePos",false).toBool()) {
[aecdf994f9]62                // Loading of saved window state
[665d32434f]63                settings->beginGroup("MainWindow");
64                resize(settings->value("Size",size()).toSize());
65                move(settings->value("Position",pos()).toPoint());
66                if (settings->value("Maximized",false).toBool())
[aecdf994f9]67                        setWindowState(windowState() | Qt::WindowMaximized);
[665d32434f]68                settings->endGroup();
[aecdf994f9]69        } else {
70                // Centering main window
71                rect.moveCenter(QApplication::desktop()->availableGeometry(this).center());
72                setGeometry(rect);
73        }
[5354a01311]74#endif // Q_OS_WINCE
[fc9f661ded]75        qsrand(QDateTime().currentDateTime().toTime_t());
[2bc8e278b7]76        tspmodel = new CTSPModel();
77        tspmodel->setNumCities(spinCities->value());
78        taskView->setModel(tspmodel);
[993d5af6f6]79        connect(tspmodel,SIGNAL(numCitiesChanged(int)),this,SLOT(numCitiesChanged(int)));
[aecdf994f9]80#ifdef Q_OS_WINCE
81        taskView->resizeColumnsToContents();
82        taskView->resizeRowsToContents();
83#endif // Q_OS_WINCE
[003e4193be]84}
[052d1b9331]85
[ac4cb71650]86bool MainWindow::loadLanguage(QString lang)
[899d1b8e15]87{
88// i18n
[ac4cb71650]89bool ad = false;
90        if (lang.isEmpty()) {
91                ad = settings->value("Language","").toString().isEmpty();
92                lang = settings->value("Language",QLocale::system().name()).toString();
93        }
[899d1b8e15]94static QTranslator *qtTranslator;
95        if (qtTranslator) {
96                qApp->removeTranslator(qtTranslator);
97                delete qtTranslator;
98                qtTranslator = NULL;
99        }
100        qtTranslator = new QTranslator();
[ac4cb71650]101static QTranslator *translator;
102        if (translator) {
103                qApp->removeTranslator(translator);
104                delete translator;
105        }
106        translator = new QTranslator();
[899d1b8e15]107        if (lang.compare("en") && !lang.startsWith("en_")) {
108                // Trying to load system Qt library translation...
109                if (qtTranslator->load("qt_" + lang,QLibraryInfo::location(QLibraryInfo::TranslationsPath)))
110                        qApp->installTranslator(qtTranslator);
111                else
112                        // No luck. Let's try to load bundled one.
113                        if (qtTranslator->load("qt_" + lang,"i18n"))
114                                qApp->installTranslator(qtTranslator);
115                        else {
116                                delete qtTranslator;
117                                qtTranslator = NULL;
118                        }
[ac4cb71650]119                // Now let's load application translation.
[899d1b8e15]120                if (translator->load(lang,"i18n"))
121                        qApp->installTranslator(translator);
122                else {
123                        if (!ad)
124                                QMessageBox(QMessageBox::Warning,trUtf8("Language change"),trUtf8("Unable to load translation language."),QMessageBox::Ok,this).exec();
125                        delete translator;
126                        translator = NULL;
127                        return false;
128                }
129        }
130        return true;
131}
132
133void MainWindow::spinCitiesValueChanged(int n)
[003e4193be]134{
[aecdf994f9]135#ifdef Q_OS_WINCE
136int count = tspmodel->numCities();
137#endif // Q_OS_WINCE
[2bc8e278b7]138        tspmodel->setNumCities(n);
[aecdf994f9]139#ifdef Q_OS_WINCE
140        if (n > count)
141                for (int k = count; k < n; k++) {
142                        taskView->resizeColumnToContents(k);
143                        taskView->resizeRowToContents(k);
144                }
145#endif // Q_OS_WINCE
[5515c2c2a7]146}
147
[899d1b8e15]148
149void MainWindow::actionFileNewTriggered()
150{
151        tspmodel->clear();
152}
153
[993d5af6f6]154void MainWindow::actionFileOpenTriggered()
155{
156QFileDialog od(this);
157        od.setAcceptMode(QFileDialog::AcceptOpen);
158        od.setFileMode(QFileDialog::ExistingFile);
159QStringList filters(trUtf8("All Supported Formats") + " (*.tspt *.zkt)");
160        filters.append(QString(trUtf8("%1 Task Files")).arg("TSPSG") + " (*.tspt)");
161        filters.append(QString(trUtf8("%1 Task Files")).arg("ZKomModRd") + " (*.zkt)");
162        filters.append(trUtf8("All Files") + " (*)");
163        od.setNameFilters(filters);
164        if (od.exec() != QDialog::Accepted)
165                return;
166QStringList files = od.selectedFiles();
167        if (files.size() < 1)
168                return;
169        tspmodel->loadTask(files.first());
170}
171
172void MainWindow::actionFileSaveTaskTriggered()
173{
174QFileDialog sd(this);
175        sd.setAcceptMode(QFileDialog::AcceptSave);
176QStringList filters(QString(trUtf8("%1 Task File")).arg("TSPSG") + " (*.tspt)");
177        filters.append(trUtf8("All Files") + " (*)");
178        sd.setNameFilters(filters);
179        sd.setDefaultSuffix("tspt");
180        if (sd.exec() != QDialog::Accepted)
181                return;
182QStringList files = sd.selectedFiles();
183        if (files.size() < 1)
184                return;
185        tspmodel->saveTask(files.first());
186}
187
[899d1b8e15]188void MainWindow::actionSettingsPreferencesTriggered()
[5515c2c2a7]189{
190SettingsDialog sd(this);
[aecdf994f9]191        sd.exec();
[5515c2c2a7]192}
[bb994a7ff8]193
[5354a01311]194#ifndef Q_OS_WINCE
[899d1b8e15]195void MainWindow::actionFilePrintSetupTriggered()
[5354a01311]196{
[899d1b8e15]197QPrintDialog pd(printer,this);
198        pd.setOption(QAbstractPrintDialog::PrintSelection,false);
199        pd.setOption(QAbstractPrintDialog::PrintPageRange,false);
[5354a01311]200        pd.exec();
201}
202#endif // Q_OS_WINCE
203
[899d1b8e15]204void MainWindow::buttonRandomClicked()
[bb994a7ff8]205{
[2bc8e278b7]206        tspmodel->randomize();
[aecdf994f9]207#ifdef Q_OS_WINCE
208        taskView->resizeColumnsToContents();
209        taskView->resizeRowsToContents();
210#endif // Q_OS_WINCE
[bb994a7ff8]211}
212
[899d1b8e15]213void MainWindow::buttonSolveClicked()
[bb994a7ff8]214{
215        // TODO: Task solving goes here :-)
[e664262f7d]216tMatrix matrix;
217double *row;
[2bc8e278b7]218int n = spinCities->value();
[e664262f7d]219bool ok;
[2bc8e278b7]220        for (int r = 0; r < n; r++) {
221                row = new double[n];
222                for (int c = 0; c < n; c++) {
223                        row[c] = tspmodel->index(r,c).data(Qt::UserRole).toDouble(&ok);
224                        if (!ok) {
[5587b87fac]225                                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();
[2bc8e278b7]226                                return;
[e664262f7d]227                        }
228                }
229                matrix.append(row);
230        }
231CTSPSolver solver;
232sStep *root = solver.solve(spinCities->value(),matrix);
233        if (!root)
[5587b87fac]234                QMessageBox(QMessageBox::Critical,trUtf8("Solution error"),trUtf8("There was an error while solving the task."),QMessageBox::Ok,this).exec();
[e664262f7d]235        // tabWidget->setCurrentIndex(1);
[bb994a7ff8]236}
[aecdf994f9]237
[899d1b8e15]238void MainWindow::actionHelpAboutTriggered()
[aecdf994f9]239{
240        // TODO: Normal about window :-)
[ac4cb71650]241QString about = QString::fromUtf8("TSPSG - TSP Solver and Generator\n");
242about += QString::fromUtf8("    Copyright (C) 2007-%1 Lёppa <contacts[at]oleksii[dot]name>\n").arg(QDate::currentDate().toString("yyyy"));
243        about += "Qt library versions:\n";
[993d5af6f6]244        about += QString::fromUtf8("    OS: %1\n").arg(OS);
[ac4cb71650]245        about += QString::fromUtf8("    Compile time: %1\n").arg(QT_VERSION_STR);
246        about += QString::fromUtf8("    Runtime: %1\n").arg(qVersion());
247        about += "\n";
248        about += "TSPSG is licensed under the terms of the GNU General Public License. You should have received a copy of the GNU General Public License along with TSPSG.";
[5587b87fac]249        QMessageBox(QMessageBox::Information,"About",about,QMessageBox::Ok,this).exec();
[aecdf994f9]250}
251
[899d1b8e15]252void MainWindow::loadLangList()
253{
254QSettings langinfo("i18n/languages.ini",QSettings::IniFormat);
255        langinfo.setIniCodec("UTF-8");
256QDir dir("i18n","*.qm",QDir::Name | QDir::IgnoreCase,QDir::Files);
257        if (!dir.exists())
258                return;
259QFileInfoList langs = dir.entryInfoList();
260        if (langs.size() <= 0)
261                return;
262QAction *a;
263        for (int k = 0; k < langs.size(); k++) {
264                QFileInfo lang = langs.at(k);
[ac4cb71650]265                if (!lang.completeBaseName().startsWith("qt_") && lang.completeBaseName().compare("en")) {
[899d1b8e15]266                        a = menuSettingsLanguage->addAction(langinfo.value(lang.completeBaseName() + "/NativeName",lang.completeBaseName()).toString());
267                        a->setData(lang.completeBaseName());
268                        a->setCheckable(true);
269                        a->setActionGroup(groupSettingsLanguageList);
270                        if (settings->value("Language",QLocale::system().name()).toString().startsWith(lang.completeBaseName()))
271                                a->setChecked(true);
272                }
273        }
274}
275
276void MainWindow::actionSettingsLanguageAutodetectTriggered(bool checked)
277{
278        if (checked) {
279                settings->remove("Language");
280                QMessageBox(QMessageBox::Information,trUtf8("Language change"),trUtf8("Language will be autodetected on next application start."),QMessageBox::Ok,this).exec();
281        } else
282                settings->setValue("Language",groupSettingsLanguageList->checkedAction()->data().toString());
283}
284
285void MainWindow::groupSettingsLanguageListTriggered(QAction *action)
286{
287        if (actionSettingsLanguageAutodetect->isChecked()) {
288                // We have language autodetection. It needs to be disabled to change language.
289                if (QMessageBox(QMessageBox::Question,trUtf8("Language change"),trUtf8("You have language autodetection turned on.\nIt needs to be off.\nDo you wish to turn it off?"),QMessageBox::Yes | QMessageBox::No,this).exec() == QMessageBox::Yes) {
290                        actionSettingsLanguageAutodetect->trigger();
291                } else
292                        return;
293        }
[ac4cb71650]294        if (loadLanguage(action->data().toString())) {
[899d1b8e15]295                settings->setValue("Language",action->data().toString());
296                retranslateUi(this);
297        }
298}
299
[aecdf994f9]300void MainWindow::closeEvent(QCloseEvent *event)
301{
[665d32434f]302        settings->setValue("NumCities",spinCities->value());
[0621172ec1]303#ifndef Q_OS_WINCE
304        // Saving windows state
[665d32434f]305        if (settings->value("SavePos",false).toBool()) {
306                settings->beginGroup("MainWindow");
307                settings->setValue("Maximized",isMaximized());
[aecdf994f9]308                if (!isMaximized()) {
[665d32434f]309                        settings->setValue("Size",size());
310                        settings->setValue("Position",pos());
[aecdf994f9]311                }
[665d32434f]312                settings->endGroup();
[aecdf994f9]313        }
[0621172ec1]314#endif // Q_OS_WINCE
[aecdf994f9]315        QMainWindow::closeEvent(event);
316}
[993d5af6f6]317
318void MainWindow::numCitiesChanged(int nCities)
319{
320        spinCities->setValue(nCities);
321}
Note: See TracBrowser for help on using the repository browser.