Kstars

pvplotwidget.cpp
1 /*
2  SPDX-FileCopyrightText: 2005 Jason Harris <[email protected]>
3 
4  SPDX-License-Identifier: GPL-2.0-or-later
5 */
6 
7 #include "pvplotwidget.h"
8 
9 #include "planetviewer.h"
10 
11 #include <KPlotObject>
12 #include <KPlotPoint>
13 
14 #include <QKeyEvent>
15 #include <QMouseEvent>
16 #include <QWheelEvent>
17 
18 #include <cmath>
19 
20 PVPlotWidget::PVPlotWidget(QWidget *parent) : KPlotWidget(parent)
21 {
22  setFocusPolicy(Qt::StrongFocus);
23  setMouseTracking(true);
24  setAntialiasing(true);
25  //FIXME: Evil cast!
26  pv = (PlanetViewer *)topLevelWidget();
27 }
28 
29 void PVPlotWidget::keyPressEvent(QKeyEvent *e)
30 {
31  double xc = (dataRect().right() + dataRect().x()) * 0.5;
32  double yc = (dataRect().bottom() + dataRect().y()) * 0.5;
33  double xstep = 0.01 * (dataRect().right() - dataRect().x());
34  double ystep = 0.01 * (dataRect().bottom() - dataRect().y());
35  double dx = 0.5 * dataRect().width();
36  double dy = 0.5 * dataRect().height();
37 
38  switch (e->key())
39  {
40  case Qt::Key_Left:
41  if (xc - xstep > -AUMAX)
42  {
43  setLimits(dataRect().x() - xstep, dataRect().right() - xstep, dataRect().y(), dataRect().bottom());
44  pv->setCenterPlanet(QString());
45  update();
46  }
47  break;
48 
49  case Qt::Key_Right:
50  if (xc + xstep < AUMAX)
51  {
52  setLimits(dataRect().x() + xstep, dataRect().right() + xstep, dataRect().y(), dataRect().bottom());
53  pv->setCenterPlanet(QString());
54  update();
55  }
56  break;
57 
58  case Qt::Key_Down:
59  if (yc - ystep > -AUMAX)
60  {
61  setLimits(dataRect().x(), dataRect().right(), dataRect().y() - ystep, dataRect().bottom() - ystep);
62  pv->setCenterPlanet(QString());
63  update();
64  }
65  break;
66 
67  case Qt::Key_Up:
68  if (yc + ystep < AUMAX)
69  {
70  setLimits(dataRect().x(), dataRect().right(), dataRect().y() + ystep, dataRect().bottom() + ystep);
71  pv->setCenterPlanet(QString());
72  update();
73  }
74  break;
75 
76  case Qt::Key_Plus:
77  case Qt::Key_Equal:
78  {
79  updateFactor(e->modifiers());
80  slotZoomIn();
81  break;
82  }
83 
84  case Qt::Key_Minus:
85  case Qt::Key_Underscore:
86  {
87  updateFactor(e->modifiers());
88  slotZoomOut();
89  break;
90  }
91 
92  case Qt::Key_0: //Sun
93  setLimits(-dx, dx, -dy, dy);
94  pv->setCenterPlanet(i18n("Sun"));
95  update();
96  break;
97 
98  case Qt::Key_1: //Mercury
99  {
100  KPlotPoint *p = plotObjects().at(10)->points().at(0);
101  setLimits(p->x() - dx, p->x() + dx, p->y() - dy, p->y() + dy);
102  pv->setCenterPlanet(i18n("Mercury"));
103  update();
104  break;
105  }
106 
107  case Qt::Key_2: //Venus
108  {
109  KPlotPoint *p = plotObjects().at(11)->points().at(0);
110  setLimits(p->x() - dx, p->x() + dx, p->y() - dy, p->y() + dy);
111  pv->setCenterPlanet(i18n("Venus"));
112  update();
113  break;
114  }
115 
116  case Qt::Key_3: //Earth
117  {
118  KPlotPoint *p = plotObjects().at(12)->points().at(0);
119  setLimits(p->x() - dx, p->x() + dx, p->y() - dy, p->y() + dy);
120  pv->setCenterPlanet(i18n("Earth"));
121  update();
122  break;
123  }
124 
125  case Qt::Key_4: //Mars
126  {
127  KPlotPoint *p = plotObjects().at(13)->points().at(0);
128  setLimits(p->x() - dx, p->x() + dx, p->y() - dy, p->y() + dy);
129  pv->setCenterPlanet(i18n("Mars"));
130  update();
131  break;
132  }
133 
134  case Qt::Key_5: //Jupiter
135  {
136  KPlotPoint *p = plotObjects().at(14)->points().at(0);
137  setLimits(p->x() - dx, p->x() + dx, p->y() - dy, p->y() + dy);
138  pv->setCenterPlanet(i18n("Jupiter"));
139  update();
140  break;
141  }
142 
143  case Qt::Key_6: //Saturn
144  {
145  KPlotPoint *p = plotObjects().at(15)->points().at(0);
146  setLimits(p->x() - dx, p->x() + dx, p->y() - dy, p->y() + dy);
147  pv->setCenterPlanet(i18n("Saturn"));
148  update();
149  break;
150  }
151 
152  case Qt::Key_7: //Uranus
153  {
154  KPlotPoint *p = plotObjects().at(16)->points().at(0);
155  setLimits(p->x() - dx, p->x() + dx, p->y() - dy, p->y() + dy);
156  pv->setCenterPlanet("Uranus");
157  update();
158  break;
159  }
160 
161  case Qt::Key_8: //Neptune
162  {
163  KPlotPoint *p = plotObjects().at(17)->points().at(0);
164  setLimits(p->x() - dx, p->x() + dx, p->y() - dy, p->y() + dy);
165  pv->setCenterPlanet(i18n("Neptune"));
166  update();
167  break;
168  }
169 
170  /*case Qt::Key_9: //Pluto
171  {
172  KPlotPoint *p = plotObjects().at(18)->points().at(0);
173  setLimits( p->x() - dx, p->x() + dx, p->y() - dy, p->y() + dy );
174  pv->setCenterPlanet( "Pluto" );
175  update();
176  break;
177  }*/
178 
179  default:
180  e->ignore();
181  break;
182  }
183 }
184 
185 void PVPlotWidget::mousePressEvent(QMouseEvent *e)
186 {
187  mouseButtonDown = true;
188  oldx = e->x();
189  oldy = e->y();
190 }
191 
192 void PVPlotWidget::mouseReleaseEvent(QMouseEvent *)
193 {
194  mouseButtonDown = false;
195  update();
196 }
197 
198 void PVPlotWidget::mouseMoveEvent(QMouseEvent *e)
199 {
200  if (mouseButtonDown)
201  {
202  //Determine how far we've moved
203  double xc = (dataRect().right() + dataRect().x()) * 0.5;
204  double yc = (dataRect().bottom() + dataRect().y()) * 0.5;
205  double xscale = dataRect().width() / (width() - leftPadding() - rightPadding());
206  double yscale = dataRect().height() / (height() - topPadding() - bottomPadding());
207 
208  xc += (oldx - e->x()) * xscale;
209  yc -= (oldy - e->y()) * yscale; //Y data axis is reversed...
210 
211  if (xc > -AUMAX && xc < AUMAX && yc > -AUMAX && yc < AUMAX)
212  {
213  setLimits(xc - 0.5 * dataRect().width(), xc + 0.5 * dataRect().width(), yc - 0.5 * dataRect().height(),
214  yc + 0.5 * dataRect().height());
215  update();
216  qApp->processEvents();
217  }
218 
219  oldx = e->x();
220  oldy = e->y();
221  }
222 }
223 
224 void PVPlotWidget::mouseDoubleClickEvent(QMouseEvent *e)
225 {
226  double xscale = dataRect().width() / (width() - leftPadding() - rightPadding());
227  double yscale = dataRect().height() / (height() - topPadding() - bottomPadding());
228 
229  double xc = dataRect().x() + xscale * (e->x() - leftPadding());
230  double yc = dataRect().bottom() - yscale * (e->y() - topPadding());
231 
232  if (xc > -AUMAX && xc < AUMAX && yc > -AUMAX && yc < AUMAX)
233  {
234  setLimits(xc - 0.5 * dataRect().width(), xc + 0.5 * dataRect().width(), yc - 0.5 * dataRect().height(),
235  yc + 0.5 * dataRect().height());
236  update();
237  }
238 
239  pv->setCenterPlanet(QString());
240  for (unsigned int i = 0; i < 9; ++i)
241  {
242  KPlotPoint *point = pv->planetObject(i)->points().at(0);
243  double dx = (point->x() - xc) / xscale;
244  if (dx < 4.0)
245  {
246  double dy = (point->y() - yc) / yscale;
247  if (sqrt(dx * dx + dy * dy) < 4.0)
248  {
249  pv->setCenterPlanet(pv->planetName(i));
250  }
251  }
252  }
253 }
254 
255 void PVPlotWidget::wheelEvent(QWheelEvent *e)
256 {
257  updateFactor(e->modifiers());
258  if (e->angleDelta().y() > 0)
259  slotZoomIn();
260  else
261  slotZoomOut();
262 }
263 
264 void PVPlotWidget::slotZoomIn()
265 {
266  double size = dataRect().width();
267  if (size > 0.8)
268  {
269  setLimits(dataRect().x() + factor * 0.01 * size, dataRect().right() - factor * 0.01 * size,
270  dataRect().y() + factor * 0.01 * size, dataRect().bottom() - factor * 0.01 * size);
271  update();
272  }
273 }
274 
275 void PVPlotWidget::slotZoomOut()
276 {
277  double size = dataRect().width();
278  if ((size) < 100.0)
279  {
280  setLimits(dataRect().x() - factor * 0.01 * size, dataRect().right() + factor * 0.01 * size,
281  dataRect().y() - factor * 0.01 * size, dataRect().bottom() + factor * 0.01 * size);
282  update();
283  }
284 }
285 
286 void PVPlotWidget::updateFactor(const int modifier)
287 {
288  factor = (modifier & Qt::ControlModifier) ? 1 : 25;
289 }
QTextStream & right(QTextStream &stream)
QPoint angleDelta() const const
int y() const const
Qt::KeyboardModifiers modifiers() const const
QString i18n(const char *text, const TYPE &arg...)
double y() const
int x() const const
int y() const const
Key_Left
Display an overhead view of the solar system.
Definition: planetviewer.h:37
Qt::KeyboardModifiers modifiers() const const
int key() const const
void ignore()
void update(Part *part, const QByteArray &data, qint64 dataSize)
StrongFocus
ControlModifier
double x() const
This file is part of the KDE documentation.
Documentation copyright © 1996-2022 The KDE developers.
Generated on Thu Aug 11 2022 04:00:02 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.