1 /* 2 SPDX-FileCopyrightText: 2015 Jasem Mutlaq <mutlaqja@ikarustech.com> 3 4 SPDX-License-Identifier: GPL-2.0-or-later 5 */ 6 7 #pragma once 8 9 #include "fitscommon.h" 10 #include "fitsdata.h" 11 #include "ui_fitshistogramui.h" 12 13 #include <QDialog> 14 #include <QUndoCommand> 15 16 class QMouseEvent; 17 18 class FITSTab; 19 20 class histogramUI : public QDialog, public Ui::FITSHistogramUI 21 { 22 Q_OBJECT 23 24 public: 25 explicit histogramUI(QDialog * parent = nullptr); 26 }; 27 28 class FITSHistogram : public QDialog 29 { 30 Q_OBJECT 31 32 friend class histDrawArea; 33 34 public: 35 explicit FITSHistogram(QWidget * parent); 36 37 enum { RED_CHANNEL, GREEN_CHANNEL, BLUE_CHANNEL }; 38 39 void constructHistogram(); 40 void syncGUI(); reset()41 void reset() 42 { 43 m_Constructed = false; 44 } 45 46 void applyFilter(FITSScale ftype); 47 48 double getBinWidth(int channel = 0) 49 { 50 return binWidth[channel]; 51 } 52 53 QVector<uint32_t> getCumulativeFrequency(int channel = 0) const; 54 55 double getJMIndex() const; 56 isConstructed()57 bool isConstructed() 58 { 59 return m_Constructed; 60 } 61 62 63 protected: 64 void showEvent(QShowEvent * event) override; 65 void driftMouseOverLine(QMouseEvent * event); 66 67 public slots: 68 void applyScale(); 69 void resizePlot(); 70 71 private: 72 template <typename T> 73 void constructHistogram(); 74 double cutMin; 75 double cutMax; 76 77 histogramUI * ui { nullptr }; 78 FITSTab * tab { nullptr }; 79 80 QVector<QVector<uint32_t>> cumulativeFrequency; 81 QVector<QVector<double>> intensity; 82 QVector<QVector<double>> frequency; 83 QVector<QVector<QWidget *>> rgbWidgets; 84 QVector<ctkRangeSlider *> sliders; 85 QVector<QDoubleSpinBox *> minBoxes, maxBoxes; 86 87 QVector<double> FITSMin; 88 QVector<double> FITSMax; 89 QVector<double> sliderScale, sliderTick; 90 QVector<int> numDecimals; 91 92 QVector<QCPGraph *> graphs; 93 QVector<double> binWidth; 94 uint16_t binCount { 0 }; 95 double JMIndex { 0 }; 96 97 int maxFrequency {0}; 98 FITSScale type { FITS_AUTO }; 99 bool isGUISynced { false}; 100 bool m_Constructed { false }; 101 QCustomPlot * customPlot { nullptr }; 102 }; 103 104 class FITSHistogramCommand : public QUndoCommand 105 { 106 public: 107 FITSHistogramCommand(QWidget * parent, FITSHistogram * inHisto, FITSScale newType, const QVector<double> &lmin, const QVector<double> &lmax); 108 virtual ~FITSHistogramCommand(); 109 110 virtual void redo() override; 111 virtual void undo() override; 112 virtual QString text() const; 113 114 private: 115 bool calculateDelta(const uint8_t * buffer); 116 bool reverseDelta(); 117 118 FITSImage::Statistic stats; 119 FITSHistogram * histogram { nullptr }; 120 FITSScale type; 121 QVector<double> min, max; 122 123 unsigned char * delta { nullptr }; 124 unsigned long compressedBytes { 0 }; 125 FITSTab * tab { nullptr }; 126 }; 127