File indexing completed on 2024-03-24 15:15:32

0001 /*
0002     SPDX-FileCopyrightText: 2002 Jason Harris <kstars@30doradus.org>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #pragma once
0008 
0009 #include "ui_details_data.h"
0010 #include "ui_details_data_comet.h"
0011 #include "ui_details_database.h"
0012 #include "ui_details_links.h"
0013 #include "ui_details_log.h"
0014 #include "ui_details_position.h"
0015 
0016 #include "skyobjectuserdata.h"
0017 #include <kpagedialog.h>
0018 
0019 #include <QPalette>
0020 #include <QString>
0021 
0022 #include <memory>
0023 
0024 class QListWidgetItem;
0025 class QPixmap;
0026 
0027 class DataCometWidget;
0028 class DataWidget;
0029 class GeoLocation;
0030 class KStars;
0031 class KStarsDateTime;
0032 class SkyObject;
0033 
0034 class PositionWidget;
0035 class LinksWidget;
0036 class DatabaseWidget;
0037 class LogWidget;
0038 
0039 struct ADVTreeData
0040 {
0041     QString Name;
0042     QString Link;
0043     int Type;
0044 };
0045 
0046 /**
0047   * @class DetailDialog
0048   * DetailDialog is a window showing detailed information for a selected object.
0049     * The window is split into four Tabs: General, Links, Advanced and Log.
0050     * The General Tab displays some type-specific data about the object, as well as its
0051     * present coordinates and Rise/Set/Transit times for the current date.  The Type-specific
0052     * data are:
0053     * @li Stars: common name, genetive name, Spectral type, magnitude, distance
0054     * @li Solar System: name, object type (planet/comet/asteroid), Distance, magnitude (TBD),
0055     * angular size (TBD)
0056     * @li Deep Sky: Common name, other names, object type, magnitude, angular size
0057     *
0058     * The Links Tab allows the user to manage the list of Image and Information links
0059     * listed in the object's popup menu.  The Advanced Tab allows the user to query
0060     * a number of professional-grade online astronomical databases for data on the object.
0061     * The Log tab allows the user to attach their own text notes about the object.
0062     *
0063     * The General Tab includes a clickable image of the object.  Clicking the image opens
0064     * a Thumbnail picker tool, which downloads a list of mages of the object from the
0065     * network, which the user may select as the new image for this objects Details window.
0066     *
0067     * @author Jason Harris, Jasem Mutlaq
0068     * @version 1.0
0069     */
0070 class DetailDialog : public KPageDialog
0071 {
0072     Q_OBJECT
0073   public:
0074     /** Constructor */
0075     DetailDialog(SkyObject *o, const KStarsDateTime &ut, GeoLocation *geo, QWidget *parent = nullptr);
0076 
0077     /** Destructor */
0078     ~DetailDialog() override = default;
0079 
0080     /** @return pointer to the QPixmap of the object's thumbnail image */
0081     inline QPixmap *thumbnail() { return Thumbnail.get(); }
0082 
0083   public slots:
0084     /** @short Slot to add this object to the observing list. */
0085     void addToObservingList();
0086 
0087     /** @short Slot to center this object in the display. */
0088     void centerMap();
0089 
0090     /** @short Slot to center this object in the telescope. */
0091     void centerTelescope();
0092 
0093     //TODO: showThumbnail() is only called in the ctor; make it private and not a slot.
0094     /** @short Slot to display the thumbnail image for the object */
0095     void showThumbnail();
0096 
0097     /**
0098      * @short Slot to update thumbnail image for the object, using the Thumbnail
0099      * Picker tool.
0100      * @sa ThumbnailPicker
0101      */
0102     void updateThumbnail();
0103 
0104     /** @short Slot for viewing the selected image or info URL in the web browser. */
0105     void viewLink();
0106 
0107     /**
0108      * Popup menu function: Add a custom Image or Information URL.
0109      * Opens the AddLinkDialog window.
0110      */
0111     void addLink();
0112 
0113     /**
0114      * @short Set the currently-selected URL resource.
0115      *
0116      * This function is needed because there are two QListWidgets,
0117      * each with its own selection.  We need to know which the user selected most recently.
0118      */
0119     void setCurrentLink(QListWidgetItem *it);
0120 
0121     /**
0122      * @short Rebuild the Image and Info URL lists for this object.
0123      * @note used when an item is added to either list.
0124      */
0125     void updateLists();
0126 
0127     /**
0128      * @short Open a dialog to edit a URL in either the Images or Info lists,
0129      * and update the user's *url.dat file.
0130      */
0131     void editLinkDialog();
0132 
0133     /**
0134      * @short remove a URL entry from either the Images or Info lists, and
0135      * update the user's *url.dat file.
0136      */
0137     void removeLinkDialog();
0138 
0139     /**
0140      * Open the web browser to the selected online astronomy database,
0141      * with a query to the object of this Detail Dialog.
0142      */
0143     void viewADVData();
0144 
0145     /** Save the User's text in the Log Tab to the userlog.dat file. */
0146     void saveLogData();
0147 
0148     /** Update View/Edit/Remove buttons */
0149     void updateButtons();
0150 
0151   private:
0152     /** Build the General Data Tab for the current object. */
0153     void createGeneralTab();
0154 
0155     /** Build the Position Tab for the current object. */
0156     void createPositionTab(const KStarsDateTime &ut, GeoLocation *geo);
0157 
0158     /**
0159      * Build the Links Tab, populating the image and info lists with the
0160      * known URLs for the current Object.
0161      */
0162     void createLinksTab();
0163 
0164     /** Build the Advanced Tab */
0165     void createAdvancedTab();
0166 
0167     /** Build the Log Tab */
0168     void createLogTab();
0169 
0170     /** Populate the TreeView of known astronomical databases in the Advanced Tab */
0171     void populateADVTree();
0172 
0173     /**
0174      * Data for the Advanced Tab TreeView is stored in the file advinterface.dat.
0175      * This function parses advinterface.dat.
0176      */
0177     QString parseADVData(const QString &link);
0178 
0179     /**
0180      * Update the local info_url and image_url files
0181      * @param type The URL type. 0 for Info Links, 1 for Images.
0182      * @param search_line The line to be search for in the local URL files
0183      * @param replace_line The replacement line once search_line is found.
0184      * @note If replace_line is empty, the function will remove search_line from the file
0185      */
0186     void updateLocalDatabase(int type, const QString &search_line, const QString &replace_line = QString());
0187 
0188     SkyObject *selectedObject { nullptr };
0189     QPalette titlePalette;
0190     QListWidgetItem *m_CurrentLink { nullptr };
0191     std::unique_ptr<QPixmap> Thumbnail;
0192     DataWidget *Data { nullptr };
0193     DataCometWidget *DataComet { nullptr };
0194     PositionWidget *Pos { nullptr };
0195     LinksWidget *Links { nullptr };
0196     DatabaseWidget *Adv { nullptr };
0197     LogWidget *Log { nullptr };
0198     const SkyObjectUserdata::Data &m_user_data;
0199 };
0200 
0201 class DataWidget : public QFrame, public Ui::DetailsData
0202 {
0203   Q_OBJECT
0204 
0205   public:
0206     explicit DataWidget(QWidget *parent = nullptr);
0207 };
0208 
0209 class DataCometWidget : public QFrame, public Ui::DetailsDataComet
0210 {
0211   Q_OBJECT
0212 
0213   public:
0214     explicit DataCometWidget(QWidget *parent = nullptr);
0215 };
0216 
0217 class PositionWidget : public QFrame, public Ui::DetailsPosition
0218 {
0219   Q_OBJECT
0220 
0221   public:
0222     explicit PositionWidget(QWidget *parent = nullptr);
0223 };
0224 
0225 class LinksWidget : public QFrame, public Ui::DetailsLinks
0226 {
0227   Q_OBJECT
0228 
0229   public:
0230     explicit LinksWidget(QWidget *parent = nullptr);
0231 };
0232 
0233 class DatabaseWidget : public QFrame, public Ui::DetailsDatabase
0234 {
0235   Q_OBJECT
0236 
0237   public:
0238     explicit DatabaseWidget(QWidget *parent = nullptr);
0239 };
0240 
0241 class LogWidget : public QFrame, public Ui::DetailsLog
0242 {
0243   Q_OBJECT
0244 
0245   public:
0246     explicit LogWidget(QWidget *parent = nullptr);
0247 };