main_window.cpp

Go to the documentation of this file.
00001 //--------------------------------------------------
00011 //---------------------------------------------------
00012 
00013 
00014 #include "../controller/controller.h"
00015 #include "../global/settings.h"
00016 
00017 #include "main_window.h"
00018 #include "datasets_viewer.h"
00019 #include "choose_views_dialog.h"
00020 #include "tab_organizer.h"
00021 #include "view_container_widget.h"
00022 #include "algorithm_widget.h"
00023 #include "dataset_configuration_tab_widget.h"
00024 #include "settings/settings_dialog.h"
00025 #include "choose_datasets_dialog.h"
00026 #include "about_dialog.h"
00027 
00028 #include "../algorithms/configuration.h"
00029 
00030 #include <Inventor/Qt/SoQt.h>
00031 #include <QtGui>
00032 #include <QToolBar>
00033 #include <QMessageBox>
00034 #include <QPixmap>
00035 #include <QSettings>
00036 
00037 #include <vector>
00038 #include <string>
00039 
00040 #include <VolumeViz/nodes/SoVolumeRendering.h>
00041 
00042 namespace imedgine
00043 {
00044 
00045   // ---------------- public -------------------------
00046 
00047   //--------------------------------------------------
00048 
00049   MainWindow::MainWindow()
00050   : QMainWindow(),
00051     first_launch_(true),
00052     tab_organizer_(0),
00053     choose_views_dialog_(0),
00054     settings_dialog_(0),
00055     about_dialog_(0)
00056   {
00057     setupUI();
00058     updateRecentFileActions();
00059   }
00060 
00061   //--------------------------------------------------
00062 
00063   MainWindow::~MainWindow()
00064   {
00065   }
00066 
00067   // ---------------- public slots -------------------
00068 
00069   //--------------------------------------------------
00070 
00071   void MainWindow::newDatasetsAdded(
00072       std::vector<std::pair<dataset_key_type, dataset_type> > const& dataset_keys_and_types)
00073   {
00074     std::vector<std::pair<dataset_key_type, dataset_type> >::const_iterator iter = 
00075         dataset_keys_and_types.begin();
00076     for ( ; iter != dataset_keys_and_types.end(); ++iter)
00077     {
00078       loaded_datasets_.insert(*iter);
00079       datasets_viewer_->addDataset(iter->first);
00080       std::cout << "opening overview " << iter->first << std::endl;
00081       this->openOverview(iter->first, iter->second);
00082     }
00083   }
00084   
00085   //--------------------------------------------------
00086   
00087   void MainWindow::openOverview(dataset_key_type const& dataset, dataset_type type)
00088   {
00089     switch (type)
00090     {
00091       case ONE_BYTE_IMAGE_PIXEL_DATASET :
00092       case TWO_BYTE_IMAGE_PIXEL_DATASET :
00093       case FOUR_BYTE_IMAGE_PIXEL_DATASET :
00094       {
00095         tab_organizer_->openOverviewForImage(dataset);
00096         break;
00097       }
00098       case ONE_BYTE_VOLUME_PIXEL_DATASET :
00099       case TWO_BYTE_VOLUME_PIXEL_DATASET :
00100       case FOUR_BYTE_VOLUME_PIXEL_DATASET :
00101       {
00102         tab_organizer_->openOverviewForVolume(dataset);
00103       }
00104       default :
00105       {
00106         return;  
00107       }
00108     }
00109   }
00110   
00111   //--------------------------------------------------
00112   
00113   void MainWindow::openOverview(dataset_key_type const& dataset)
00114   {
00115     std::map<dataset_key_type, dataset_type>::const_iterator iter =
00116         loaded_datasets_.find(dataset);
00117     if (iter != loaded_datasets_.end())
00118     {
00119       this->openOverview(dataset, iter->second);
00120     }
00121   }
00122 
00123   //--------------------------------------------------
00124 
00125   void MainWindow::openNewWorkspace(std::vector<view_pointer_type> const& view_vector)
00126   {
00127     QString title = tr("Custom_Tab", "MainWindow");
00128     tab_organizer_->addTab(view_vector, title);
00129   }
00130 
00131   // ---------------- private slots ------------------
00132 
00133   //--------------------------------------------------
00134 
00135   void MainWindow::openFileFromDialog()
00136   {
00137     QFileDialog open_dialog(this);
00138 
00139     QVariant previous_open_path =
00140       (Settings::getInstance())->getValue("last_open_path", "/");
00141 
00142     QString open_path = open_dialog.getOpenFileName(
00143         this,
00144         tr("Choose a File to Open"),
00145         previous_open_path.toString(),
00146         "Analyze Files (*.hdr)");
00147 
00148     if(!open_path.isEmpty())
00149     {
00150       (Settings::getInstance())->setValue("last_open_path", QVariant(open_path));
00151 
00152       loadDataset(open_path);
00153     }
00154   }
00155 
00156   //--------------------------------------------------
00157 
00158   void MainWindow::openRecentFile()
00159   {
00160     QAction* action = qobject_cast<QAction *>(sender());
00161     if (action)
00162     {
00163        loadDataset((action->data()).toString());
00164     }
00165   }
00166 
00167 
00168   //--------------------------------------------------
00169 
00170   void MainWindow::newTabSlot()
00171   {
00172     if(choose_views_dialog_ == 0)
00173     {
00174       choose_views_dialog_ = new ChooseViewsDialog(this);
00175       connect(choose_views_dialog_, SIGNAL(sendViewVector(std::vector<view_pointer_type>)),
00176             this, SLOT(openNewWorkspace(std::vector<view_pointer_type>)));
00177     }
00178     choose_views_dialog_->show();
00179   }
00180 
00181   //--------------------------------------------------
00182 
00183   void MainWindow::closeDataset(dataset_key_type const& dataset_name)
00184   {
00185     if(datasets_viewer_->count() == 0)
00186     {
00187       toggleDatasetDependendActionStatus(false);
00188     }
00189     
00190     emit closeDatasetSignal(dataset_name);
00191     Controller::getInstance().removeDataset(dataset_name);
00192     emit datasetClosedSignal(dataset_name);
00193 
00194     loaded_datasets_.erase(dataset_name);
00195   }
00196 
00197   void MainWindow::checkForDirtyToSave()
00198   {
00199     // TODO: iterate the dirty flags of the loaded datasets
00200     // TODO: check for type of dataset
00201   }
00202 
00203   //--------------------------------------------------
00204 
00205   void MainWindow::saveSpecificVolumeDataset(dataset_key_type const& dataset_name)
00206   {
00207     //TODO: Does not work, and seg fault if not .hdr!
00208     //TODO: Check if the dataset already has a path, if not, call save as
00209     //TODO: substitute written.hdr with the saved path
00210     //TODO: exception handling!
00211     //TODO: write permissions
00212     //TODO: add extension if not yet done
00213     //TODO: destinguish between different types of files
00214 
00215     if ((Controller::getInstance().getDataset(dataset_name))->isDirty())
00216     {
00217       std::cout << "Trying to write Datset" << std::endl;
00218       Controller::getInstance().writeDataset(dataset_name, "/written.hdr");
00219     }
00220     else
00221     {
00222       std::cout << "Dataset is not dirty, nothing to do" << std::endl;
00223     }
00224   }
00225 
00226   //--------------------------------------------------
00227 
00228   void MainWindow::openDatasetSaveSelectionDialog()
00229   {
00230     // TODO: some time, when more than only volume datasets
00231     // can be saved, implement the switching between the different
00232     // save types in here
00233 
00234     if(loaded_datasets_.size() == 1)
00235     {
00236       saveVolumeDatasetAs(loaded_datasets_.begin()->first);
00237     }
00238     else if(loaded_datasets_.size() > 1)
00239     {
00240       dataset_key_container_type dataset_keys;
00241       std::map<dataset_key_type, dataset_type>::const_iterator iter =
00242           loaded_datasets_.begin();
00243       for ( ; iter != loaded_datasets_.end(); ++iter)
00244       {
00245         dataset_keys.push_back(iter->first);
00246       }
00247       
00248       ChooseDatasetsDialog choose_datasets_dialog(this, dataset_keys);
00249  
00250       if(choose_datasets_dialog.exec())
00251       {
00252         dataset_key_container_type datasets_to_save =
00253           choose_datasets_dialog.getDatasetsToSave();
00254         dataset_key_container_type::iterator dataset_name_iterator = datasets_to_save.begin();
00255         while(dataset_name_iterator != datasets_to_save.end())
00256         {
00257           saveVolumeDatasetAs(*dataset_name_iterator);
00258           ++dataset_name_iterator;
00259         }
00260       }
00261     }
00262   }
00263 
00264   //--------------------------------------------------
00265 
00266   void MainWindow::saveVolumeDatasetAs(dataset_key_type const& dataset_name)
00267   {
00268     QVariant previous_saving_path =
00269       (Settings::getInstance())->getValue("last_saving_path", "/");
00270 
00271     QFileDialog save_dialog(this);
00272 
00273     QString dialog_title = tr("Choose a path to Save ");
00274     dialog_title += dialog_title.fromStdString(dataset_name);
00275 
00276     QString saving_path = save_dialog.getSaveFileName(
00277         this,
00278         dialog_title,
00279         previous_saving_path.toString(),
00280         "Analyze Files (*.hdr)");
00281 
00282 
00283     if(!saving_path.isEmpty())
00284     {
00285       (Settings::getInstance())->setValue("last_saving_path", QVariant(saving_path));
00286       // TODO: Segfault if not .hdr file
00287       Controller::getInstance().writeDataset(dataset_name, saving_path.toStdString());
00288     }
00289   }
00290 
00291   //--------------------------------------------------
00292 
00293   void MainWindow::updateGuiInteractionMode()
00294   {
00295 
00296     if (sender() == standard_mode_action_)
00297     {
00298       Controller::getInstance().setGuiInteractionMode(STANDARD_MODE);
00299       return;
00300     }
00301     else if (sender() == zoom_in_mode_action_)
00302     {
00303       Controller::getInstance().setGuiInteractionMode(ZOOM_IN_MODE);
00304       return;
00305     }
00306     else if (sender() == zoom_out_mode_action_)
00307     {
00308       Controller::getInstance().setGuiInteractionMode(ZOOM_OUT_MODE);
00309       return;
00310     }
00311     else if (sender() == pan_mode_action_)
00312     {
00313       Controller::getInstance().setGuiInteractionMode(PAN_MODE);
00314       return;
00315     }
00316     else if (sender() == rotation_mode_action_)
00317     {
00318       Controller::getInstance().setGuiInteractionMode(ROTATION_MODE);
00319       return;
00320     }
00321     else if (sender() == region_of_interest_rectangle_mode_action_)
00322     {
00323       Controller::getInstance().setGuiInteractionMode(REGION_OF_INTEREST_RECTANGLE_MODE);
00324       return;
00325     }
00326     else if (sender() == region_of_interest_ellipse_mode_action_)
00327     {
00328       Controller::getInstance().setGuiInteractionMode(REGION_OF_INTEREST_ELLIPSE_MODE);
00329       return;
00330     }
00331     else if (sender() == region_of_interest_poly_line_mode_action_)
00332     {
00333       Controller::getInstance().setGuiInteractionMode(REGION_OF_INTEREST_POLY_LINE_MODE);
00334       return;
00335     }
00336     else if (sender() == region_of_interest_freehand_mode_action_)
00337     {
00338       Controller::getInstance().setGuiInteractionMode(REGION_OF_INTEREST_FREEHAND_MODE);
00339       return;
00340     }
00341     else
00342     {
00343       // TODO: throw unknownModeException
00344     }
00345    
00346   }
00347 
00348   //--------------------------------------------------
00349 
00350   void MainWindow::openSettingsDialog()
00351   {
00352     if(settings_dialog_ == 0)
00353     {
00354       settings_dialog_ = new SettingsDialog(this);
00355     }
00356     settings_dialog_->show();
00357   }
00358 
00359   //--------------------------------------------------
00360 
00361   void MainWindow::openAboutDialog()
00362   {
00363     if(about_dialog_ == 0)
00364     {
00365       about_dialog_ = new AboutDialog(this);
00366     }
00367     about_dialog_->show();
00368   }
00369 
00370   // ---------------- private ------------------------
00371 
00372   //--------------------------------------------------
00373 
00374   void MainWindow::setupUI()
00375   {
00376     setWindowTitle(tr("iMEDgine"));
00377     setWindowState(Qt::WindowMaximized);
00378 
00379     SoQt::init(this);
00380     SoVolumeRendering::init();
00381     
00382     datasets_viewer_ = new DatasetsViewer();
00383     datasets_viewer_dock_widget_ = new QDockWidget(tr("Datasets Viewer"));
00384     datasets_viewer_dock_widget_->setWidget(datasets_viewer_);
00385 
00386     
00387     dataset_configuration_tab_widget_ =
00388         new DatasetConfigurationTabWidget();
00389     dataset_configuration_editor_dock_widget_ =
00390         new QDockWidget(tr("Dataset Configuration"));
00391     dataset_configuration_editor_dock_widget_->setWidget(dataset_configuration_tab_widget_);
00392     
00393     addDockWidget(Qt::LeftDockWidgetArea, datasets_viewer_dock_widget_);
00394     addDockWidget(Qt::LeftDockWidgetArea, dataset_configuration_editor_dock_widget_);
00395     
00396     tab_organizer_ = new TabOrganizer(this);
00397     setCentralWidget(tab_organizer_);
00398     createActions();
00399     createMenus();
00400     createToolBars();
00401     createStatusBar();
00402     
00403     algorithm_name_container_type loaded_algorithms =
00404         Controller::getInstance().getLoadedAlgorithmNames();
00405     
00406     if(loaded_algorithms.size() == 0)
00407     {
00408       //QMessageBox::information(this, tr("Warning"),
00409       //                         tr("No algorithms found. Please check your config file"));
00410       //std::cout << "No algorithms found" << std::endl;
00411     }
00412     else
00413     {
00414       algorithm_config_dock_widget_ = new QDockWidget(tr("Algorithms"));
00415       algo_widget_ = new AlgorithmWidget(loaded_algorithms);
00416       algorithm_config_dock_widget_->setWidget(algo_widget_);
00417       addDockWidget(Qt::RightDockWidgetArea, algorithm_config_dock_widget_);
00418       toolbox_menu_->addAction(
00419           algorithm_config_dock_widget_->toggleViewAction());
00420     }
00421     initializeConnections();
00422   }
00423 
00424   //--------------------------------------------------
00425 
00426   void MainWindow::createActions()
00427   {
00428     load_dataset_action_ = new QAction(QIcon(":icons/document-open.png"),
00429       tr("&Open"), this);
00430     save_dataset_action_ = new QAction(QIcon(":icons/document-save.png"),
00431       tr("&Save"), this);
00432     save_as_dataset_action_ = new QAction(QIcon(":icons/document-save-as.png"),
00433       tr("S&ave as"), this);
00434     new_tab_action_ = new QAction(QIcon(":icons/tab-new.png"),
00435       tr("&New Tab"), this);
00436 
00437     for (int counter = 0; counter < max_recent_files; ++counter)
00438     {
00439       recent_file_actions_[counter] = new QAction(this);
00440       recent_file_actions_[counter]->setVisible(false);
00441       connect(recent_file_actions_[counter], SIGNAL(triggered()),
00442               this, SLOT(openRecentFile()));
00443     }
00444 
00445     // TODO: bad icon
00446     quit_action_ = new QAction(QIcon(":icons/document-close.png"), tr("&Quit"), this);
00447 
00448 
00449    configure_imedgine_action_ = new QAction(QIcon(":icons/preferences-imedgine.png"),
00450       tr("&Configure iMEDgine"), this);
00451 
00452     toggle_datasets_viewer_action_ = datasets_viewer_dock_widget_->toggleViewAction();
00453 
00454     toggle_dataset_configuration_editor_action_ =
00455       dataset_configuration_editor_dock_widget_->toggleViewAction();
00456 
00457     about_action_ = new QAction(tr("&About"), this);
00458 
00459     // -----------    Toolbar Actions   --------
00460     // TODO: bad icon
00461     standard_mode_action_ = new QAction(QIcon(":icons/process-stop.png"), tr("Select"), this);
00462     // TODO: bad icon
00463     zoom_in_mode_action_ = new QAction(QIcon(":icons/page-magnifier"), tr("Zoom In"), this);
00464     // TODO: bad icon
00465     zoom_out_mode_action_ = new QAction(QIcon(":icons/page-magnifier"), tr("Zoom Out"), this);
00466     pan_mode_action_ = new QAction(QIcon(":icons/transform-move.png"), tr("Pan"), this);
00467     // TODO: bad icon
00468     rotation_mode_action_ = new QAction(QIcon(":icons/view-refresh.png"), tr("Rotate"), this);
00469     region_of_interest_rectangle_mode_action_ =
00470       new QAction(QIcon(":icons/draw-rectangle.png"), tr("Draw Rectangle"), this);
00471     region_of_interest_ellipse_mode_action_ =
00472       new QAction(QIcon(":icons/draw-ellipse.png"), tr("Draw Ellipse"), this);
00473     region_of_interest_poly_line_mode_action_ =
00474       new QAction(QIcon(":icons/draw-polyline.png"), tr("Draw Polyline"), this);
00475     region_of_interest_freehand_mode_action_ =
00476       new QAction(QIcon(":icons/draw-freehand.png"), tr("Draw Freehand"), this);
00477 
00478     toggleDatasetDependendActionStatus(false);
00479   }
00480 
00481   //--------------------------------------------------
00482 
00483   void MainWindow::createMenus()
00484   {
00485     file_menu_ = menuBar()->addMenu(tr("&File"));
00486     file_menu_->addAction(load_dataset_action_);
00487     file_menu_->addAction(save_dataset_action_);
00488     file_menu_->addAction(save_as_dataset_action_);
00489     file_menu_->addAction(new_tab_action_);
00490     separator_action_ = file_menu_->addSeparator();
00491 
00492     for (int counter = 0; counter < max_recent_files; ++counter)
00493       file_menu_->addAction(recent_file_actions_[counter]);
00494 
00495     file_menu_->addSeparator();
00496     file_menu_->addAction(quit_action_);
00497 
00498     menuBar()->addSeparator();
00499     
00500     view_menu_ = menuBar()->addMenu(tr("&View"));
00501     toolbox_menu_ = view_menu_->addMenu(tr("&Toolboxes"));
00502     toolbox_menu_->addAction(toggle_datasets_viewer_action_);
00503     toolbox_menu_->addAction(toggle_dataset_configuration_editor_action_);
00504 
00505     settings_menu_ = menuBar()->addMenu(tr("&Settings"));
00506     settings_menu_->addAction(configure_imedgine_action_);
00507 
00508     help_menu_ = menuBar()->addMenu(tr("&Help"));
00509     help_menu_->addAction(about_action_);
00510   }
00511 
00512   //--------------------------------------------------
00513 
00514   void MainWindow::createToolBars()
00515   {
00516     QToolBar* main_tool_bar_ = addToolBar(tr("File"));
00517     main_tool_bar_->addAction(load_dataset_action_);
00518     main_tool_bar_->addAction(save_dataset_action_);
00519     main_tool_bar_->addAction(save_as_dataset_action_);
00520     main_tool_bar_->addSeparator();
00521     main_tool_bar_->addAction(new_tab_action_);
00522 
00523 
00524     addToolBar(Qt::TopToolBarArea, main_tool_bar_);
00525 
00526     QToolBar* mode_tool_bar_ = addToolBar(tr("Modes"));
00527     mode_tool_bar_->addAction(standard_mode_action_);
00528     mode_tool_bar_->addSeparator();
00529     mode_tool_bar_->addAction(zoom_in_mode_action_);
00530     mode_tool_bar_->addAction(zoom_out_mode_action_);
00531     mode_tool_bar_->addSeparator();
00532     mode_tool_bar_->addAction(pan_mode_action_);
00533     mode_tool_bar_->addAction(rotation_mode_action_);
00534     mode_tool_bar_->addSeparator();
00535     mode_tool_bar_->addAction(region_of_interest_rectangle_mode_action_);
00536     mode_tool_bar_->addAction(region_of_interest_ellipse_mode_action_);
00537     mode_tool_bar_->addAction(region_of_interest_poly_line_mode_action_);
00538     mode_tool_bar_->addAction(region_of_interest_freehand_mode_action_);
00539     addToolBar(Qt::TopToolBarArea, mode_tool_bar_);
00540   }
00541 
00542   //--------------------------------------------------
00543 
00544   void MainWindow::createStatusBar()
00545   {
00546     statusBar()->showMessage(tr("Ready"));
00547   }
00548 
00549   //--------------------------------------------------
00550 
00551   void MainWindow::initializeConnections()
00552   {
00553     connect(load_dataset_action_, SIGNAL(triggered()),
00554             this, SLOT(openFileFromDialog()));
00555     // TODO: Check for dirty bit, connect to other slot, check for filename
00556     connect(save_dataset_action_, SIGNAL(triggered()),
00557             this, SLOT(checkForDirtyToSave()));
00558     connect(save_as_dataset_action_, SIGNAL(triggered()),
00559             this, SLOT(openDatasetSaveSelectionDialog()));
00560     // TODO: don't call close directly, check first for unsaved data
00561     connect(quit_action_, SIGNAL(triggered()),
00562             this, SLOT(close()));
00563 
00564     connect(new_tab_action_, SIGNAL(triggered()),
00565             this, SLOT(newTabSlot()));
00566     connect(datasets_viewer_, SIGNAL(datasetDoubleClicked(dataset_key_type const&)),
00567             this, SLOT(openOverview(dataset_key_type const&)));
00568     connect(configure_imedgine_action_, SIGNAL(triggered()),
00569             this, SLOT(openSettingsDialog()));
00570     connect(about_action_, SIGNAL(triggered()),
00571             this, SLOT(openAboutDialog()));
00572 
00573     connect(datasets_viewer_, SIGNAL(closeDatasetSignal(dataset_key_type const&)),
00574             this, SLOT(closeDataset(dataset_key_type const&)));
00575     connect(this, SIGNAL(closeDatasetSignal(dataset_key_type const&)),
00576             tab_organizer_, SLOT(closeTab(dataset_key_type const&)));
00577     connect(algo_widget_, SIGNAL(notifyNewDatasetGeneration(
00578               std::vector<std::pair<dataset_key_type, dataset_type> > const&)),
00579             this, SLOT(newDatasetsAdded(
00580               std::vector<std::pair<dataset_key_type, dataset_type> > const&)));
00581 
00582     connect(datasets_viewer_, SIGNAL(saveDatasetSignal(dataset_key_type const&)),
00583             this, SLOT(saveSpecificVolumeDataset(dataset_key_type const&)));
00584     connect(datasets_viewer_, SIGNAL(saveAsDatasetSignal(dataset_key_type const&)),
00585             this, SLOT(saveDatasetVolumeAs(dataset_key_type const&)));
00586 
00587     // Dataset Configuration
00588     /*connect(this, SIGNAL(newDatasetLoaded(dataset_key_type const&)),
00589             algo_widget_,
00590             SLOT(datasetChanged(dataset_key_type const&)));*/
00591     connect(this, SIGNAL(newDatasetLoaded(dataset_key_type const&)),
00592             dataset_configuration_tab_widget_,
00593             SLOT(addDatasetConfigurationTab(dataset_key_type const&)));
00594     connect(algo_widget_, SIGNAL(notifyNewDatasetGeneration(
00595               std::vector<std::pair<dataset_key_type, dataset_type> > const&)),
00596             dataset_configuration_tab_widget_, SLOT(addDatasetConfigurationTabs(
00597               std::vector<std::pair<dataset_key_type, dataset_type> > const&)));
00598     connect(this, SIGNAL(closeDatasetSignal(dataset_key_type const&)),
00599             dataset_configuration_tab_widget_,
00600             SLOT(removeDatasetConfigurationTab(dataset_key_type const&)));
00601     connect(this, SIGNAL(datasetClosedSignal(dataset_key_type const&)),
00602             algo_widget_,
00603             SLOT(datasetChanged(dataset_key_type const&)));
00604 
00605     // Mode Connections
00606     connect(standard_mode_action_, SIGNAL(triggered()),
00607             this, SLOT(updateGuiInteractionMode()));
00608     connect(zoom_in_mode_action_, SIGNAL(triggered()),
00609             this, SLOT(updateGuiInteractionMode()));
00610     connect(zoom_out_mode_action_, SIGNAL(triggered()),
00611             this, SLOT(updateGuiInteractionMode()));
00612     connect(pan_mode_action_, SIGNAL(triggered()),
00613             this, SLOT(updateGuiInteractionMode()));
00614     connect(rotation_mode_action_, SIGNAL(triggered()),
00615             this, SLOT(updateGuiInteractionMode()));
00616     connect(region_of_interest_rectangle_mode_action_, SIGNAL(triggered()),
00617             this, SLOT(updateGuiInteractionMode()));
00618     connect(region_of_interest_ellipse_mode_action_, SIGNAL(triggered()),
00619             this, SLOT(updateGuiInteractionMode()));
00620     connect(region_of_interest_poly_line_mode_action_, SIGNAL(triggered()),
00621             this, SLOT(updateGuiInteractionMode()));
00622     connect(region_of_interest_freehand_mode_action_, SIGNAL(triggered()),
00623             this, SLOT(updateGuiInteractionMode()));
00624 
00625   }
00626 
00627   //--------------------------------------------------
00628 
00629   void MainWindow::loadDataset(const QString& file_path)
00630   {
00631     std::pair<dataset_key_type, dataset_type> dataset_key_and_type;
00632     try
00633     {
00634       dataset_key_and_type =
00635           Controller::getInstance().loadDataset(file_path.toStdString());
00636     }
00637     catch(FormatNotSupportedException &exc)
00638     {
00639       QMessageBox::information(this, tr("Warning"),
00640                                tr("The filetype is not recognized by the\
00641                                    application!"));
00642       return;
00643     }
00644 
00645     loaded_datasets_.insert(dataset_key_and_type);
00646 
00647     datasets_viewer_->addDataset(dataset_key_and_type.first);
00648     
00649     algo_widget_->datasetChanged(dataset_key_and_type.first);
00650     
00651     this->openOverview(dataset_key_and_type.first, dataset_key_and_type.second);
00652 
00653     updateRecentFileList(file_path);
00654 
00655     std::cout << "Loaded Datasets Size: " << loaded_datasets_.size() << std::endl;
00656 
00657     if(loaded_datasets_.size() == 1)
00658     {
00659       toggleDatasetDependendActionStatus(true);
00660     }
00661     emit newDatasetLoaded(dataset_key_and_type.first);
00662   }
00663 
00664   //--------------------------------------------------
00665   // TODO: change order of the recent files when opened again
00666   void MainWindow::updateRecentFileList(const QString& file_path)
00667   {
00668     QVariant recent_file_setting = (Settings::getInstance())->getValue("recentFileList");
00669     
00670     if(!recent_file_setting.isValid())
00671     {
00672       QStringList list_of_files;
00673       list_of_files << file_path;
00674       (Settings::getInstance())->setValue("recentFileList", QVariant(list_of_files));
00675     }
00676     else
00677     {
00678       QStringList string_list = recent_file_setting.toStringList();
00679       bool already_in_recently_used_files = false;
00680       
00681       QStringList::const_iterator iterator;
00682       for (iterator = string_list.constBegin(); iterator != string_list.constEnd();
00683            ++iterator)
00684       {
00685         //std::cout << (*iterator).toStdString() << std::endl;
00686         if( *iterator == file_path)
00687         {
00688           //std::cout << "ALREADY in RECENTLY" << std::endl;
00689           already_in_recently_used_files = true;
00690         }
00691       }
00692       
00693       if(!already_in_recently_used_files)
00694       {
00695         if(string_list.size() == 5)
00696         {
00697           string_list.removeAt(0);
00698         }
00699         string_list << file_path;
00700         (Settings::getInstance())->setValue("recentFileList", QVariant(string_list));
00701       }
00702     }
00703     updateRecentFileActions();
00704   }
00705 
00706   //--------------------------------------------------
00707 
00708   void MainWindow::updateRecentFileActions()
00709   {
00710     QStringList files = (Settings::getInstance())->getValue("recentFileList").toStringList();
00711 
00712     int num_recent_files = qMin(files.size(), (int)max_recent_files);
00713 
00714     for (int i = 0; i < num_recent_files; ++i) {
00715       QString text = tr("&%1 %2").arg(i + 1).arg(strippedName(files[i]));
00716       recent_file_actions_[i]->setText(text);
00717       recent_file_actions_[i]->setData(files[i]);
00718       recent_file_actions_[i]->setVisible(true);
00719     }
00720     for (int j = num_recent_files; j < max_recent_files; ++j)
00721       recent_file_actions_[j]->setVisible(false);
00722 
00723     separator_action_->setVisible(num_recent_files > 0);
00724   }
00725 
00726   //--------------------------------------------------
00727 
00728   QString MainWindow::strippedName(const QString& full_file_name)
00729   {
00730     return QFileInfo(full_file_name).fileName();
00731   }
00732 
00733   //--------------------------------------------------
00734 
00735   void MainWindow::toggleDatasetDependendActionStatus(bool enable)
00736   {
00737       new_tab_action_->setEnabled(enable);
00738       save_dataset_action_->setEnabled(enable);
00739       save_as_dataset_action_->setEnabled(enable);
00740       standard_mode_action_->setEnabled(enable);
00741       zoom_in_mode_action_->setEnabled(enable);
00742       zoom_out_mode_action_->setEnabled(enable);
00743       pan_mode_action_->setEnabled(enable);
00744       rotation_mode_action_->setEnabled(enable);
00745       region_of_interest_rectangle_mode_action_->setEnabled(enable);
00746       region_of_interest_ellipse_mode_action_->setEnabled(enable);
00747       region_of_interest_poly_line_mode_action_->setEnabled(enable);
00748       region_of_interest_freehand_mode_action_->setEnabled(enable);
00749   }
00750 }

Generated on Sun Aug 13 18:19:40 2006 for iMEDgine by  doxygen 1.4.6