36 #include "boost/bind.hpp"
90 mFullScreenAction(NULL), mStandard3DViewActions(new QActionGroup(this)), mControlPanel(NULL), mDockWidgets(new
DockWidgets(this))
92 this->setObjectName(
"MainWindow");
97 this->setCentralWidget(
viewService()->getLayoutWidget(
this, 0));
99 this->createActions();
101 this->createToolBars();
110 this->updateWindowTitle();
112 this->setTabPosition(Qt::AllDockWidgetAreas, QTabWidget::North);
116 this->addAsDockWidget(
new EraserWidget(
this),
"Properties");
117 this->addAsDockWidget(
new MetricWidget(mServices->visualizationService, mServices->patientModelService,
this),
"Utility");
118 this->addAsDockWidget(
new SlicePropertiesWidget(mServices->patientModelService, mServices->visualizationService,
this),
"Properties");
119 this->addAsDockWidget(
new VolumePropertiesWidget(mServices->patientModelService, mServices->visualizationService,
this),
"Properties");
120 this->addAsDockWidget(
new MeshInfoWidget(mServices->patientModelService, mServices->visualizationService,
this),
"Properties");
121 this->addAsDockWidget(
new StreamPropertiesWidget(mServices->patientModelService, mServices->visualizationService,
this),
"Properties");
125 this->addAsDockWidget(
new ConsoleWidget(
this,
"ConsoleWidget",
"Console"),
"Utility");
126 this->addAsDockWidget(
new ConsoleWidget(
this,
"ConsoleWidget2",
"Extra Console"),
"Utility");
128 this->addAsDockWidget(
new FrameTreeWidget(mServices->patientModelService,
this),
"Browsing");
138 for (
unsigned i = 0; i < guiExtenders.size(); ++i)
139 this->addGUIExtender(guiExtenders[i].
get());
141 this->setupGUIExtenders();
145 popupMenu->setTitle(
"Window");
146 this->menuBar()->insertMenu(mHelpMenuAction, popupMenu);
150 if (restoreGeometry(
settings()->value(
"mainWindow/geometry").toByteArray()))
156 this->showMaximized();
159 if (
settings()->value(
"gui/fullscreen").toBool())
160 this->setWindowState(this->windowState() | Qt::WindowFullScreen);
165 QMainWindow::changeEvent(event);
167 if (event->type() == QEvent::WindowStateChange)
169 if (mFullScreenAction)
170 mFullScreenAction->setChecked(this->windowState() & Qt::WindowFullScreen);
174 void MainWindow::setupGUIExtenders()
182 mServiceListener->open();
185 void MainWindow::addGUIExtender(GUIExtenderService* service)
187 std::vector<GUIExtenderService::CategorizedWidget> widgets = service->createWidgets();
188 for (
unsigned j = 0; j < widgets.size(); ++j)
190 QWidget* widget = this->addCategorizedWidget(widgets[j]);
191 mWidgetsByPlugin[service].push_back(widget);
194 std::vector<QToolBar*> toolBars = service->createToolBars();
195 for(
unsigned j = 0; j < toolBars.size(); ++j)
197 addToolBar(toolBars[j]);
198 this->registerToolBar(toolBars[j],
"Toolbar");
202 QWidget *MainWindow::addCategorizedWidget(GUIExtenderService::CategorizedWidget categorizedWidget)
205 retval = this->addAsDockWidget(categorizedWidget.mWidget, categorizedWidget.mCategory);
209 void MainWindow::removeGUIExtender(GUIExtenderService* service)
211 while (!mWidgetsByPlugin[service].empty())
214 QWidget* widget = mWidgetsByPlugin[service].back();
215 mWidgetsByPlugin[service].pop_back();
217 QDockWidget* dockWidget =
dynamic_cast<QDockWidget*
>(widget);
218 this->removeDockWidget(dockWidget);
220 mDockWidgets->
erase(dockWidget);
224 for (std::map<QString, QActionGroup*>::iterator iter=mWidgetGroupsMap.begin(); iter!=mWidgetGroupsMap.end(); ++iter)
226 iter->second->removeAction(dockWidget->toggleViewAction());
234 this->addGUIExtender(service);
243 this->removeGUIExtender(service);
249 this->focusInsideDockWidget(sender());
254 this->focusInsideDockWidget(now);
257 void MainWindow::focusInsideDockWidget(QObject *dockWidget)
261 QDockWidget* dw =
dynamic_cast<QDockWidget*
>(dockWidget);
264 if (dw->parent()!=
this)
266 QScrollArea* sa =
dynamic_cast<QScrollArea*
>(dw->widget());
269 QTimer::singleShot(0, sa->widget(), SLOT(setFocus()));
273 void MainWindow::addToWidgetGroupMap(QAction* action, QString groupname)
275 action->setMenuRole(QAction::NoRole);
276 if (mWidgetGroupsMap.find(groupname) != mWidgetGroupsMap.end())
278 mWidgetGroupsMap[groupname]->addAction(action);
282 QActionGroup* group =
new QActionGroup(
this);
283 group->setExclusive(
false);
284 mWidgetGroupsMap[groupname] = group;
285 QAction* heading =
new QAction(groupname,
this);
286 heading->setDisabled(
true);
287 mWidgetGroupsMap[groupname]->addAction(heading);
288 mWidgetGroupsMap[groupname]->addAction(action);
295 mServiceListener.reset();
300 QMenu* popupMenu =
new QMenu(
this);
301 std::map<QString, QActionGroup*>::iterator it = mWidgetGroupsMap.begin();
302 for (; it != mWidgetGroupsMap.end(); ++it)
304 popupMenu->addSeparator();
305 popupMenu->addActions(it->second->actions());
311 void MainWindow::createActions()
315 mStandard3DViewActions = cameraControl->createStandard3DViewActions();
318 mNewPatientAction =
new QAction(QIcon(
":/icons/open_icon_library/document-new-8.png"), tr(
319 "&New patient"),
this);
320 mNewPatientAction->setShortcut(tr(
"Ctrl+N"));
321 mNewPatientAction->setStatusTip(tr(
"Create a new patient file"));
322 mSaveFileAction =
new QAction(QIcon(
":/icons/open_icon_library/document-save-5.png"), tr(
323 "&Save Patient"),
this);
324 mSaveFileAction->setShortcut(tr(
"Ctrl+S"));
325 mSaveFileAction->setStatusTip(tr(
"Save patient file"));
326 mLoadFileAction =
new QAction(QIcon(
":/icons/open_icon_library/document-open-7.png"), tr(
327 "&Load Patient"),
this);
328 mLoadFileAction->setShortcut(tr(
"Ctrl+L"));
329 mLoadFileAction->setStatusTip(tr(
"Load patient file"));
330 mClearPatientAction =
new QAction(tr(
"&Clear Patient"),
this);
331 mExportPatientAction =
new QAction(tr(
"&Export Patient"),
this);
340 mShowControlPanelAction =
new QAction(
"Show Control Panel",
this);
342 mSecondaryViewLayoutWindowAction =
new QAction(
"Show Secondary View Layout Window",
this);
346 mAboutAction =
new QAction(tr(
"About"),
this);
347 mAboutAction->setStatusTip(tr(
"Show the application's About box"));
348 mPreferencesAction =
new QAction(tr(
"Preferences"),
this);
349 mPreferencesAction->setShortcut(tr(
"Ctrl+,"));
350 mPreferencesAction->setStatusTip(tr(
"Show the preferences dialog"));
352 mStartLogConsoleAction =
new QAction(tr(
"&Start Log Console"),
this);
353 mStartLogConsoleAction->setShortcut(tr(
"Ctrl+D"));
354 mStartLogConsoleAction->setStatusTip(tr(
"Open Log Console as external application"));
357 mFullScreenAction =
new QAction(tr(
"Fullscreen"),
this);
358 mFullScreenAction->setShortcut(tr(
"F11"));
359 mFullScreenAction->setStatusTip(tr(
"Toggle full screen"));
360 mFullScreenAction->setCheckable(
true);
361 mFullScreenAction->setChecked(this->windowState() & Qt::WindowFullScreen);
364 mQuitAction =
new QAction(tr(
"&Quit"),
this);
365 mQuitAction->setShortcut(tr(
"Ctrl+Q"));
366 mQuitAction->setStatusTip(tr(
"Exit the application"));
372 mShootScreenAction =
new QAction(tr(
"Shoot Screen"),
this);
373 mShootScreenAction->setIcon(QIcon(
":/icons/screenshot-screen.png"));
374 mShootScreenAction->setShortcut(tr(
"Ctrl+f"));
375 mShootScreenAction->setStatusTip(tr(
"Save a screenshot to the patient folder."));
378 mShootWindowAction =
new QAction(tr(
"Shoot Window"),
this);
379 mShootWindowAction->setIcon(QIcon(
":/icons/screenshot-window.png"));
380 mShootWindowAction->setShortcut(tr(
"Ctrl+Shift+f"));
381 mShootWindowAction->setStatusTip(tr(
"Save an image of the application to the patient folder."));
384 mRecordFullscreenAction =
new QAction(tr(
"Record Fullscreen"),
this);
385 mRecordFullscreenAction->setShortcut(tr(
"F8"));
386 mRecordFullscreenAction->setStatusTip(tr(
"Record a video of the full screen."));
390 mImportDataAction =
new QAction(QIcon(
":/icons/open_icon_library/document-import-2.png"), tr(
"&Import data"),
this);
391 mImportDataAction->setShortcut(tr(
"Ctrl+I"));
392 mImportDataAction->setStatusTip(tr(
"Import image data"));
394 mDeleteDataAction =
new QAction(tr(
"Delete current image"),
this);
395 mDeleteDataAction->setStatusTip(tr(
"Delete selected volume"));
400 mShowPointPickerAction =
new QAction(tr(
"Point Picker"),
this);
401 mShowPointPickerAction->setCheckable(
true);
402 mShowPointPickerAction->setToolTip(
"Activate the 3D Point Picker Probe");
403 mShowPointPickerAction->setIcon(QIcon(
":/icons/point_picker.png"));
411 mToolsActionGroup =
new QActionGroup(
this);
412 mConfigureToolsAction =
new QAction(tr(
"Tool configuration"), mToolsActionGroup);
413 mInitializeToolsAction =
new QAction(tr(
"Initialize"), mToolsActionGroup);
414 mTrackingToolsAction =
new QAction(tr(
"Start tracking"), mToolsActionGroup);
415 mTrackingToolsAction->setShortcut(tr(
"Ctrl+T"));
417 mToolsActionGroup->setExclusive(
false);
419 mStartStreamingAction =
new QAction(tr(
"Start Streaming"), mToolsActionGroup);
420 mStartStreamingAction->setShortcut(tr(
"Ctrl+V"));
425 mConfigureToolsAction->setChecked(
true);
429 connect(mInitializeToolsAction, &QAction::triggered, finit);
435 mCenterToImageCenterAction =
new QAction(tr(
"Center Image"),
this);
436 mCenterToImageCenterAction->setIcon(QIcon(
":/icons/center_image.png"));
438 mCenterToTooltipAction =
new QAction(tr(
"Center Tool"),
this);
439 mCenterToTooltipAction->setIcon(QIcon(
":/icons/center_tool.png"));
442 mSaveDesktopAction =
new QAction(QIcon(
":/icons/workflow_state_save.png"), tr(
"Save desktop"),
this);
443 mSaveDesktopAction->setToolTip(
"Save desktop for workflow step");
445 mResetDesktopAction =
new QAction(QIcon(
":/icons/workflow_state_revert.png"), tr(
"Reset desktop"),
this);
446 mResetDesktopAction->setToolTip(
"Reset desktop for workflow step");
449 mInteractorStyleActionGroup =
viewService()->createInteractorStyleActionGroup();
454 this->setWindowState(this->windowState() ^ Qt::WindowFullScreen);
456 settings()->
setValue(
"gui/fullscreen", (this->windowState() & Qt::WindowFullScreen)!=0);
461 QDesktopWidget* desktop = qApp->desktop();
462 QList<QScreen*> screens = qApp->screens();
464 for (
int i=0; i<desktop->screenCount(); ++i)
466 QWidget* screenWidget = desktop->screen(i);
467 WId screenWinId = screenWidget->winId();
468 QRect geo = desktop->screenGeometry(i);
470 if (desktop->screenCount()>1)
471 name = screens[i]->name().split(
" ").join(
"");
472 this->saveScreenShot(screens[i]->grabWindow(screenWinId, geo.left(), geo.top(), geo.width(), geo.height()), name);
478 QScreen* screen = qApp->primaryScreen();
479 this->saveScreenShot(screen->grabWindow(this->winId()));
484 QString path =
patientService()->generateFilePath(
"Screenshots",
"mp4");
486 if(
vlc()->isRecording())
497 mLocalVideoServerProcess.reset(
new ProcessWrapper(QString(
"LogConsole")));
498 mLocalVideoServerProcess->launchWithRelativePath(fullname, QStringList());
501 void MainWindow::saveScreenShot(QPixmap pixmap, QString
id)
503 QString ending =
"png";
505 ending =
id +
"." + ending;
506 QString path =
patientService()->generateFilePath(
"Screenshots", ending);
507 QtConcurrent::run(boost::bind(&MainWindow::saveScreenShotThreaded,
this, pixmap.toImage(), path));
513 void MainWindow::saveScreenShotThreaded(QImage pixmap, QString filename)
515 pixmap.save(filename,
"png");
516 report(
"Saved screenshot to " + filename);
532 mStartStreamingAction->setIcon(QIcon(
":/icons/streaming_green.png"));
533 mStartStreamingAction->setText(
"Stop Streaming");
537 mStartStreamingAction->setIcon(QIcon(
":/icons/streaming_red.png"));
538 mStartStreamingAction->setText(
"Start Streaming");
549 nav->centerToView(
viewService()->getGroup(0)->getData());
551 nav->centerToGlobalDataCenter();
557 nav->centerToTooltip();
565 data->setOptions(options);
571 bool show =
viewService()->getGroup(0)->getOptions().mShowPointPickerProbe;
572 mShowPointPickerAction->setChecked(show);
579 mTrackingToolsAction->setIcon(QIcon(
":/icons/polaris-green.png"));
580 mTrackingToolsAction->setText(
"Stop Tracking");
584 mTrackingToolsAction->setIcon(QIcon(
":/icons/polaris-red.png"));
585 mTrackingToolsAction->setText(
"Start Tracking");
599 QString timestampFormatFolderFriendly()
601 return QString(
"yyyy-MM-dd_hh-mm");
607 QString patientDatafolder = this->getExistingSessionFolder();
609 QString timestamp = QDateTime::currentDateTime().toString(timestampFormatFolderFriendly());
610 QString filename = QString(
"%1_%2_%3.cx3")
613 .arg(
settings()->value(
"globalPatientNumber").toString());
615 QString choosenDir = patientDatafolder +
"/" + filename;
617 QFileDialog dialog(
this, tr(
"Select directory to save patient in"), patientDatafolder +
"/");
618 dialog.setOption(QFileDialog::DontUseNativeDialog,
true);
619 dialog.setOption(QFileDialog::ShowDirsOnly,
true);
620 dialog.selectFile(filename);
623 choosenDir = dialog.selectedFiles().front();
625 if (!choosenDir.endsWith(
".cx3"))
626 choosenDir += QString(
".cx3");
629 int patientNumber =
settings()->
value(
"globalPatientNumber").toInt();
632 mServices->getSession()->load(choosenDir);
635 QString MainWindow::getExistingSessionFolder()
637 QString folder =
settings()->
value(
"globalPatientDataFolder").toString();
640 if (!QDir().exists(folder))
642 QDir().mkdir(folder);
643 report(
"Made a new patient folder: " + folder);
651 mServices->getSession()->clear();
658 reportWarning(
"No patient selected, select or create patient before saving!");
663 mServices->getSession()->save();
668 this->updateWindowTitle();
671 void MainWindow::updateWindowTitle()
673 QString profileName =
stateService()->getApplicationStateName();
676 QString activePatientFolder =
patientService()->getActivePatientFolder();
677 if (activePatientFolder.endsWith(
'/'))
678 activePatientFolder.chop(1);
681 if (!activePatientFolder.isEmpty())
683 QFileInfo info(activePatientFolder);
684 patientName = info.completeBaseName();
687 QString format(
"%1 %2 - %3 - %4 (not approved for medical use)");
688 QString title = format
689 .arg(qApp->applicationDisplayName())
693 this->setWindowTitle(title);
719 QSize size = this->size();
720 this->resize(size.width()-1, size.height());
744 mControlPanel->show();
749 if (!mSecondaryViewLayoutWindow)
751 mSecondaryViewLayoutWindow->tryShowOnSecondaryScreen();
756 QString patientDatafolder = this->getExistingSessionFolder();
759 QString folder = QFileDialog::getExistingDirectory(
this,
"Select patient", patientDatafolder, QFileDialog::ShowDirsOnly);
760 if (folder.isEmpty())
763 mServices->getSession()->load(folder);
778 QString folder = mLastImportDataFolder;
779 if (folder.isEmpty())
780 folder =
settings()->
value(
"globalPatientDataFolder").toString();
782 QStringList fileName = QFileDialog::getOpenFileNames(
this, QString(tr(
"Select data file(s) for import")),
783 folder, tr(
"Image/Mesh (*.mhd *.mha *.stl *.vtk *.mnc)"));
784 if (fileName.empty())
786 report(
"Import canceled");
790 mLastImportDataFolder = QFileInfo(fileName[0]).absolutePath();
792 for (
int i=0; i<fileName.size(); ++i)
801 this->updateWindowTitle();
804 void MainWindow::createMenus()
812 this->menuBar()->setNativeMenuBar(
false);
814 mFileMenu =
new QMenu(tr(
"File"),
this);
815 mWorkflowMenu =
new QMenu(tr(
"Workflow"),
this);
816 mToolMenu =
new QMenu(tr(
"Tracking"),
this);
817 mLayoutMenu =
new QMenu(tr(
"Layouts"),
this);
818 mNavigationMenu =
new QMenu(tr(
"Navigation"),
this);
819 mHelpMenu =
new QMenu(tr(
"Help"),
this);
822 mFileMenu->addAction(mPreferencesAction);
823 this->menuBar()->addMenu(mFileMenu);
824 mFileMenu->addAction(mNewPatientAction);
825 mFileMenu->addAction(mSaveFileAction);
826 mFileMenu->addAction(mLoadFileAction);
827 mFileMenu->addAction(mClearPatientAction);
828 mFileMenu->addSeparator();
829 mFileMenu->addAction(mExportPatientAction);
830 mFileMenu->addAction(mImportDataAction);
831 mFileMenu->addAction(mDeleteDataAction);
832 mFileMenu->addSeparator();
833 mFileMenu->addAction(mFullScreenAction);
834 mFileMenu->addAction(mStartLogConsoleAction);
835 mFileMenu->addAction(mShootScreenAction);
836 mFileMenu->addAction(mShootWindowAction);
837 mFileMenu->addAction(mRecordFullscreenAction);
838 mFileMenu->addSeparator();
839 mFileMenu->addAction(mShowControlPanelAction);
840 mFileMenu->addAction(mSecondaryViewLayoutWindowAction);
842 mFileMenu->addAction(mQuitAction);
845 this->menuBar()->addMenu(mWorkflowMenu);
846 QList<QAction*> actions =
stateService()->getWorkflowActions()->actions();
847 for (
int i=0; i<actions.size(); ++i)
849 mWorkflowMenu->addAction(actions[i]);
852 mWorkflowMenu->addSeparator();
853 mWorkflowMenu->addAction(mSaveDesktopAction);
854 mWorkflowMenu->addAction(mResetDesktopAction);
857 this->menuBar()->addMenu(mToolMenu);
858 mToolMenu->addAction(mConfigureToolsAction);
859 mToolMenu->addAction(mInitializeToolsAction);
860 mToolMenu->addAction(mTrackingToolsAction);
861 mToolMenu->addSeparator();
862 mToolMenu->addAction(mStartStreamingAction);
863 mToolMenu->addSeparator();
866 this->menuBar()->addMenu(mLayoutMenu);
867 mLayoutInteractor->connectToMenu(mLayoutMenu);
869 this->menuBar()->addMenu(mNavigationMenu);
870 mNavigationMenu->addAction(mCenterToImageCenterAction);
871 mNavigationMenu->addAction(mCenterToTooltipAction);
872 mNavigationMenu->addAction(mShowPointPickerAction);
873 mNavigationMenu->addSeparator();
874 mNavigationMenu->addActions(mInteractorStyleActionGroup->actions());
876 mHelpMenuAction = this->menuBar()->addMenu(mHelpMenu);
877 mHelpMenu->addAction(mAboutAction);
878 mHelpMenu->addAction(QWhatsThis::createAction(
this));
881 void MainWindow::createToolBars()
883 mDataToolBar = addToolBar(
"Data");
884 mDataToolBar->setObjectName(
"DataToolBar");
885 mDataToolBar->addAction(mNewPatientAction);
886 mDataToolBar->addAction(mLoadFileAction);
887 mDataToolBar->addAction(mSaveFileAction);
888 mDataToolBar->addAction(mImportDataAction);
889 this->registerToolBar(mDataToolBar,
"Toolbar");
891 mToolToolBar = addToolBar(
"Tools");
892 mToolToolBar->setObjectName(
"ToolToolBar");
893 mToolToolBar->addAction(mTrackingToolsAction);
894 mToolToolBar->addAction(mStartStreamingAction);
895 this->registerToolBar(mToolToolBar,
"Toolbar");
897 mNavigationToolBar = addToolBar(
"Navigation");
898 mNavigationToolBar->setObjectName(
"NavigationToolBar");
899 mNavigationToolBar->addAction(mCenterToImageCenterAction);
900 mNavigationToolBar->addAction(mCenterToTooltipAction);
901 mNavigationToolBar->addAction(mShowPointPickerAction);
902 this->registerToolBar(mNavigationToolBar,
"Toolbar");
904 mInteractorStyleToolBar = addToolBar(
"InteractorStyle");
905 mInteractorStyleToolBar->setObjectName(
"InteractorStyleToolBar");
907 mInteractorStyleToolBar->addActions(mInteractorStyleActionGroup->actions());
908 this->registerToolBar(mInteractorStyleToolBar,
"Toolbar");
910 mWorkflowToolBar = addToolBar(
"Workflow");
911 mWorkflowToolBar->setObjectName(
"WorkflowToolBar");
913 QList<QAction*> actions =
stateService()->getWorkflowActions()->actions();
914 for (
int i=0; i<actions.size(); ++i)
916 mWorkflowToolBar->addAction(actions[i]);
919 this->registerToolBar(mWorkflowToolBar,
"Toolbar");
921 mDesktopToolBar = addToolBar(
"Desktop");
922 mDesktopToolBar->setObjectName(
"DesktopToolBar");
923 mDesktopToolBar->addAction(mSaveDesktopAction);
924 mDesktopToolBar->addAction(mResetDesktopAction);
925 this->registerToolBar(mDesktopToolBar,
"Toolbar");
927 mHelpToolBar = addToolBar(
"Help");
928 mHelpToolBar->setObjectName(
"HelpToolBar");
929 mHelpToolBar->addAction(QWhatsThis::createAction(
this));
930 this->registerToolBar(mHelpToolBar,
"Toolbar");
932 mScreenshotToolBar = addToolBar(
"Screenshot");
933 mScreenshotToolBar->setObjectName(
"ScreenshotToolBar");
934 mScreenshotToolBar->addAction(mShootScreenAction);
935 this->registerToolBar(mScreenshotToolBar,
"Toolbar");
937 QToolBar* camera3DViewToolBar = addToolBar(
"Camera 3D Views");
938 camera3DViewToolBar->setObjectName(
"Camera3DViewToolBar");
939 camera3DViewToolBar->addActions(mStandard3DViewActions->actions());
940 this->registerToolBar(camera3DViewToolBar,
"Toolbar");
942 QToolBar* samplerWidgetToolBar = addToolBar(
"Sampler");
943 samplerWidgetToolBar->setObjectName(
"SamplerToolBar");
944 samplerWidgetToolBar->addWidget(
new SamplerWidget(
this));
945 this->registerToolBar(samplerWidgetToolBar,
"Toolbar");
947 QToolBar* toolOffsetToolBar = addToolBar(
"Tool Offset");
948 toolOffsetToolBar->setObjectName(
"ToolOffsetToolBar");
950 this->registerToolBar(toolOffsetToolBar,
"Toolbar");
953 void MainWindow::registerToolBar(QToolBar* toolbar, QString groupname)
955 this->addToWidgetGroupMap(toolbar->toggleViewAction(), groupname);
958 mToolbars.insert(toolbar);
959 if (!mToolbars.empty())
966 QString appName = qApp->applicationDisplayName();
967 QString url_github(
"https://github.com/SINTEFMedtek/CustusX");
968 QString url_license = QString(
"file://%1/license.txt").arg(doc_path);
969 QString url_config = QString(
"file://%1/cxConfigDescription.txt").arg(doc_path);
974 "<p>A Research Platform for Image-Guided Therapy<p>"
975 "<p>%1 is NOT approved for medical use.<p>"
977 "<p><a href=%3> website </a><p>"
978 "<p><a href=%4> license </a><p>"
979 "<p><a href=%5> configuration </a><p>");
981 QMessageBox::about(
this, tr(
"About %1").arg(appName), text
983 .arg(CustusX_VERSION_STRING)
992 PreferencesDialog prefDialog(mServices->visualizationService, mServices->patientModelService,
this);
998 report(
"Shutting down CustusX");
1006 report(
"Closing: Save geometry and window state");
1015 QString text = QString(
"Do you really want to delete data %1?").arg(
patientService()->getActiveImage()->getName());
1016 if (QMessageBox::question(
this,
"Data delete", text, QMessageBox::StandardButtons(QMessageBox::Ok | QMessageBox::Cancel))!=QMessageBox::Ok)
1018 mServices->patientModelService->removeData(
patientService()->getActiveImageUid());
1026 void MainWindow::closeEvent(QCloseEvent *event)
1028 QMainWindow::closeEvent(event);
1032 QDockWidget* MainWindow::addAsDockWidget(QWidget* widget, QString groupname)
1034 QDockWidget* dockWidget = mDockWidgets->
addAsDockWidget(widget, groupname);
1035 this->addToWidgetGroupMap(dockWidget->toggleViewAction(), groupname);
1036 QMainWindow::addDockWidget(Qt::LeftDockWidgetArea, dockWidget);
1037 this->restoreDockWidget(dockWidget);
void newPatientSlot()
Create new patient with directory structure.
cxResource_EXPORT ProfilePtr profile()
void toggleStreamingSlot()
boost::shared_ptr< class ViewGroupData > ViewGroupDataPtr
void onPluginBaseModified(GUIExtenderService *service)
void dockWidgetVisibilityChanged(bool val)
virtual QMenu * createPopupMenu()
void changeEvent(QEvent *event)
Statusbar with extended functionality.
void applicationStateChanged()
void updateTrackingActionSlot()
void showSecondaryViewLayoutWindowActionSlot()
void onPluginBaseAdded(GUIExtenderService *service)
void clearPatientSlot()
clear current patient (debug)
void focusChanged(QWidget *old, QWidget *now)
void savePatientFileSlot()
Save all application data to XML file.
void patientChangedSlot()
static VisServicesPtr create(ctkPluginContext *context)
cxLogicManager_EXPORT StateServicePtr stateService()
Experimental class for IPad usage.This detached main window can be moved onto a secondary screen...
QWidget * createDataWidget(VisualizationServicePtr visualizationService, PatientModelServicePtr patientModelService, QWidget *parent, PropertyPtr data, QGridLayout *gridLayout, int row)
Create a widget capable of displaying the input data.
QVariant value(const QString &key, const QVariant &defaultValue=QVariant()) const
void startRecording(QString saveFile)
void togglePointPickerActionSlot()
boost::shared_ptr< class Navigation > NavigationPtr
void toggleTrackingSlot()
void onApplicationStateChangedSlot()
void updatePointPickerActionSlot()
void setValue(const QString &key, const QVariant &value)
Experimental class for IPad usage.
void workflowStateAboutToChange()
void toggleFullScreenSlot()
void reportWarning(QString msg)
void importDataSlot()
loads data(images) into the datamanager
MainWindow(std::vector< GUIExtenderServicePtr > guiExtenders=std::vector< GUIExtenderServicePtr >())
void onPluginBaseRemoved(GUIExtenderService *service)
void centerToTooltipSlot()
void loadPatientFileSlot()
Load all application data from XML file.
virtual void setState(const Tool::State val)=0
QByteArray mMainWindowState
static LogicManager * getInstance()
Settings * settings()
Shortcut for accessing the settings instance.
void updateStreamingActionSlot()
Helper class for listening to services being added, modified and removed.
LogicManager * logicManager()
void workflowStateChanged()
Data class for CustusX desktop.
void showControlPanelActionSlot()
void centerToImageCenterSlot()
boost::shared_ptr< class CameraControl > CameraControlPtr
cxLogicManager_EXPORT ViewServicePtr viewService()
void deleteDataSlot()
deletes data(image) from the patient
cxLogicManager_EXPORT VideoServicePtr videoService()
static QString findExecutableInStandardLocations(QString filename)
look for an exe in the same folder as the executable or bundle.
cxLogicManager_EXPORT PatientModelServicePtr patientService()
QString mSecondaryLayoutUid
cxLogicManager_EXPORT TrackingServicePtr trackingService()
void onWorkflowStateChangedSlot()
static QString getDocPath()
return path to folder containing documentation files
Set application preferences.
boost::shared_ptr< Audio > AudioPtr
void configureSlot()
lets the user choose which configuration files to use for the navigation
bool mShowPointPickerProbe
VLCRecorder * vlc()
Shortcut for accessing the vlc recorder.