]> AND Private Git Repository - blast.git/blob - MainWindow.cpp
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
1f8c1c0375c158f6dcfe356258fe3850da186166
[blast.git] / MainWindow.cpp
1 #include "MainWindow.h"
2 #include "Dispatcher.h"
3 #include "Parameters.h"
4 #include "BlockLibraryWidget.h"
5 #include "GroupWidget.h"
6 #include "GroupScene.h"
7 #include "BlockWidget.h"
8 #include "AbstractBoxItem.h"
9 #include "Graph.h"
10 #include "GroupItem.h"
11 #include <QDomDocument>
12 #include <QDomElement>
13 #include <QDomText>
14 #include <sstream>
15
16 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
17
18   versionMaj = VERSION_MAJ;
19   versionMin = VERSION_MIN;
20   revision = REVISION;
21
22   // reading parameters
23   params  = new Parameters();
24   try {    
25     params->loadBlastConfiguration("blastconfig.xml");
26
27     if (!QFileInfo::exists(params->refLib)) {
28       params->loadReferencesFromXml();
29       int ret = QMessageBox::question(this,tr("Building references library"),tr("The reference block library does not exists.\n References have been read directly from the xml descriptions of blocks.\n It can be saved into a library in order to start application faster. "), QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Ok);
30       if (ret == QMessageBox::Ok) {
31         params->saveReferencesToLib();
32       }
33     }
34     else {      
35       params->loadReferencesFromLib();
36     }
37
38     if (!QFileInfo::exists(params->implLib)) {
39       params->loadImplementationsFromXml();
40       int ret = QMessageBox::question(this,tr("Building implementations library"),tr("The block implementations library does not exists.\nImplementations have been read directly from the xml descriptions.\n It can be saved into a library in order to start application faster. "), QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Ok);
41       if (ret == QMessageBox::Ok) {
42         params->saveImplementationsToLib();
43       }
44     }
45     else {
46       params->loadImplementationsFromLib();
47     }
48   }
49   catch(Exception err) {
50     cerr << qPrintable(err.getDefaultMessage()) << endl;
51     cerr << "Aborting ..." << endl;
52     exit(1);
53   }
54
55   cout << "all references and implementations are loaded" << endl;
56
57   // create the menu, action, ...
58   dispatcher = new Dispatcher(params,this);
59   params->setDispatcher(dispatcher);
60
61   // creating block library
62   library = new BlockLibraryWidget(dispatcher,params);
63   params->isCurrentProject = false;
64
65   QLabel* labDefault = new QLabel("BLAST: BLock ASsembler Tool");
66   stackedWidget = new QStackedWidget;
67   stackedWidget->addWidget(labDefault);
68   stackedWidget->setCurrentIndex(0);
69   this->setCentralWidget(stackedWidget);
70   this->setMinimumSize(800,600);
71
72   createActions();
73   createMenus(); 
74   setWindowTitle("blast - top group");
75   setFocusPolicy(Qt::StrongFocus);
76   setFocus();
77
78   readSettings();
79
80   initialize();
81
82 }
83
84 MainWindow::~MainWindow() {}
85
86 void MainWindow::initialize() {
87
88   projectMenuEnb = 0;
89
90   stackedWidget->setCurrentIndex(0);
91   enableProjectActions(true,PROJECT_NEW | PROJECT_OPEN, OP_RAZ);
92
93   stackedWidget->setCurrentIndex(0);
94
95   resize(500,300);
96 }
97
98 void MainWindow::readSettings() {
99   QSettings settings;
100   settings.beginGroup("init");
101   checkNewVersion = settings.value("check_new_version").toString();
102   settings.endGroup();
103   if (checkNewVersion.isEmpty()) {
104     checkNewVersion = "true";
105   }
106   /*
107   cout << "test nouvelle version : " << qPrintable(checkNewVersion) << endl;
108   QUrl url("http://www.hrafnheim.fr/download/Cartomagic/carto_currentversion.txt");
109   QNetworkRequest request(url);
110   manager = new QNetworkAccessManager(this);
111   connect(manager,SIGNAL(finished(QNetworkReply*)), this, SLOT(slotCheckNewVersion(QNetworkReply*)));
112   manager->get(request);
113   */
114 }
115
116 void MainWindow::writeSettings() {
117   QSettings settings;
118   settings.beginGroup("init");
119   settings.setValue("check_new_version",checkNewVersion);
120   settings.endGroup();
121 }
122
123 void MainWindow::slotCheckNewVersion(QNetworkReply *reply) {
124
125   if (reply->error() == QNetworkReply::NoError) {
126     QString txt = reply->readAll();
127     QString currentVer = QString("%1.%2.%3").arg(versionMaj).arg(versionMin).arg(revision);
128     if (txt.contains(currentVer)) {
129       cout << "a jour" << endl;
130     }
131     else {
132       cout << "dernière version : " << qPrintable(txt) << ", version actuelle = " << qPrintable(currentVer) << endl;
133     }
134   }
135   else {
136     cout << "erreur = " << qPrintable(reply->errorString()) << endl;
137   }
138   reply->deleteLater();
139 }
140
141 void MainWindow::enableProjectActions(bool enbMenu, quint16 mask, quint8 op) {
142   if (enbMenu) {
143     projectMenu->setEnabled(true);
144   }
145   else {
146     projectMenu->setEnabled(false);
147   }
148
149   if (op == OP_ADD) {
150     projectMenuEnb = projectMenuEnb | mask;
151   }
152   else if (op == OP_REM) {
153     projectMenuEnb = (projectMenuEnb | mask) ^ mask;
154   }
155   else if (op == OP_RAZ) {
156     projectMenuEnb = mask;
157   }
158
159
160   if (projectMenuEnb & PROJECT_NEW) {
161     newProject->setEnabled(true);
162   }
163   else {
164     newProject->setEnabled(false);
165   }
166   if (projectMenuEnb & PROJECT_OPEN) {
167     openProject->setEnabled(true);
168   }
169   else {
170     openProject->setEnabled(false);
171   }
172   if (projectMenuEnb & PROJECT_SAVE) {
173     saveProject->setEnabled(true);
174   }
175   else {
176     saveProject->setEnabled(false);
177   }
178   if (projectMenuEnb & PROJECT_SAVEAS) {
179     saveAsProject->setEnabled(true);
180   }
181   else {
182     saveAsProject->setEnabled(false);
183   }
184   if (projectMenuEnb & PROJECT_CLOSE) {
185     closeProject->setEnabled(true);
186   }
187   else {
188     closeProject->setEnabled(false);
189   }
190   if (projectMenuEnb & PROJECT_LIB) {
191     openLibrary->setEnabled(true);
192   }
193   else {
194     openLibrary->setEnabled(false);
195   }
196 }
197
198 void MainWindow::createMenus(){
199
200   allMenuBar = menuBar();
201
202   projectMenu = allMenuBar->addMenu(tr("&Project"));
203   toolsMenu = allMenuBar->addMenu(tr("&Tools"));
204
205   projectMenu->addAction(newProject);
206   projectMenu->addAction(openProject);
207   projectMenu->addAction(saveProject);
208   projectMenu->addAction(saveAsProject);
209   projectMenu->addAction(closeProject);
210   projectMenu->addAction(openLibrary);
211
212   toolsMenu->addAction(newBlockWidgetAct);
213   toolsMenu->addAction(graphValidation);
214
215 }
216
217 void MainWindow::createActions() {
218
219   newProject = new QAction(tr("&New project"), this);
220   newProject->setIcon(QPixmap::fromImage(QImage("icons/new.ico")));
221   newProject->setStatusTip(tr("Create a new project"));
222   connect(newProject, SIGNAL(triggered()), this, SLOT(slotNewProject()));
223
224   openProject = new QAction(tr("&Open project"), this);
225   openProject->setIcon(QPixmap::fromImage(QImage("icons/load.png")));
226   openProject->setStatusTip(tr("Open an existing project"));
227   connect(openProject, SIGNAL(triggered()), this, SLOT(slotLoadProject()));
228
229   saveProject = new QAction(tr("&Save project"), this);
230   saveProject->setIcon(QPixmap::fromImage(QImage("icons/save.png")));
231   saveProject->setStatusTip(tr("Save the current project"));
232   connect(saveProject, SIGNAL(triggered()), this, SLOT(slotSaveProject()));
233
234   saveAsProject = new QAction(tr("&Save project as..."), this);
235   saveAsProject->setIcon(QPixmap::fromImage(QImage("icons/save-as.png")));
236   saveAsProject->setStatusTip(tr("Save the current project as..."));
237   connect(saveAsProject, SIGNAL(triggered()), this, SLOT(slotSaveAsProject()));
238
239   closeProject = new QAction(tr("&Close project"), this);
240   closeProject->setIcon(QPixmap::fromImage(QImage("icons/close.png")));
241   closeProject->setStatusTip(tr("Close the current project"));
242   connect(closeProject, SIGNAL(triggered()), this, SLOT(slotCloseProject()));
243
244   openLibrary = new QAction(tr("Open block &Library"), this);
245   openLibrary->setIcon(QPixmap::fromImage(QImage("icons/add_block.png")));
246   openLibrary->setStatusTip(tr("Open block library window"));
247   connect(openLibrary, SIGNAL(triggered()), this, SLOT(slotOpenBlockLibrary()));
248
249   newBlockWidgetAct = new QAction(tr("&XML generator"), this);
250   newBlockWidgetAct->setIcon(QPixmap::fromImage(QImage("icons/new.ico")));
251   newBlockWidgetAct->setStatusTip(tr("Create a new XML generator"));
252   connect(newBlockWidgetAct, SIGNAL(triggered()), this, SLOT(slotNewBlockWidget()));
253
254   graphValidation = new QAction(tr("&graph validation"), this);
255   graphValidation->setIcon(QPixmap::fromImage(QImage("icons/new.ico")));
256   graphValidation->setStatusTip(tr("validate the graph"));
257   connect(graphValidation, SIGNAL(triggered()), this, SLOT(slotGraphValidation()));
258
259 }
260
261 void MainWindow::save(QString absoluteFilename) {
262   params->save(absoluteFilename);
263 }
264
265 void MainWindow::slotLoadProject(){
266
267   absoluteFilename = QFileDialog::getOpenFileName(0, "select a project file", "save/",tr("sauvegardes (*.xml)"));
268
269   if(! absoluteFilename.isEmpty()){
270     GroupWidget* topGroup = dispatcher->loadProject(absoluteFilename);
271     if (topGroup != NULL) {
272       addTopGroup(topGroup);
273       library->updateComboScene();
274     }
275     else {
276       QMessageBox msgBox;
277       msgBox.setText("Cannot open the project.");
278       msgBox.setInformativeText("Do you want to save your changes?");
279       msgBox.setStandardButtons(QMessageBox::Cancel);
280       msgBox.setDefaultButton(QMessageBox::Cancel);
281
282       int ret = msgBox.exec();
283     }
284   }
285 }
286
287
288 void MainWindow::slotNewProject(){
289
290   enableProjectActions(true, PROJECT_CLOSE | PROJECT_SAVE | PROJECT_SAVEAS | PROJECT_LIB, OP_RAZ);
291   GroupWidget* topGroup = dispatcher->createTopScene();
292   addTopGroup(topGroup);
293   library->updateComboScene();
294 }
295
296 void MainWindow::slotCloseProject(){
297
298   // removing the GroupWidget from stack
299   QWidget *widget = stackedWidget->widget(1);
300   stackedWidget->removeWidget(widget);
301   stackedWidget->setCurrentIndex(0);
302
303   dispatcher->closeCurrentProject();
304
305
306   params->isCurrentProject = false;
307   params->unsaveModif = false;
308   absoluteFilename = QString();
309
310   initialize();
311 }
312
313
314 void MainWindow::slotNewBlockWidget() {
315   new BlockWidget();
316 }
317
318 void MainWindow::slotSaveProject(){
319   if(absoluteFilename != QString()){
320     save(absoluteFilename);
321   } else {
322     slotSaveAsProject();
323   }
324 }
325
326 void MainWindow::slotSaveAsProject(){
327   if(params->isCurrentProject){
328     QFileDialog dial(0, "Select a file", "save/");
329     dial.setDefaultSuffix(".xml");
330     dial.setAcceptMode(QFileDialog::AcceptSave);
331     if(dial.exec() == QFileDialog::AcceptSave){
332       absoluteFilename = dial.selectedFiles().at(0);
333       if(absoluteFilename != QString())
334         save(absoluteFilename);
335     }
336   }
337 }
338
339 void MainWindow::slotOpenBlockLibrary() {
340   dispatcher->showBlocksLibrary();
341 }
342
343
344 void MainWindow::slotGraphValidation() {
345   params->parametersValidation();
346 }
347
348 void MainWindow::addTopGroup(GroupWidget *_topGroup) {
349   topGroup = _topGroup;
350   stackedWidget->addWidget(topGroup);
351   stackedWidget->setCurrentIndex(1);
352 }
353
354 void MainWindow::removeTopGroup() {
355   stackedWidget->removeWidget(topGroup);
356   topGroup->deleteLater();
357   stackedWidget->setCurrentIndex(0);
358 }
359
360 void MainWindow::closeEvent(QCloseEvent *event){
361   if(params->isCurrentProject){
362     QMessageBox msgBox;
363     msgBox.setText("The project has been modified.");
364     msgBox.setInformativeText("Do you want to save your changes?");
365     msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
366     msgBox.setDefaultButton(QMessageBox::Save);
367
368     int ret = msgBox.exec();
369
370     switch(ret) {
371     case QMessageBox::Save :
372       slotSaveProject();
373       slotCloseProject();
374       break;
375     case QMessageBox::Discard :
376       slotCloseProject();
377       break;
378     }
379     event->ignore();
380   } else {
381     exit(0);
382   }
383 }
384
385 void MainWindow::mousePressEvent(QMouseEvent *e) {
386
387   if (dispatcher->getCurrentGroup() != NULL) {
388     dispatcher->setCurrentGroupWidget(dispatcher->getCurrentGroup());
389   }
390   QMainWindow::mousePressEvent(e);
391 }
392
393 void MainWindow::focusInEvent(QFocusEvent *e) {
394 /*
395   if(params->currentWindow != this){
396     params->setCurrentWindow(this);
397     changeConnectionMode(false);
398   }
399   */
400 }