DynExp
Highly flexible laboratory automation for dynamically changing experiments.
WidefieldMicroscopeWidget.cpp
Go to the documentation of this file.
1 // This file is part of DynExp.
2 
3 #include "stdafx.h"
4 #include "WidefieldMicroscope.h"
5 #include "moc_WidefieldMicroscopeWidget.cpp"
7 
9 {
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))
18  {
19  CellIDLabel->setContextMenuPolicy(Qt::ContextMenuPolicy::CustomContextMenu);
20  PumpPowerLabel->setMinimumWidth(140);
21  XCoordLabel->setAlignment(Qt::AlignmentFlag::AlignRight);
22  YCoordLabel->setAlignment(Qt::AlignmentFlag::AlignRight);
26  }
27 
29  {
30  if (CurrentContext && !std::string(CurrentContext->GetDescription()).empty())
31  StateLabel->setText(QString(" ") + CurrentContext->GetDescription());
32  else
33  StateLabel->setText(CurrentState ? (QString(" ") + CurrentState->GetDescription()) : "< Unknown >");
34 
35  if (CurrentState && CurrentState->GetState() != StateType::Ready)
36  StateLabel->setStyleSheet(DynExpUI::StatusBarBusyStyleSheet);
37  else
38  StateLabel->setStyleSheet("");
39  }
40 
42  : QModuleWidget(Owner, parent), StatusBar(this),
43  WidefieldConfocalModeActionGroup(new QActionGroup(this)), MainGraphicsView(nullptr),
44  MainGraphicsScene(new QGraphicsScene(this)), CurrentConfocalSpotPosition(0, 0),
45  EmitterListContextMenu(new QMenu(this)),
46  ConfocalMapContextMenu(new QMenu(this)), ConfocalGraph(nullptr), ConfocalGraphContainer(nullptr),
47  ConfocalSurfaceDataProxy(new QSurfaceDataProxy(this)), ConfocalSurfaceDataArray(nullptr),
49  NumItemsInArray(0),
50  ConfocalSurfaceMinCounts(std::numeric_limits<decltype(ConfocalSurfaceMinCounts)>::max()), ConfocalSurfaceMaxCounts(0),
51  HBTDataSeries(nullptr), HBTDataChart(nullptr), HBTXAxis(new QValueAxis(this)), HBTYAxis(new QValueAxis(this))
52  {
53  ui.setupUi(this);
54 
55  // For shortcuts
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);
66 
67  ui.action_Zoom_fit->setChecked(true);
68 
69  // Status bar
70  ui.MainStatusBar->addWidget(StatusBar.StateLabel, 4);
71  ui.MainStatusBar->addWidget(StatusBar.CellIDLabel, 1);
72  ui.MainStatusBar->addWidget(StatusBar.HomePosLabel, 2);
73  ui.MainStatusBar->addWidget(StatusBar.PumpPowerLabel, 1);
74  ui.MainStatusBar->addPermanentWidget(StatusBar.ImageCoordinatesGroup, 2);
75 
76  StatusBar.CellIDContextMenu->addAction(ui.action_Reset_CellID);
77  connect(StatusBar.CellIDLabel, &QWidget::customContextMenuRequested, this, &WidefieldMicroscopeWidget::OnCellIDContextMenuRequested);
78 
79  // Tool bar
80  WidefieldConfocalModeActionGroup->addAction(ui.action_Widefield_mode);
81  WidefieldConfocalModeActionGroup->addAction(ui.action_Widefield_mode);
82  WidefieldConfocalModeActionGroup->addAction(ui.action_Confocal_mode);
83 
84  // Main image
85  MainGraphicsView = new Util::MarkerGraphicsView(ui.MainHSplitter);
86  MainGraphicsView->setObjectName(QString::fromUtf8("MainGraphicsView"));
87  MainGraphicsView->setMinimumSize(QSize(300, 200));
88  ui.MainHSplitter->addWidget(MainGraphicsView);
89 
92  MainGraphicsView->setAlignment(Qt::AlignLeft | Qt::AlignTop);
93  MainGraphicsView->viewport()->installEventFilter(this);
94  MainGraphicsView->viewport()->setMouseTracking(true);
95 
96  MainGraphicsView->contextMenu()->addSeparator();
97  MainGraphicsView->contextMenu()->addAction(ui.action_Zoom_in);
98  MainGraphicsView->contextMenu()->addAction(ui.action_Zoom_out);
99  MainGraphicsView->contextMenu()->addAction(ui.action_Zoom_reset);
100  MainGraphicsView->contextMenu()->addAction(ui.action_Zoom_fit);
101  MainGraphicsView->contextMenu()->addSeparator();
102  MainGraphicsView->contextMenu()->addAction(ui.action_Save_Image);
103 
104  // Emitter list
105  EmitterListContextMenu->addAction(ui.action_EmitterList_Edit_name);
106  EmitterListContextMenu->addAction(ui.action_EmitterList_Remove_entry);
107  EmitterListContextMenu->addSeparator();
108  EmitterListContextMenu->addAction(ui.action_EmitterList_Go_to_sample_position);
109  EmitterListContextMenu->addAction(ui.action_EmitterList_Bring_marker_to_confocal_spot);
110  EmitterListContextMenu->addSeparator();
111  EmitterListContextMenu->addAction(ui.action_EmitterList_Run_characterization_from_ID);
112 
113  // Graph to display confocal scans
114  ConfocalMapContextMenu->addAction(ui.action_confocal_map_save_raw_data);
115  ConfocalMapContextMenu->addAction(ui.action_confocal_map_reset);
116  ui.BConfocalGraphTools->setMenu(ConfocalMapContextMenu);
117  ConfocalGraph = new Q3DSurface(); // Ownership transferred to ConfocalGraphContainer below.
118  ConfocalGraphContainer = QWidget::createWindowContainer(ConfocalGraph, ui.WidgetConfocalGraphContainer);
119  ConfocalGraphContainer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
120  ui.WidgetConfocalGraphContainer->layout()->addWidget(ConfocalGraphContainer);
121  ConfocalGraph->activeTheme()->setType(DynExpUI::DefaultQ3DTheme);
122  ConfocalGraph->activeTheme()->setLabelBorderEnabled(false);
123  ConfocalGraph->scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPreset::CameraPresetDirectlyAbove);
124  ConfocalGraph->setShadowQuality(QAbstract3DGraph::ShadowQuality::ShadowQualityNone);
125  ConfocalGraph->setOrthoProjection(true);
126  ConfocalGraph->setSelectionMode(QAbstract3DGraph::SelectionFlag::SelectionItem);
127 
128  ConfocalGraph->axisX()->setLabelFormat("%.0f");
129  ConfocalGraph->axisX()->setAutoAdjustRange(true);
130  ConfocalGraph->axisX()->setLabelAutoRotation(90);
131  ConfocalGraph->axisX()->setTitle("X in nm");
132  ConfocalGraph->axisX()->setTitleVisible(true);
133  ConfocalGraph->axisY()->setLabelFormat("%.0f");
134  ConfocalGraph->axisY()->setAutoAdjustRange(false);
135  ConfocalGraph->axisY()->setTitle("Count rate in Hz");
136  ConfocalGraph->axisY()->setTitleVisible(true);
137  ConfocalGraph->axisZ()->setLabelFormat("%.0f");
138  ConfocalGraph->axisZ()->setAutoAdjustRange(true);
139  ConfocalGraph->axisZ()->setTitle("Y in nm");
140  ConfocalGraph->axisZ()->setTitleVisible(true);
141 
142  ConfocalSurface3DSeries->setDrawMode(QSurface3DSeries::DrawSurface);
143  ConfocalSurface3DSeries->setFlatShadingEnabled(true);
145  ConfocalSurface3DSeries->setColorStyle(Q3DTheme::ColorStyleRangeGradient);
146  ConfocalSurface3DSeries->setItemLabelFormat("(@xLabel nm, @zLabel nm): @yLabel Hz");
148 
149  // Graph to display HBT result
150  HBTDataChart = new QChart();
151  ui.HBTChart->setChart(HBTDataChart); // Takes ownership of HBTDataChart.
152  ui.HBTChart->setRenderHint(QPainter::Antialiasing);
154  HBTDataChart->legend()->setVisible(false);
155  HBTXAxis->setTitleText("time in ps");
156  HBTYAxis->setTitleText("g(2)");
157 
158  // Chart takes ownership of axes.
159  HBTDataChart->addAxis(HBTXAxis, Qt::AlignBottom);
160  HBTDataChart->addAxis(HBTYAxis, Qt::AlignLeft);
161  }
162 
164  {
165  return static_cast<const WidefieldMicroscope&>(GetOwner());
166  }
167 
169  {
170  if (!GetUIInitialized())
171  {
172  ui.action_Toogle_LED_light_source->setEnabled(ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::LEDLightToggle));
173  ui.action_Toogle_pump_light_source->setEnabled(ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::PumpLightToggle));
174  ui.GBGeneralLaserPowers->setEnabled(ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::SetPumpPower));
175 
176  auto WidefieldTabIndex = ui.TabWidget->indexOf(ui.TabWidefield);
177  auto ConfocalTabIndex = ui.TabWidget->indexOf(ui.TabConfocal);
178  auto HBTTabIndex = ui.TabWidget->indexOf(ui.TabHBT);
179  ui.TabWidget->setTabVisible(WidefieldTabIndex, ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield));
180  ui.TabWidget->setTabVisible(ConfocalTabIndex, ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Confocal));
181  ui.TabWidget->setTabVisible(HBTTabIndex, ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::HBT));
182 
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);
189  if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::FocusAdjustment))
190  {
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);
200  }
201  else
202  ui.GBGeneralFocus->setVisible(false);
204  {
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);
210  }
211 
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());
216 
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);
221 
222  UIInitialized = true;
223  }
224  }
225 
228  {
229  bool IsReady = State->GetState() == StateType::Ready;
230  StatusBar.CurrentState = State;
231  StatusBar.CurrentContext = Context;
232 
233  StatusBar.CellIDLabel->setText(ModuleData->HasCellID() ? QString::fromStdString(ModuleData->GetCellID().IDString) : "< Unknown cell ID. >");
234  StatusBar.CellIDLabel->setToolTip(ModuleData->HasCellID() ?
235  ("(" + QString::number(ModuleData->GetCellID().X_id) + ", " + QString::number(ModuleData->GetCellID().Y_id) + ")") : "n/a");
236 
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);
239 
241  (" Pump power: " + QString::number(ModuleData->GetMeasuredPumpPower(), 'f', 2) + " V") : "");
242  if (ModuleData->GetPumpLightTurnedOn())
244  else
245  StatusBar.PumpPowerLabel->setStyleSheet("");
246 
248  ui.action_Save_Image->setEnabled(IsReady);
249  ui.action_Stop_current_action->setEnabled(!IsReady);
250  ui.action_Set_home_position->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Confocal));
251  ui.action_Go_home_position->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Confocal));
252  ui.action_Widefield_mode->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldConfocalSwitch));
253  ui.action_Confocal_mode->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldConfocalSwitch));
254  ui.action_Autofocus->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::FocusAdjustment));
255  ui.action_Optimize_positions->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::ConfocalOptimization)
256  && ModuleData->GetSetupMode() == WidefieldMicroscopeData::SetupModeType::Confocal);
257  ui.action_Toggle_HBT_mirror->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::HBTSwitch));
258  ui.action_Reset_CellID->setEnabled(IsReady);
259  ui.GBGeneralLaserPowers->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::SetPumpPower));
260  ui.GBGeneralFocus->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::FocusAdjustment));
261  ui.SBWidefieldLEDExposureTime->setEnabled(IsReady &&
262  ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield) && ModuleData->GetWidefieldCamera()->CanSetExposureTime());
263  ui.BWidefieldApplyLEDExposureTime->setEnabled(IsReady &&
264  ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield) && ModuleData->GetWidefieldCamera()->CanSetExposureTime());
265  ui.SBWidefieldPumpExposureTime->setEnabled(IsReady &&
266  ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield) && ModuleData->GetWidefieldCamera()->CanSetExposureTime());
267  ui.BWidefieldApplyPumpExposureTime->setEnabled(IsReady &&
268  ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield) && ModuleData->GetWidefieldCamera()->CanSetExposureTime());
269  ui.BWidefieldFindConfocalSpot->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldConfocalSwitch));
270  ui.BWidefieldLEDCapture->setEnabled(IsReady);
271  ui.BWidefieldCapture->setEnabled(IsReady);
272  ui.BReadCellID->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldLocalization));
273  ui.BAnalyzeImageDistortion->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldLocalization));
274  ui.BLocalizeEmitters->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldLocalization));
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);
284  ui.SBConfocalOptimizationInitXYStepSize->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::ConfocalOptimization));
285  ui.SBConfocalOptimizationInitZStepSize->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::ConfocalOptimization));
286  ui.SBConfocalOptimizationTolerance->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::ConfocalOptimization));
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);
297  ui.BAutoMeasureRunLocalization->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield));
298  ui.BAutoMeasureRunCharacterization->setEnabled(IsReady);
299  ui.BAutoMeasureRunSampleCharacterization->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield) &&
300  ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Confocal) &&
302  }
303 
305  {
306  // Toolbar
307  ui.action_Toogle_LED_light_source->setChecked(ModuleData->GetLEDLightTurnedOn());
308  ui.action_Toogle_pump_light_source->setChecked(ModuleData->GetPumpLightTurnedOn());
309  ui.action_Widefield_mode->setChecked(ModuleData->GetSetupMode() == WidefieldMicroscopeData::SetupModeType::Widefield);
310  ui.action_Confocal_mode->setChecked(ModuleData->GetSetupMode() == WidefieldMicroscopeData::SetupModeType::Confocal);
311 
312  // General
313  // QDoubleSpinBox::setValue() emits QDoubleSpinBox::valueChanged().
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());
324 
325  // MainGraphicsView
327  {
328  auto SamplePosition = ModuleData->GetSamplePosition();
329  MainGraphicsView->SetCurrentImagePos({ static_cast<qreal>(SamplePosition.x), static_cast<qreal>(SamplePosition.y) });
330  }
331  else
333  }
334 
336  {
337  if (!ui.SBWidefieldLEDExposureTime->hasFocus())
338  ui.SBWidefieldLEDExposureTime->setValue(ModuleData->GetLEDCameraExposureTime().count());
339 
340  if (!ui.SBWidefieldPumpExposureTime->hasFocus())
341  ui.SBWidefieldPumpExposureTime->setValue(ModuleData->GetWidefieldCameraExposureTime().count());
342 
343  if (ModuleData->IsCurrentImageAvlbl())
344  {
345  // SetMainGraphicsImage creates a deep copy of the current image.
346  SetMainGraphicsImage(ModuleData->GetCurrentImage());
347  ModuleData->ResetCurrentImageAvlbl();
348  }
349 
350  if (!SaveWidefieldImageFilename.isEmpty())
351  {
353 
355  }
356 
357  if (ModuleData->HaveLocalizedPositionsChanged())
358  {
360  for (const auto& Position : ModuleData->GetLocalizedPositions())
361  MainGraphicsView->AddMarker(Position.second.Position, QColorConstants::DarkYellow, true, Position.first, "Emitter " + Util::ToStr(Position.first));
362 
363  ModuleData->ResetLocalizedPositionsChanged();
364  }
365 
366  if (CurrentConfocalSpotPosition != ModuleData->GetConfocalSpotImagePosition())
367  {
369  MainGraphicsView->AddMarker(ModuleData->GetConfocalSpotImagePosition(), QColorConstants::Red, false, -1, "Confocal spot");
370 
371  CurrentConfocalSpotPosition = ModuleData->GetConfocalSpotImagePosition();
372  }
373 
375  {
376  // Copy intended.
377  const auto LocalizedPositions = ModuleData->GetLocalizedPositions();
378  ModuleData->ClearLocalizedPositions();
379 
380  bool SortingEnabled = ui.TWEmitterList->isSortingEnabled();
381  ui.TWEmitterList->setSortingEnabled(false);
382 
383  ui.TWEmitterList->clearContents();
384  ui.TWEmitterList->setRowCount(0);
385 
386  auto& Markers = MainGraphicsView->GetMarkers();
387  for (const auto& Marker : Markers)
388  {
389  const auto Row = ui.TWEmitterList->rowCount();
390  ui.TWEmitterList->insertRow(Row);
391 
392  QTableWidgetItem* IDItem = new QTableWidgetItem;
394  if (Marker.GetID() >= 0)
395  {
396  IDItem->setData(Qt::EditRole, Marker.GetID());
397  IDItem->setData(Qt::UserRole, Marker.GetID());
398 
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 } });
403  }
404  else
405  {
406  IDItem->setData(Qt::UserRole, Util::MarkerGraphicsView::MarkerType::IDType(-1));
407  IDItem->setText("n/a");
408  }
409 
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());
420  ui.TWEmitterList->setItem(Row, EmitterListColumnType::EmitterState, new QTableWidgetItem(WidefieldMicroscopeData::GetLocalizedEmitterStateString(LocalizedEmitterState)));
421  ui.TWEmitterList->item(Row, EmitterListColumnType::EmitterState)->setForeground(WidefieldMicroscopeData::GetLocalizedEmitterColor(LocalizedEmitterState));
422  }
423 
424  ui.TWEmitterList->setSortingEnabled(SortingEnabled);
425 
426  ModuleData->ResetLocalizedPositionsChanged();
427  ModuleData->ResetAutoMeasureCurrentEmitter();
428  }
429 
430  if (ModuleData->HaveLocalizedPositionsStateChanged())
431  {
432  for (int i = 0; i < ui.TWEmitterList->rowCount(); ++i)
433  {
434  auto ID = ui.TWEmitterList->item(i, EmitterListColumnType::EmitterID)->data(Qt::ItemDataRole::UserRole).value<Util::MarkerGraphicsView::MarkerType::IDType>();
435  auto Emitter = ModuleData->GetLocalizedPositions().find(ID);
436  if (Emitter == ModuleData->GetLocalizedPositions().cend())
437  continue;
438 
439  ui.TWEmitterList->item(i, EmitterListColumnType::EmitterState)->setText(WidefieldMicroscopeData::GetLocalizedEmitterStateString(Emitter->second.State));
440  ui.TWEmitterList->item(i, EmitterListColumnType::EmitterState)->setForeground(WidefieldMicroscopeData::GetLocalizedEmitterColor(Emitter->second.State));
441  }
442 
443  ModuleData->ClearLocalizedPositionsStateChanged();
444  }
445 
446  switch (EmitterListTask)
447  {
451  break;
455  break;
459  break;
460  default: break;
461  }
462  }
463 
465  {
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());
478 
479  if (ModuleData->HasConfocalScanSurfacePlotRows())
480  {
481  auto Rows = ModuleData->GetConfocalScanSurfacePlotRows();
482  NumItemsInArray = 0;
483  ConfocalSurfaceMinCounts = std::numeric_limits<decltype(ConfocalSurfaceMinCounts)>::max();
485 
486  // Deletes old array.
487  ConfocalSurfaceDataProxy->resetArray(nullptr);
488  // Ownership transferred to ConfocalSurfaceDataProxy below with resetArray().
489  ConfocalSurfaceDataArray = new QSurfaceDataArray;
490  ConfocalSurfaceDataArray->reserve(Util::NumToT<int>(Rows.size()));
491 
492  for (auto& Row : Rows)
493  *ConfocalSurfaceDataArray << Row.release();
494 
496  }
497 
498  if (ModuleData->GetConfocalScanResults().size() > NumItemsInArray)
499  {
500  for (auto i = NumItemsInArray; i < ModuleData->GetConfocalScanResults().size(); ++i)
501  {
502  const auto& ResultItem = ModuleData->GetConfocalScanResults()[i];
503  if (ResultItem.first.RowIndex < 0 || ResultItem.first.ColumnIndex < 0)
504  continue;
505 
506  auto& SurfaceItem = ConfocalSurfaceDataArray->operator[](ResultItem.first.RowIndex)->operator[](ResultItem.first.ColumnIndex);
507 
508  SurfaceItem.setY(ResultItem.second);
509  ConfocalSurfaceDataProxy->setItem(ResultItem.first.RowIndex, ResultItem.first.ColumnIndex, SurfaceItem);
510 
511  ConfocalSurfaceMinCounts = std::min(ConfocalSurfaceMinCounts, ResultItem.second);
512  ConfocalSurfaceMaxCounts = std::max(ConfocalSurfaceMaxCounts, ResultItem.second);
513 
514  ++NumItemsInArray;
515  }
516 
517  if (ConfocalSurfaceMinCounts < std::numeric_limits<decltype(ConfocalSurfaceMinCounts)>::max() && ConfocalSurfaceMaxCounts > 0)
519  }
520  }
521 
523  {
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");
531 
532  if (ui.HBTChart->isVisible())
533  {
534  HBTDataChart->removeAllSeries();
535  HBTDataSeries = new QLineSeries(this);
536  HBTDataSeries->append(ModuleData->GetHBTDataPoints());
537  HBTDataSeries->setPointsVisible(false);
538 
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()));
542 
543  HBTDataChart->addSeries(HBTDataSeries);
544  HBTDataSeries->attachAxis(HBTDataChart->axes()[0]);
545  HBTDataSeries->attachAxis(HBTDataChart->axes()[1]);
546  }
547  }
548 
550  {
551  {
552  const QSignalBlocker Blocker(ui.LEAutoMeasureSavePath);
553  ui.LEAutoMeasureSavePath->setText(QString::fromUtf16(ModuleData->GetAutoMeasureSavePath().u16string().c_str()));
554  } // Blocker unlocked here.
555 
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());
590 
591  if (ModuleData->GetAutoMeasureCurrentImageSet() >= 0 && ModuleData->GetAutoMeasureCurrentImageSet() < ModuleData->GetAutoMeasureNumberImageSets())
592  {
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);
597  }
598  else if (ModuleData->IsAutoMeasureRunning())
599  {
600  const auto EmitterCount = std::distance(ModuleData->GetAutoMeasureFirstEmitter(), ModuleData->GetLocalizedPositions().end());
601  const auto CurrentEmitter = EmitterCount - std::distance(ModuleData->GetAutoMeasureCurrentEmitter(), ModuleData->GetLocalizedPositions().end());
602 
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);
609  }
610  else
611  {
612  ui.LAutoMeasureCellProgress->setText("Ready");
613  ui.PBAutoMeasureCellProgress->setVisible(false);
614  }
615 
616  ui.GBAutoMeasureSampleProgress->setVisible(IsCharacterizingSample && ModuleData->HasCellID());
617  if (IsCharacterizingSample && ModuleData->HasCellID())
618  {
619  const auto CurrentCell = ModuleData->GetAutoMeasureCurrentCellIndex();
620  const auto CellCount = ModuleData->GetAutoMeasureCellCount();
621 
622  ui.LAutoMeasureSampleProgress->setText("Cell " + QString::number(CurrentCell + 1) +
623  " / " + QString::number(CellCount));
624  ui.PBAutoMeasureSampleProgress->setValue(static_cast<int>(100.0 * CurrentCell / CellCount));
625  }
626  }
627 
628  void WidefieldMicroscopeWidget::SetMainGraphicsImage(const QImage& Image) noexcept
629  {
630  MainGraphicsPixmap = QPixmap::fromImage(Image); // deep copy
631  MainGraphicsPixmap.detach(); // just to be sure...
632  }
633 
635  {
636  if (MainGraphicsView->isVisible() && !MainGraphicsView->visibleRegion().isEmpty())
637  {
639  MainGraphicsScene->update();
640 
641  OnZoomFitClicked(ui.action_Zoom_fit->isChecked());
642  }
643 
644  StatusBar.Update();
645  }
646 
647  bool WidefieldMicroscopeWidget::eventFilter(QObject* obj, QEvent* event)
648  {
649  if (MainGraphicsView->viewport())
650  if (event->type() == QEvent::MouseMove)
651  {
652  OnImageMouseMove(static_cast<QMouseEvent*>(event));
653 
654  return true;
655  }
656 
657  return QObject::eventFilter(obj, event);
658  }
659 
660  void WidefieldMicroscopeWidget::resizeEvent(QResizeEvent* event)
661  {
662  OnZoomFitClicked(ui.action_Zoom_fit->isChecked());
663  }
664 
666  {
667  if (ui.TWEmitterList->selectedItems().empty())
668  return false;
669 
670  const auto Row = ui.TWEmitterList->selectedItems()[0]->row();
671 
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)>();
677 
678  return true;
679  }
680 
682  {
683  auto Filename = Util::PromptSaveFilePathModule(this, "Save image", ".png", "Portable Network Graphics image (*.png)");
684  if (Filename.isEmpty())
685  return;
686 
687  SaveWidefieldImageFilename = Filename;
688  }
689 
691  {
692  ui.action_Zoom_fit->setChecked(false);
694  }
695 
697  {
698  ui.action_Zoom_fit->setChecked(false);
700  }
701 
703  {
704  ui.action_Zoom_fit->setChecked(false);
706  }
707 
709  {
710  if (Checked)
711  MainGraphicsView->fitInView(MainGraphicsPixmapItem, Qt::AspectRatioMode::KeepAspectRatio);
712  }
713 
715  {
716  auto LocalPoint = MainGraphicsView->mapFromGlobal(Event->globalPos());
717 
718  if (!MainGraphicsView->items(LocalPoint).empty())
719  {
720  auto Point = MainGraphicsView->mapToScene(LocalPoint).toPoint();
721 
722  StatusBar.XCoordLabel->setText("X:" + QString::number(Point.x()));
723  StatusBar.YCoordLabel->setText("Y:" + QString::number(Point.y()));
724  }
725  }
726 
728  {
729  StatusBar.CellIDContextMenu->exec(StatusBar.CellIDLabel->mapToGlobal(Position));
730  }
731 
733  {
736  else
738  }
739 
741  {
744  }
745 
747  {
748  EmitterListContextMenu->exec(ui.TWEmitterList->mapToGlobal(Position));
749  }
750 
752  {
753  for (int i = 0; i < ui.TWEmitterList->selectedItems().size(); ++i)
754  {
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() };
758 
759  MainGraphicsView->RemoveMarker(Pos, true);
760  }
761  }
762 
764  {
765  if (ui.TWEmitterList->selectedItems().empty() || !StoreTWEmitterListSelection())
766  return;
767 
768  const auto Row = ui.TWEmitterList->selectedItems()[0]->row();
769  const auto OldName = ui.TWEmitterList->item(Row, EmitterListColumnType::EmitterName)->text();
770 
771  bool OKClicked = false;
772  QString NewName = QInputDialog::getText(this, "Edit name",
773  QString("Enter new name for marker \"") + OldName + "\":", QLineEdit::Normal, OldName, &OKClicked);
774 
775  if (OKClicked)
776  MainGraphicsView->RenameMarker(MarkerPos, NewName.toStdString());
777  }
778 
780  {
783  }
784 
786  {
789  }
790 
792  {
795  }
796 
798  {
799  ConfocalGraph->scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPreset::CameraPresetDirectlyAbove);
800  }
801 
803  {
805  return;
806 
807  auto Filename = Util::PromptSaveFilePathModule(this, "Save data", ".csv", " Comma-separated values file (*.csv)");
808  if (Filename.isEmpty())
809  return;
810 
811  std::stringstream CSVData;
812  {
813  auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(GetOwner().GetModuleData());
814 
815  CSVData = ModuleData->AssembleCSVHeader(true, false, false);
816  ModuleData->WriteConfocalScanResults(CSVData);
817  } // ModuleData unlocked here.
818 
819  if (!Util::SaveToFile(Filename, CSVData.str()))
820  QMessageBox::warning(this, "DynExp - Error", "Error writing data to file.");
821  }
822 
824  {
825  auto Filename = Util::PromptSaveFilePathModule(this, "Save data", ".csv", " Comma-separated values file (*.csv)");
826  if (Filename.isEmpty())
827  return;
828 
829  std::stringstream CSVData;
830  {
831  auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(GetOwner().GetModuleData());
832 
833  CSVData = ModuleData->AssembleCSVHeader(false, true, false);
834  ModuleData->WriteHBTResults(CSVData);
835  } // ModuleData unlocked here.
836 
837  if (!Util::SaveToFile(Filename, CSVData.str()))
838  QMessageBox::warning(this, "DynExp - Error", "Error writing data to file.");
839  }
840 
842  {
843  auto Filename = Util::PromptSaveFilePathModule(this, "Select directory and filename prefix for saving data in auto-measure mode",
844  ".csv", " Comma-separated values file (*.csv)");
845  if (Filename.isEmpty())
846  return;
847 
848  // Emits signal to update module data accordingly.
849  ui.LEAutoMeasureSavePath->setText(Filename);
850  }
851 }
User interface belonging to the DynExpModule::Widefield::WidefieldMicroscope module.
Implementation of a module to control a combined widefield and confocal microscope.
static QColor GetLocalizedEmitterColor(LocalizedEmitterStateType State)
static const char * GetLocalizedEmitterStateString(LocalizedEmitterStateType State)
bool eventFilter(QObject *obj, QEvent *event) override
void UpdateHBTUIData(Util::SynchronizedPointer< WidefieldMicroscopeData > &ModuleData)
WidefieldMicroscopeWidget(WidefieldMicroscope &Owner, QModuleWidget *parent=nullptr)
Util::MarkerGraphicsView::MarkerType::IDType MarkerID
void UpdateConfocalUIData(Util::SynchronizedPointer< WidefieldMicroscopeData > &ModuleData)
void SetUIState(const StateMachineStateType *State, const Util::StateMachineContext< StateMachineStateType > *Context, Util::SynchronizedPointer< WidefieldMicroscopeData > &ModuleData)
void UpdateUIData(Util::SynchronizedPointer< WidefieldMicroscopeData > &ModuleData)
bool StoreTWEmitterListSelection()
Stores the values of the respective cells of ui.TWEmitterList's currently selected row in MarkerPos a...
virtual void resizeEvent(QResizeEvent *event) override
void InitializeUI(Util::SynchronizedPointer< WidefieldMicroscopeData > &ModuleData)
void UpdateAutoMeasureUIData(Util::SynchronizedPointer< WidefieldMicroscopeData > &ModuleData, bool IsCharacterizingSample)
void UpdateWidefieldUIData(Util::SynchronizedPointer< WidefieldMicroscopeData > &ModuleData)
const WidefieldMicroscope & GetCastOwner() const noexcept
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
QModuleBase & Owner
Module owning this user interface window (reference, because it should never change nor be nullptr).
Definition: Module.h:1162
QModuleWidget(QModuleBase &Owner, QWidget *Parent=nullptr)
Constructs a QModuleWidget instance.
Definition: Module.cpp:417
const auto & GetOwner() const noexcept
Getter for the owning module.
Definition: Module.h:1111
Implements a QGraphicsView the user can interact with to insert graphical markers....
Definition: QtUtil.h:379
const std::vector< MarkerType > & GetMarkers() const noexcept
Definition: QtUtil.h:448
void ZoomReset()
Resets the zoom.
Definition: QtUtil.cpp:522
void DeselectMarkers()
Deselects all selected markers.
Definition: QtUtil.cpp:506
void EnableActions(bool Enable)
Definition: QtUtil.cpp:527
auto contextMenu() const noexcept
Definition: QtUtil.h:446
void RenameMarker(const QPoint &MarkerPos, std::string_view NewName)
Assigns a name to the marker at position MarkerPos. Affects MarkersChanged.
Definition: QtUtil.cpp:489
void SelectMarker(const QPoint &MarkerPos)
Selects the marker at position MarkerPos.
Definition: QtUtil.cpp:500
bool HaveMarkersChanged() noexcept
Returns whether a marker operation has changed the stored markers. Resets the flag.
Definition: QtUtil.cpp:390
void RemoveMarker(size_t Index, bool OnlyUserDeletableMarkers=false)
Removes the n-th marker specified by Index. Affects MarkersChanged.
Definition: QtUtil.cpp:413
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...
Definition: QtUtil.cpp:398
void ZoomIn()
Zooms in one step.
Definition: QtUtil.cpp:512
void ZoomOut()
Zooms out one step.
Definition: QtUtil.cpp:517
void SetCurrentImagePos(const QPointF &Pos)
Definition: QtUtil.h:455
void RemoveMarkers(bool OnlyUserDeletableMarkers)
Removes all markers from the graphics view. Affects MarkersChanged.
Definition: QtUtil.cpp:464
State machine context as used by class StateMachine. A state machine context holds a map with keys an...
Definition: Util.h:1362
State machine state as used by class StateMachine. A state mainly wraps a state function of the membe...
Definition: Util.h:1305
constexpr StateEnumType GetState() const noexcept
Returns the state's unique identifier.
Definition: Util.h:1321
Pointer to lock a class derived from ISynchronizedPointerLockable for synchronizing between threads....
Definition: Util.h:170
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.
Definition: Module.h:763
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.
Definition: Util.h:625
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 ...
Definition: QtUtil.cpp:236
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....
Definition: QtUtil.cpp:143
Accumulates include statements to provide a precompiled header.
const Util::StateMachineContext< StateMachineStateType > * CurrentContext