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
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
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
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
00200
00201 }
00202
00203
00204
00205 void MainWindow::saveSpecificVolumeDataset(dataset_key_type const& dataset_name)
00206 {
00207
00208
00209
00210
00211
00212
00213
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
00231
00232
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
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
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
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
00409
00410
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
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
00460
00461 standard_mode_action_ = new QAction(QIcon(":icons/process-stop.png"), tr("Select"), this);
00462
00463 zoom_in_mode_action_ = new QAction(QIcon(":icons/page-magnifier"), tr("Zoom In"), this);
00464
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
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
00556 connect(save_dataset_action_, SIGNAL(triggered()),
00557 this, SLOT(checkForDirtyToSave()));
00558 connect(save_as_dataset_action_, SIGNAL(triggered()),
00559 this, SLOT(openDatasetSaveSelectionDialog()));
00560
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
00588
00589
00590
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
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
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
00686 if( *iterator == file_path)
00687 {
00688
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 }