3 #include <QtConcurrent>
8 #include <QDesktopWidget>
10 #include <QApplication>
11 #include <QDesktopServices>
13 #include "boost/bind.hpp"
14 #include "boost/function.hpp"
42 this->createActions();
47 if (!mActions.count(uid))
48 CX_LOG_ERROR() << QString(
"Could not find action %1 in MainWindowActions object").arg(uid);
52 void MainWindowActions::createActions()
54 this->createAction(
"GotoDocumentation",
"Web Documentation",
55 QIcon(
":/icons/open_icon_library/applications-internet.png"),
57 &MainWindowActions::onGotoDocumentation);
59 this->createAction(
"StartLogConsole",
"Start Log Console",
61 QKeySequence(
"Ctrl+D"),
"Open Log Console as external application",
62 &MainWindowActions::onStartLogConsole);
64 this->createAction(
"ShootScreen",
"Shoot Screen",
65 QIcon(
":/icons/screenshot-screen.png"),
66 QKeySequence(
"Ctrl+f"),
"Save a screenshot to the patient folder.",
67 &MainWindowActions::shootScreen);
69 this->createAction(
"ShootWindow",
"Shoot Window",
70 QIcon(
":/icons/screenshot-window.png"),
71 QKeySequence(
"Ctrl+Shift+f"),
"Save an image of the application to the patient folder.",
72 &MainWindowActions::shootWindow);
74 mRecordFullscreenStreamingAction = this->createAction(
"RecordFullscreen",
"Record Fullscreen",
76 QKeySequence(
"F8"),
"Record a video of the full screen.",
77 &MainWindowActions::recordFullscreen);
79 this->updateRecordFullscreenActionSlot();
81 mShowPointPickerAction = this->createAction(
"ShowPointPicker",
"Point Picker",
82 QIcon(
":/icons/point_picker.png"),
83 QKeySequence(
""),
"Activate the 3D Point Picker Probe",
84 &MainWindowActions::togglePointPickerActionSlot);
85 mShowPointPickerAction->setCheckable(
true);
89 this->updatePointPickerActionSlot();
91 mStartStreamingAction = this->createAction(
"StartStreaming",
"Start Streaming",
92 QIcon(
":/icons/open_icon_library/.png"),
93 QKeySequence(
"Ctrl+V"),
"",
94 &MainWindowActions::toggleStreamingSlot);
96 this->updateStreamingActionSlot();
98 this->createAction(
"CenterToImageCenter",
"Center Image",
99 QIcon(
":/icons/center_image.png"),
101 &MainWindowActions::centerToImageCenterSlot);
103 this->createAction(
"CenterToTooltip",
"Center Tool",
104 QIcon(
":/icons/center_tool.png"),
105 QKeySequence(
""),
"",
106 &MainWindowActions::centerToTooltipSlot);
108 this->createPatientActions();
109 this->createTrackingActions();
112 void MainWindowActions::createTrackingActions()
114 this->createAction(
"ConfigureTools",
"Tool configuration",
115 QIcon(), QKeySequence(),
"",
116 &MainWindowActions::configureSlot);
119 this->createAction(
"InitializeTools",
"Initialize",
120 QIcon(), QKeySequence(),
"",
123 mTrackingToolsAction = this->createAction(
"TrackingTools",
"Start tracking",
124 QIcon(), QKeySequence(
"Ctrl+T"),
"",
125 &MainWindowActions::toggleTrackingSlot);
128 this->updateTrackingActionSlot();
131 void MainWindowActions::createPatientActions()
133 this->createAction(
"NewPatient",
"New Patient",
134 QIcon(
":/icons/open_icon_library/document-new-8.png"),
135 QKeySequence(
"Ctrl+N"),
136 "Create a new patient file",
137 &MainWindowActions::newPatientSlot);
139 this->createAction(
"SaveFile",
"Save Patient",
140 QIcon(
":/icons/open_icon_library/document-save-5.png"),
141 QKeySequence(
"Ctrl+S"),
143 &MainWindowActions::savePatientFileSlot);
145 this->createAction(
"LoadFile",
"Load Patient",
146 QIcon(
":/icons/open_icon_library/document-open-7.png"),
147 QKeySequence(
"Ctrl+L"),
149 &MainWindowActions::loadPatientFileSlot);
151 this->createAction(
"ClearPatient",
"Clear Patient",
154 "Clear the current patient from the application",
155 &MainWindowActions::clearPatientSlot);
157 this->createAction(
"ExportPatient",
"Export Patient",
160 "Export patient data to a folder",
161 &MainWindowActions::exportDataSlot);
163 this->createAction(
"ImportData",
"Import data",
164 QIcon(
":/icons/open_icon_library/document-import-2.png"),
165 QKeySequence(
"Ctrl+I"),
167 &MainWindowActions::importDataSlot);
169 this->createAction(
"DeleteData",
"Delete current image",
172 "Delete selected volume",
173 &MainWindowActions::deleteDataSlot);
177 QAction* MainWindowActions::createAction(QString uid, QString text, QIcon icon,
178 QKeySequence shortcut, QString help,
181 QAction* retval =
new QAction(icon, text,
this);
182 retval->setShortcut(shortcut);
183 retval->setStatusTip(help);
184 connect(retval, &QAction::triggered,
this, triggerSlot);
185 mActions[uid] = retval;
191 QString timestampFormatFolderFriendly()
193 return QString(
"yyyy-MM-dd_hh-mm");
197 QWidget* MainWindowActions::parentWidget()
199 return dynamic_cast<QWidget*
>(this->parent());
203 void MainWindowActions::newPatientSlot()
205 QString patientDatafolder = this->getExistingSessionFolder();
207 QString timestamp = QDateTime::currentDateTime().toString(timestampFormatFolderFriendly());
208 QString filename = QString(
"%1_%2_%3.cx3")
211 .arg(
settings()->value(
"globalPatientNumber").toString());
213 QString choosenDir = patientDatafolder +
"/" + filename;
215 QFileDialog dialog(this->parentWidget(), tr(
"Select directory to save patient in"), patientDatafolder +
"/");
216 dialog.setOption(QFileDialog::DontUseNativeDialog,
true);
217 dialog.setOption(QFileDialog::ShowDirsOnly,
true);
218 dialog.selectFile(filename);
221 choosenDir = dialog.selectedFiles().front();
223 if (!choosenDir.endsWith(
".cx3"))
224 choosenDir += QString(
".cx3");
227 int patientNumber =
settings()->
value(
"globalPatientNumber").toInt();
230 mServices->getSession()->load(choosenDir);
233 QString MainWindowActions::getExistingSessionFolder()
235 return profile()->getSessionRootFolder();
238 void MainWindowActions::clearPatientSlot()
240 mServices->getSession()->clear();
243 void MainWindowActions::savePatientFileSlot()
247 reportWarning(
"No patient selected, select or create patient before saving!");
248 this->newPatientSlot();
252 mServices->getSession()->save();
255 void MainWindowActions::loadPatientFileSlot()
257 QString patientDatafolder = this->getExistingSessionFolder();
260 QString folder = QFileDialog::getExistingDirectory(this->parentWidget(),
"Select patient", patientDatafolder, QFileDialog::ShowDirsOnly);
261 if (folder.isEmpty())
264 mServices->getSession()->load(folder);
267 void MainWindowActions::exportDataSlot()
269 this->savePatientFileSlot();
271 ExportDataDialog* wizard =
new ExportDataDialog(mServices->patientModelService, this->parentWidget());
275 void MainWindowActions::importDataSlot()
277 this->savePatientFileSlot();
279 QString folder = mLastImportDataFolder;
280 if (folder.isEmpty())
281 folder =
profile()->getSessionRootFolder();
283 QStringList fileName = QFileDialog::getOpenFileNames(this->parentWidget(), QString(tr(
"Select data file(s) for import")),
284 folder, tr(
"Image/Mesh (*.mhd *.mha *.stl *.vtk *.mnc *.png)"));
285 if (fileName.empty())
287 report(
"Import canceled");
291 mLastImportDataFolder = QFileInfo(fileName[0]).absolutePath();
293 for (
int i=0; i<fileName.size(); ++i)
295 ImportDataDialog* wizard =
new ImportDataDialog(mServices->patientModelService, fileName[i], this->parentWidget());
300 void MainWindowActions::deleteDataSlot()
304 QString text = QString(
"Do you really want to delete data %1?").arg(
patientService()->getActiveImage()->getName());
305 if (QMessageBox::question(this->parentWidget(),
"Data delete", text, QMessageBox::StandardButtons(QMessageBox::Ok | QMessageBox::Cancel))!=QMessageBox::Ok)
307 mServices->patientModelService->removeData(
patientService()->getActiveImageUid());
310 void MainWindowActions::shootScreen()
312 QDesktopWidget* desktop = qApp->desktop();
313 QList<QScreen*> screens = qApp->screens();
315 for (
int i=0; i<desktop->screenCount(); ++i)
317 QWidget* screenWidget = desktop->screen(i);
318 WId screenWinId = screenWidget->winId();
319 QRect geo = desktop->screenGeometry(i);
321 if (desktop->screenCount()>1)
322 name = screens[i]->name().split(
" ").join(
"");
323 this->saveScreenShot(screens[i]->grabWindow(screenWinId, geo.left(), geo.top(), geo.width(), geo.height()), name);
327 void MainWindowActions::shootWindow()
329 QScreen* screen = qApp->primaryScreen();
330 this->saveScreenShot(screen->grabWindow(this->parentWidget()->winId()));
333 void MainWindowActions::recordFullscreen()
335 QString path =
patientService()->generateFilePath(
"Screenshots",
"mp4");
337 if(
vlc()->isRecording())
343 void MainWindowActions::updateRecordFullscreenActionSlot()
345 mRecordFullscreenStreamingAction->setCheckable(
true);
346 mRecordFullscreenStreamingAction->blockSignals(
true);
347 mRecordFullscreenStreamingAction->setChecked(
vlc()->isRecording());
348 mRecordFullscreenStreamingAction->blockSignals(
false);
350 if(
vlc()->isRecording())
352 mRecordFullscreenStreamingAction->setIcon(QIcon(
":/icons/Video-icon_green.png"));
356 mRecordFullscreenStreamingAction->setIcon(QIcon(
":/icons/Video-icon_gray.png"));
361 void MainWindowActions::onStartLogConsole()
365 mLocalVideoServerProcess.reset(
new ProcessWrapper(QString(
"LogConsole")));
366 mLocalVideoServerProcess->launchWithRelativePath(fullname, QStringList());
369 void MainWindowActions::saveScreenShot(QPixmap pixmap, QString
id)
371 QString ending =
"png";
373 ending =
id +
"." + ending;
374 QString path =
patientService()->generateFilePath(
"Screenshots", ending);
375 QtConcurrent::run(boost::bind(&MainWindowActions::saveScreenShotThreaded,
this, pixmap.toImage(), path));
381 void MainWindowActions::saveScreenShotThreaded(QImage pixmap, QString filename)
383 pixmap.save(filename,
"png");
384 report(
"Saved screenshot to " + filename);
388 void MainWindowActions::toggleStreamingSlot()
396 void MainWindowActions::updateStreamingActionSlot()
400 mStartStreamingAction->setIcon(QIcon(
":/icons/streaming_green.png"));
401 mStartStreamingAction->setText(
"Stop Streaming");
405 mStartStreamingAction->setIcon(QIcon(
":/icons/streaming_red.png"));
406 mStartStreamingAction->setText(
"Start Streaming");
410 void MainWindowActions::centerToImageCenterSlot()
412 viewService()->getNavigation()->centerToDataInActiveViewGroup();
415 void MainWindowActions::centerToTooltipSlot()
418 nav->centerToTooltip();
421 void MainWindowActions::togglePointPickerActionSlot()
424 ViewGroupData::Options options = data->getOptions();
425 options.mShowPointPickerProbe = !options.mShowPointPickerProbe;
426 data->setOptions(options);
428 void MainWindowActions::updatePointPickerActionSlot()
432 bool show =
viewService()->getGroup(0)->getOptions().mShowPointPickerProbe;
433 mShowPointPickerAction->setChecked(show);
436 void MainWindowActions::updateTrackingActionSlot()
440 mTrackingToolsAction->setIcon(QIcon(
":/icons/polaris-green.png"));
441 mTrackingToolsAction->setText(
"Stop Tracking");
445 mTrackingToolsAction->setIcon(QIcon(
":/icons/polaris-red.png"));
446 mTrackingToolsAction->setText(
"Start Tracking");
450 void MainWindowActions::configureSlot()
455 void MainWindowActions::toggleTrackingSlot()
463 void MainWindowActions::onGotoDocumentation()
466 QDesktopServices::openUrl(QUrl(url, QUrl::TolerantMode));
cxResource_EXPORT ProfilePtr profile()
boost::shared_ptr< class ViewGroupData > ViewGroupDataPtr
boost::shared_ptr< class VisServices > VisServicesPtr
static QString getWebsiteUserDocumentationURL()
QVariant value(const QString &key, const QVariant &defaultValue=QVariant()) const
void startRecording(QString saveFile)
boost::shared_ptr< class Navigation > NavigationPtr
void setValue(const QString &key, const QVariant &value)
void reportWarning(QString msg)
MainWindowActions(VisServicesPtr services, QWidget *parent)
virtual void setState(const Tool::State val)=0
Settings * settings()
Shortcut for accessing the settings instance.
QAction * getAction(QString uid)
cxLogicManager_EXPORT ViewServicePtr viewService()
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()
cxLogicManager_EXPORT TrackingServicePtr trackingService()
VLCRecorder * vlc()
Shortcut for accessing the vlc recorder.