36 #include "boost/bind.hpp"
79 mFullScreenAction(NULL),
80 mStandard3DViewActions(new QActionGroup(this)),
85 this->setObjectName(
"MainWindow");
90 this->setCentralWidget(
viewService()->getLayoutWidget(
this, 0));
94 this->createActions();
96 this->createToolBars();
105 this->updateWindowTitle();
107 this->setTabPosition(Qt::AllDockWidgetAreas, QTabWidget::North);
111 this->addAsDockWidget(
new EraserWidget(mServices->patientModelService, mServices->visualizationService,
this),
"Properties");
112 this->addAsDockWidget(
new MetricWidget(mServices->visualizationService, mServices->patientModelService,
this),
"Utility");
113 this->addAsDockWidget(
new SlicePropertiesWidget(mServices->patientModelService, mServices->visualizationService,
this),
"Properties");
114 this->addAsDockWidget(
new VolumePropertiesWidget(mServices->patientModelService, mServices->visualizationService,
this),
"Properties");
115 this->addAsDockWidget(
new MeshInfoWidget(mServices->patientModelService, mServices->visualizationService,
this),
"Properties");
116 this->addAsDockWidget(
new StreamPropertiesWidget(mServices->patientModelService, mServices->visualizationService,
this),
"Properties");
120 this->addAsDockWidget(
new ConsoleWidget(
this,
"ConsoleWidget",
"Console"),
"Utility");
121 this->addAsDockWidget(
new ConsoleWidget(
this,
"ConsoleWidget2",
"Extra Console"),
"Utility");
123 this->addAsDockWidget(
new FrameTreeWidget(mServices->patientModelService,
this),
"Browsing");
131 this->setupGUIExtenders();
135 popupMenu->setTitle(
"Window");
136 this->menuBar()->insertMenu(mHelpMenuAction, popupMenu);
140 if (restoreGeometry(
settings()->value(
"mainWindow/geometry").toByteArray()))
146 this->showMaximized();
149 if (
settings()->value(
"gui/fullscreen").toBool())
150 this->setWindowState(this->windowState() | Qt::WindowFullScreen);
155 QMainWindow::changeEvent(event);
157 if (event->type() == QEvent::WindowStateChange)
159 if (mFullScreenAction)
160 mFullScreenAction->setChecked(this->windowState() & Qt::WindowFullScreen);
164 void MainWindow::setupGUIExtenders()
172 mServiceListener->open();
177 std::vector<GUIExtenderService::CategorizedWidget> widgets = service->
createWidgets();
178 for (
unsigned j = 0; j < widgets.size(); ++j)
180 mDockWidgets->
addAsDockWidget(widgets[j].mWidget, widgets[j].mCategory, service);
184 for(
unsigned j = 0; j < toolBars.size(); ++j)
202 this->focusInsideDockWidget(sender());
207 this->focusInsideDockWidget(now);
210 void MainWindow::focusInsideDockWidget(QObject *dockWidget)
223 QDockWidget* dw =
dynamic_cast<QDockWidget*
>(dockWidget);
226 if (dw->parent()!=
this)
228 QScrollArea* sa =
dynamic_cast<QScrollArea*
>(dw->widget());
239 QTimer::singleShot(0, sa->widget(), SLOT(setFocus()));
246 mServiceListener.reset();
254 void MainWindow::createActions()
258 mStandard3DViewActions = cameraControl->createStandard3DViewActions();
260 mShowContextSensitiveHelpAction =
new QAction(QIcon(
":/icons/open_icon_library/help-contents-5.png"),
261 "Context-sensitive help",
this);
264 mShowControlPanelAction =
new QAction(
"Show Control Panel",
this);
266 mSecondaryViewLayoutWindowAction =
new QAction(
"Show Secondary View Layout Window",
this);
270 mAboutAction =
new QAction(tr(
"About"),
this);
271 mAboutAction->setStatusTip(tr(
"Show the application's About box"));
272 mPreferencesAction =
new QAction(tr(
"Preferences"),
this);
273 mPreferencesAction->setShortcut(tr(
"Ctrl+,"));
274 mPreferencesAction->setStatusTip(tr(
"Show the preferences dialog"));
276 mFullScreenAction =
new QAction(tr(
"Fullscreen"),
this);
277 mFullScreenAction->setShortcut(tr(
"F11"));
278 mFullScreenAction->setStatusTip(tr(
"Toggle full screen"));
279 mFullScreenAction->setCheckable(
true);
280 mFullScreenAction->setChecked(this->windowState() & Qt::WindowFullScreen);
283 mQuitAction =
new QAction(tr(
"&Quit"),
this);
284 mQuitAction->setShortcut(tr(
"Ctrl+Q"));
285 mQuitAction->setStatusTip(tr(
"Exit the application"));
289 connect(mQuitAction, &QAction::triggered, qApp, &QApplication::quit);
291 mSaveDesktopAction =
new QAction(QIcon(
":/icons/workflow_state_save.png"), tr(
"Save desktop"),
this);
292 mSaveDesktopAction->setToolTip(
"Save desktop for workflow step");
294 mResetDesktopAction =
new QAction(QIcon(
":/icons/workflow_state_revert.png"), tr(
"Reset desktop"),
this);
295 mResetDesktopAction->setToolTip(
"Reset desktop for workflow step");
298 mInteractorStyleActionGroup =
viewService()->createInteractorStyleActionGroup();
307 this->updateWindowTitle();
310 void MainWindow::updateWindowTitle()
312 QString profileName =
stateService()->getApplicationStateName();
315 QString activePatientFolder =
patientService()->getActivePatientFolder();
316 if (activePatientFolder.endsWith(
'/'))
317 activePatientFolder.chop(1);
320 if (!activePatientFolder.isEmpty())
322 QFileInfo info(activePatientFolder);
323 patientName = info.completeBaseName();
326 QString format(
"%1 %2 - %3 - %4 (not approved for medical use)");
327 QString title = format
328 .arg(qApp->applicationDisplayName())
332 this->setWindowTitle(title);
388 this->setWindowState(this->windowState() ^ Qt::WindowFullScreen);
390 settings()->
setValue(
"gui/fullscreen", (this->windowState() & Qt::WindowFullScreen)!=0);
397 mControlPanel->show();
402 if (!mSecondaryViewLayoutWindow)
404 mSecondaryViewLayoutWindow->tryShowOnSecondaryScreen();
409 this->updateWindowTitle();
412 void MainWindow::createMenus()
420 this->menuBar()->setNativeMenuBar(
false);
422 mFileMenu =
new QMenu(tr(
"File"),
this);
423 mWorkflowMenu =
new QMenu(tr(
"Workflow"),
this);
424 mToolMenu =
new QMenu(tr(
"Tracking"),
this);
425 mLayoutMenu =
new QMenu(tr(
"Layouts"),
this);
426 mNavigationMenu =
new QMenu(tr(
"Navigation"),
this);
427 mHelpMenu =
new QMenu(tr(
"Help"),
this);
430 mFileMenu->addAction(mPreferencesAction);
431 this->menuBar()->addMenu(mFileMenu);
432 mFileMenu->addAction(mActions->
getAction(
"NewPatient"));
433 mFileMenu->addAction(mActions->
getAction(
"SaveFile"));
434 mFileMenu->addAction(mActions->
getAction(
"LoadFile"));
435 mFileMenu->addAction(mActions->
getAction(
"ClearPatient"));
436 mFileMenu->addSeparator();
437 mFileMenu->addAction(mActions->
getAction(
"ExportPatient"));
438 mFileMenu->addAction(mActions->
getAction(
"ImportData"));
439 mFileMenu->addAction(mActions->
getAction(
"DeleteData"));
440 mFileMenu->addSeparator();
441 mFileMenu->addAction(mFullScreenAction);
442 mFileMenu->addAction(mActions->
getAction(
"StartLogConsole"));
443 mFileMenu->addAction(mActions->
getAction(
"ShootScreen"));
444 mFileMenu->addAction(mActions->
getAction(
"ShootWindow"));
445 mFileMenu->addAction(mActions->
getAction(
"RecordFullscreen"));
446 mFileMenu->addSeparator();
447 mFileMenu->addAction(mShowControlPanelAction);
448 mFileMenu->addAction(mSecondaryViewLayoutWindowAction);
450 mFileMenu->addAction(mQuitAction);
453 this->menuBar()->addMenu(mWorkflowMenu);
454 QList<QAction*> actions =
stateService()->getWorkflowActions()->actions();
455 for (
int i=0; i<actions.size(); ++i)
457 mWorkflowMenu->addAction(actions[i]);
460 mWorkflowMenu->addSeparator();
461 mWorkflowMenu->addAction(mSaveDesktopAction);
462 mWorkflowMenu->addAction(mResetDesktopAction);
465 this->menuBar()->addMenu(mToolMenu);
466 mToolMenu->addAction(mActions->
getAction(
"ConfigureTools"));
467 mToolMenu->addAction(mActions->
getAction(
"InitializeTools"));
468 mToolMenu->addAction(mActions->
getAction(
"TrackingTools"));
469 mToolMenu->addSeparator();
470 mToolMenu->addAction(mActions->
getAction(
"StartStreaming"));
471 mToolMenu->addSeparator();
474 this->menuBar()->addMenu(mLayoutMenu);
475 mLayoutInteractor->connectToMenu(mLayoutMenu);
477 this->menuBar()->addMenu(mNavigationMenu);
478 mNavigationMenu->addAction(mActions->
getAction(
"CenterToImageCenter"));
479 mNavigationMenu->addAction(mActions->
getAction(
"CenterToTooltip"));
480 mNavigationMenu->addAction(mActions->
getAction(
"ShowPointPicker"));
481 mNavigationMenu->addSeparator();
482 mNavigationMenu->addActions(mInteractorStyleActionGroup->actions());
484 mHelpMenuAction = this->menuBar()->addMenu(mHelpMenu);
485 mHelpMenu->addAction(mAboutAction);
486 mHelpMenu->addAction(mActions->
getAction(
"GotoDocumentation"));
487 mHelpMenu->addAction(mShowContextSensitiveHelpAction);
490 void MainWindow::createToolBars()
492 mWorkflowToolBar = this->registerToolBar(
"Workflow");
493 QList<QAction*> actions =
stateService()->getWorkflowActions()->actions();
494 for (
int i=0; i<actions.size(); ++i)
495 mWorkflowToolBar->addAction(actions[i]);
497 mDataToolBar = this->registerToolBar(
"Data");
498 mDataToolBar->addAction(mActions->
getAction(
"NewPatient"));
499 mDataToolBar->addAction(mActions->
getAction(
"LoadFile"));
500 mDataToolBar->addAction(mActions->
getAction(
"SaveFile"));
501 mDataToolBar->addAction(mActions->
getAction(
"ImportData"));
503 mToolToolBar = this->registerToolBar(
"Tools");
504 mToolToolBar->addAction(mActions->
getAction(
"TrackingTools"));
505 mToolToolBar->addAction(mActions->
getAction(
"StartStreaming"));
507 mNavigationToolBar = this->registerToolBar(
"Navigation");
508 mNavigationToolBar->addAction(mActions->
getAction(
"CenterToImageCenter"));
509 mNavigationToolBar->addAction(mActions->
getAction(
"CenterToTooltip"));
510 mNavigationToolBar->addAction(mActions->
getAction(
"ShowPointPicker"));
512 mInteractorStyleToolBar = this->registerToolBar(
"InteractorStyle");
513 mInteractorStyleToolBar->addActions(mInteractorStyleActionGroup->actions());
515 mDesktopToolBar = this->registerToolBar(
"Desktop");
516 mDesktopToolBar->addAction(mSaveDesktopAction);
517 mDesktopToolBar->addAction(mResetDesktopAction);
519 mScreenshotToolBar = this->registerToolBar(
"Screenshot");
520 mScreenshotToolBar->addAction(mActions->
getAction(
"ShootScreen"));
521 mScreenshotToolBar->addAction(mActions->
getAction(
"RecordFullscreen"));
523 QToolBar* camera3DViewToolBar = this->registerToolBar(
"Camera 3D Views");
524 camera3DViewToolBar->addActions(mStandard3DViewActions->actions());
526 QToolBar* samplerWidgetToolBar = this->registerToolBar(
"Sampler");
527 samplerWidgetToolBar->addWidget(
new SamplerWidget(
this));
529 QToolBar* toolOffsetToolBar = this->registerToolBar(
"Tool Offset");
531 offsetWidget->showLabel(
false);
532 toolOffsetToolBar->addWidget(offsetWidget);
534 QToolBar* helpToolBar = this->registerToolBar(
"Help");
535 helpToolBar->addAction(mShowContextSensitiveHelpAction);
538 QToolBar* MainWindow::registerToolBar(QString name, QString groupname)
540 QToolBar* toolbar =
new QToolBar(name);
541 toolbar->setObjectName(QString(name).
remove(
" ")+
"ToolBar");
549 QString appName = qApp->applicationDisplayName();
551 QString url_license = QString(
"file://%1/license.txt").arg(doc_path);
552 QString url_config = QString(
"file://%1/cxConfigDescription.txt").arg(doc_path);
557 "<p>A Research Platform for Image-Guided Therapy<p>"
558 "<p>%1 is NOT approved for medical use.<p>"
560 "<p><a href=%3> website </a><p>"
561 "<p><a href=%4> license </a><p>"
562 "<p><a href=%5> configuration </a><p>");
564 QMessageBox::about(
this, tr(
"About %1").arg(appName), text
566 .arg(CustusX_VERSION_STRING)
575 PreferencesDialog prefDialog(mServices->visualizationService, mServices->patientModelService,
this);
579 void MainWindow::closeEvent(QCloseEvent *event)
581 QMainWindow::closeEvent(event);
585 QDockWidget* MainWindow::addAsDockWidget(QWidget* widget, QString groupname)
void registerToolBar(QToolBar *toolbar, QString groupname="Toolbars")
void dockWidgetVisibilityChanged(bool val)
virtual QMenu * createPopupMenu()
void changeEvent(QEvent *event)
Statusbar with extended functionality.
void applicationStateChanged()
void showSecondaryViewLayoutWindowActionSlot()
void focusChanged(QWidget *old, QWidget *now)
void restoreFrom(const Desktop &desktop)
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...
void onApplicationStateChangedSlot()
QMenu * createPopupMenu()
void setValue(const QString &key, const QVariant &value)
Experimental class for IPad usage.
void workflowStateAboutToChange()
void onGUIExtenderServiceAdded(GUIExtenderService *service)
void toggleFullScreenSlot()
void onGUIExtenderServiceRemoved(GUIExtenderService *service)
static QString getWebsiteURL()
QByteArray mMainWindowState
static LogicManager * getInstance()
void showWidget(QString name)
void onGUIExtenderServiceModified(GUIExtenderService *service)
void onShowContextSentitiveHelp()
Settings * settings()
Shortcut for accessing the settings instance.
Helper class for listening to services being added, modified and removed.
LogicManager * logicManager()
void workflowStateChanged()
Data class for CustusX desktop.
void showControlPanelActionSlot()
QAction * getAction(QString uid)
boost::shared_ptr< class CameraControl > CameraControlPtr
cxLogicManager_EXPORT ViewServicePtr viewService()
void owningServiceRemoved(QObject *service)
virtual std::vector< QToolBar * > createToolBars() const
cxLogicManager_EXPORT PatientModelServicePtr patientService()
QString mSecondaryLayoutUid
virtual std::vector< CategorizedWidget > createWidgets() const =0
QDockWidget * addAsDockWidget(QWidget *widget, QString groupname, QObject *owningPlugin=NULL)
void onWorkflowStateChangedSlot()
static QString getDocPath()
return path to folder containing documentation files
Set application preferences.
boost::shared_ptr< Audio > AudioPtr
void isSaving(QDomElement &root)
xml storage is available