#ifndef TWODSPECTRALCOMPLIANCE_H #define TWODSPECTRALCOMPLIANCE_H #include #include #include #include class CustomQwtPlot; class QwtPlotSpectrogram; class QPushButton; class QLineEdit; class ScatterPlotItem; class BusyIndicator; namespace Ui { class TwoDSpectralCompliance; } struct TwoSurfacePoint { float primaryEnergy; float secondaryEnergySum; int count; }; class TwoDSpectralCompliance : public MeasureAnalysisView { Q_OBJECT public: explicit TwoDSpectralCompliance(QWidget* parent = nullptr); ~TwoDSpectralCompliance(); virtual void InitViewWorkspace(const QString& project_name) override final; virtual void SetAnalyzeDataFilename(const QMap& data_files_set) override; protected: void resizeEvent(QResizeEvent* event) override; bool eventFilter(QObject* obj, QEvent* event) override; virtual void showEvent(QShowEvent* e) override final; private: void setupPlot(); void readCsv(const QString& filename); void generateSurfaceData(); void updateSpectrogram(); void createFloatingInfoWidget(); void updateInfoContent(); void updateToggleButtonText(); void updateFloatingWidgetPosition(); void updateToggleButtonPosition(); void updateShowButtonPosition(); private slots: void showFloatingWidget(); void hideFloatingWidget(); private: Ui::TwoDSpectralCompliance* ui; CustomQwtPlot* _plot = nullptr; QwtPlotSpectrogram* _spectrogram = nullptr; struct EventData { int eventId; int board; int channel; double energy; unsigned long long timeCounter; }; QVector m_rawData; QVector m_surfaceData; QWidget* m_floatingWidget = nullptr; QPushButton* m_toggleButton = nullptr; QPushButton* m_showButton = nullptr; QLineEdit* m_totalEventsEdit = nullptr; QLineEdit* m_totalPointsEdit = nullptr; QLineEdit* m_maxCountEdit = nullptr; QLineEdit* m_primRangeEdit = nullptr; QLineEdit* m_secRangeEdit = nullptr; QPoint m_dragPosition; bool m_dragging = false; BusyIndicator* _busy_indicator = nullptr; }; #endif // TWODSPECTRALCOMPLIANCE_H