DynExp
Highly flexible laboratory automation for dynamically changing experiments.
Loading...
Searching...
No Matches
WidefieldMicroscopeWidget.cpp
Go to the documentation of this file.
1// This file is part of DynExp.
2
3#include "stdafx.h"
5#include "moc_WidefieldMicroscopeWidget.cpp"
6#include "ui_WidefieldMicroscope.h"
8
10{
12 : CurrentState(nullptr), CurrentContext(nullptr),
13 StateLabel(new QLabel(Owner)),
14 CellIDLabel(new QLabel(Owner)), CellIDContextMenu(new QMenu(Owner)),
15 HomePosLabel(new QLabel(Owner)),
16 PumpPowerLabel(new QLabel(Owner)),
17 ImageCoordinatesGroup(new QWidget(Owner)), ImageCoordinatesLayout(new QHBoxLayout),
18 XCoordLabel(new QLabel(Owner)), YCoordLabel(new QLabel(Owner))
19 {
20 CellIDLabel->setContextMenuPolicy(Qt::ContextMenuPolicy::CustomContextMenu);
21 PumpPowerLabel->setMinimumWidth(140);
22 XCoordLabel->setAlignment(Qt::AlignmentFlag::AlignRight);
23 YCoordLabel->setAlignment(Qt::AlignmentFlag::AlignRight);
27 }
28
30 {
31 if (CurrentContext && !std::string(CurrentContext->GetDescription()).empty())
32 StateLabel->setText(QString(" ") + CurrentContext->GetDescription());
33 else
34 StateLabel->setText(CurrentState ? (QString(" ") + CurrentState->GetDescription()) : "< Unknown >");
35
36 if (CurrentState && CurrentState->GetState() != StateType::Ready)
37 StateLabel->setStyleSheet(DynExpUI::StatusBarBusyStyleSheet);
38 else
39 StateLabel->setStyleSheet("");
40 }
41
43 : QModuleWidget(Owner, parent),
44 ui(std::make_unique<Ui::WidefieldMicroscope>()),
45 StatusBar(this),
46 WidefieldConfocalModeActionGroup(new QActionGroup(this)), MainGraphicsView(nullptr),
47 MainGraphicsScene(new QGraphicsScene(this)), CurrentConfocalSpotPosition(0, 0),
48 EmitterListContextMenu(new QMenu(this)),
49 ConfocalMapContextMenu(new QMenu(this)), ConfocalGraph(nullptr), ConfocalGraphContainer(nullptr),
50 ConfocalSurfaceDataProxy(new QSurfaceDataProxy(this)), ConfocalSurfaceDataArray(nullptr),
53 ConfocalSurfaceMinCounts(std::numeric_limits<decltype(ConfocalSurfaceMinCounts)>::max()), ConfocalSurfaceMaxCounts(0),
54 HBTDataSeries(nullptr), HBTDataChart(nullptr), HBTXAxis(new QValueAxis(this)), HBTYAxis(new QValueAxis(this)),
56 {
57 ui->setupUi(this);
58
59 // For shortcuts
60 this->addAction(ui->action_Stop_current_action);
61 this->addAction(ui->action_Optimize_positions);
62 this->addAction(ui->action_Save_Image);
63 this->addAction(ui->action_Save_Image);
64 this->addAction(ui->action_Zoom_in);
65 this->addAction(ui->action_Zoom_out);
66 this->addAction(ui->action_Zoom_reset);
67 this->addAction(ui->action_Zoom_fit);
68 this->addAction(ui->action_EmitterList_Edit_name);
69 this->addAction(ui->action_EmitterList_Remove_entry);
70
71 ui->action_Zoom_fit->setChecked(true);
72
73 // Status bar
74 ui->MainStatusBar->addWidget(StatusBar.StateLabel, 4);
75 ui->MainStatusBar->addWidget(StatusBar.CellIDLabel, 1);
76 ui->MainStatusBar->addWidget(StatusBar.HomePosLabel, 2);
77 ui->MainStatusBar->addWidget(StatusBar.PumpPowerLabel, 1);
78 ui->MainStatusBar->addPermanentWidget(StatusBar.ImageCoordinatesGroup, 2);
79
80 StatusBar.CellIDContextMenu->addAction(ui->action_Reset_CellID);
81 connect(StatusBar.CellIDLabel, &QWidget::customContextMenuRequested, this, &WidefieldMicroscopeWidget::OnCellIDContextMenuRequested);
82
83 // Tool bar
84 WidefieldConfocalModeActionGroup->addAction(ui->action_Widefield_mode);
85 WidefieldConfocalModeActionGroup->addAction(ui->action_Widefield_mode);
86 WidefieldConfocalModeActionGroup->addAction(ui->action_Confocal_mode);
87
88 // Main image
89 MainGraphicsView = new Util::MarkerGraphicsView(ui->MainHSplitter);
90 MainGraphicsView->setObjectName(QString::fromUtf8("MainGraphicsView"));
91 MainGraphicsView->setMinimumSize(QSize(300, 200));
92 ui->MainHSplitter->addWidget(MainGraphicsView);
93
96 MainGraphicsView->setAlignment(Qt::AlignLeft | Qt::AlignTop);
97 MainGraphicsView->viewport()->installEventFilter(this);
98 MainGraphicsView->viewport()->setMouseTracking(true);
99
100 MainGraphicsView->contextMenu()->addSeparator();
101 MainGraphicsView->contextMenu()->addAction(ui->action_Zoom_in);
102 MainGraphicsView->contextMenu()->addAction(ui->action_Zoom_out);
103 MainGraphicsView->contextMenu()->addAction(ui->action_Zoom_reset);
104 MainGraphicsView->contextMenu()->addAction(ui->action_Zoom_fit);
105 MainGraphicsView->contextMenu()->addSeparator();
106 MainGraphicsView->contextMenu()->addAction(ui->action_Save_Image);
107
108 // Emitter list
109 EmitterListContextMenu->addAction(ui->action_EmitterList_Edit_name);
110 EmitterListContextMenu->addAction(ui->action_EmitterList_Remove_entry);
111 EmitterListContextMenu->addSeparator();
112 EmitterListContextMenu->addAction(ui->action_EmitterList_Go_to_sample_position);
113 EmitterListContextMenu->addAction(ui->action_EmitterList_Bring_marker_to_confocal_spot);
114 EmitterListContextMenu->addSeparator();
115 EmitterListContextMenu->addAction(ui->action_EmitterList_Run_characterization_from_ID);
116
117 // Graph to display confocal scans
118 ConfocalMapContextMenu->addAction(ui->action_confocal_map_save_raw_data);
119 ConfocalMapContextMenu->addAction(ui->action_confocal_map_reset);
120 ui->BConfocalGraphTools->setMenu(ConfocalMapContextMenu);
121 ConfocalGraph = new Q3DSurface(); // Ownership transferred to ConfocalGraphContainer below.
122 ConfocalGraphContainer = QWidget::createWindowContainer(ConfocalGraph, ui->WidgetConfocalGraphContainer);
123 ConfocalGraphContainer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
124 ui->WidgetConfocalGraphContainer->layout()->addWidget(ConfocalGraphContainer);
125 ConfocalGraph->activeTheme()->setType(DynExpUI::DefaultQ3DTheme);
126 ConfocalGraph->activeTheme()->setLabelBorderEnabled(false);
127 ConfocalGraph->scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPreset::CameraPresetDirectlyAbove);
128 ConfocalGraph->setShadowQuality(QAbstract3DGraph::ShadowQuality::ShadowQualityNone);
129 ConfocalGraph->setOrthoProjection(true);
130 ConfocalGraph->setSelectionMode(QAbstract3DGraph::SelectionFlag::SelectionItem);
131
132 ConfocalGraph->axisX()->setLabelFormat("%.0f");
133 ConfocalGraph->axisX()->setAutoAdjustRange(true);
134 ConfocalGraph->axisX()->setLabelAutoRotation(90);
135 ConfocalGraph->axisX()->setTitle("X in nm");
136 ConfocalGraph->axisX()->setTitleVisible(true);
137 ConfocalGraph->axisY()->setLabelFormat("%.0f");
138 ConfocalGraph->axisY()->setAutoAdjustRange(false);
139 ConfocalGraph->axisY()->setTitle("Count rate in Hz");
140 ConfocalGraph->axisY()->setTitleVisible(true);
141 ConfocalGraph->axisZ()->setLabelFormat("%.0f");
142 ConfocalGraph->axisZ()->setAutoAdjustRange(true);
143 ConfocalGraph->axisZ()->setTitle("Y in nm");
144 ConfocalGraph->axisZ()->setTitleVisible(true);
145
146 ConfocalSurface3DSeries->setDrawMode(QSurface3DSeries::DrawSurface);
147 ConfocalSurface3DSeries->setFlatShadingEnabled(true);
149 ConfocalSurface3DSeries->setColorStyle(Q3DTheme::ColorStyleRangeGradient);
150 ConfocalSurface3DSeries->setItemLabelFormat("(@xLabel nm, @zLabel nm): @yLabel Hz");
152
153 // Graph to display HBT result
154 HBTDataChart = new QChart();
155 ui->HBTChart->setChart(HBTDataChart); // Takes ownership of HBTDataChart.
156 ui->HBTChart->setRenderHint(QPainter::Antialiasing);
158 HBTDataChart->legend()->setVisible(false);
159 HBTXAxis->setTitleText("time in ps");
160 HBTYAxis->setTitleText("g(2)");
161
162 // Chart takes ownership of axes.
163 HBTDataChart->addAxis(HBTXAxis, Qt::AlignBottom);
164 HBTDataChart->addAxis(HBTYAxis, Qt::AlignLeft);
165
166 // Characterization steps
167 CharacterizationStepsContextMenu->addAction(ui->action_CharacterizationSteps_Widefield_PLE);
168 CharacterizationStepsContextMenu->addAction(ui->action_CharacterizationSteps_Optimize);
169 CharacterizationStepsContextMenu->addAction(ui->action_CharacterizationSteps_Spectrum);
170 CharacterizationStepsContextMenu->addAction(ui->action_CharacterizationSteps_Confocal_PLE);
171 CharacterizationStepsContextMenu->addAction(ui->action_CharacterizationSteps_HBT);
173 ui->BAutoMeasureCharacterizationSteps->setMenu(CharacterizationStepsContextMenu);
174 }
175
177 {
178 return static_cast<const WidefieldMicroscope&>(GetOwner());
179 }
180
182 {
183 if (!GetUIInitialized())
184 {
185 ui->action_Toogle_LED_light_source->setEnabled(ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::LEDLightToggle));
186 ui->action_Toogle_pump_light_source->setEnabled(ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::PumpLightToggle));
187 ui->GBGeneralLaserPowers->setEnabled(ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::SetPumpPower));
188
189 auto WidefieldTabIndex = ui->TabWidget->indexOf(ui->TabWidefield);
190 auto ConfocalTabIndex = ui->TabWidget->indexOf(ui->TabConfocal);
191 auto HBTTabIndex = ui->TabWidget->indexOf(ui->TabHBT);
192 ui->TabWidget->setTabVisible(WidefieldTabIndex, ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield));
193 ui->TabWidget->setTabVisible(ConfocalTabIndex, ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Confocal));
194 ui->TabWidget->setTabVisible(HBTTabIndex, ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::HBT));
195
196 ui->SBGeneralWidefieldPower->setMinimum(ModuleData->GetMinPumpPower());
197 ui->SBGeneralWidefieldPower->setMaximum(ModuleData->GetMaxPumpPower());
198 ui->SBGeneralWidefieldPower->setSingleStep(std::abs(ModuleData->GetMaxPumpPower() - ModuleData->GetMinPumpPower()) / 100.0);
199 ui->SBGeneralConfocalPower->setMinimum(ModuleData->GetMinPumpPower());
200 ui->SBGeneralConfocalPower->setMaximum(ModuleData->GetMaxPumpPower());
201 ui->SBGeneralConfocalPower->setSingleStep(std::abs(ModuleData->GetMaxPumpPower() - ModuleData->GetMinPumpPower()) / 100.0);
203 {
204 ui->SBGeneralFocusCurrentVoltage->setMinimum(ModuleData->GetMinFocusVoltage());
205 ui->SBGeneralFocusCurrentVoltage->setMaximum(ModuleData->GetMaxFocusVoltage());
206 ui->SBGeneralFocusCurrentVoltage->setSingleStep(std::abs(ModuleData->GetMaxFocusVoltage() - ModuleData->GetMinFocusVoltage()) / 100.0);
207 ui->SBGeneralFocusZeroVoltage->setMinimum(ModuleData->GetMinFocusVoltage());
208 ui->SBGeneralFocusZeroVoltage->setMaximum(ModuleData->GetMaxFocusVoltage());
209 ui->SBGeneralFocusZeroVoltage->setSingleStep(std::abs(ModuleData->GetMaxFocusVoltage() - ModuleData->GetMinFocusVoltage()) / 100.0);
210 ui->SBGeneralFocusConfocalOffsetVoltage->setMinimum(-std::abs(ModuleData->GetMinFocusVoltage()) - std::abs(ModuleData->GetMaxFocusVoltage()));
211 ui->SBGeneralFocusConfocalOffsetVoltage->setMaximum(std::abs(ModuleData->GetMinFocusVoltage()) + std::abs(ModuleData->GetMaxFocusVoltage()));
212 ui->SBGeneralFocusConfocalOffsetVoltage->setSingleStep(std::abs(ModuleData->GetMaxFocusVoltage() - ModuleData->GetMinFocusVoltage()) / 100.0);
213 }
214 else
215 ui->GBGeneralFocus->setVisible(false);
217 {
218 ui->LGeneralWidefieldPower->setText("Power in any mode");
219 ui->LGeneralConfocalPower->setVisible(false);
220 ui->SBGeneralConfocalPower->setVisible(false);
221 ui->LGeneralFocusConfocalOffsetVoltage->setVisible(false);
222 ui->SBGeneralFocusConfocalOffsetVoltage->setVisible(false);
223 }
224
225 ui->SBWidefieldLEDExposureTime->setMinimum(ModuleData->GetMinCameraExposureTime().count());
226 ui->SBWidefieldLEDExposureTime->setMaximum(ModuleData->GetMaxCameraExposureTime().count());
227 ui->SBWidefieldPumpExposureTime->setMinimum(ModuleData->GetMinCameraExposureTime().count());
228 ui->SBWidefieldPumpExposureTime->setMaximum(ModuleData->GetMaxCameraExposureTime().count());
229
230 ui->TWEmitterList->setColumnWidth(EmitterListColumnType::EmitterName, 96);
231 ui->TWEmitterList->setColumnWidth(EmitterListColumnType::Sample_x, 134);
232 ui->TWEmitterList->setColumnWidth(EmitterListColumnType::Sample_y, 134);
233 ui->TWEmitterList->setColumnWidth(EmitterListColumnType::EmitterState, 134);
234
235 ui->action_CharacterizationSteps_Widefield_PLE->setVisible(ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::PLEInterModuleCommunicator));
236 ui->action_CharacterizationSteps_Optimize->setVisible(ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::ConfocalOptimization));
237 ui->action_CharacterizationSteps_Spectrum->setVisible(ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::SpectrumInterModuleCommunicator));
238 ui->action_CharacterizationSteps_Confocal_PLE->setVisible(ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::PLEInterModuleCommunicator));
239 ui->action_CharacterizationSteps_HBT->setVisible(ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::HBT));
240
241 UIInitialized = true;
242 }
243 }
244
247 {
248 bool IsReady = State->GetState() == StateType::Ready;
249 StatusBar.CurrentState = State;
250 StatusBar.CurrentContext = Context;
251
252 StatusBar.CellIDLabel->setText(ModuleData->HasCellID() ? QString::fromStdString(ModuleData->GetCellID().IDString) : "< Unknown cell ID. >");
253 StatusBar.CellIDLabel->setToolTip(ModuleData->HasCellID() ?
254 ("(" + QString::number(ModuleData->GetCellID().X_id) + ", " + QString::number(ModuleData->GetCellID().Y_id) + ")") : "n/a");
255
256 QString HomePosString = "home: (" + QString::number(ModuleData->GetSampleHomePosition().x) + " nm, " + QString::number(ModuleData->GetSampleHomePosition().y) + " nm)";
257 StatusBar.HomePosLabel->setText(ModuleData->GetSampleHomePosition().IsEmpty() ? "< No home position set. >" : HomePosString);
258
260 (" Pump power: " + QString::number(ModuleData->GetMeasuredPumpPower(), 'f', 2) + " V") : "");
261 if (ModuleData->GetPumpLightTurnedOn())
263 else
264 StatusBar.PumpPowerLabel->setStyleSheet("");
265
267 ui->action_Save_Image->setEnabled(IsReady);
268 ui->action_Stop_current_action->setEnabled(!IsReady);
269 ui->action_Set_home_position->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Confocal));
270 ui->action_Go_home_position->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Confocal));
271 ui->action_Widefield_mode->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldConfocalSwitch));
272 ui->action_Confocal_mode->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldConfocalSwitch));
273 ui->action_Autofocus->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::FocusAdjustment));
274 ui->action_Optimize_positions->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::ConfocalOptimization)
275 && ModuleData->GetSetupMode() == WidefieldMicroscopeData::SetupModeType::Confocal);
276 ui->action_Toggle_HBT_mirror->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::HBTSwitch));
277 ui->action_Reset_CellID->setEnabled(IsReady);
278 ui->GBGeneralLaserPowers->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::SetPumpPower));
279 ui->GBGeneralFocus->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::FocusAdjustment));
280 ui->SBWidefieldLEDExposureTime->setEnabled(IsReady &&
281 ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield) && ModuleData->GetWidefieldCamera()->CanSetExposureTime());
282 ui->BWidefieldApplyLEDExposureTime->setEnabled(IsReady &&
283 ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield) && ModuleData->GetWidefieldCamera()->CanSetExposureTime());
284 ui->SBWidefieldPumpExposureTime->setEnabled(IsReady &&
285 ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield) && ModuleData->GetWidefieldCamera()->CanSetExposureTime());
286 ui->BWidefieldApplyPumpExposureTime->setEnabled(IsReady &&
287 ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield) && ModuleData->GetWidefieldCamera()->CanSetExposureTime());
288 ui->BWidefieldFindConfocalSpot->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldConfocalSwitch));
289 ui->BWidefieldLEDCapture->setEnabled(IsReady);
290 ui->BWidefieldCapture->setEnabled(IsReady);
291 ui->BReadCellID->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldLocalization));
292 ui->BAnalyzeImageDistortion->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldLocalization));
293 ui->BLocalizeEmitters->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldLocalization));
294 ui->action_EmitterList_Edit_name->setEnabled(IsReady);
295 ui->action_EmitterList_Remove_entry->setEnabled(IsReady);
296 ui->action_EmitterList_Go_to_sample_position->setEnabled(IsReady);
297 ui->action_EmitterList_Bring_marker_to_confocal_spot->setEnabled(IsReady);
298 ui->action_EmitterList_Run_characterization_from_ID->setEnabled(IsReady);
299 ui->SBConfocalWidth->setEnabled(IsReady);
300 ui->SBConfocalHeight->setEnabled(IsReady);
301 ui->SBConfocalDistPerPixel->setEnabled(IsReady);
302 ui->SBConfocalSPDExposureTime->setEnabled(IsReady);
303 ui->SBConfocalOptimizationInitXYStepSize->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::ConfocalOptimization));
304 ui->SBConfocalOptimizationInitZStepSize->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::ConfocalOptimization));
305 ui->SBConfocalOptimizationTolerance->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::ConfocalOptimization));
306 ui->BConfocalScan->setEnabled(IsReady);
307 ui->action_confocal_map_save_raw_data->setEnabled(IsReady);
308 ui->SBHBTBinWidth->setEnabled(IsReady);
309 ui->SBHBTBinCount->setEnabled(IsReady);
310 ui->BHBTSaveData->setEnabled(IsReady);
311 ui->BHBT->setEnabled(IsReady);
312 ui->GBAutoMeasureGeneralSettings->setEnabled(IsReady);
313 ui->GBAutoMeasureLocalizationSettings->setEnabled(IsReady);
314 ui->GBAutoMeasureCharacterizationSettings->setEnabled(IsReady);
315 ui->GBAutoMeasureCellSettings->setEnabled(IsReady);
316 ui->BAutoMeasureRunLocalization->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield));
317 ui->BAutoMeasureRunCharacterization->setEnabled(IsReady);
318 ui->BAutoMeasureRunSampleCharacterization->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield) &&
320 }
321
323 {
324 // Toolbar
325 ui->action_Toogle_LED_light_source->setChecked(ModuleData->GetLEDLightTurnedOn());
326 ui->action_Toogle_pump_light_source->setChecked(ModuleData->GetPumpLightTurnedOn());
327 ui->action_Widefield_mode->setChecked(ModuleData->GetSetupMode() == WidefieldMicroscopeData::SetupModeType::Widefield);
328 ui->action_Confocal_mode->setChecked(ModuleData->GetSetupMode() == WidefieldMicroscopeData::SetupModeType::Confocal);
329
330 // General
331 // QDoubleSpinBox::setValue() emits QDoubleSpinBox::valueChanged().
332 if (!ui->SBGeneralWidefieldPower->hasFocus())
333 ui->SBGeneralWidefieldPower->setValue(ModuleData->GetWidefieldPumpPower());
334 if (!ui->SBGeneralConfocalPower->hasFocus())
335 ui->SBGeneralConfocalPower->setValue(ModuleData->GetConfocalPumpPower());
336 if (!ui->SBGeneralFocusCurrentVoltage->hasFocus())
337 ui->SBGeneralFocusCurrentVoltage->setValue(ModuleData->GetFocusCurrentVoltage());
338 if (!ui->SBGeneralFocusZeroVoltage->hasFocus())
339 ui->SBGeneralFocusZeroVoltage->setValue(ModuleData->GetFocusZeroVoltage());
340 if (!ui->SBGeneralFocusConfocalOffsetVoltage->hasFocus())
341 ui->SBGeneralFocusConfocalOffsetVoltage->setValue(ModuleData->GetFocusConfocalOffsetVoltage());
342
343 // MainGraphicsView
345 {
346 auto SamplePosition = ModuleData->GetSamplePosition();
347 MainGraphicsView->SetCurrentImagePos({ static_cast<qreal>(SamplePosition.x), static_cast<qreal>(SamplePosition.y) });
348 }
349 else
351 }
352
354 {
355 if (!ui->SBWidefieldLEDExposureTime->hasFocus())
356 ui->SBWidefieldLEDExposureTime->setValue(ModuleData->GetLEDCameraExposureTime().count());
357
358 if (!ui->SBWidefieldPumpExposureTime->hasFocus())
359 ui->SBWidefieldPumpExposureTime->setValue(ModuleData->GetWidefieldCameraExposureTime().count());
360
361 if (ModuleData->IsCurrentImageAvlbl())
362 {
363 // SetMainGraphicsImage creates a deep copy of the current image.
364 SetMainGraphicsImage(ModuleData->GetCurrentImage());
365 ModuleData->ResetCurrentImageAvlbl();
366 }
367
368 if (!SaveWidefieldImageFilename.isEmpty())
369 {
371
373 }
374
375 if (ModuleData->HaveLocalizedPositionsChanged())
376 {
378 for (const auto& Position : ModuleData->GetLocalizedPositions())
379 MainGraphicsView->AddMarker(Position.second.Position, QColorConstants::DarkYellow, true, Position.first, "Emitter " + Util::ToStr(Position.first));
380
381 ModuleData->ResetLocalizedPositionsChanged();
382 }
383
384 if (CurrentConfocalSpotPosition != ModuleData->GetConfocalSpotImagePosition())
385 {
387 MainGraphicsView->AddMarker(ModuleData->GetConfocalSpotImagePosition(), QColorConstants::Red, false, -1, "Confocal spot");
388
389 CurrentConfocalSpotPosition = ModuleData->GetConfocalSpotImagePosition();
390 }
391
393 {
394 // Copy intended.
395 const auto LocalizedPositions = ModuleData->GetLocalizedPositions();
396 ModuleData->ClearLocalizedPositions();
397
398 bool SortingEnabled = ui->TWEmitterList->isSortingEnabled();
399 ui->TWEmitterList->setSortingEnabled(false);
400
401 ui->TWEmitterList->clearContents();
402 ui->TWEmitterList->setRowCount(0);
403
404 auto& Markers = MainGraphicsView->GetMarkers();
405 for (const auto& Marker : Markers)
406 {
407 const auto Row = ui->TWEmitterList->rowCount();
408 ui->TWEmitterList->insertRow(Row);
409
410 QTableWidgetItem* IDItem = new QTableWidgetItem;
412 if (Marker.GetID() >= 0)
413 {
414 IDItem->setData(Qt::EditRole, Marker.GetID());
415 IDItem->setData(Qt::UserRole, Marker.GetID());
416
417 auto OldLocalizedPosition = LocalizedPositions.find(Marker.GetID());
418 if (OldLocalizedPosition != LocalizedPositions.cend())
419 LocalizedEmitterState = OldLocalizedPosition->second.State;
420 ModuleData->AppendLocalizedPosition({ Marker.GetID(), { Marker.GetMarkerPos(), LocalizedEmitterState } });
421 }
422 else
423 {
424 IDItem->setData(Qt::UserRole, Util::MarkerGraphicsView::MarkerType::IDType(-1));
425 IDItem->setText("n/a");
426 }
427
428 ui->TWEmitterList->setItem(Row, EmitterListColumnType::EmitterID, IDItem);
429 ui->TWEmitterList->setItem(Row, EmitterListColumnType::EmitterName, new QTableWidgetItem(Marker.GetName().data()));
430 ui->TWEmitterList->setItem(Row, EmitterListColumnType::Image_x, new QTableWidgetItem(QString::number(Marker.GetMarkerPos().x())));
431 ui->TWEmitterList->item(Row, EmitterListColumnType::Image_x)->setData(Qt::ItemDataRole::UserRole, Marker.GetMarkerPos().x());
432 ui->TWEmitterList->setItem(Row, EmitterListColumnType::Image_y, new QTableWidgetItem(QString::number(Marker.GetMarkerPos().y())));
433 ui->TWEmitterList->item(Row, EmitterListColumnType::Image_y)->setData(Qt::ItemDataRole::UserRole, Marker.GetMarkerPos().y());
434 ui->TWEmitterList->setItem(Row, EmitterListColumnType::Sample_x, new QTableWidgetItem(Marker.GetImagePos().isNull() ? "n/a" : QString::number(Marker.GetImagePos().x(), 'f', 0)));
435 ui->TWEmitterList->item(Row, EmitterListColumnType::Sample_x)->setData(Qt::ItemDataRole::UserRole, Marker.GetImagePos().x());
436 ui->TWEmitterList->setItem(Row, EmitterListColumnType::Sample_y, new QTableWidgetItem(Marker.GetImagePos().isNull() ? "n/a" : QString::number(Marker.GetImagePos().y(), 'f', 0)));
437 ui->TWEmitterList->item(Row, EmitterListColumnType::Sample_y)->setData(Qt::ItemDataRole::UserRole, Marker.GetImagePos().y());
438 ui->TWEmitterList->setItem(Row, EmitterListColumnType::EmitterState, new QTableWidgetItem(WidefieldMicroscopeData::GetLocalizedEmitterStateString(LocalizedEmitterState)));
439 ui->TWEmitterList->item(Row, EmitterListColumnType::EmitterState)->setForeground(WidefieldMicroscopeData::GetLocalizedEmitterColor(LocalizedEmitterState));
440 }
441
442 ui->TWEmitterList->setSortingEnabled(SortingEnabled);
443
444 ModuleData->ResetLocalizedPositionsChanged();
445 ModuleData->ResetAutoMeasureCurrentEmitter();
446 }
447
448 if (ModuleData->HaveLocalizedPositionsStateChanged())
449 {
450 for (int i = 0; i < ui->TWEmitterList->rowCount(); ++i)
451 {
452 auto ID = ui->TWEmitterList->item(i, EmitterListColumnType::EmitterID)->data(Qt::ItemDataRole::UserRole).value<Util::MarkerGraphicsView::MarkerType::IDType>();
453 auto Emitter = ModuleData->GetLocalizedPositions().find(ID);
454 if (Emitter == ModuleData->GetLocalizedPositions().cend())
455 continue;
456
457 ui->TWEmitterList->item(i, EmitterListColumnType::EmitterState)->setText(WidefieldMicroscopeData::GetLocalizedEmitterStateString(Emitter->second.State));
458 ui->TWEmitterList->item(i, EmitterListColumnType::EmitterState)->setForeground(WidefieldMicroscopeData::GetLocalizedEmitterColor(Emitter->second.State));
459 }
460
461 ModuleData->ClearLocalizedPositionsStateChanged();
462 }
463
464 switch (EmitterListTask)
465 {
469 break;
473 break;
477 break;
478 default: break;
479 }
480 }
481
483 {
484 if (!ui->SBConfocalWidth->hasFocus())
485 ui->SBConfocalWidth->setValue(ModuleData->GetConfocalScanWidth());
486 if (!ui->SBConfocalHeight->hasFocus())
487 ui->SBConfocalHeight->setValue(ModuleData->GetConfocalScanHeight());
488 if (!ui->SBConfocalDistPerPixel->hasFocus())
489 ui->SBConfocalDistPerPixel->setValue(ModuleData->GetConfocalScanDistPerPixel());
490 if (!ui->SBConfocalOptimizationInitXYStepSize->hasFocus())
491 ui->SBConfocalOptimizationInitXYStepSize->setValue(ModuleData->GetConfocalOptimizationInitXYStepSize());
492 if (!ui->SBConfocalOptimizationInitZStepSize->hasFocus())
493 ui->SBConfocalOptimizationInitZStepSize->setValue(ModuleData->GetConfocalOptimizationInitZStepSize());
494 if (!ui->SBConfocalOptimizationTolerance->hasFocus())
495 ui->SBConfocalOptimizationTolerance->setValue(ModuleData->GetConfocalOptimizationTolerance());
496
497 if (ModuleData->HasConfocalScanSurfacePlotRows())
498 {
499 auto Rows = ModuleData->GetConfocalScanSurfacePlotRows();
500 NumItemsInArray = 0;
501 ConfocalSurfaceMinCounts = std::numeric_limits<decltype(ConfocalSurfaceMinCounts)>::max();
503
504 // Deletes old array.
505 ConfocalSurfaceDataProxy->resetArray(nullptr);
506 // Ownership transferred to ConfocalSurfaceDataProxy below with resetArray().
507 ConfocalSurfaceDataArray = new QSurfaceDataArray;
508 ConfocalSurfaceDataArray->reserve(Util::NumToT<int>(Rows.size()));
509
510 for (auto& Row : Rows)
511 *ConfocalSurfaceDataArray << Row.release();
512
514 }
515
516 if (ModuleData->GetConfocalScanResults().size() > NumItemsInArray)
517 {
518 for (auto i = NumItemsInArray; i < ModuleData->GetConfocalScanResults().size(); ++i)
519 {
520 const auto& ResultItem = ModuleData->GetConfocalScanResults()[i];
521 if (ResultItem.first.RowIndex < 0 || ResultItem.first.ColumnIndex < 0)
522 continue;
523
524 auto& SurfaceItem = ConfocalSurfaceDataArray->operator[](ResultItem.first.RowIndex)->operator[](ResultItem.first.ColumnIndex);
525
526 SurfaceItem.setY(ResultItem.second);
527 ConfocalSurfaceDataProxy->setItem(ResultItem.first.RowIndex, ResultItem.first.ColumnIndex, SurfaceItem);
528
529 ConfocalSurfaceMinCounts = std::min(ConfocalSurfaceMinCounts, ResultItem.second);
530 ConfocalSurfaceMaxCounts = std::max(ConfocalSurfaceMaxCounts, ResultItem.second);
531
533 }
534
535 if (ConfocalSurfaceMinCounts < std::numeric_limits<decltype(ConfocalSurfaceMinCounts)>::max() && ConfocalSurfaceMaxCounts > 0)
537 }
538 }
539
541 {
542 if (!ui->SBHBTBinWidth->hasFocus())
543 ui->SBHBTBinWidth->setValue(ModuleData->GetHBTBinWidth().count());
544 if (!ui->SBHBTBinCount->hasFocus())
545 ui->SBHBTBinCount->setValue(Util::NumToT<int>(ModuleData->GetHBTBinCount()));
546 if (!ui->SBHBTAcquisitionTime->hasFocus())
547 ui->SBHBTAcquisitionTime->setValue(static_cast<double>(ModuleData->GetHBTMaxIntegrationTime().count()) / std::chrono::microseconds::period::den);
548 ui->LEHBTTotalIntegrationTime->setText(QString::number(ModuleData->GetHBTTotalIntegrationTime().count() / std::chrono::microseconds::period::den) + " s");
549
550 if (ui->HBTChart->isVisible())
551 {
552 HBTDataChart->removeAllSeries();
553 HBTDataSeries = new QLineSeries(this);
554 HBTDataSeries->append(ModuleData->GetHBTDataPoints());
555 HBTDataSeries->setPointsVisible(false);
556
557 HBTXAxis->setRange(ModuleData->GetHBTDataPointsMinValues().x(), ModuleData->GetHBTDataPointsMaxValues().x());
558 HBTYAxis->setRange(ModuleData->GetHBTDataPointsMinValues().y(), ModuleData->GetHBTDataPointsMaxValues().y());
559 ui->LEHBTMinValue->setText(QString::number(ModuleData->GetHBTDataPointsMinValues().y()));
560
561 HBTDataChart->addSeries(HBTDataSeries);
562 HBTDataSeries->attachAxis(HBTDataChart->axes()[0]);
563 HBTDataSeries->attachAxis(HBTDataChart->axes()[1]);
564 }
565 }
566
568 {
569 {
570 const QSignalBlocker Blocker(ui->LEAutoMeasureSavePath);
571 ui->LEAutoMeasureSavePath->setText(QString::fromUtf16(ModuleData->GetAutoMeasureSavePath().u16string().c_str()));
572 } // Blocker unlocked here.
573
574 if (!ui->SBAutoMeasureNumberImageSets->hasFocus())
575 ui->SBAutoMeasureNumberImageSets->setValue(ModuleData->GetAutoMeasureNumberImageSets());
576 if (!ui->SBAutoMeasureInitialImageSetWaitTime->hasFocus())
577 ui->SBAutoMeasureInitialImageSetWaitTime->setValue(ModuleData->GetAutoMeasureInitialImageSetWaitTime().count());
578 if (!ui->SBAutoMeasureImagePositionScatterRadius->hasFocus())
579 ui->SBAutoMeasureImagePositionScatterRadius->setValue(ModuleData->GetAutoMeasureImagePositionScatterRadius());
580 if (!ui->CBAutoMeasureLocalize->hasFocus())
581 ui->CBAutoMeasureLocalize->setCurrentIndex(ModuleData->GetAutoMeasureLocalizationType());
582 if (!ui->SBAutoMeasureOptimizationAttempts->hasFocus())
583 ui->SBAutoMeasureOptimizationAttempts->setValue(ModuleData->GetAutoMeasureNumOptimizationAttempts());
584 if (!ui->SBAutoMeasureOptimizationReruns->hasFocus())
585 ui->SBAutoMeasureOptimizationReruns->setValue(ModuleData->GetAutoMeasureMaxOptimizationReruns());
586 if (!ui->SBAutoMeasureOptimizationMaxDistance->hasFocus())
587 ui->SBAutoMeasureOptimizationMaxDistance->setValue(ModuleData->GetAutoMeasureOptimizationMaxDistance());
588 if (!ui->SBAutoMeasureCountRateThreshold->hasFocus())
589 ui->SBAutoMeasureCountRateThreshold->setValue(ModuleData->GetAutoMeasureCountRateThreshold());
590 if (!ui->SBAutoMeasureCellRangeFromX->hasFocus())
591 ui->SBAutoMeasureCellRangeFromX->setValue(ModuleData->GetAutoMeasureCellRangeFrom().x());
592 if (!ui->SBAutoMeasureCellRangeFromY->hasFocus())
593 ui->SBAutoMeasureCellRangeFromY->setValue(ModuleData->GetAutoMeasureCellRangeFrom().y());
594 if (!ui->SBAutoMeasureCellRangeToX->hasFocus())
595 ui->SBAutoMeasureCellRangeToX->setValue(ModuleData->GetAutoMeasureCellRangeTo().x());
596 if (!ui->SBAutoMeasureCellRangeToY->hasFocus())
597 ui->SBAutoMeasureCellRangeToY->setValue(ModuleData->GetAutoMeasureCellRangeTo().y());
598 if (!ui->SBAutoMeasureCellSkipX->hasFocus())
599 ui->SBAutoMeasureCellSkipX->setValue(ModuleData->GetAutoMeasureCellSkip().x());
600 if (!ui->SBAutoMeasureCellSkipY->hasFocus())
601 ui->SBAutoMeasureCellSkipY->setValue(ModuleData->GetAutoMeasureCellSkip().y());
602
603 if (ModuleData->GetAutoMeasureCurrentImageSet() >= 0 && ModuleData->GetAutoMeasureCurrentImageSet() < ModuleData->GetAutoMeasureNumberImageSets())
604 {
605 ui->LAutoMeasureCellProgress->setText("Recording image set " + QString::number(ModuleData->GetAutoMeasureCurrentImageSet() + 1) +
606 " / " + QString::number(ModuleData->GetAutoMeasureNumberImageSets()));
607 ui->PBAutoMeasureCellProgress->setValue(static_cast<int>(100.0 * ModuleData->GetAutoMeasureCurrentImageSet() / ModuleData->GetAutoMeasureNumberImageSets()));
608 ui->PBAutoMeasureCellProgress->setVisible(true);
609 }
610 else if (ModuleData->IsAutoMeasureRunning())
611 {
612 const auto EmitterCount = std::distance(ModuleData->GetAutoMeasureFirstEmitter(), ModuleData->GetLocalizedPositions().end());
613 const auto CurrentEmitter = EmitterCount - std::distance(ModuleData->GetAutoMeasureCurrentEmitter(), ModuleData->GetLocalizedPositions().end());
614
615 ui->LAutoMeasureCellProgress->setText("Emitter " + QString::number(CurrentEmitter + 1) +
616 " / " + QString::number(EmitterCount) + ", " +
617 QString::number(ModuleData->GetNumFinishedLocalizedPositions()) + " successful, " +
618 QString::number(ModuleData->GetNumFailedLocalizedPositions()) + " failed");
619 ui->PBAutoMeasureCellProgress->setValue(static_cast<int>(100.0 * CurrentEmitter / EmitterCount));
620 ui->PBAutoMeasureCellProgress->setVisible(true);
621 }
622 else
623 {
624 ui->LAutoMeasureCellProgress->setText("Ready");
625 ui->PBAutoMeasureCellProgress->setVisible(false);
626 }
627
628 ui->GBAutoMeasureSampleProgress->setVisible(IsCharacterizingSample && ModuleData->HasCellID());
629 if (IsCharacterizingSample && ModuleData->HasCellID())
630 {
631 const auto CurrentCell = ModuleData->GetAutoMeasureCurrentCellIndex();
632 const auto CellCount = ModuleData->GetAutoMeasureCellCount();
633
634 ui->LAutoMeasureSampleProgress->setText("Cell " + QString::number(CurrentCell + 1) +
635 " / " + QString::number(CellCount));
636 ui->PBAutoMeasureSampleProgress->setValue(static_cast<int>(100.0 * CurrentCell / CellCount));
637 }
638 }
639
640 void WidefieldMicroscopeWidget::SetMainGraphicsImage(const QImage& Image) noexcept
641 {
642 MainGraphicsPixmap = QPixmap::fromImage(Image); // deep copy
643 MainGraphicsPixmap.detach(); // just to be sure...
644 }
645
647 {
648 if (MainGraphicsView->isVisible() && !MainGraphicsView->visibleRegion().isEmpty())
649 {
651 MainGraphicsScene->update();
652
653 OnZoomFitClicked(ui->action_Zoom_fit->isChecked());
654 }
655
657 }
658
659 bool WidefieldMicroscopeWidget::eventFilter(QObject* obj, QEvent* event)
660 {
661 if (MainGraphicsView->viewport())
662 if (event->type() == QEvent::MouseMove)
663 {
664 OnImageMouseMove(static_cast<QMouseEvent*>(event));
665
666 return true;
667 }
668
669 return QObject::eventFilter(obj, event);
670 }
671
673 {
674 OnZoomFitClicked(ui->action_Zoom_fit->isChecked());
675 }
676
678 {
679 if (ui->TWEmitterList->selectedItems().empty())
680 return false;
681
682 const auto Row = ui->TWEmitterList->selectedItems()[0]->row();
683
684 MarkerPos = { ui->TWEmitterList->item(Row, EmitterListColumnType::Image_x)->data(Qt::ItemDataRole::UserRole).toInt(),
685 ui->TWEmitterList->item(Row, EmitterListColumnType::Image_y)->data(Qt::ItemDataRole::UserRole).toInt() };
686 SamplePos = { ui->TWEmitterList->item(Row, EmitterListColumnType::Sample_x)->data(Qt::ItemDataRole::UserRole).toReal(),
687 ui->TWEmitterList->item(Row, EmitterListColumnType::Sample_y)->data(Qt::ItemDataRole::UserRole).toReal() };
688 MarkerID = ui->TWEmitterList->item(Row, EmitterListColumnType::EmitterID)->data(Qt::ItemDataRole::UserRole).value<decltype(MarkerID)>();
689
690 return true;
691 }
692
694 {
695 auto Filename = Util::PromptSaveFilePathModule(this, "Save image", ".png", "Portable Network Graphics image (*.png)");
696 if (Filename.isEmpty())
697 return;
698
700 }
701
703 {
704 ui->action_Zoom_fit->setChecked(false);
706 }
707
709 {
710 ui->action_Zoom_fit->setChecked(false);
712 }
713
715 {
716 ui->action_Zoom_fit->setChecked(false);
718 }
719
721 {
722 if (Checked)
723 MainGraphicsView->fitInView(MainGraphicsPixmapItem, Qt::AspectRatioMode::KeepAspectRatio);
724 }
725
727 {
728 auto LocalPoint = MainGraphicsView->mapFromGlobal(Event->globalPosition().toPoint());
729
730 if (!MainGraphicsView->items(LocalPoint).empty())
731 {
732 auto Point = MainGraphicsView->mapToScene(LocalPoint).toPoint();
733
734 StatusBar.XCoordLabel->setText("X:" + QString::number(Point.x()));
735 StatusBar.YCoordLabel->setText("Y:" + QString::number(Point.y()));
736 }
737 }
738
740 {
741 StatusBar.CellIDContextMenu->exec(StatusBar.CellIDLabel->mapToGlobal(Position));
742 }
743
751
757
759 {
760 EmitterListContextMenu->exec(ui->TWEmitterList->mapToGlobal(Position));
761 }
762
764 {
765 for (int i = 0; i < ui->TWEmitterList->selectedItems().size(); ++i)
766 {
767 const auto Row = ui->TWEmitterList->selectedItems()[i]->row();
768 const QPoint Pos = { ui->TWEmitterList->item(Row, EmitterListColumnType::Image_x)->data(Qt::ItemDataRole::UserRole).toInt(),
769 ui->TWEmitterList->item(Row, EmitterListColumnType::Image_y)->data(Qt::ItemDataRole::UserRole).toInt() };
770
771 MainGraphicsView->RemoveMarker(Pos, true);
772 }
773 }
774
776 {
777 if (ui->TWEmitterList->selectedItems().empty() || !StoreTWEmitterListSelection())
778 return;
779
780 const auto Row = ui->TWEmitterList->selectedItems()[0]->row();
781 const auto OldName = ui->TWEmitterList->item(Row, EmitterListColumnType::EmitterName)->text();
782
783 bool OKClicked = false;
784 QString NewName = QInputDialog::getText(this, "Edit name",
785 QString("Enter new name for marker \"") + OldName + "\":", QLineEdit::Normal, OldName, &OKClicked);
786
787 if (OKClicked)
788 MainGraphicsView->RenameMarker(MarkerPos, NewName.toStdString());
789 }
790
796
802
808
810 {
811 ConfocalGraph->scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPreset::CameraPresetDirectlyAbove);
812 }
813
815 {
817 return;
818
819 auto Filename = Util::PromptSaveFilePathModule(this, "Save data", ".csv", " Comma-separated values file (*.csv)");
820 if (Filename.isEmpty())
821 return;
822
823 std::stringstream CSVData;
824 {
825 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(GetOwner().GetModuleData());
826
827 CSVData = ModuleData->AssembleCSVHeader(true, false, false);
828 ModuleData->WriteConfocalScanResults(CSVData);
829 } // ModuleData unlocked here.
830
831 if (!Util::SaveToFile(Filename, CSVData.str()))
832 QMessageBox::warning(this, "DynExp - Error", "Error writing data to file.");
833 }
834
836 {
837 auto Filename = Util::PromptSaveFilePathModule(this, "Save data", ".csv", " Comma-separated values file (*.csv)");
838 if (Filename.isEmpty())
839 return;
840
841 std::stringstream CSVData;
842 {
843 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(GetOwner().GetModuleData());
844
845 CSVData = ModuleData->AssembleCSVHeader(false, true, false);
846 ModuleData->WriteHBTResults(CSVData);
847 } // ModuleData unlocked here.
848
849 if (!Util::SaveToFile(Filename, CSVData.str()))
850 QMessageBox::warning(this, "DynExp - Error", "Error writing data to file.");
851 }
852
854 {
855 auto Filename = Util::PromptSaveFilePathModule(this, "Select directory and filename prefix for saving data in auto-measure mode",
856 ".csv", " Comma-separated values file (*.csv)");
857 if (Filename.isEmpty())
858 return;
859
860 // Emits signal to update module data accordingly.
861 ui->LEAutoMeasureSavePath->setText(Filename);
862 }
863
865 {
866 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(GetOwner().GetModuleData());
867
868 ui->action_CharacterizationSteps_Widefield_PLE->setChecked(ModuleData->GetAutoMeasureWidefieldPLEEnabled());
869 ui->action_CharacterizationSteps_Optimize->setChecked(ModuleData->GetAutoMeasureOptimizeEnabled());
870 ui->action_CharacterizationSteps_Spectrum->setChecked(ModuleData->GetAutoMeasureSpectrumEnabled());
871 ui->action_CharacterizationSteps_Confocal_PLE->setChecked(ModuleData->GetAutoMeasureConfocalPLEEnabled());
872 ui->action_CharacterizationSteps_HBT->setChecked(ModuleData->GetAutoMeasureHBTEnabled());
873 }
874}
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:1478
QModuleWidget(QModuleBase &Owner, QWidget *Parent=nullptr)
Constructs a QModuleWidget instance.
Definition Module.cpp:451
const auto & GetOwner() const noexcept
Getter for the owning module.
Definition Module.h:1427
Implements a QGraphicsView the user can interact with to insert graphical markers....
Definition QtUtil.h:379
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
const std::vector< MarkerType > & GetMarkers() const noexcept
Definition QtUtil.h:448
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:1424
State machine state as used by class StateMachine. A state mainly wraps a state function of the membe...
Definition Util.h:1367
constexpr StateEnumType GetState() const noexcept
Returns the state's unique identifier.
Definition Util.h:1383
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:810
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:688
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