1 /*
2     SPDX-FileCopyrightText: 2003 Thomas Kabelmann <tk78@gmx.de>
3 
4     SPDX-License-Identifier: GPL-2.0-or-later
5 */
6 
7 #pragma once
8 
9 #include "kstarsdata.h"
10 #include "kstarsdatetime.h"
11 #include "ui_wutdialog.h"
12 #include "catalogobject.h"
13 #include "catalogsdb.h"
14 
15 #include <QFrame>
16 #include <QDialog>
17 #include <qevent.h>
18 
19 class GeoLocation;
20 class SkyObject;
21 
22 class WUTDialogUI : public QFrame, public Ui::WUTDialog
23 {
24     Q_OBJECT
25 
26   public:
27     explicit WUTDialogUI(QWidget *p = nullptr);
28 };
29 
30 /**
31  * @class WUTDialog
32  *
33  * What's up tonight dialog is a window which lists all sky objects
34  * that will be visible during the next night.
35  *
36  * @author Thomas Kabelmann
37  * @version 1.0
38  */
39 class WUTDialog : public QDialog
40 {
41     Q_OBJECT
42 
43   public:
44     /** Constructor */
45     explicit WUTDialog(QWidget *ks, bool session = false,
46                        GeoLocation *geo  = KStarsData::Instance()->geo(),
47                        KStarsDateTime lt = KStarsData::Instance()->lt());
48     virtual ~WUTDialog() override = default;
49 
50     /**
51      * @short Check visibility of object
52      * @p o the object to check
53      * @return true if visible
54      */
55     bool checkVisibility(const SkyObject *o);
56 
57   public slots:
58     /**
59      * @short Determine which objects are visible, and store them in
60      * an array of lists, classified by object type
61      */
62     void init();
63 
64   private slots:
65     /**
66      * @short Load the list of visible objects for selected object type.
67      * @p category the string describing the type of object
68      */
69     void slotLoadList(const QString &category);
70 
71     /** Display the rise/transit/set times for selected object */
72     void slotDisplayObject(const QString &name);
73 
74     /**
75      * @short Apply user's choice of what part of the night should be examined:
76      * @li 0: Evening only (sunset to midnight)
77      * @li 1: Morning only (midnight to sunrise)
78      * @li 2: All night (sunset to sunrise)
79      */
80     void slotEveningMorning(int flag);
81 
82     /**
83      * @short Adjust the date for the WUT tool
84      * @note this does NOT affect the date of the sky map
85      */
86     void slotChangeDate();
87 
88     /**
89      * @short Adjust the geographic location for the WUT tool
90      * @note this does NOT affect the geographic location for the sky map
91      */
92     void slotChangeLocation();
93 
94     /** Open the detail dialog for the current object */
95     void slotDetails();
96 
97     /** Center the display on the current object */
98     void slotCenter();
99 
100     /** Add the object to the observing list */
101     void slotObslist();
102 
103     /** Filters the objects displayed by Magnitude */
104     void slotChangeMagnitude();
105 
106     void updateMag();
107 
108     /**
109      * Load skyobjects from the DSO database and return an `ObjectLists` like
110      * vector.
111      *
112      * \param category The category for which to load the dsos.
113      * \param types The types to load.
114      */
115     QVector<QPair<QString, const SkyObject *>>
116     load_dso(const QString &category, const std::vector<SkyObject::TYPE> &types);
117 
118   private:
119     QSet<const SkyObject *> &visibleObjects(const QString &category);
120     const SkyObject * findVisibleObject(const QString &name);
121     bool isCategoryInitialized(const QString &category);
122     /** @short Initialize all SIGNAL/SLOT connections, used in constructor */
123     void makeConnections();
124     /** @short Initialize category list, used in constructor */
125     void initCategories();
126 
127     void showEvent(QShowEvent *event) override;
128 
129     WUTDialogUI *WUT{ nullptr };
130     bool session { false };
131     QTime sunRiseTomorrow, sunSetToday, sunRiseToday, moonRise, moonSet;
132     KStarsDateTime T0, UT0, Tomorrow, TomorrowUT, Evening, EveningUT;
133     GeoLocation *geo { nullptr };
134     int EveningFlag { 0 };
135     float m_Mag{ 0 };
136     QTimer *timer{ nullptr };
137     QStringList m_Categories;
138     QHash<QString, QSet<const SkyObject *>> m_VisibleList;
139     QHash<QString, bool> m_CategoryInitialized;
140     QHash<QString, CatalogsDB::CatalogObjectList> m_CatalogObjects;
141 };
142