Kstars

skymapqdraw.cpp
1/*
2 SPDX-FileCopyrightText: 2010 Akarsh Simha <akarsh.simha@kdemail.net>
3
4 SPDX-License-Identifier: GPL-2.0-or-later
5*/
6
7#include "skymapqdraw.h"
8#include "skymapcomposite.h"
9#include "skyqpainter.h"
10#include "skymap.h"
11#include "projections/projector.h"
12#include "printing/legend.h"
13#include "kstars_debug.h"
14#include <QPainterPath>
15
17{
18 m_SkyPixmap = new QPixmap(width(), height());
19 m_SkyPainter.reset(new SkyQPainter(this, m_SkyPixmap));
20}
21
23{
24 delete m_SkyPixmap;
25}
26
27void SkyMapQDraw::paintEvent(QPaintEvent *event)
28{
29 Q_UNUSED(event)
30 // This is machinery to prevent multiple concurrent paint events / recursive paint events
31 if (m_DrawLock)
32 {
33 qCDebug(KSTARS) << "Prevented a recursive / concurrent draw!";
34 return;
35 }
36 setDrawLock(true);
37
38 // JM 2016-05-03: Not needed since we're not using OpenGL for now
39 //calculateFPS();
40
41 //If computeSkymap is false, then we just refresh the window using the stored sky pixmap
42 //and draw the "overlays" on top. This lets us update the overlay information rapidly
43 //without needing to recompute the entire skymap.
44 //use update() to trigger this "short" paint event; to force a full "recompute"
45 //of the skymap, use forceUpdate().
46
47 if (!m_SkyMap->computeSkymap)
48 {
49 QPainter p;
50 p.begin(this);
51 p.drawLine(0, 0, 1, 1); // Dummy operation to circumvent bug. TODO: Add details
52 p.drawPixmap(0, 0, *m_SkyPixmap);
53 drawOverlays(p);
54 p.end();
55
56 setDrawLock(false);
57 return; // exit because the pixmap is repainted and that's all what we want
58 }
59
60 m_SkyMap->updateInfoBoxes();
61 m_SkyMap->setupProjector();
62
63 m_SkyPixmap->fill(Qt::black);
64 m_SkyPainter->setPaintDevice(m_SkyPixmap);
65 m_SkyPainter->setSize(m_SkyPixmap->width(), m_SkyPixmap->height());
66
67 //FIXME: we may want to move this into the components.
68 m_SkyPainter->begin();
69
70 //Draw all sky elements
71
72 // Set Clipping
73 QPainterPath path;
74 path.addPolygon(m_SkyMap->projector()->clipPoly());
75 m_SkyPainter->setClipPath(path);
76 m_SkyPainter->setClipping(true);
77
78 m_SkyPainter->drawSkyBackground();
79
80 m_KStarsData->skyComposite()->draw(m_SkyPainter.data());
81 //Finish up
82 m_SkyPainter->end();
83
84 QPainter psky2;
85 psky2.begin(this);
86 psky2.drawLine(0, 0, 1, 1); // Dummy op.
87 psky2.drawPixmap(0, 0, *m_SkyPixmap);
88 drawOverlays(psky2);
89 psky2.end();
90
91 if (m_SkyMap->m_previewLegend)
92 {
93 m_SkyMap->m_legend.paintLegend(m_SkyPixmap);
94 }
95
96 m_SkyMap->computeSkymap = false; // use forceUpdate() to compute new skymap else old pixmap will be shown
97
98 setDrawLock(false);
99}
100
101void SkyMapQDraw::resizeEvent(QResizeEvent *e)
102{
103 Q_UNUSED(e)
104 delete m_SkyPixmap;
105 m_SkyPixmap = new QPixmap(width(), height());
106}
static void setDrawLock(bool state)
Acquire / release a draw lock.
void drawOverlays(QPainter &p, bool drawFov=true)
Draw the overlays on top of the sky map.
SkyMapDrawAbstract(SkyMap *sm)
Constructor that sets data and m_SkyMap, and initializes the FPS counters.
~SkyMapQDraw() override
Destructor.
SkyMapQDraw(SkyMap *parent)
Constructor.
This is the canvas on which the sky is painted.
Definition skymap.h:54
The QPainter-based painting backend.
Definition skyqpainter.h:31
QString path(const QString &relativePath)
bool begin(QPaintDevice *device)
void drawLine(const QLine &line)
void drawPixmap(const QPoint &point, const QPixmap &pixmap)
bool end()
iterator end()
QWidget(QWidget *parent, Qt::WindowFlags f)
virtual bool event(QEvent *event) override
This file is part of the KDE documentation.
Documentation copyright © 1996-2025 The KDE developers.
Generated on Fri Jan 24 2025 11:53:02 by doxygen 1.13.2 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.