File indexing completed on 2024-04-14 14:10:41

0001 /*
0002     SPDX-FileCopyrightText: 2004 Jasem Mutlaq <mutlaqja@ikarustech.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 
0006     Some code fragments were adapted from Peter Kirchgessner's FITS plugin
0007     SPDX-FileCopyrightText: Peter Kirchgessner <http://members.aol.com/pkirchg>
0008 */
0009 
0010 #pragma once
0011 
0012 #include "fitscommon.h"
0013 #include "fitsviewer/stretch.h"
0014 
0015 #include <KLed>
0016 #include <KXmlGui/KXmlGuiWindow>
0017 #include <KActionMenu>
0018 
0019 #include <QLabel>
0020 #include <QList>
0021 #include <QMap>
0022 #include <QUrl>
0023 
0024 #ifdef WIN32
0025 // avoid compiler warning when windows.h is included after fitsio.h
0026 #include <windows.h>
0027 #endif
0028 
0029 #include <fitsio.h>
0030 
0031 class QCloseEvent;
0032 class QUndoGroup;
0033 
0034 class QTabWidget;
0035 
0036 class FITSDebayer;
0037 class FITSTab;
0038 class FITSView;
0039 class FITSData;
0040 
0041 /**
0042  * @class FITSViewer
0043  * @short Primary window to view monochrome and color FITS images.
0044  * The FITSviewer can open multiple images each in a separate. It supports simple filters, histogram transforms, flip and rotation operations, and star detection.
0045  *
0046  * @author Jasem Mutlaq
0047  * @version 1.0
0048  */
0049 class FITSViewer : public KXmlGuiWindow
0050 {
0051         Q_OBJECT
0052 
0053     public:
0054         /** Constructor. */
0055         explicit FITSViewer(QWidget *parent);
0056         ~FITSViewer() override;
0057 
0058         void loadFile(const QUrl &imageName, FITSMode mode = FITS_NORMAL, FITSScale filter = FITS_NONE,
0059                       const QString &previewText = QString());
0060 
0061         bool loadData(const QSharedPointer<FITSData> &data, const QUrl &imageName, int *tab_uid,
0062                       FITSMode mode = FITS_NORMAL, FITSScale filter = FITS_NONE,
0063                       const QString &previewText = QString());
0064 
0065         void updateFile(const QUrl &imageName, int fitsUID, FITSScale filter = FITS_NONE);
0066         bool updateData(const QSharedPointer<FITSData> &data, const QUrl &imageName, int fitsUID, int *tab_uid,
0067                         FITSScale filter = FITS_NONE, FITSMode mode = FITS_UNKNOWN);
0068         bool removeFITS(int fitsUID);
0069 
0070         bool isStarsMarked()
0071         {
0072             return markStars;
0073         }
0074 
0075         bool empty() const
0076         {
0077             return m_Tabs.empty();
0078         }
0079         const QList<QSharedPointer<FITSTab>> tabs() const
0080         {
0081             return m_Tabs;
0082         }
0083         bool getView(int fitsUID, QSharedPointer<FITSView> &view);
0084         bool getCurrentView(QSharedPointer<FITSView> &view);
0085 
0086         static QStringList filterTypes;
0087 
0088     protected:
0089         void closeEvent(QCloseEvent *) override;
0090         void hideEvent(QHideEvent *) override;
0091         void showEvent(QShowEvent *) override;
0092 
0093     public slots:
0094         void changeAlwaysOnTop(Qt::ApplicationState state);
0095         void openFile();
0096         void blink();
0097         void nextBlink();
0098         void previousBlink();
0099         void saveFile();
0100         void saveFileAs();
0101         void copyFITS();
0102         void statFITS();
0103         void toggleSelectionMode();
0104         void headerFITS();
0105         void debayerFITS();
0106         void histoFITS();
0107         void tabFocusUpdated(int currentIndex);
0108         void updateStatusBar(const QString &msg, FITSBar id);
0109         void ZoomIn();
0110         void ZoomOut();
0111         void ZoomAllIn();
0112         void ZoomAllOut();
0113         void ZoomDefault();
0114         void ZoomToFit();
0115         void updateAction(const QString &name, bool enable);
0116         void updateTabStatus(bool clean, const QUrl &imageURL);
0117         void closeTab(int index);
0118         void toggleStars();
0119         void nextTab();
0120         void previousTab();
0121         void toggleCrossHair();
0122         void toggleClipping();
0123         void toggleEQGrid();
0124         void toggleObjects();
0125         void togglePixelGrid();
0126         void toggle3DGraph();
0127         void toggleHiPSOverlay();
0128         void starProfileButtonOff();
0129         void centerTelescope();
0130         void updateWCSFunctions();
0131         void applyFilter(int ftype);
0132         void rotateCW();
0133         void rotateCCW();
0134         void flipHorizontal();
0135         void flipVertical();
0136         void setDebayerAction(bool);
0137         void updateScopeButton();
0138         void ROIFixedSize(int s);
0139         void customROIInputWindow();
0140 
0141 
0142     private:
0143         void updateButtonStatus(const QString &action, const QString &item, bool showing);
0144         // Shared utilites between the standard and "FromData" addFITS and updateFITS.
0145         bool addFITSCommon(const QSharedPointer<FITSTab> &tab, const QUrl &imageName,
0146                            FITSMode mode, const QString &previewText);
0147         bool updateFITSCommon(const QSharedPointer<FITSTab> &tab, const QUrl &imageName);
0148 
0149         QTabWidget *fitsTabWidget { nullptr };
0150         QUndoGroup *undoGroup { nullptr };
0151         FITSDebayer *debayerDialog { nullptr };
0152         KLed led;
0153         QLabel fitsPosition, fitsValue, fitsResolution, fitsZoom, fitsWCS, fitsHFR, fitsClip;
0154         QAction *saveFileAction { nullptr };
0155         QAction *saveFileAsAction { nullptr };
0156         QList<QSharedPointer<FITSTab>> m_Tabs;
0157         int fitsID { 0 };
0158         bool markStars { false };
0159         QMap<int, QSharedPointer<FITSTab>> fitsMap;
0160         QUrl lastURL;
0161         KActionMenu *roiActionMenu { nullptr };
0162         KActionMenu* roiMenu { nullptr };
0163 
0164         void loadFiles();
0165         QList<QUrl> m_urls;
0166         void changeBlink(bool increment);
0167         static bool m_BlinkBusy;
0168 
0169     signals:
0170         void trackingStarSelected(int x, int y);
0171         void loaded(int tabUID);
0172         void closed(int tabUID);
0173         void failed(const QString &errorMessage);
0174         void terminated();
0175 
0176 };