5 #include "moc_WidefieldMicroscopeWidget.cpp"
11 : CurrentState(nullptr), CurrentContext(nullptr),
12 StateLabel(new QLabel(Owner)),
13 CellIDLabel(new QLabel(Owner)), CellIDContextMenu(new QMenu(Owner)),
14 HomePosLabel(new QLabel(Owner)),
15 PumpPowerLabel(new QLabel(Owner)),
16 ImageCoordinatesGroup(new QWidget(Owner)), ImageCoordinatesLayout(new QHBoxLayout),
17 XCoordLabel(new QLabel(Owner)), YCoordLabel(new QLabel(Owner))
19 CellIDLabel->setContextMenuPolicy(Qt::ContextMenuPolicy::CustomContextMenu);
21 XCoordLabel->setAlignment(Qt::AlignmentFlag::AlignRight);
22 YCoordLabel->setAlignment(Qt::AlignmentFlag::AlignRight);
30 if (CurrentContext && !std::string(CurrentContext->GetDescription()).empty())
31 StateLabel->setText(QString(
" ") + CurrentContext->GetDescription());
33 StateLabel->setText(CurrentState ? (QString(
" ") + CurrentState->GetDescription()) :
"< Unknown >");
38 StateLabel->setStyleSheet(
"");
56 this->addAction(
ui.action_Stop_current_action);
57 this->addAction(
ui.action_Optimize_positions);
58 this->addAction(
ui.action_Save_Image);
59 this->addAction(
ui.action_Save_Image);
60 this->addAction(
ui.action_Zoom_in);
61 this->addAction(
ui.action_Zoom_out);
62 this->addAction(
ui.action_Zoom_reset);
63 this->addAction(
ui.action_Zoom_fit);
64 this->addAction(
ui.action_EmitterList_Edit_name);
65 this->addAction(
ui.action_EmitterList_Remove_entry);
67 ui.action_Zoom_fit->setChecked(
true);
123 ConfocalGraph->scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPreset::CameraPresetDirectlyAbove);
124 ConfocalGraph->setShadowQuality(QAbstract3DGraph::ShadowQuality::ShadowQualityNone);
126 ConfocalGraph->setSelectionMode(QAbstract3DGraph::SelectionFlag::SelectionItem);
152 ui.HBTChart->setRenderHint(QPainter::Antialiasing);
155 HBTXAxis->setTitleText(
"time in ps");
176 auto WidefieldTabIndex =
ui.TabWidget->indexOf(
ui.TabWidefield);
177 auto ConfocalTabIndex =
ui.TabWidget->indexOf(
ui.TabConfocal);
178 auto HBTTabIndex =
ui.TabWidget->indexOf(
ui.TabHBT);
183 ui.SBGeneralWidefieldPower->setMinimum(ModuleData->GetMinPumpPower());
184 ui.SBGeneralWidefieldPower->setMaximum(ModuleData->GetMaxPumpPower());
185 ui.SBGeneralWidefieldPower->setSingleStep(std::abs(ModuleData->GetMaxPumpPower() - ModuleData->GetMinPumpPower()) / 100.0);
186 ui.SBGeneralConfocalPower->setMinimum(ModuleData->GetMinPumpPower());
187 ui.SBGeneralConfocalPower->setMaximum(ModuleData->GetMaxPumpPower());
188 ui.SBGeneralConfocalPower->setSingleStep(std::abs(ModuleData->GetMaxPumpPower() - ModuleData->GetMinPumpPower()) / 100.0);
191 ui.SBGeneralFocusCurrentVoltage->setMinimum(ModuleData->GetMinFocusVoltage());
192 ui.SBGeneralFocusCurrentVoltage->setMaximum(ModuleData->GetMaxFocusVoltage());
193 ui.SBGeneralFocusCurrentVoltage->setSingleStep(std::abs(ModuleData->GetMaxFocusVoltage() - ModuleData->GetMinFocusVoltage()) / 100.0);
194 ui.SBGeneralFocusZeroVoltage->setMinimum(ModuleData->GetMinFocusVoltage());
195 ui.SBGeneralFocusZeroVoltage->setMaximum(ModuleData->GetMaxFocusVoltage());
196 ui.SBGeneralFocusZeroVoltage->setSingleStep(std::abs(ModuleData->GetMaxFocusVoltage() - ModuleData->GetMinFocusVoltage()) / 100.0);
197 ui.SBGeneralFocusConfocalOffsetVoltage->setMinimum(-std::abs(ModuleData->GetMinFocusVoltage()) - std::abs(ModuleData->GetMaxFocusVoltage()));
198 ui.SBGeneralFocusConfocalOffsetVoltage->setMaximum(std::abs(ModuleData->GetMinFocusVoltage()) + std::abs(ModuleData->GetMaxFocusVoltage()));
199 ui.SBGeneralFocusConfocalOffsetVoltage->setSingleStep(std::abs(ModuleData->GetMaxFocusVoltage() - ModuleData->GetMinFocusVoltage()) / 100.0);
202 ui.GBGeneralFocus->setVisible(
false);
205 ui.LGeneralWidefieldPower->setText(
"Power in any mode");
206 ui.LGeneralConfocalPower->setVisible(
false);
207 ui.SBGeneralConfocalPower->setVisible(
false);
208 ui.LGeneralFocusConfocalOffsetVoltage->setVisible(
false);
209 ui.SBGeneralFocusConfocalOffsetVoltage->setVisible(
false);
212 ui.SBWidefieldLEDExposureTime->setMinimum(ModuleData->GetMinCameraExposureTime().count());
213 ui.SBWidefieldLEDExposureTime->setMaximum(ModuleData->GetMaxCameraExposureTime().count());
214 ui.SBWidefieldPumpExposureTime->setMinimum(ModuleData->GetMinCameraExposureTime().count());
215 ui.SBWidefieldPumpExposureTime->setMaximum(ModuleData->GetMaxCameraExposureTime().count());
217 ui.TWEmitterList->setColumnWidth(EmitterListColumnType::EmitterName, 96);
218 ui.TWEmitterList->setColumnWidth(EmitterListColumnType::Sample_x, 134);
219 ui.TWEmitterList->setColumnWidth(EmitterListColumnType::Sample_y, 134);
220 ui.TWEmitterList->setColumnWidth(EmitterListColumnType::EmitterState, 134);
233 StatusBar.
CellIDLabel->setText(ModuleData->HasCellID() ? QString::fromStdString(ModuleData->GetCellID().IDString) :
"< Unknown cell ID. >");
235 (
"(" + QString::number(ModuleData->GetCellID().X_id) +
", " + QString::number(ModuleData->GetCellID().Y_id) +
")") :
"n/a");
237 QString HomePosString =
"home: (" + QString::number(ModuleData->GetSampleHomePosition().x) +
" nm, " + QString::number(ModuleData->GetSampleHomePosition().y) +
" nm)";
238 StatusBar.
HomePosLabel->setText(ModuleData->GetSampleHomePosition().IsEmpty() ?
"< No home position set. >" : HomePosString);
241 (
" Pump power: " + QString::number(ModuleData->GetMeasuredPumpPower(),
'f', 2) +
" V") :
"");
242 if (ModuleData->GetPumpLightTurnedOn())
248 ui.action_Save_Image->setEnabled(IsReady);
249 ui.action_Stop_current_action->setEnabled(!IsReady);
258 ui.action_Reset_CellID->setEnabled(IsReady);
261 ui.SBWidefieldLEDExposureTime->setEnabled(IsReady &&
263 ui.BWidefieldApplyLEDExposureTime->setEnabled(IsReady &&
265 ui.SBWidefieldPumpExposureTime->setEnabled(IsReady &&
267 ui.BWidefieldApplyPumpExposureTime->setEnabled(IsReady &&
270 ui.BWidefieldLEDCapture->setEnabled(IsReady);
271 ui.BWidefieldCapture->setEnabled(IsReady);
275 ui.action_EmitterList_Edit_name->setEnabled(IsReady);
276 ui.action_EmitterList_Remove_entry->setEnabled(IsReady);
277 ui.action_EmitterList_Go_to_sample_position->setEnabled(IsReady);
278 ui.action_EmitterList_Bring_marker_to_confocal_spot->setEnabled(IsReady);
279 ui.action_EmitterList_Run_characterization_from_ID->setEnabled(IsReady);
280 ui.SBConfocalWidth->setEnabled(IsReady);
281 ui.SBConfocalHeight->setEnabled(IsReady);
282 ui.SBConfocalDistPerPixel->setEnabled(IsReady);
283 ui.SBConfocalSPDExposureTime->setEnabled(IsReady);
287 ui.BConfocalScan->setEnabled(IsReady);
288 ui.action_confocal_map_save_raw_data->setEnabled(IsReady);
289 ui.SBHBTBinWidth->setEnabled(IsReady);
290 ui.SBHBTBinCount->setEnabled(IsReady);
291 ui.BHBTSaveData->setEnabled(IsReady);
292 ui.BHBT->setEnabled(IsReady);
293 ui.GBAutoMeasureGeneralSettings->setEnabled(IsReady);
294 ui.GBAutoMeasureLocalizationSettings->setEnabled(IsReady);
295 ui.GBAutoMeasureCharacterizationSettings->setEnabled(IsReady);
296 ui.GBAutoMeasureCellSettings->setEnabled(IsReady);
298 ui.BAutoMeasureRunCharacterization->setEnabled(IsReady);
307 ui.action_Toogle_LED_light_source->setChecked(ModuleData->GetLEDLightTurnedOn());
308 ui.action_Toogle_pump_light_source->setChecked(ModuleData->GetPumpLightTurnedOn());
314 if (!
ui.SBGeneralWidefieldPower->hasFocus())
315 ui.SBGeneralWidefieldPower->setValue(ModuleData->GetWidefieldPumpPower());
316 if (!
ui.SBGeneralConfocalPower->hasFocus())
317 ui.SBGeneralConfocalPower->setValue(ModuleData->GetConfocalPumpPower());
318 if (!
ui.SBGeneralFocusCurrentVoltage->hasFocus())
319 ui.SBGeneralFocusCurrentVoltage->setValue(ModuleData->GetFocusCurrentVoltage());
320 if (!
ui.SBGeneralFocusZeroVoltage->hasFocus())
321 ui.SBGeneralFocusZeroVoltage->setValue(ModuleData->GetFocusZeroVoltage());
322 if (!
ui.SBGeneralFocusConfocalOffsetVoltage->hasFocus())
323 ui.SBGeneralFocusConfocalOffsetVoltage->setValue(ModuleData->GetFocusConfocalOffsetVoltage());
328 auto SamplePosition = ModuleData->GetSamplePosition();
337 if (!
ui.SBWidefieldLEDExposureTime->hasFocus())
338 ui.SBWidefieldLEDExposureTime->setValue(ModuleData->GetLEDCameraExposureTime().count());
340 if (!
ui.SBWidefieldPumpExposureTime->hasFocus())
341 ui.SBWidefieldPumpExposureTime->setValue(ModuleData->GetWidefieldCameraExposureTime().count());
343 if (ModuleData->IsCurrentImageAvlbl())
347 ModuleData->ResetCurrentImageAvlbl();
357 if (ModuleData->HaveLocalizedPositionsChanged())
360 for (
const auto& Position : ModuleData->GetLocalizedPositions())
363 ModuleData->ResetLocalizedPositionsChanged();
369 MainGraphicsView->
AddMarker(ModuleData->GetConfocalSpotImagePosition(), QColorConstants::Red,
false, -1,
"Confocal spot");
377 const auto LocalizedPositions = ModuleData->GetLocalizedPositions();
378 ModuleData->ClearLocalizedPositions();
380 bool SortingEnabled =
ui.TWEmitterList->isSortingEnabled();
381 ui.TWEmitterList->setSortingEnabled(
false);
383 ui.TWEmitterList->clearContents();
384 ui.TWEmitterList->setRowCount(0);
387 for (
const auto& Marker : Markers)
389 const auto Row =
ui.TWEmitterList->rowCount();
390 ui.TWEmitterList->insertRow(Row);
392 QTableWidgetItem* IDItem =
new QTableWidgetItem;
394 if (Marker.GetID() >= 0)
396 IDItem->setData(Qt::EditRole, Marker.GetID());
397 IDItem->setData(Qt::UserRole, Marker.GetID());
399 auto OldLocalizedPosition = LocalizedPositions.find(Marker.GetID());
400 if (OldLocalizedPosition != LocalizedPositions.cend())
401 LocalizedEmitterState = OldLocalizedPosition->second.State;
402 ModuleData->AppendLocalizedPosition({ Marker.GetID(), { Marker.GetMarkerPos(), LocalizedEmitterState } });
407 IDItem->setText(
"n/a");
410 ui.TWEmitterList->setItem(Row, EmitterListColumnType::EmitterID, IDItem);
411 ui.TWEmitterList->setItem(Row, EmitterListColumnType::EmitterName,
new QTableWidgetItem(Marker.GetName().data()));
412 ui.TWEmitterList->setItem(Row, EmitterListColumnType::Image_x,
new QTableWidgetItem(QString::number(Marker.GetMarkerPos().x())));
413 ui.TWEmitterList->item(Row, EmitterListColumnType::Image_x)->setData(Qt::ItemDataRole::UserRole, Marker.GetMarkerPos().x());
414 ui.TWEmitterList->setItem(Row, EmitterListColumnType::Image_y,
new QTableWidgetItem(QString::number(Marker.GetMarkerPos().y())));
415 ui.TWEmitterList->item(Row, EmitterListColumnType::Image_y)->setData(Qt::ItemDataRole::UserRole, Marker.GetMarkerPos().y());
416 ui.TWEmitterList->setItem(Row, EmitterListColumnType::Sample_x,
new QTableWidgetItem(Marker.GetImagePos().isNull() ?
"n/a" : QString::number(Marker.GetImagePos().x(),
'f', 0)));
417 ui.TWEmitterList->item(Row, EmitterListColumnType::Sample_x)->setData(Qt::ItemDataRole::UserRole, Marker.GetImagePos().x());
418 ui.TWEmitterList->setItem(Row, EmitterListColumnType::Sample_y,
new QTableWidgetItem(Marker.GetImagePos().isNull() ?
"n/a" : QString::number(Marker.GetImagePos().y(),
'f', 0)));
419 ui.TWEmitterList->item(Row, EmitterListColumnType::Sample_y)->setData(Qt::ItemDataRole::UserRole, Marker.GetImagePos().y());
424 ui.TWEmitterList->setSortingEnabled(SortingEnabled);
426 ModuleData->ResetLocalizedPositionsChanged();
427 ModuleData->ResetAutoMeasureCurrentEmitter();
430 if (ModuleData->HaveLocalizedPositionsStateChanged())
432 for (
int i = 0; i <
ui.TWEmitterList->rowCount(); ++i)
435 auto Emitter = ModuleData->GetLocalizedPositions().find(ID);
436 if (Emitter == ModuleData->GetLocalizedPositions().cend())
443 ModuleData->ClearLocalizedPositionsStateChanged();
466 if (!
ui.SBConfocalWidth->hasFocus())
467 ui.SBConfocalWidth->setValue(ModuleData->GetConfocalScanWidth());
468 if (!
ui.SBConfocalHeight->hasFocus())
469 ui.SBConfocalHeight->setValue(ModuleData->GetConfocalScanHeight());
470 if (!
ui.SBConfocalDistPerPixel->hasFocus())
471 ui.SBConfocalDistPerPixel->setValue(ModuleData->GetConfocalScanDistPerPixel());
472 if (!
ui.SBConfocalOptimizationInitXYStepSize->hasFocus())
473 ui.SBConfocalOptimizationInitXYStepSize->setValue(ModuleData->GetConfocalOptimizationInitXYStepSize());
474 if (!
ui.SBConfocalOptimizationInitZStepSize->hasFocus())
475 ui.SBConfocalOptimizationInitZStepSize->setValue(ModuleData->GetConfocalOptimizationInitZStepSize());
476 if (!
ui.SBConfocalOptimizationTolerance->hasFocus())
477 ui.SBConfocalOptimizationTolerance->setValue(ModuleData->GetConfocalOptimizationTolerance());
479 if (ModuleData->HasConfocalScanSurfacePlotRows())
481 auto Rows = ModuleData->GetConfocalScanSurfacePlotRows();
492 for (
auto& Row : Rows)
500 for (
auto i =
NumItemsInArray; i < ModuleData->GetConfocalScanResults().size(); ++i)
502 const auto& ResultItem = ModuleData->GetConfocalScanResults()[i];
503 if (ResultItem.first.RowIndex < 0 || ResultItem.first.ColumnIndex < 0)
506 auto& SurfaceItem =
ConfocalSurfaceDataArray->operator[](ResultItem.first.RowIndex)->
operator[](ResultItem.first.ColumnIndex);
508 SurfaceItem.setY(ResultItem.second);
524 if (!
ui.SBHBTBinWidth->hasFocus())
525 ui.SBHBTBinWidth->setValue(ModuleData->GetHBTBinWidth().count());
526 if (!
ui.SBHBTBinCount->hasFocus())
527 ui.SBHBTBinCount->setValue(Util::NumToT<int>(ModuleData->GetHBTBinCount()));
528 if (!
ui.SBHBTAcquisitionTime->hasFocus())
529 ui.SBHBTAcquisitionTime->setValue(
static_cast<double>(ModuleData->GetHBTMaxIntegrationTime().count()) / std::chrono::microseconds::period::den);
530 ui.LEHBTTotalIntegrationTime->setText(QString::number(ModuleData->GetHBTTotalIntegrationTime().count() / std::chrono::microseconds::period::den) +
" s");
532 if (
ui.HBTChart->isVisible())
539 HBTXAxis->setRange(ModuleData->GetHBTDataPointsMinValues().x(), ModuleData->GetHBTDataPointsMaxValues().x());
540 HBTYAxis->setRange(ModuleData->GetHBTDataPointsMinValues().y(), ModuleData->GetHBTDataPointsMaxValues().y());
541 ui.LEHBTMinValue->setText(QString::number(ModuleData->GetHBTDataPointsMinValues().y()));
552 const QSignalBlocker Blocker(
ui.LEAutoMeasureSavePath);
553 ui.LEAutoMeasureSavePath->setText(QString::fromUtf16(ModuleData->GetAutoMeasureSavePath().u16string().c_str()));
556 if (!
ui.SBAutoMeasureNumberImageSets->hasFocus())
557 ui.SBAutoMeasureNumberImageSets->setValue(ModuleData->GetAutoMeasureNumberImageSets());
558 if (!
ui.SBAutoMeasureInitialImageSetWaitTime->hasFocus())
559 ui.SBAutoMeasureInitialImageSetWaitTime->setValue(ModuleData->GetAutoMeasureInitialImageSetWaitTime().count());
560 if (!
ui.SBAutoMeasureImagePositionScatterRadius->hasFocus())
561 ui.SBAutoMeasureImagePositionScatterRadius->setValue(ModuleData->GetAutoMeasureImagePositionScatterRadius());
562 if (!
ui.CBAutoMeasureLocalize->hasFocus())
563 ui.CBAutoMeasureLocalize->setCurrentIndex(ModuleData->GetAutoMeasureLocalizationType());
564 if (!
ui.CBAutoMeasureOptimize->hasFocus())
565 ui.CBAutoMeasureOptimize->setChecked(ModuleData->GetAutoMeasureOptimizeEnabled());
566 if (!
ui.CBAutoMeasureEnableSpectrum->hasFocus())
567 ui.CBAutoMeasureEnableSpectrum->setChecked(ModuleData->GetAutoMeasureSpectrumEnabled());
568 if (!
ui.CBAutoMeasureEnableHBT->hasFocus())
569 ui.CBAutoMeasureEnableHBT->setChecked(ModuleData->GetAutoMeasureHBTEnabled());
570 if (!
ui.SBAutoMeasureOptimizationAttempts->hasFocus())
571 ui.SBAutoMeasureOptimizationAttempts->setValue(ModuleData->GetAutoMeasureNumOptimizationAttempts());
572 if (!
ui.SBAutoMeasureOptimizationReruns->hasFocus())
573 ui.SBAutoMeasureOptimizationReruns->setValue(ModuleData->GetAutoMeasureMaxOptimizationReruns());
574 if (!
ui.SBAutoMeasureOptimizationMaxDistance->hasFocus())
575 ui.SBAutoMeasureOptimizationMaxDistance->setValue(ModuleData->GetAutoMeasureOptimizationMaxDistance());
576 if (!
ui.SBAutoMeasureCountRateThreshold->hasFocus())
577 ui.SBAutoMeasureCountRateThreshold->setValue(ModuleData->GetAutoMeasureCountRateThreshold());
578 if (!
ui.SBAutoMeasureCellRangeFromX->hasFocus())
579 ui.SBAutoMeasureCellRangeFromX->setValue(ModuleData->GetAutoMeasureCellRangeFrom().x());
580 if (!
ui.SBAutoMeasureCellRangeFromY->hasFocus())
581 ui.SBAutoMeasureCellRangeFromY->setValue(ModuleData->GetAutoMeasureCellRangeFrom().y());
582 if (!
ui.SBAutoMeasureCellRangeToX->hasFocus())
583 ui.SBAutoMeasureCellRangeToX->setValue(ModuleData->GetAutoMeasureCellRangeTo().x());
584 if (!
ui.SBAutoMeasureCellRangeToY->hasFocus())
585 ui.SBAutoMeasureCellRangeToY->setValue(ModuleData->GetAutoMeasureCellRangeTo().y());
586 if (!
ui.SBAutoMeasureCellSkipX->hasFocus())
587 ui.SBAutoMeasureCellSkipX->setValue(ModuleData->GetAutoMeasureCellSkip().x());
588 if (!
ui.SBAutoMeasureCellSkipY->hasFocus())
589 ui.SBAutoMeasureCellSkipY->setValue(ModuleData->GetAutoMeasureCellSkip().y());
591 if (ModuleData->GetAutoMeasureCurrentImageSet() >= 0 && ModuleData->GetAutoMeasureCurrentImageSet() < ModuleData->GetAutoMeasureNumberImageSets())
593 ui.LAutoMeasureCellProgress->setText(
"Recording image set " + QString::number(ModuleData->GetAutoMeasureCurrentImageSet() + 1) +
594 " / " + QString::number(ModuleData->GetAutoMeasureNumberImageSets()));
595 ui.PBAutoMeasureCellProgress->setValue(
static_cast<int>(100.0 * ModuleData->GetAutoMeasureCurrentImageSet() / ModuleData->GetAutoMeasureNumberImageSets()));
596 ui.PBAutoMeasureCellProgress->setVisible(
true);
598 else if (ModuleData->IsAutoMeasureRunning())
600 const auto EmitterCount = std::distance(ModuleData->GetAutoMeasureFirstEmitter(), ModuleData->GetLocalizedPositions().end());
601 const auto CurrentEmitter = EmitterCount - std::distance(ModuleData->GetAutoMeasureCurrentEmitter(), ModuleData->GetLocalizedPositions().end());
603 ui.LAutoMeasureCellProgress->setText(
"Emitter " + QString::number(CurrentEmitter + 1) +
604 " / " + QString::number(EmitterCount) +
", " +
605 QString::number(ModuleData->GetNumFinishedLocalizedPositions()) +
" successful, " +
606 QString::number(ModuleData->GetNumFailedLocalizedPositions()) +
" failed");
607 ui.PBAutoMeasureCellProgress->setValue(
static_cast<int>(100.0 * CurrentEmitter / EmitterCount));
608 ui.PBAutoMeasureCellProgress->setVisible(
true);
612 ui.LAutoMeasureCellProgress->setText(
"Ready");
613 ui.PBAutoMeasureCellProgress->setVisible(
false);
616 ui.GBAutoMeasureSampleProgress->setVisible(IsCharacterizingSample && ModuleData->HasCellID());
617 if (IsCharacterizingSample && ModuleData->HasCellID())
619 const auto CurrentCell = ModuleData->GetAutoMeasureCurrentCellIndex();
620 const auto CellCount = ModuleData->GetAutoMeasureCellCount();
622 ui.LAutoMeasureSampleProgress->setText(
"Cell " + QString::number(CurrentCell + 1) +
623 " / " + QString::number(CellCount));
624 ui.PBAutoMeasureSampleProgress->setValue(
static_cast<int>(100.0 * CurrentCell / CellCount));
630 MainGraphicsPixmap = QPixmap::fromImage(Image);
631 MainGraphicsPixmap.detach();
650 if (event->type() == QEvent::MouseMove)
657 return QObject::eventFilter(obj, event);
667 if (
ui.TWEmitterList->selectedItems().empty())
670 const auto Row =
ui.TWEmitterList->selectedItems()[0]->row();
672 MarkerPos = {
ui.TWEmitterList->item(Row, EmitterListColumnType::Image_x)->data(Qt::ItemDataRole::UserRole).toInt(),
673 ui.TWEmitterList->item(Row, EmitterListColumnType::Image_y)->data(Qt::ItemDataRole::UserRole).toInt() };
674 SamplePos = {
ui.TWEmitterList->item(Row, EmitterListColumnType::Sample_x)->data(Qt::ItemDataRole::UserRole).toReal(),
675 ui.TWEmitterList->item(Row, EmitterListColumnType::Sample_y)->data(Qt::ItemDataRole::UserRole).toReal() };
676 MarkerID =
ui.TWEmitterList->item(Row, EmitterListColumnType::EmitterID)->data(Qt::ItemDataRole::UserRole).value<decltype(
MarkerID)>();
684 if (Filename.isEmpty())
692 ui.action_Zoom_fit->setChecked(
false);
698 ui.action_Zoom_fit->setChecked(
false);
704 ui.action_Zoom_fit->setChecked(
false);
753 for (
int i = 0; i <
ui.TWEmitterList->selectedItems().size(); ++i)
755 const auto Row =
ui.TWEmitterList->selectedItems()[i]->row();
756 const QPoint Pos = {
ui.TWEmitterList->item(Row, EmitterListColumnType::Image_x)->data(Qt::ItemDataRole::UserRole).toInt(),
757 ui.TWEmitterList->item(Row, EmitterListColumnType::Image_y)->data(Qt::ItemDataRole::UserRole).toInt() };
768 const auto Row =
ui.TWEmitterList->selectedItems()[0]->row();
769 const auto OldName =
ui.TWEmitterList->item(Row, EmitterListColumnType::EmitterName)->text();
771 bool OKClicked =
false;
772 QString NewName = QInputDialog::getText(
this,
"Edit name",
773 QString(
"Enter new name for marker \"") + OldName +
"\":", QLineEdit::Normal, OldName, &OKClicked);
799 ConfocalGraph->scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPreset::CameraPresetDirectlyAbove);
808 if (Filename.isEmpty())
811 std::stringstream CSVData;
813 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(
GetOwner().GetModuleData());
815 CSVData = ModuleData->AssembleCSVHeader(
true,
false,
false);
816 ModuleData->WriteConfocalScanResults(CSVData);
820 QMessageBox::warning(
this,
"DynExp - Error",
"Error writing data to file.");
826 if (Filename.isEmpty())
829 std::stringstream CSVData;
831 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(
GetOwner().GetModuleData());
833 CSVData = ModuleData->AssembleCSVHeader(
false,
true,
false);
834 ModuleData->WriteHBTResults(CSVData);
838 QMessageBox::warning(
this,
"DynExp - Error",
"Error writing data to file.");
844 ".csv",
" Comma-separated values file (*.csv)");
845 if (Filename.isEmpty())
849 ui.LEAutoMeasureSavePath->setText(Filename);
Implementation of a module to control a combined widefield and confocal microscope.
static QColor GetLocalizedEmitterColor(LocalizedEmitterStateType State)
LocalizedEmitterStateType
@ WidefieldConfocalSwitch
static const char * GetLocalizedEmitterStateString(LocalizedEmitterStateType State)
void OnRunCharacterizationFromID(DynExp::ModuleInstance *Instance, Util::MarkerGraphicsView::MarkerType::IDType ID) const
void OnGoToSamplePos(DynExp::ModuleInstance *Instance, QPointF SamplePos) const
void OnSaveCurrentImage(DynExp::ModuleInstance *Instance, QString Filename) const
void OnBringMarkerToConfocalSpot(DynExp::ModuleInstance *Instance, QPoint MarkerPos, QPointF SamplePos) const
Implements a QGraphicsView the user can interact with to insert graphical markers....
const std::vector< MarkerType > & GetMarkers() const noexcept
void ZoomReset()
Resets the zoom.
void DeselectMarkers()
Deselects all selected markers.
void EnableActions(bool Enable)
auto contextMenu() const noexcept
void RenameMarker(const QPoint &MarkerPos, std::string_view NewName)
Assigns a name to the marker at position MarkerPos. Affects MarkersChanged.
void SelectMarker(const QPoint &MarkerPos)
Selects the marker at position MarkerPos.
bool HaveMarkersChanged() noexcept
Returns whether a marker operation has changed the stored markers. Resets the flag.
void RemoveMarker(size_t Index, bool OnlyUserDeletableMarkers=false)
Removes the n-th marker specified by Index. Affects MarkersChanged.
void AddMarker(const QPoint &MarkerPos, const QColor &Color, bool IsUserDeletable=true, MarkerType::IDType ID=-1, std::string Name={})
Adds a marker to the graphics view at position MarkerPos assigning the properties passed as arguments...
void ZoomIn()
Zooms in one step.
void ZoomOut()
Zooms out one step.
void SetCurrentImagePos(const QPointF &Pos)
void RemoveMarkers(bool OnlyUserDeletableMarkers)
Removes all markers from the graphics view. Affects MarkersChanged.
State machine context as used by class StateMachine. A state machine context holds a map with keys an...
State machine state as used by class StateMachine. A state mainly wraps a state function of the membe...
constexpr StateEnumType GetState() const noexcept
Returns the state's unique identifier.
Pointer to lock a class derived from ISynchronizedPointerLockable for synchronizing between threads....
constexpr auto DefaultQChartTheme
constexpr auto StatusBarRunningStyleSheet
constexpr auto DefaultQ3DTheme
QLinearGradient GetDefaultLinearGradient()
constexpr auto StatusBarBusyStyleSheet
auto MakeEvent(ReceiverType *Receiver, typename DefaultEvent< ReceiverType, std::tuple< std::remove_reference_t< ArgsTs >... >>::EventFuncPtrType EventFuncPtr, ArgsTs &&...Args)
Creates an event of type DefaultEvent.
std::string ToStr(const T &Value, int Precision=-1)
Converts a (numeric) value of type T to a std::string using operator<< of std::stringstream.
bool SaveToFile(const QString &Filename, std::string_view Text)
Saves a std::string_view to a file (using QFile). Creates a new file or truncates an existing file's ...
QString PromptSaveFilePathModule(DynExp::QModuleWidget *Parent, const QString &Title, const QString &DefaultSuffix, const QString &NameFilter)
Works as PromptOpenFilePath() but asks the user to select a single file which does not need to exist....
Accumulates include statements to provide a precompiled header.