Kstars

xplanetimageviewer.h
1 /*
2  SPDX-FileCopyrightText: Thomas Kabelmann
3  SPDX-FileCopyrightText: 2018 Robert Lancaster <[email protected]>
4 
5  SPDX-License-Identifier: GPL-2.0-or-later
6 */
7 
8 #pragma once
9 
10 #include "auxiliary/filedownloader.h"
11 
12 #include <QDialog>
13 #include <QLineEdit>
14 #include <QSpinBox>
15 #include "nonlineardoublespinbox.h"
16 #include <QComboBox>
17 #include <QFile>
18 #include <QFrame>
19 #include <QImage>
20 #include <QPixmap>
21 #include "kstarsdata.h"
22 #include <QEvent>
23 #include <QGestureEvent>
24 #include <QPinchGesture>
25 
26 #ifndef Q_OS_WIN
27 #include<QFutureWatcher>
28 #endif
29 
30 
31 class QLabel;
32 /**
33  * @class XPlanetImageLabel
34  * @short XPlanet Image viewer QFrame for the KPlanetImageViewer for KStars
35  * @author Thomas Kabelmann
36  * @author Jasem Mutlaq
37  * @author Robert Lancaster
38  * @version 1.1
39  *
40  * This image-viewer QFrame automatically resizes the picture. It also receives input from the mouse to
41  * zoom and pan the XPlanet Image.
42  */
43 class XPlanetImageLabel : public QFrame
44 {
45  Q_OBJECT
46  public:
47  explicit XPlanetImageLabel(QWidget *parent);
48  ~XPlanetImageLabel() override = default;
49  void setImage(const QImage &img);
50  void invertPixels();
51  void refreshImage();
52 
53  public slots:
54  void wheelEvent(QWheelEvent *e) override;
55  void mousePressEvent(QMouseEvent *e) override;
56  void mouseReleaseEvent(QMouseEvent *e) override;
57  void mouseMoveEvent(QMouseEvent *e) override;
58 
59  signals:
60  void zoomIn();
61  void zoomOut();
62  void changePosition(QPoint);
63  void changeLocation(QPoint);
64 
65  protected:
66  void paintEvent(QPaintEvent *e) override;
67  void resizeEvent(QResizeEvent *) override;
68 
69  private:
70  //Image related
71  QPixmap m_Pix;
72  QImage m_Image;
73 
74  //Mouse related
75  bool m_MouseButtonDown = false;
76  QPoint m_LastMousePoint;
77  bool event(QEvent *event) override;
78  bool gestureEvent(QGestureEvent *event);
79  void pinchTriggered(QPinchGesture *gesture);
80 };
81 
82 /**
83  * @class XPlanetImageViewer
84  * @short XPlanet Image viewer window for KStars
85  * @author Thomas Kabelmann
86  * @author Jasem Mutlaq
87  * @author Robert Lancaster
88  * @version 1.1
89  *
90  * This class is meant to interact with XPlanet and display the results. It has interfaces to control many of the XPlanet Options.
91  * It can change a number of properties using controls. It works with the XPlanetImageLabel to display the results. It also can work
92  * with the XPlanetImageLabel to respond to mouse inputs on the ImageLabel and act on them in the Image Viewer. It has a hover mode where
93  * it hovers over the same planetary body or a remote mode where it views one body from another. It has interfaces for changing the field of
94  * view, the time, the rotation, and other settings. In hover mode, it can change latitude, longitude, and radius with the mouse inputs.
95  * It also can animate events so that you can watch xplanet frames like a movie to see solar system events in action.
96  */
98 {
99  Q_OBJECT
100 
101  public:
102  /** Create xplanet image viewer from Object */
103  explicit XPlanetImageViewer(const QString &obj, QWidget *parent = nullptr);
104 
105  /** Destructor. If there is a partially downloaded image file, delete it.*/
106  ~XPlanetImageViewer() override;
107 
108  /**
109  * @brief loadImage Load image and display it
110  * @return True if opened and displayed, false otherwise
111  */
112  bool loadImage();
113 
114  void startXplanet();
115 
116  private:
117 
118 
119  /** prepares the output file**/
120  bool setupOutputFile();
121 
122  QImage m_Image;
123 
124  /** Save the downloaded image to a local file. */
125  void saveFile(const QString & fileName);
126 
127  QFile m_File;
128 
129  XPlanetImageLabel *m_View { nullptr };
130  QLabel *m_Caption { nullptr };
131 
132  QString m_LastFile;
133 
134  QStringList m_ObjectNames;
135  QList<double> m_objectDefaultFOVs;
136 
137  typedef enum { YEARS, MONTHS, DAYS, HOURS, MINS, SECS } timeUnits;
138 
139  void setXPlanetDate(KStarsDateTime time);
140 
141  //XPlanet strings
142  QString m_ObjectName;
143  QString m_OriginName;
144  QString m_Date;
145  QString m_DateText;
146 
147  //XPlanet numbers
148  int m_CurrentObjectIndex { 0 };
149  int m_CurrentOriginIndex { 0 };
150  int m_Rotation { 0 };
151  int m_CurrentTimeUnitIndex { 0 };
152  uint32_t m_Radius { 0 };
153  double m_FOV { 0 };
154  double m_lat { 0 };
155  double m_lon { 0 };
156  QPoint center;
157 
158 #ifndef Q_OS_WIN
159  QFutureWatcher<bool> fifoImageLoadWatcher;
160  QTimer watcherTimeout;
161 #endif
162 
163  // Time
164  KStarsDateTime m_XPlanetTime {};
165  bool m_XPlanetRunning = false;
166 
167  QComboBox *m_OriginSelector {nullptr};
168 
169  // Field of view controls
170  QPushButton *m_KStarsFOV {nullptr};
171  QPushButton *m_setFOV {nullptr};
172  QPushButton *m_NoFOV {nullptr};
173  NonLinearDoubleSpinBox *m_FOVEdit {nullptr};
174 
175  // Rotation controls
176  QSpinBox *m_RotateEdit {nullptr};
177 
178  // Free rotation controls
179  QLabel *m_PositionDisplay {nullptr};
180  QPushButton *m_FreeRotate {nullptr};
181  bool m_ImageLoadSucceeded = false;
182 
183  // Time controls
184  QLabel *m_XPlanetTimeDisplay {nullptr};
185  QSlider *m_TimeSlider {nullptr};
186  QSpinBox *m_TimeEdit {nullptr};
187  QComboBox *m_TimeUnitsSelect {nullptr};
188 
189  //Animation controls
190  QPushButton *m_RunTime {nullptr};
191  QTimer *m_XPlanetTimer {nullptr};
192 
193 
194  private slots:
195 
196  /**
197  * Display the downloaded image. Resize the window to fit the image, If the image is
198  * larger than the screen, make the image as large as possible while preserving the
199  * original aspect ratio
200  */
201  bool showImage();
202 
203  // Saves file to disk.
204  void saveFileToDisk();
205 
206  // Inverts colors
207  void invertColors();
208 
209  // Rotation slots
210  void updateXPlanetRotationEdit();
211  void resetXPlanetRotation();
212  void invertXPlanetRotation();
213 
214  void reCenterXPlanet();
215 
216  // Free Rotation slots
217  void changeXPlanetPosition(QPoint delta);
218  void changeXPlanetLocation(QPoint delta);
219  void slotFreeRotate();
220  void updateStates();
221  void updatePositionDisplay();
222  void resetLocation();
223 
224  // Field of View slots
225  void zoomInXPlanetFOV();
226  void zoomOutXPlanetFOV();
227  void updateXPlanetFOVEdit();
228  void resetXPlanetFOV();
229  void setKStarsXPlanetFOV();
230  void setFOVfromList();
231 
232  // Time slots
233  void updateXPlanetTime(int timeShift);
234  void updateXPlanetObject(int objectIndex);
235  void updateXPlanetOrigin(int originIndex);
236  void updateXPlanetTimeUnits(int units);
237  void updateXPlanetTimeEdit();
238  void setXPlanetTime();
239  void setXPlanetTimetoKStarsTime();
240  void resetXPlanetTime();
241 
242  // Animation slots
243  void incrementXPlanetTime();
244  void toggleXPlanetRun();
245  void timeSliderDisplay(int timeShift);
246 
247 };
Q_OBJECTQ_OBJECT
Extension of QDateTime for KStars KStarsDateTime can represent the date/time as a Julian Day,...
~XPlanetImageViewer() override
Destructor.
XPlanet Image viewer window for KStars.
XPlanetImageViewer(const QString &obj, QWidget *parent=nullptr)
Create xplanet image viewer from Object.
bool loadImage()
loadImage Load image and display it
QObject * parent() const const
XPlanet Image viewer QFrame for the KPlanetImageViewer for KStars.
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Sun Oct 1 2023 04:02:45 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.