• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

Stellarium / stellarium / 15291801018

28 May 2025 04:52AM UTC coverage: 11.931% (-0.02%) from 11.951%
15291801018

push

github

alex-w
Added new set of navigational stars (XIX century)

0 of 6 new or added lines in 2 files covered. (0.0%)

14124 existing lines in 74 files now uncovered.

14635 of 122664 relevant lines covered (11.93%)

18291.42 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/src/core/modules/GridLinesMgr.cpp
1
/*
2
 * Stellarium
3
 * Copyright (C) 2007 Fabien Chereau
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA  02110-1335, USA.
18
 */
19

20
#include "GridLinesMgr.hpp"
21
#include "StelApp.hpp"
22
#include "StelLocaleMgr.hpp"
23
#include "StelUtils.hpp"
24
#include "StelTranslator.hpp"
25
#include "StelProjector.hpp"
26
#include "StelFader.hpp"
27
#include "Planet.hpp"
28
#include "SolarSystem.hpp"
29
#include "StelModuleMgr.hpp"
30
#include "StelCore.hpp"
31
#include "StelObserver.hpp"
32
#include "StelPainter.hpp"
33
#include "StelTextureMgr.hpp"
34
#include "StelFileMgr.hpp"
35
#include "StelMovementMgr.hpp"
36
#include "precession.h"
37

38
#include <set>
39
#include <vector>
40
#include <QSettings>
41
#include <QDebug>
42
#include <QFontMetrics>
43

44
//! @class SkyGrid
45
//! Class which manages a grid to display in the sky.
46
class SkyGrid
47
{
48
public:
49
        // Create and precompute positions of a SkyGrid
50
        SkyGrid(StelCore::FrameType frame);
51
        virtual ~SkyGrid();
52
        void draw(const StelCore* prj) const;
53
        void setFontSize(int newFontSize);
54
        void setColor(const Vec3f& c) {color = c;}
×
55
        const Vec3f& getColor() const {return color;}
×
56
        void update(double deltaTime) {fader.update(static_cast<int>(deltaTime*1000));}
×
57
        void setFadeDuration(float duration) {fader.setDuration(static_cast<int>(duration*1000.f));}
58
        void setDisplayed(const bool displayed){fader = displayed;}
×
59
        bool isDisplayed() const {return fader;}
×
60
        void setLineThickness(const float thickness) {lineThickness = thickness;}
×
61
        float getLineThickness() const {return lineThickness;}
×
62
private:
63
        Vec3f color;
64
        StelCore::FrameType frameType;
65
        QFont font;
66
        LinearFader fader;
67
        float lineThickness;
68
};
69

70
//! @class SkyPoint
71
//! Class which manages a point to display around the sky like the North Celestial Pole.
72
class SkyPoint
73
{
74
public:
75
        enum SKY_POINT_TYPE
76
        {
77
                CELESTIALPOLES_J2000,
78
                CELESTIALPOLES_OF_DATE,
79
                ZENITH_NADIR,
80
                ECLIPTICPOLES_J2000,
81
                ECLIPTICPOLES_OF_DATE,
82
                GALACTICPOLES,
83
                GALACTICCENTER,
84
                SUPERGALACTICPOLES,
85
                EQUINOXES_J2000,
86
                EQUINOXES_OF_DATE,
87
                SOLSTICES_J2000,
88
                SOLSTICES_OF_DATE,
89
                ANTISOLAR,
90
                EARTH_UMBRA_CENTER,
91
                APEX
92
        };
93
        // Create and precompute positions of a SkyGrid
94
        SkyPoint(SKY_POINT_TYPE _point_type = CELESTIALPOLES_J2000);
95
        virtual ~SkyPoint();
96
        void draw(StelCore* core) const;
97
        void setColor(const Vec3f& c) {color = c;}
×
98
        const Vec3f& getColor() const {return color;}
×
99
        void update(double deltaTime) {fader.update(static_cast<int>(deltaTime*1000));}
×
100
        void setFadeDuration(float duration) {fader.setDuration(static_cast<int>(duration*1000.f));}
101
        void setDisplayed(const bool displayed){fader = displayed;}
×
102
        bool isDisplayed() const {return fader;}
×
103
        void setFontSize(int newSize);
104
        //! Re-translates the label.
105
        void updateLabel();
106
private:
107
        QSharedPointer<Planet> earth, sun;
108
        SKY_POINT_TYPE point_type;
109
        Vec3f color;
110
        StelCore::FrameType frameType;
111
        LinearFader fader;
112
        QFont font;
113
        QString northernLabel, southernLabel;
114
        StelTextureSP texCross;
115
};
116

117

118
//! @class SkyLine
119
//! Class which manages a line to display around the sky like the ecliptic line.
120
class SkyLine
121
{
122
public:
123
        enum SKY_LINE_TYPE
124
        {
125
                EQUATOR_J2000,
126
                EQUATOR_OF_DATE,
127
                FIXED_EQUATOR,
128
                ECLIPTIC_J2000,
129
                ECLIPTIC_OF_DATE,
130
                ECLIPTIC_WITH_DATE,
131
                PRECESSIONCIRCLE_N,
132
                PRECESSIONCIRCLE_S,
133
                MERIDIAN,
134
                HORIZON,
135
                GALACTICEQUATOR,
136
                SUPERGALACTICEQUATOR,
137
                LONGITUDE,
138
                QUADRATURE,
139
                PRIME_VERTICAL,
140
                CURRENT_VERTICAL,
141
                COLURE_1,
142
                COLURE_2,
143
                CIRCUMPOLARCIRCLE_N,
144
                CIRCUMPOLARCIRCLE_S,
145
                INVARIABLEPLANE,
146
                SOLAR_EQUATOR,
147
                EARTH_UMBRA,
148
                EARTH_PENUMBRA
149
        };
150
        // Create and precompute positions of a SkyGrid
151
        SkyLine(SKY_LINE_TYPE _line_type = EQUATOR_J2000);
152
        virtual ~SkyLine();
153
        static void init(); //! call once before creating the first line.
154
        static void deinit(); //! call once after deleting all lines.
155
        void draw(StelCore* core) const;
156
        void setColor(const Vec3f& c) {color = c;}
×
157
        void setPartitions(bool visible) {showPartitions = visible;}
×
158
        bool showsPartitions() const {return showPartitions;}
×
159
        const Vec3f& getColor() const {return color;}
×
160
        void update(double deltaTime) {fader.update(static_cast<int>(deltaTime*1000));}
×
161
        void setFadeDuration(float duration) {fader.setDuration(static_cast<int>(duration*1000.f));}
162
        void setDisplayed(const bool displayed){fader = displayed;}
×
163
        bool isDisplayed() const {return fader;}
×
164
        void setLabeled(const bool displayed){showLabel = displayed;}
×
165
        bool isLabeled() const {return showLabel;}
×
166
        void setFontSize(int newSize);
167
        void setLineThickness(const float thickness) {lineThickness = thickness;}
×
168
        float getLineThickness() const {return lineThickness;}
169
        void setPartThickness(const float thickness) {partThickness = thickness;}
×
170
        float getPartThickness() const {return partThickness;}
×
171
        //! Re-translates the label and sets the frameType. Must be called in the constructor!
172
        void updateLabel();
173
        static void setSolarSystem(SolarSystem* ss);
174
        //! Compute eclipticOnDatePartitions for @param year. Trigger a call to this from a signal StelCore::dateChangedByYear()
175
        static void computeEclipticDatePartitions(int year = std::numeric_limits<int>::min());
176
private:
177
        static QSharedPointer<Planet> earth, sun, moon;
178
        SKY_LINE_TYPE line_type;
179
        Vec3f color;
180
        StelCore::FrameType frameType;
181
        LinearFader fader;
182
        QFont font;
183
        QString label;
184
        float lineThickness;
185
        float partThickness;
186
        bool showPartitions;
187
        bool showLabel;
188
        static QMap<int, double> precessionPartitions;
189
        static std::vector<QPair<Vec3d, QString>> eclipticOnDatePartitions; //!< Collection of up to 366 entries Vec3d={eclLongitude, aberration, nutation}, QString label
190
};
191

192
// rms added color as parameter
193
SkyGrid::SkyGrid(StelCore::FrameType frame) : color(0.2f,0.2f,0.2f), frameType(frame), lineThickness(1)
×
194
{
195
        // Font size is 12
196
        font.setPixelSize(StelApp::getInstance().getScreenFontSize()-1);
×
197
}
×
198

199
SkyGrid::~SkyGrid()
×
200
{
201
}
×
202

203
void SkyGrid::setFontSize(int newFontSize)
×
204
{
205
        font.setPixelSize(newFontSize);
×
206
}
×
207

208
// Step sizes in arcsec
209
static const double STEP_SIZES_DMS[] = {0.05, 0.2, 1., 5., 10., 60., 300., 600., 1200., 3600., 3600.*5., 3600.*10.};
210
static const double STEP_SIZES_HMS[] = {0.05, 0.2, 1.5, 7.5, 15., 15.*5., 15.*10., 15.*60., 15.*60.*5., 15.*60*10., 15.*60*60};
211

212
//! Return the angular grid step in degree which best fits the given scale
213
static double getClosestResolutionDMS(double pixelPerRad)
×
214
{
215
        double minResolution = 80.;
×
216
        double minSizeArcsec = minResolution/pixelPerRad*M_180_PI*3600;
×
217
        for (unsigned int i=0;i<12;++i)
×
218
        {
219
                if (STEP_SIZES_DMS[i]>minSizeArcsec)
×
220
                        return STEP_SIZES_DMS[i]/3600.;
×
221
        }
222
        return 10.;
×
223
}
224

225
//! Return the angular grid step in degree which best fits the given scale
226
static double getClosestResolutionHMS(double pixelPerRad)
×
227
{
228
        double minResolution = 80.;
×
229
        double minSizeArcsec = minResolution/pixelPerRad*M_180_PI*3600;
×
230
        for (unsigned int i=0;i<11;++i)
×
231
        {
232
                if (STEP_SIZES_HMS[i]>minSizeArcsec)
×
233
                        return STEP_SIZES_HMS[i]/3600.;
×
234
        }
235
        return 15.;
×
236
}
237

238
struct ViewportEdgeIntersectCallbackData
239
{
240
        ViewportEdgeIntersectCallbackData(StelPainter* p)
×
241
                : sPainter(p)
×
242
                , raAngle(0.0)
×
243
                , gridStepMeridianRad(0.1)
×
UNCOV
244
                , frameType(StelCore::FrameUninitialized) {}
×
245
        StelPainter* sPainter;
246
        Vec4f textColor;
247
        QString text;                // Label to display at the intersection of the lines and screen side
248
        double raAngle;                // Used for meridians
249
        double gridStepMeridianRad; // used as rounding threshold
250
        StelCore::FrameType frameType;
251
};
252

253
// Callback which draws the label of the grid
UNCOV
254
void viewportEdgeIntersectCallback(const Vec3d& screenPos, const Vec3d& direction, void* userData)
×
255
{
256
        ViewportEdgeIntersectCallbackData* d = static_cast<ViewportEdgeIntersectCallbackData*>(userData);
×
257
        const Vec4f tmpColor = d->sPainter->getColor();
×
258
        d->sPainter->setColor(d->textColor);
×
259
        const bool withDecimalDegree = StelApp::getInstance().getFlagShowDecimalDegrees();
×
260
        const bool useSouthAzimuth = StelApp::getInstance().getFlagSouthAzimuthUsage();
×
UNCOV
261
        const float ppx = static_cast<float>(d->sPainter->getProjector()->getDevicePixelsPerPixel());
×
262

263
        const int viewportWidth  = d->sPainter->getProjector()->getViewportWidth();
×
UNCOV
264
        const int viewportHeight = d->sPainter->getProjector()->getViewportHeight();
×
265

266
        QString text;
×
UNCOV
267
        if (d->text.isEmpty())
×
268
        {
269
                // We are in the case of meridians, we need to determine which of the 2 labels (3h or 15h) to use
270
                Vec3d tmpV;
×
UNCOV
271
                d->sPainter->getProjector()->unProject(screenPos, tmpV);
×
272
                double lon, lat, textAngle, raAngle;
273
                StelUtils::rectToSphe(&lon, &lat, tmpV);
×
UNCOV
274
                switch (d->frameType)
×
275
                {
UNCOV
276
                        case StelCore::FrameAltAz:
×
277
                        {
278
                                raAngle = ::fmod(M_PI-d->raAngle,2.*M_PI);
×
UNCOV
279
                                lon = ::fmod(M_PI-lon,2.*M_PI);
×
280

281
                                if (std::fabs(2.*M_PI-lon)<0.001) // We are at meridian 0
×
UNCOV
282
                                        lon = 0.;
×
283

284
                                const double delta = raAngle<M_PI ? M_PI : -M_PI;                                
×
285
                                if (std::fabs(lon-raAngle) < 0.01 || (lon==0. && !qFuzzyCompare(raAngle, M_PI)))
×
UNCOV
286
                                        textAngle = raAngle;
×
287
                                else
UNCOV
288
                                        textAngle = raAngle+delta;
×
289

290
                                if (qFuzzyCompare(raAngle, 2*M_PI) && qFuzzyCompare(delta, -M_PI))
×
UNCOV
291
                                        textAngle = 0;
×
292

293
                                if (useSouthAzimuth)
×
UNCOV
294
                                        textAngle += M_PI;
×
295

296
                                if (withDecimalDegree)
×
UNCOV
297
                                        text = StelUtils::radToDecDegStr(textAngle, 4, false, true);
×
298
                                else
UNCOV
299
                                        text = StelUtils::radToDmsStrAdapt(textAngle);
×
300

UNCOV
301
                                break;                        
×
302
                        }
UNCOV
303
                        default:
×
304
                        {
305
                                raAngle = StelUtils::fmodpos(d->raAngle, 2.*M_PI);
×
UNCOV
306
                                lon = StelUtils::fmodpos(lon, 2.*M_PI);
×
307

308
                                if (std::fabs(2.*M_PI-lon)<d->gridStepMeridianRad/250.) // We are at meridian 0
×
UNCOV
309
                                        lon = 0.;
×
310

311
                                const double delta = raAngle<M_PI ? M_PI : -M_PI;
×
312
                                if (std::fabs(lon-raAngle) < 1. || lon==0.)
×
UNCOV
313
                                        textAngle = raAngle;
×
314
                                else
UNCOV
315
                                        textAngle = raAngle+delta;
×
316

317
                                if (qFuzzyCompare(raAngle, 2*M_PI) && qFuzzyCompare(delta, -M_PI))
×
UNCOV
318
                                        textAngle = 0;
×
319

320
                                if (d->frameType==StelCore::FrameFixedEquatorial)
×
UNCOV
321
                                        textAngle=2.*M_PI-textAngle;
×
322

323

324
                                textAngle=StelUtils::fmodpos(textAngle, 2.*M_PI);
×
325
                                if (withDecimalDegree)
×
UNCOV
326
                                        text = StelUtils::radToDecDegStr(textAngle, 4, false, true);
×
327
                                else
328
                                {
329
                                        if (QList<StelCore::FrameType>{StelCore::FrameObservercentricEclipticJ2000, StelCore::FrameObservercentricEclipticOfDate,
×
330
                                                StelCore::FrameGalactic, StelCore::FrameSupergalactic}.contains(d->frameType))
×
UNCOV
331
                                                text = StelUtils::radToDmsStrAdapt(textAngle);
×
332
                                        else
UNCOV
333
                                                text = StelUtils::radToHmsStrAdapt(textAngle);
×
334
                                }
335
                        }
336
                }
337
        }
338
        else
UNCOV
339
                text = d->text;
×
340

341
        Vec3f direc=direction.toVec3f();        
×
342
        direc.normalize();        
×
343
        float angleDeg = std::atan2(-direc[1], -direc[0])*M_180_PIf;
×
344
        float xshift=6.f;
×
345
        float yshift=6.f;
×
UNCOV
346
        if (angleDeg>90.f || angleDeg<-90.f)
×
347
        {
348
                angleDeg+=180.f;
×
UNCOV
349
                xshift=-(static_cast<float>(d->sPainter->getFontMetrics().boundingRect(text).width()) + xshift*ppx);
×
350
        }
351
        // DEBUG INFO ONLY!
352
        //text=QString(" <:%1°").arg(QString::number(angleDeg, 'f', 2));
353
        //text.append(QString(" <:%1° %2/%3 (%4x%5)").arg(QString::number(angleDeg, 'f', 2), QString::number(screenPos[0], 'f', 2), QString::number(screenPos[1], 'f', 2),
354
        //                QString::number(viewportWidth),        QString::number(viewportHeight)));
UNCOV
355
        if ((fabs(screenPos[0])<1.) && (angleDeg>0.f )) // LEFT
×
356
        {
UNCOV
357
                xshift+=0.5f*tan(angleDeg*M_PI_180f)*d->sPainter->getFontMetrics().boundingRect(text).height();
×
358
        }
UNCOV
359
        else if ((fabs(screenPos[0]-viewportWidth)<1.) && (angleDeg>180.f )) // RIGHT
×
360
        {
UNCOV
361
                xshift += 0.5 * tan(angleDeg*M_PI_180f)*d->sPainter->getFontMetrics().boundingRect(text).height();
×
362
        }
UNCOV
363
        else if ((fabs(screenPos[1]-viewportHeight)<1.) && fabs(angleDeg)>5.f) // TOP
×
364
        {
365
                const float sign = angleDeg<-90.f ? 0.5f : -0.5f;
×
UNCOV
366
                xshift += sign * (1./tan(angleDeg*M_PI_180f))*d->sPainter->getFontMetrics().boundingRect(text).height();
×
367
        }
368
        // It seems bottom edge is always OK!
369

370
        d->sPainter->drawText(static_cast<float>(screenPos[0]), static_cast<float>(screenPos[1]), text, angleDeg, xshift*ppx, yshift*ppx);
×
371
        d->sPainter->setColor(tmpColor);
×
UNCOV
372
}
×
373

374
//! Draw the sky grid in the current frame
UNCOV
375
void SkyGrid::draw(const StelCore* core) const
×
376
{
377
        if (fader.getInterstate() <= 0.f)
×
UNCOV
378
                return;
×
379

380
        const StelProjectorP prj = core->getProjection(frameType, (frameType!=StelCore::FrameAltAz && frameType!=StelCore::FrameFixedEquatorial) ? StelCore::RefractionAuto : StelCore::RefractionOff);
×
UNCOV
381
        const bool withDecimalDegree = StelApp::getInstance().getFlagShowDecimalDegrees();
×
382

383
        // Look for all meridians and parallels intersecting with the disk bounding the viewport
384
        // Check whether the pole are in the viewport
385
        Vec3f win;
×
386
        const bool northPoleInViewport = (prj->project(Vec3f(0,0,1), win) && prj->checkInViewport(win));
×
UNCOV
387
        const bool southPoleInViewport = (prj->project(Vec3f(0,0,-1), win) && prj->checkInViewport(win));
×
388
        // Get the longitude and latitude resolution at the center of the viewport
389
        Vec3d centerV;
×
UNCOV
390
        prj->unProject(prj->getViewportPosX()+prj->getViewportWidth()/2., prj->getViewportPosY()+prj->getViewportHeight()/2.+1., centerV);
×
391
        double lon2, lat2;
UNCOV
392
        StelUtils::rectToSphe(&lon2, &lat2, centerV);
×
393

UNCOV
394
        const double gridStepParallelRad = M_PI_180*getClosestResolutionDMS(static_cast<double>(prj->getPixelPerRadAtCenter()));
×
395
        double gridStepMeridianRad;
396
        if (northPoleInViewport || southPoleInViewport)
×
UNCOV
397
                gridStepMeridianRad = (frameType==StelCore::FrameAltAz) ? M_PI_180 * 10. : M_PI_180 * 15.;
×
398
        else
399
        {
400
                const double closestResLon = (frameType==StelCore::FrameAltAz) ?
×
401
                                        getClosestResolutionDMS(static_cast<double>(prj->getPixelPerRadAtCenter())*std::cos(lat2)) :
×
402
                                        getClosestResolutionHMS(static_cast<double>(prj->getPixelPerRadAtCenter())*std::cos(lat2));
×
UNCOV
403
                gridStepMeridianRad = M_PI_180 * closestResLon;
×
404
        }
405

406
        // Get the bounding halfspace
UNCOV
407
        const SphericalCap& viewPortSphericalCap = prj->getBoundingCap();
×
408

409
        // Compute the first grid starting point. This point is close to the center of the screen
410
        // and lies at the intersection of a meridian and a parallel
411
        lon2 = gridStepMeridianRad*(static_cast<int>(lon2/gridStepMeridianRad+0.5));
×
412
        lat2 = gridStepParallelRad*(static_cast<int>(lat2/gridStepParallelRad+0.5));
×
413
        Vec3d firstPoint;
×
414
        StelUtils::spheToRect(lon2, lat2, firstPoint);
×
UNCOV
415
        firstPoint.normalize();
×
416

417
        // Q_ASSERT(viewPortSphericalCap.contains(firstPoint));
418

419
        // Initialize a painter and set OpenGL state
420
        StelPainter sPainter(prj);
×
421
        sPainter.setBlending(true);
×
422
        if (lineThickness>1.f)
×
423
                sPainter.setLineWidth(lineThickness); // set line thickness
×
UNCOV
424
        sPainter.setLineSmooth(true);
×
425

426
        // make text colors just a bit brighter. (But if >1, QColor::setRgb fails and makes text invisible.)
427
        Vec4f textColor(qMin(1.0f, 1.25f*color[0]), qMin(1.0f, 1.25f*color[1]), qMin(1.0f, 1.25f*color[2]), fader.getInterstate());
×
UNCOV
428
        sPainter.setColor(color, fader.getInterstate());
×
429

430
        sPainter.setFont(font);
×
431
        ViewportEdgeIntersectCallbackData userData(&sPainter);
×
432
        userData.textColor = textColor;
×
433
        userData.frameType = frameType;
×
UNCOV
434
        userData.gridStepMeridianRad = gridStepMeridianRad;
×
435

436
        /////////////////////////////////////////////////
437
        // Draw all the meridians (great circles)
438
        SphericalCap meridianSphericalCap(Vec3d(1,0,0), 0);
×
439
        Mat4d rotLon = Mat4d::zrotation(gridStepMeridianRad);
×
440
        Vec3d fpt = firstPoint;
×
441
        Vec3d p1, p2;
×
UNCOV
442
        int maxNbIter = static_cast<int>(M_PI/gridStepMeridianRad);
×
443
        int i;
UNCOV
444
        for (i=0; i<maxNbIter; ++i)
×
445
        {
446
                StelUtils::rectToSphe(&lon2, &lat2, fpt);
×
UNCOV
447
                userData.raAngle = fabs(lon2)<1.e-12 ? 0. : lon2; // Get rid of stupid noise
×
448

449
                meridianSphericalCap.n = fpt^Vec3d(0,0,1);
×
450
                meridianSphericalCap.n.normalize();
×
UNCOV
451
                if (!SphericalCap::intersectionPoints(viewPortSphericalCap, meridianSphericalCap, p1, p2))
×
452
                {
UNCOV
453
                        if (viewPortSphericalCap.d<meridianSphericalCap.d && viewPortSphericalCap.contains(meridianSphericalCap.n))
×
454
                        {
455
                                // The meridian is fully included in the viewport, draw it in 3 sub-arcs to avoid length > 180.
456
                                const Mat4d& rotLon120 = Mat4d::rotation(meridianSphericalCap.n, 120.*M_PI/180.);
×
457
                                Vec3d rotFpt=fpt;
×
458
                                rotFpt.transfo4d(rotLon120);
×
459
                                Vec3d rotFpt2=rotFpt;
×
460
                                rotFpt2.transfo4d(rotLon120);
×
461
                                sPainter.drawGreatCircleArc(fpt, rotFpt, nullptr, viewportEdgeIntersectCallback, &userData);
×
462
                                sPainter.drawGreatCircleArc(rotFpt, rotFpt2, nullptr, viewportEdgeIntersectCallback, &userData);
×
463
                                sPainter.drawGreatCircleArc(rotFpt2, fpt, nullptr, viewportEdgeIntersectCallback, &userData);
×
464
                                fpt.transfo4d(rotLon);
×
465
                                continue;
×
UNCOV
466
                        }
×
467
                        else
UNCOV
468
                                break;
×
469
                }
470

471
                Vec3d middlePoint = p1+p2;
×
472
                middlePoint.normalize();
×
473
                if (!viewPortSphericalCap.contains(middlePoint))
×
UNCOV
474
                        middlePoint*=-1.;
×
475

476
                // Draw the arc in 2 sub-arcs to avoid lengths > 180 deg
477
                sPainter.drawGreatCircleArc(p1, middlePoint, nullptr, viewportEdgeIntersectCallback, &userData);
×
UNCOV
478
                sPainter.drawGreatCircleArc(p2, middlePoint, nullptr, viewportEdgeIntersectCallback, &userData);
×
479

UNCOV
480
                fpt.transfo4d(rotLon);
×
481
        }
482

UNCOV
483
        if (i!=maxNbIter)
×
484
        {
485
                rotLon = Mat4d::zrotation(-gridStepMeridianRad);
×
486
                fpt = firstPoint;
×
487
                fpt.transfo4d(rotLon);
×
UNCOV
488
                for (int j=0; j<maxNbIter-i; ++j)
×
489
                {
490
                        StelUtils::rectToSphe(&lon2, &lat2, fpt);
×
UNCOV
491
                        userData.raAngle = fabs(lon2)<1.e-12 ? 0. : lon2; // Get rid of stupid noise
×
492

493
                        meridianSphericalCap.n = fpt^Vec3d(0,0,1);
×
494
                        meridianSphericalCap.n.normalize();
×
495
                        if (!SphericalCap::intersectionPoints(viewPortSphericalCap, meridianSphericalCap, p1, p2))
×
UNCOV
496
                                break;
×
497

498
                        Vec3d middlePoint = p1+p2;
×
499
                        middlePoint.normalize();
×
500
                        if (!viewPortSphericalCap.contains(middlePoint))
×
UNCOV
501
                                middlePoint*=-1;
×
502

503
                        sPainter.drawGreatCircleArc(p1, middlePoint, nullptr, viewportEdgeIntersectCallback, &userData);
×
UNCOV
504
                        sPainter.drawGreatCircleArc(p2, middlePoint, nullptr, viewportEdgeIntersectCallback, &userData);
×
505

UNCOV
506
                        fpt.transfo4d(rotLon);
×
507
                }
508
        }
509

510
        /////////////////////////////////////////////////
511
        // Draw all the parallels (small circles)
512
        SphericalCap parallelSphericalCap(Vec3d(0,0,1), 0);
×
513
        rotLon = Mat4d::rotation(firstPoint^Vec3d(0,0,1), gridStepParallelRad);
×
514
        fpt = firstPoint;
×
515
        maxNbIter = static_cast<int>(M_PI/gridStepParallelRad)-1;
×
UNCOV
516
        for (i=0; i<maxNbIter; ++i)
×
517
        {
518
                StelUtils::rectToSphe(&lon2, &lat2, fpt);
×
519
                if (withDecimalDegree)
×
UNCOV
520
                        userData.text = StelUtils::radToDecDegStr(lat2);
×
521
                else
UNCOV
522
                        userData.text = StelUtils::radToDmsStrAdapt(lat2);
×
523

524
                parallelSphericalCap.d = fpt[2];
×
525
                if (parallelSphericalCap.d>0.9999999)
×
UNCOV
526
                        break;
×
527

528
                const Vec3d rotCenter(0,0,parallelSphericalCap.d);
×
UNCOV
529
                if (!SphericalCap::intersectionPoints(viewPortSphericalCap, parallelSphericalCap, p1, p2))
×
530
                {
531
                        if ((viewPortSphericalCap.d<parallelSphericalCap.d && viewPortSphericalCap.contains(parallelSphericalCap.n))
×
UNCOV
532
                                || (viewPortSphericalCap.d<-parallelSphericalCap.d && viewPortSphericalCap.contains(-parallelSphericalCap.n)))
×
533
                        {
534
                                // The parallel is fully included in the viewport, draw it in 3 sub-arcs to avoid lengths >= 180 deg
535
                                static const Mat4d rotLon120 = Mat4d::zrotation(120.*M_PI/180.);
×
536
                                Vec3d rotFpt=fpt;
×
537
                                rotFpt.transfo4d(rotLon120);
×
538
                                Vec3d rotFpt2=rotFpt;
×
539
                                rotFpt2.transfo4d(rotLon120);
×
540
                                sPainter.drawSmallCircleArc(fpt, rotFpt, rotCenter, viewportEdgeIntersectCallback, &userData);
×
541
                                sPainter.drawSmallCircleArc(rotFpt, rotFpt2, rotCenter, viewportEdgeIntersectCallback, &userData);
×
542
                                sPainter.drawSmallCircleArc(rotFpt2, fpt, rotCenter, viewportEdgeIntersectCallback, &userData);
×
543
                                fpt.transfo4d(rotLon);
×
544
                                continue;
×
UNCOV
545
                        }
×
546
                        else
UNCOV
547
                                break;
×
548
                }
549

550
                // Draw the arc in 2 sub-arcs to avoid lengths > 180 deg
551
                Vec3d middlePoint = p1-rotCenter+p2-rotCenter;
×
552
                middlePoint.normalize();
×
553
                middlePoint*=(p1-rotCenter).norm();
×
554
                middlePoint+=rotCenter;
×
UNCOV
555
                if (!viewPortSphericalCap.contains(middlePoint))
×
556
                {
557
                        middlePoint-=rotCenter;
×
558
                        middlePoint*=-1.;
×
UNCOV
559
                        middlePoint+=rotCenter;
×
560
                }
561

562
                sPainter.drawSmallCircleArc(p1, middlePoint, rotCenter, viewportEdgeIntersectCallback, &userData);
×
UNCOV
563
                sPainter.drawSmallCircleArc(p2, middlePoint, rotCenter, viewportEdgeIntersectCallback, &userData);
×
564

UNCOV
565
                fpt.transfo4d(rotLon);
×
566
        }
567

UNCOV
568
        if (i!=maxNbIter)
×
569
        {
570
                rotLon = Mat4d::rotation(firstPoint^Vec3d(0,0,1), -gridStepParallelRad);
×
571
                fpt = firstPoint;
×
572
                fpt.transfo4d(rotLon);
×
UNCOV
573
                for (int j=0; j<maxNbIter-i; ++j)
×
574
                {
575
                        StelUtils::rectToSphe(&lon2, &lat2, fpt);
×
576
                        if (withDecimalDegree)
×
UNCOV
577
                                userData.text = StelUtils::radToDecDegStr(lat2);
×
578
                        else
UNCOV
579
                                userData.text = StelUtils::radToDmsStrAdapt(lat2);
×
580

581
                        parallelSphericalCap.d = fpt[2];
×
582
                        const Vec3d rotCenter(0,0,parallelSphericalCap.d);
×
UNCOV
583
                        if (!SphericalCap::intersectionPoints(viewPortSphericalCap, parallelSphericalCap, p1, p2))
×
584
                        {
585
                                if ((viewPortSphericalCap.d<parallelSphericalCap.d && viewPortSphericalCap.contains(parallelSphericalCap.n))
×
UNCOV
586
                                         || (viewPortSphericalCap.d<-parallelSphericalCap.d && viewPortSphericalCap.contains(-parallelSphericalCap.n)))
×
587
                                {
588
                                        // The parallel is fully included in the viewport, draw it in 3 sub-arcs to avoid lengths >= 180 deg
589
                                        static const Mat4d rotLon120 = Mat4d::zrotation(120.*M_PI/180.);
×
590
                                        Vec3d rotFpt=fpt;
×
591
                                        rotFpt.transfo4d(rotLon120);
×
592
                                        Vec3d rotFpt2=rotFpt;
×
593
                                        rotFpt2.transfo4d(rotLon120);
×
594
                                        sPainter.drawSmallCircleArc(fpt, rotFpt, rotCenter, viewportEdgeIntersectCallback, &userData);
×
595
                                        sPainter.drawSmallCircleArc(rotFpt, rotFpt2, rotCenter, viewportEdgeIntersectCallback, &userData);
×
596
                                        sPainter.drawSmallCircleArc(rotFpt2, fpt, rotCenter, viewportEdgeIntersectCallback, &userData);
×
597
                                        fpt.transfo4d(rotLon);
×
598
                                        continue;
×
UNCOV
599
                                }
×
600
                                else
UNCOV
601
                                        break;
×
602
                        }
603

604
                        // Draw the arc in 2 sub-arcs to avoid lengths > 180 deg
605
                        Vec3d middlePoint = p1-rotCenter+p2-rotCenter;
×
606
                        middlePoint.normalize();
×
607
                        middlePoint*=(p1-rotCenter).norm();
×
608
                        middlePoint+=rotCenter;
×
UNCOV
609
                        if (!viewPortSphericalCap.contains(middlePoint))
×
610
                        {
611
                                middlePoint-=rotCenter;
×
612
                                middlePoint*=-1.;
×
UNCOV
613
                                middlePoint+=rotCenter;
×
614
                        }
615

616
                        sPainter.drawSmallCircleArc(p1, middlePoint, rotCenter, viewportEdgeIntersectCallback, &userData);
×
UNCOV
617
                        sPainter.drawSmallCircleArc(p2, middlePoint, rotCenter, viewportEdgeIntersectCallback, &userData);
×
618

UNCOV
619
                        fpt.transfo4d(rotLon);
×
620
                }
621
        }
622

623
        if (lineThickness>1)
×
624
                sPainter.setLineWidth(1); // reset thickness of line
×
625
        sPainter.setLineSmooth(false);
×
UNCOV
626
}
×
627

UNCOV
628
SkyLine::SkyLine(SKY_LINE_TYPE _line_type) : line_type(_line_type), color(0.f, 0.f, 1.f), lineThickness(1), partThickness(1), showPartitions(true), showLabel(true)
×
629
{
630
        // Font size is 14
631
        font.setPixelSize(StelApp::getInstance().getScreenFontSize()+1);
×
632
        updateLabel();
×
UNCOV
633
}
×
634

635
// Contains ecliptic rotations from -13000, -12900, ... , +13000
636
QMap<int, double> SkyLine::precessionPartitions;
637
// Contains ecliptic partitions {eclLongitude, aberration, nutation} with labels for the current year
638
std::vector<QPair<Vec3d, QString>> SkyLine::eclipticOnDatePartitions;
639
QSharedPointer<Planet> SkyLine::earth, SkyLine::sun, SkyLine::moon;
640

641
//! call once before creating the first line.
UNCOV
642
void SkyLine::init()
×
643
{
UNCOV
644
        setSolarSystem(GETSTELMODULE(SolarSystem));
×
645
        // The years for the precession circles start in -13000, this is 15000 before J2000.
UNCOV
646
        for (int y=-13000; y<=17000; y+=100) // Range of DE431. Maybe extend to -50000..+50000?
×
647
        {
648
                double jdY0, epsilonA, chiA, omegaA, psiA;
649
                StelUtils::getJDFromDate(&jdY0, y, 1, 0, 0, 0, 0); // JD of Jan.0.
×
650
                getPrecessionAnglesVondrak(jdY0, &epsilonA, &chiA, &omegaA, &psiA);
×
UNCOV
651
                precessionPartitions.insert(y, psiA); // Store only the value of shift along the ecliptic.
×
652
        }
653
        StelCore *core=StelApp::getInstance().getCore();
×
UNCOV
654
        const double jde=core->getJDE();
×
655
        int year, month, day;
656
        StelUtils::getDateFromJulianDay(jde, &year, &month, &day);
×
657
        computeEclipticDatePartitions(year);
×
UNCOV
658
}
×
659

UNCOV
660
void SkyLine::computeEclipticDatePartitions(int year)
×
661
{
662
        static GridLinesMgr* gMgr=GETSTELMODULE_SILENT(GridLinesMgr);
×
663
        if (gMgr && (! gMgr->getFlagEclipticDatesLabeled()))
×
UNCOV
664
                return;
×
665

666
        Q_ASSERT(earth);
×
667
        StelCore *core=StelApp::getInstance().getCore();
×
UNCOV
668
        eclipticOnDatePartitions.clear();
×
669

UNCOV
670
        if (year==std::numeric_limits<int>::min())
×
671
        {
672
                int m, d;
UNCOV
673
                StelUtils::getDateFromJulianDay(core->getJD(), &year, &m, &d);
×
674
        }
675
        const int lastDoY = (StelUtils::isLeapYear(year) ? 366 : 365);
×
UNCOV
676
        for (int day=1; day <= lastDoY; day++)
×
677
        {
UNCOV
678
                const Vec3i date=StelUtils::dateFromDayYear(day, year);
×
679
                double jd;
680
                StelUtils::getJDFromDate(&jd, year, date[1], date[2], 0, 0, 0.f);
×
681
                const double tzOffset=core->getUTCOffset(jd)/24.;
×
682
                const double jde=jd+core->getDeltaT()/86400.-tzOffset;
×
UNCOV
683
                Vec3d earthPos=earth->getEclipticPos(jde); // J2000 position!
×
684
                double lng, lat, r;
685
                StelUtils::rectToSphe(&lng, &lat, &r, earthPos);
×
UNCOV
686
                lng+=M_PI; lat*=-1.; // derive Solar data from this.
×
687
                double epsilonA, chiA, omegaA, psiA;
688
                getPrecessionAnglesVondrak(jde, &epsilonA, &chiA, &omegaA, &psiA);
×
689
                lng+=psiA;
×
UNCOV
690
                double aberration=-20.4898/3600.*M_PI_180/r; // Meeus AA (25.10)
×
691
                double deltaEps, deltaPsi;
UNCOV
692
                getNutationAngles(jde, &deltaPsi, &deltaEps);
×
693

694
                QString label;
×
UNCOV
695
                if ((year==1582) && (date[1]==10))
×
696
                {
697
                        // Gregorian calendar reform. Duplicate ticks are harmless, but we must tweak date labels.
698
                        if (QList<int>{1, 4, 15, 20, 25}.contains(date[2]))
×
UNCOV
699
                                label=QString("%1.%2").arg(QString::number(date[2]), StelLocaleMgr::romanMonthName(date[1]));
×
700
                }
701
                else
702
                {
703
                        if (QList<int>{1, 5, 10, 15, 20, 25}.contains(date[2]))
×
UNCOV
704
                                label=QString("%1.%2").arg(QString::number(date[2]), StelLocaleMgr::romanMonthName(date[1]));
×
705
                }
706
                eclipticOnDatePartitions.push_back({Vec3d(lng, aberration, deltaPsi), label});
×
UNCOV
707
        }
×
708
}
709

UNCOV
710
void SkyLine::setSolarSystem(SolarSystem* ss)
×
711
{
712
        earth = ss->getEarth();
×
713
        sun   = ss->getSun();
×
714
        moon  = ss->getMoon();
×
UNCOV
715
}
×
716

UNCOV
717
void SkyLine::deinit()
×
718
{
719
        earth = nullptr;
×
720
        sun   = nullptr;
×
721
        moon  = nullptr;
×
UNCOV
722
}
×
723

UNCOV
724
SkyLine::~SkyLine()
×
725
{
UNCOV
726
}
×
727

UNCOV
728
void SkyLine::setFontSize(int newFontSize)
×
729
{
730
        font.setPixelSize(newFontSize);
×
UNCOV
731
}
×
732

UNCOV
733
void SkyLine::updateLabel()
×
734
{
UNCOV
735
        switch (line_type)
×
736
        {
737
                case MERIDIAN:
×
738
                        frameType = StelCore::FrameAltAz;
×
739
                        label = q_("Meridian");
×
740
                        break;
×
741
                case ECLIPTIC_J2000:
×
742
                        frameType = StelCore::FrameObservercentricEclipticJ2000;
×
743
                        label = q_("Ecliptic of J2000.0");
×
744
                        break;
×
745
                case ECLIPTIC_OF_DATE:
×
746
                        frameType = StelCore::FrameObservercentricEclipticOfDate;
×
747
                        label = q_("Ecliptic of Date");
×
748
                        break;
×
749
                case ECLIPTIC_WITH_DATE:
×
750
                        frameType = StelCore::FrameObservercentricEclipticOfDate;
×
751
                        label = QString(); // No label: parallel to ecliptic.
×
752
                        break;
×
753
                case EQUATOR_J2000:
×
754
                        frameType = StelCore::FrameJ2000;
×
755
                        label = q_("Equator of J2000.0");
×
756
                        break;
×
757
                case EQUATOR_OF_DATE:
×
758
                        frameType = StelCore::FrameEquinoxEqu;
×
759
                        label = q_("Equator");
×
760
                        break;
×
761
                case FIXED_EQUATOR:
×
762
                        frameType = StelCore::FrameFixedEquatorial; // Apparent Hour Angle is a non-refraction frame.
×
763
                        label = q_("Hour Angle");
×
764
                        break;
×
UNCOV
765
                case PRECESSIONCIRCLE_N:
×
766
                case PRECESSIONCIRCLE_S:
767
                        frameType = StelCore::FrameObservercentricEclipticOfDate;
×
768
                        label = q_("Precession Circle");
×
769
                        break;
×
770
                case HORIZON:
×
771
                        frameType = StelCore::FrameAltAz;
×
772
                        label = q_("Horizon");
×
773
                        break;
×
774
                case GALACTICEQUATOR:
×
775
                        frameType = StelCore::FrameGalactic;
×
776
                        label = q_("Galactic Equator");
×
777
                        break;
×
778
                case SUPERGALACTICEQUATOR:
×
779
                        frameType = StelCore::FrameSupergalactic;
×
780
                        label = q_("Supergalactic Equator");
×
781
                        break;
×
782
                case LONGITUDE:
×
UNCOV
783
                        frameType = StelCore::FrameObservercentricEclipticOfDate;
×
784
                        // TRANSLATORS: Full term is "opposition/conjunction longitude"
785
                        label = q_("O./C. longitude");
×
786
                        break;
×
787
                case QUADRATURE:
×
788
                        frameType = StelCore::FrameObservercentricEclipticOfDate;
×
789
                        label = q_("Quadrature");
×
790
                        break;
×
791
                case PRIME_VERTICAL:
×
792
                        frameType=StelCore::FrameAltAz;
×
793
                        label = q_("Prime Vertical");
×
794
                        break;
×
795
                case CURRENT_VERTICAL:
×
796
                        frameType=StelCore::FrameAltAz;
×
797
                        label = q_("Altitude");
×
798
                        break;
×
799
                case COLURE_1:
×
800
                        frameType=StelCore::FrameEquinoxEqu;
×
801
                        label = q_("Equinoctial Colure");
×
802
                        break;
×
803
                case COLURE_2:
×
804
                        frameType=StelCore::FrameEquinoxEqu;
×
805
                        label = q_("Solstitial Colure");
×
806
                        break;
×
UNCOV
807
                case CIRCUMPOLARCIRCLE_N:
×
808
                case CIRCUMPOLARCIRCLE_S:
809
                        frameType = StelCore::FrameEquinoxEqu;
×
810
                        label = q_("Circumpolar Circle");
×
811
                        break;
×
812
                case EARTH_UMBRA:
×
813
                        frameType = StelCore::FrameHeliocentricEclipticJ2000;
×
814
                        label = q_("Umbra");
×
815
                        break;
×
816
                case EARTH_PENUMBRA:
×
817
                        frameType = StelCore::FrameHeliocentricEclipticJ2000;
×
818
                        label = q_("Penumbra");
×
819
                        break;
×
820
                case INVARIABLEPLANE:
×
821
                        frameType = StelCore::FrameJ2000;
×
822
                        label = q_("Invariable Plane");
×
823
                        break;
×
824
                case SOLAR_EQUATOR:
×
825
                        frameType = StelCore::FrameJ2000;
×
826
                        label = q_("Projected Solar Equator");
×
UNCOV
827
                        break;
×
828
        }
UNCOV
829
}
×
830

UNCOV
831
void SkyLine::draw(StelCore *core) const
×
832
{
833
        if (fader.getInterstate() <= 0.f)
×
UNCOV
834
                return;
×
835

836
        static StelMovementMgr *sMvMgr=GETSTELMODULE(StelMovementMgr);
×
837
        Q_ASSERT(sMvMgr);
×
UNCOV
838
        StelProjectorP prj = core->getProjection(frameType, (frameType!=StelCore::FrameAltAz && frameType!=StelCore::FrameFixedEquatorial) ? StelCore::RefractionAuto : StelCore::RefractionOff);
×
839

840
        // Get the bounding halfspace
UNCOV
841
        const SphericalCap& viewPortSphericalCap = prj->getBoundingCap();
×
842

843
        // Initialize a painter and set openGL state
844
        StelPainter sPainter(prj);
×
845
        sPainter.setColor(color, fader.getInterstate());
×
846
        sPainter.setBlending(true);
×
847
        const float oldLineWidth=sPainter.getLineWidth();
×
848
        sPainter.setLineWidth(lineThickness); // set line thickness
×
UNCOV
849
        sPainter.setLineSmooth(true);
×
850

851
        ViewportEdgeIntersectCallbackData userData(&sPainter);        
×
852
        sPainter.setFont(font);
×
853
        userData.textColor = Vec4f(color, fader.getInterstate());
×
854
        userData.text = label;
×
UNCOV
855
        double alt=0, az=0; // Required only for CURRENT_VERTICAL line. Will contain alt/az of view.
×
856
        /////////////////////////////////////////////////
857
        // Draw the line
858

859
        // Precession and Circumpolar circles are Small Circles, all others are Great Circles.
UNCOV
860
        if (QList<SKY_LINE_TYPE>({PRECESSIONCIRCLE_N, PRECESSIONCIRCLE_S, CIRCUMPOLARCIRCLE_N, CIRCUMPOLARCIRCLE_S, EARTH_UMBRA, EARTH_PENUMBRA}).contains(line_type))
×
861
        {
862
                // partitions for precession. (mark millennia!)
863
                double lat=0.;
×
UNCOV
864
                if (line_type==PRECESSIONCIRCLE_N || line_type==PRECESSIONCIRCLE_S)
×
865
                {
UNCOV
866
                        lat=(line_type==PRECESSIONCIRCLE_S ? -1.0 : 1.0) * (M_PI_2-getPrecessionAngleVondrakCurrentEpsilonA());
×
867
                }
UNCOV
868
                else if (line_type==CIRCUMPOLARCIRCLE_N || line_type==CIRCUMPOLARCIRCLE_S)
×
869
                {
870
                        const double obsLatRad=core->getCurrentLocation().getLatitude() * (M_PI_180);
×
UNCOV
871
                        if (obsLatRad == 0.)
×
872
                        {
873
                                sPainter.setLineWidth(oldLineWidth); // restore painter state
×
874
                                sPainter.setLineSmooth(false);
×
875
                                sPainter.setBlending(false);
×
UNCOV
876
                                return;
×
877
                        }
878
                        if (line_type==CIRCUMPOLARCIRCLE_N)
×
UNCOV
879
                                lat=(obsLatRad>0 ? -1.0 : +1.0) * obsLatRad + (M_PI_2);
×
880
                        else // southern circle
UNCOV
881
                                lat=(obsLatRad>0 ? +1.0 : -1.0) * obsLatRad - (M_PI_2);
×
882
                }
883

UNCOV
884
                if ((line_type==EARTH_UMBRA) || (line_type==EARTH_PENUMBRA))
×
885
                {
886
                        // resizing the shadow together with the Moon would require considerable trickery.
887
                        // It seems better to just switch it off.
888
                        static SolarSystem *sSystem=GETSTELMODULE(SolarSystem);
×
UNCOV
889
                        if (sSystem->getFlagMoonScale()) return;
×
890

891
                        // We compute the shadow circle attached to the geocenter, but must point it in the opposite direction of the sun's aberrated position.
892
                        const Vec3d pos=earth->getEclipticPos();
×
UNCOV
893
                        const Vec3d dir= - sun->getAberrationPush() + pos;
×
894
                        double lambda, beta;
895
                        StelUtils::rectToSphe(&lambda, &beta, dir);
×
896
                        const QPair<Vec3d, Vec3d> radii=sSystem->getEarthShadowRadiiAtLunarDistance();
×
897
                        const double radius=(line_type==EARTH_UMBRA ? radii.first[1] : radii.second[1]);
×
898
                        const double dist=moon->getEclipticPos().norm();  // geocentric Lunar distance [AU]
×
UNCOV
899
                        const Mat4d rot=Mat4d::zrotation(lambda)*Mat4d::yrotation(-beta);
×
900

901
                        StelVertexArray circle(StelVertexArray::LineLoop);
×
UNCOV
902
                        for (int i=0; i<360; ++i)
×
903
                        {
904
                                Vec3d point(dist, cos(i*M_PI_180)*radius, sin(i*M_PI_180)*radius); // disk towards First Point of Aries
×
905
                                rot.transfo(point);                                                // rotate towards earth position
×
UNCOV
906
                                circle.vertex.append(pos+point);                                   // attach to earth centre
×
907
                        }
UNCOV
908
                        sPainter.drawStelVertexArray(circle, true);
×
909

910
                        // Special case for Umbra and Penumbra labels
911
                        Vec3d point(dist, 0.0, 0.0);
×
912
                        rot.transfo(point);
×
913
                        const float shift=static_cast<float>(sPainter.getProjector()->getPixelPerRadAtCenter()*(line_type==EARTH_UMBRA ? radii.first[0] : radii.second[0]))*0.0000112f/M_PIf;
×
914
                        sPainter.drawText(pos+point, (line_type==EARTH_UMBRA ? q_("Umbra") : q_("Penumbra")), 0.f, shift, shift, false);
×
915
                        return;
×
UNCOV
916
                }
×
917
                else
918
                {
919
                        SphericalCap declinationCap(Vec3d(0,0,1), std::sin(lat));
×
UNCOV
920
                        const Vec3d rotCenter(0,0,declinationCap.d);
×
921

922
                        Vec3d p1, p2;
×
UNCOV
923
                        if (!SphericalCap::intersectionPoints(viewPortSphericalCap, declinationCap, p1, p2))
×
924
                        {
925
                                if ((viewPortSphericalCap.d<declinationCap.d && viewPortSphericalCap.contains(declinationCap.n))
×
UNCOV
926
                                                || (viewPortSphericalCap.d<-declinationCap.d && viewPortSphericalCap.contains(-declinationCap.n)))
×
927
                                {
928
                                        // The line is fully included in the viewport, draw it in 3 sub-arcs to avoid length > 180.
929
                                        Vec3d pt1;
×
930
                                        Vec3d pt2;
×
931
                                        Vec3d pt3;
×
932
                                        const double lon1=0.0;
×
933
                                        const double lon2=120.0*M_PI_180;
×
934
                                        const double lon3=240.0*M_PI_180;
×
935
                                        StelUtils::spheToRect(lon1, lat, pt1); pt1.normalize();
×
936
                                        StelUtils::spheToRect(lon2, lat, pt2); pt2.normalize();
×
UNCOV
937
                                        StelUtils::spheToRect(lon3, lat, pt3); pt3.normalize();
×
938

939
                                        sPainter.drawSmallCircleArc(pt1, pt2, rotCenter, viewportEdgeIntersectCallback, &userData);
×
940
                                        sPainter.drawSmallCircleArc(pt2, pt3, rotCenter, viewportEdgeIntersectCallback, &userData);
×
UNCOV
941
                                        sPainter.drawSmallCircleArc(pt3, pt1, rotCenter, viewportEdgeIntersectCallback, &userData);
×
942
                                }
943
                        }
944
                        else
945
                        {
946
                                // Draw the arc in 2 sub-arcs to avoid lengths > 180 deg
947
                                Vec3d middlePoint = p1-rotCenter+p2-rotCenter;
×
948
                                middlePoint.normalize();
×
949
                                middlePoint*=(p1-rotCenter).norm();
×
950
                                middlePoint+=rotCenter;
×
UNCOV
951
                                if (!viewPortSphericalCap.contains(middlePoint))
×
952
                                {
953
                                        middlePoint-=rotCenter;
×
954
                                        middlePoint*=-1.;
×
UNCOV
955
                                        middlePoint+=rotCenter;
×
956
                                }
957

958
                                sPainter.drawSmallCircleArc(p1, middlePoint, rotCenter,viewportEdgeIntersectCallback, &userData);
×
UNCOV
959
                                sPainter.drawSmallCircleArc(p2, middlePoint, rotCenter, viewportEdgeIntersectCallback, &userData);
×
960
                        }
961

UNCOV
962
                        if (showPartitions && (line_type==PRECESSIONCIRCLE_N))
×
963
                        {
964
                                const float lineThickness=sPainter.getLineWidth();
×
UNCOV
965
                                sPainter.setLineWidth(partThickness);
×
966

967
                                // Find current value of node rotation.
968
                                double epsilonA, chiA, omegaA, psiA;
UNCOV
969
                                getPrecessionAnglesVondrak(core->getJDE(), &epsilonA, &chiA, &omegaA, &psiA);
×
970
                                // psiA is the current angle, counted from J2000. Other century years have been precomputed in precessionPartitions.
971
                                // We cannot simply sum up the rotations, but must find the century locations one-by-one.
972

973
                                Vec3d part0; // current pole point on the northern precession circle.
×
974
                                StelUtils::spheToRect(0., M_PI/2.-core->getCurrentPlanet().data()->getRotObliquity(core->getJDE()), part0);
×
975
                                Vec3d partAxis(0,1,0);
×
976
                                Vec3d partZAxis = Vec3d(0,0,1); // rotation axis for the year partitions
×
977
                                Vec3d part100=part0;  part100.transfo4d(Mat4d::rotation(partAxis, 0.10*M_PI/180)); // part1 should point to 0.05deg south of "equator"
×
978
                                Vec3d part500=part0;  part500.transfo4d(Mat4d::rotation(partAxis, 0.25*M_PI/180));
×
979
                                Vec3d part1000=part0; part1000.transfo4d(Mat4d::rotation(partAxis, 0.45*M_PI/180));
×
UNCOV
980
                                Vec3d part1000l=part0; part1000l.transfo4d(Mat4d::rotation(partAxis, 0.475*M_PI/180)); // label
×
981

982
                                Vec3d pt0, ptTgt;
×
UNCOV
983
                                for (int y=-13000; y<13000; y+=100)
×
984
                                {
985
                                        const double tickAngle=M_PI_2+psiA-precessionPartitions.value(y, 0.);
×
986
                                        pt0=part0; pt0.transfo4d(Mat4d::rotation(partZAxis, tickAngle));
×
UNCOV
987
                                        if (y%1000 == 0)
×
988
                                        {
989
                                                ptTgt=part1000; ptTgt.transfo4d(Mat4d::rotation(partZAxis, tickAngle));
×
990
                                                if (viewPortSphericalCap.contains(pt0) || viewPortSphericalCap.contains(ptTgt))
×
991
                                                        sPainter.drawGreatCircleArc(pt0, ptTgt, nullptr, nullptr, nullptr);
×
UNCOV
992
                                                if (showLabel)
×
993
                                                {
994
                                                        Vec3d ptTgtL=part1000l; ptTgtL.transfo4d(Mat4d::rotation(partZAxis, tickAngle));
×
995
                                                        QString label(QString::number(y));
×
996
                                                        Vec3d screenPosTgt, screenPosTgtL;
×
997
                                                        prj->project(ptTgt, screenPosTgt);
×
998
                                                        prj->project(ptTgtL, screenPosTgtL);
×
999
                                                        double dx=screenPosTgtL[0]-screenPosTgt[0];
×
1000
                                                        double dy=screenPosTgtL[1]-screenPosTgt[1];
×
UNCOV
1001
                                                        float textAngle=static_cast<float>(atan2(dy,dx));
×
1002

1003
                                                        const float shiftx = 2.f;
×
1004
                                                        const float shifty = - static_cast<float>(sPainter.getFontMetrics().height()) / 4.f;
×
1005
                                                        sPainter.drawText(ptTgt, label, textAngle*M_180_PIf, shiftx, shifty, true);
×
UNCOV
1006
                                                }
×
1007
                                        }
1008
                                        else
1009
                                        {
1010
                                                ptTgt=(y%500 == 0 ? part500 : part100);
×
1011
                                                ptTgt.transfo4d(Mat4d::rotation(partZAxis, tickAngle));
×
1012
                                                if (viewPortSphericalCap.contains(pt0) || viewPortSphericalCap.contains(ptTgt))
×
UNCOV
1013
                                                        sPainter.drawGreatCircleArc(pt0, ptTgt, nullptr, nullptr, nullptr);
×
1014
                                        }
1015
                                }
1016

UNCOV
1017
                                sPainter.setLineWidth(lineThickness);
×
1018
                        }
UNCOV
1019
                        if (showPartitions && (line_type==PRECESSIONCIRCLE_S))
×
1020
                        {
1021
                                const float lineThickness=sPainter.getLineWidth();
×
UNCOV
1022
                                sPainter.setLineWidth(partThickness);
×
1023

1024
                                // Find current value of node rotation.
1025
                                double epsilonA, chiA, omegaA, psiA;
UNCOV
1026
                                getPrecessionAnglesVondrak(core->getJDE(), &epsilonA, &chiA, &omegaA, &psiA);
×
1027
                                // psiA is the current angle, counted from J2000. Other century years have been precomputed in precessionPartitions.
1028
                                // We cannot simply sum up the rotations, but must find the century locations one-by-one.
1029

1030
                                Vec3d part0; // current pole point on the northern precession circle.
×
1031
                                StelUtils::spheToRect(0., -M_PI/2.+core->getCurrentPlanet().data()->getRotObliquity(core->getJDE()), part0);
×
1032
                                Vec3d partAxis(0,1,0);
×
1033
                                Vec3d partZAxis = Vec3d(0,0,1); // rotation axis for the year partitions
×
1034
                                Vec3d part100=part0;  part100.transfo4d(Mat4d::rotation(partAxis, -0.10*M_PI/180)); // part1 should point to 0.05deg south of "equator"
×
1035
                                Vec3d part500=part0;  part500.transfo4d(Mat4d::rotation(partAxis, -0.25*M_PI/180));
×
1036
                                Vec3d part1000=part0; part1000.transfo4d(Mat4d::rotation(partAxis, -0.45*M_PI/180));
×
UNCOV
1037
                                Vec3d part1000l=part0; part1000.transfo4d(Mat4d::rotation(partAxis, -0.475*M_PI/180)); // label
×
1038

1039
                                Vec3d pt0, ptTgt;
×
UNCOV
1040
                                for (int y=-13000; y<13000; y+=100)
×
1041
                                {
1042
                                        const double tickAngle=-M_PI_2+psiA-precessionPartitions.value(y, 0.);
×
1043
                                        pt0=part0; pt0.transfo4d(Mat4d::rotation(partZAxis, tickAngle));
×
UNCOV
1044
                                        if (y%1000 == 0)
×
1045
                                        {
1046
                                                ptTgt=part1000; ptTgt.transfo4d(Mat4d::rotation(partZAxis, tickAngle));
×
1047
                                                if (viewPortSphericalCap.contains(pt0) || viewPortSphericalCap.contains(ptTgt))
×
1048
                                                        sPainter.drawGreatCircleArc(pt0, ptTgt, nullptr, nullptr, nullptr);
×
UNCOV
1049
                                                if (showLabel)
×
1050
                                                {
1051
                                                        Vec3d ptTgtL=part1000l; ptTgtL.transfo4d(Mat4d::rotation(partZAxis, tickAngle));
×
1052
                                                        QString label(QString::number(y));
×
1053
                                                        Vec3d screenPosTgt, screenPosTgtL;
×
1054
                                                        prj->project(ptTgt, screenPosTgt);
×
1055
                                                        prj->project(ptTgtL, screenPosTgtL);
×
1056
                                                        double dx=screenPosTgtL[0]-screenPosTgt[0];
×
1057
                                                        double dy=screenPosTgtL[1]-screenPosTgt[1];
×
UNCOV
1058
                                                        float textAngle=static_cast<float>(atan2(dy,dx));
×
1059

1060
                                                        const float shiftx = -5.f - static_cast<float>(sPainter.getFontMetrics().boundingRect(label).width());
×
1061
                                                        const float shifty = - static_cast<float>(sPainter.getFontMetrics().height()) / 4.f;
×
1062
                                                        sPainter.drawText(ptTgt, label, textAngle*M_180_PIf, shiftx, shifty, true);
×
UNCOV
1063
                                                }
×
1064
                                        }
1065
                                        else
1066
                                        {
1067
                                                ptTgt=(y%500 == 0 ? part500 : part100);
×
1068
                                                ptTgt.transfo4d(Mat4d::rotation(partZAxis, tickAngle));
×
1069
                                                if (viewPortSphericalCap.contains(pt0) || viewPortSphericalCap.contains(ptTgt))
×
UNCOV
1070
                                                        sPainter.drawGreatCircleArc(pt0, ptTgt, nullptr, nullptr, nullptr);
×
1071
                                        }
1072
                                }
1073

UNCOV
1074
                                sPainter.setLineWidth(lineThickness);
×
1075
                        }
1076
                }
×
1077
                sPainter.setLineWidth(oldLineWidth); // restore line thickness
×
1078
                sPainter.setLineSmooth(false);
×
UNCOV
1079
                sPainter.setBlending(false);
×
1080

UNCOV
1081
                return;
×
1082
        }
1083

1084
        // All the other "lines" are Great Circles
1085
        SphericalCap sphericalCap(Vec3d(0,0,1), 0);
×
UNCOV
1086
        Vec3d fpt(1,0,0); // First Point
×
1087

UNCOV
1088
        if ((line_type==MERIDIAN) || (line_type==COLURE_1))
×
1089
        {
UNCOV
1090
                sphericalCap.n.set(0,1,0);
×
1091
        }
UNCOV
1092
        else if ((line_type==PRIME_VERTICAL) || (line_type==COLURE_2))
×
1093
        {
1094
                sphericalCap.n.set(1,0,0);
×
UNCOV
1095
                fpt.set(0,0,1);
×
1096
        }
UNCOV
1097
        else if (line_type==CURRENT_VERTICAL)
×
1098
        {
1099
                Vec3d coordJ2000=sMvMgr->getViewDirectionJ2000();
×
1100
                Vec3d coordAltAz=core->j2000ToAltAz(coordJ2000, StelCore::RefractionAuto);
×
1101
                StelUtils::rectToSphe(&az, &alt, coordAltAz);
×
1102
                sphericalCap.n.set(sin(-az), cos(-az), 0.);
×
UNCOV
1103
                fpt.set(0,0,1);
×
1104
        }
UNCOV
1105
        else if (line_type==LONGITUDE)
×
1106
        {
1107
                Vec3d coord;                
×
UNCOV
1108
                const double eclJDE = earth->getRotObliquity(core->getJDE());
×
1109
                double ra_equ, dec_equ, lambdaJDE, betaJDE;
1110

1111
                StelUtils::rectToSphe(&ra_equ,&dec_equ, sun->getEquinoxEquatorialPos(core));
×
1112
                StelUtils::equToEcl(ra_equ, dec_equ, eclJDE, &lambdaJDE, &betaJDE);
×
UNCOV
1113
                if (lambdaJDE<0) lambdaJDE+=2.0*M_PI;
×
1114

1115
                StelUtils::spheToRect(lambdaJDE + M_PI_2, 0., coord);
×
1116
                sphericalCap.n=coord;
×
UNCOV
1117
                fpt.set(0,0,1);
×
1118
        }
UNCOV
1119
        else if (line_type==QUADRATURE)
×
1120
        {
1121
                Vec3d coord;
×
UNCOV
1122
                const double eclJDE = earth->getRotObliquity(core->getJDE());
×
1123
                double ra_equ, dec_equ, lambdaJDE, betaJDE;
1124

1125
                StelUtils::rectToSphe(&ra_equ,&dec_equ, sun->getEquinoxEquatorialPos(core));
×
1126
                StelUtils::equToEcl(ra_equ, dec_equ, eclJDE, &lambdaJDE, &betaJDE);
×
UNCOV
1127
                if (lambdaJDE<0) lambdaJDE+=2.0*M_PI;
×
1128

1129
                StelUtils::spheToRect(lambdaJDE + M_PI, 0., coord);
×
1130
                sphericalCap.n=coord;
×
UNCOV
1131
                fpt.set(0,0,1);
×
1132
        }
UNCOV
1133
        else if (line_type==INVARIABLEPLANE)
×
1134
        {
1135
                // RA, DEC of the Invariable Plane given in WGCCRE2015 report
1136
                static const Mat4d mat=Mat4d::zrotation(M_PI_180*(273.85+90.))*Mat4d::xrotation(M_PI_180*(90.-66.99));
×
1137
                static const Vec3d axis=mat*Vec3d(0, 0, 1);
×
1138
                static const Vec3d ivFpt=mat*Vec3d(1, 0, 0);
×
1139
                sphericalCap.n=axis;
×
UNCOV
1140
                fpt=ivFpt;
×
1141
        }
UNCOV
1142
        else if (line_type==SOLAR_EQUATOR)
×
1143
        {
1144
                // Split out the const part of rotation: rotate along ICRS equator to ascending node
UNCOV
1145
                static const Mat4d solarFrame = Mat4d::zrotation((286.13+90)*M_PI_180) * Mat4d::xrotation((90-63.87)*M_PI_180);
×
1146
                // Axis rotation. N.B. By this formulation, we ignore any light time correction.
UNCOV
1147
                Mat4d solarRot=solarFrame * Mat4d::zrotation((sun->getSiderealTime(core->getJD(), core->getJDE())*M_PI_180));
×
1148

1149
                sphericalCap.n=solarRot*sphericalCap.n;
×
UNCOV
1150
                fpt=solarRot*fpt;
×
1151
        }
1152

UNCOV
1153
        if (showPartitions && !(QList<SKY_LINE_TYPE>({INVARIABLEPLANE, EARTH_UMBRA, EARTH_PENUMBRA, QUADRATURE}).contains(line_type)))
×
1154
        {
1155
                const float lineThickness=sPainter.getLineWidth();
×
1156
                const float rotSign= (line_type==ECLIPTIC_WITH_DATE ? -1.f : 1.f);
×
UNCOV
1157
                sPainter.setLineWidth(partThickness);
×
1158

1159
                // Before drawing the lines themselves (and returning), draw the short partition lines
1160
                // Define short lines from "equator" a bit "southwards"
1161
                Vec3d part0 = fpt;
×
1162
                Vec3d partAxis(0,1,0);
×
1163
                Vec3d partZAxis = sphericalCap.n; // rotation axis for the 360 partitions
×
UNCOV
1164
                if ((line_type==MERIDIAN) || (line_type==COLURE_1))
×
1165
                {
UNCOV
1166
                        partAxis.set(0,0,1);
×
1167
                }
UNCOV
1168
                else if ((line_type==PRIME_VERTICAL) || (line_type==COLURE_2))
×
1169
                {
1170
                        part0.set(0,1,0);
×
UNCOV
1171
                        partAxis.set(0,0,1);
×
1172
                }
UNCOV
1173
                else if ((line_type==LONGITUDE) || (line_type==CURRENT_VERTICAL) || (line_type==SOLAR_EQUATOR))
×
1174
                {
UNCOV
1175
                        partAxis=sphericalCap.n ^ part0;
×
1176
                }
1177

1178
                Vec3d part1=part0;  part1.transfo4d(Mat4d::rotation(partAxis, rotSign*0.10*M_PI/180)); // part1 should point to 0.05deg south of "equator"
×
1179
                Vec3d part5=part0;  part5.transfo4d(Mat4d::rotation(partAxis, rotSign*0.25*M_PI/180));
×
1180
                Vec3d part10=part0; part10.transfo4d(Mat4d::rotation(partAxis, rotSign*0.45*M_PI/180));
×
1181
                Vec3d part30=part0; part30.transfo4d(Mat4d::rotation(partAxis, rotSign*0.75*M_PI/180));
×
1182
                Vec3d part30l=part0; part30l.transfo4d(Mat4d::rotation(partAxis, rotSign*0.775*M_PI/180));
×
UNCOV
1183
                const Mat4d& rotZ1 = Mat4d::rotation(partZAxis, 1.0*M_PI/180.);
×
1184
                // Limit altitude marks to the displayed range
1185
                int i_min= 0;
×
1186
                int i_max=(line_type==CURRENT_VERTICAL ? 181 : 360);
×
1187
                if ((line_type==CURRENT_VERTICAL) && (sMvMgr->getMountMode()==StelMovementMgr::MountAltAzimuthal) &&
×
UNCOV
1188
                    (core->getCurrentProjectionType()!=StelCore::ProjectionEqualArea) && (core->getCurrentProjectionType()!=StelCore::ProjectionStereographic) && (core->getCurrentProjectionType()!=StelCore::ProjectionFisheye))
×
1189
                {
1190
                        // Avoid marks creeping sideways
1191
                        if (alt<= 2*M_PI_180) i_min =static_cast<int>(-alt*M_180_PI)+2;
×
UNCOV
1192
                        if (alt>=-2*M_PI_180) i_max-=static_cast<int>( alt*M_180_PI)+2;
×
1193
                }
UNCOV
1194
                if (line_type==ECLIPTIC_WITH_DATE)
×
1195
                {
1196
                        // we must adapt (rotate) some labels to observers on the southern hemisphere.
1197
                        const bool southernHemi = core->getCurrentLocation().getLatitude() < 0.f;
×
1198
                        const float extraTextAngle = southernHemi ? M_PI_2f : -M_PI_2f;
×
1199
                        const float shifty = (southernHemi ? -1.f : 0.25) *  static_cast<float>(sPainter.getFontMetrics().height());
×
UNCOV
1200
                        const double currentFoV=core->getMovementMgr()->getCurrentFov();
×
1201

1202
                        // This special line type does not show the actual ecliptic line but only the partitions. These must be read from the precomputed static array eclipticOnDatePartitions
UNCOV
1203
                        for (const auto& v : eclipticOnDatePartitions)
×
1204
                        {
1205
                                double lng=v.first[0]; // ecl. longitude, radians
×
1206
                                const double nutation=v.first[1]; // nutation in longitude, radians
×
1207
                                const double aberration=v.first[2]; // aberration, radians
×
1208
                                if (core->getUseNutation())
×
1209
                                        lng+=nutation;
×
1210
                                if (core->getUseAberration())
×
1211
                                        lng+=aberration;
×
UNCOV
1212
                                const QString &label=v.second;
×
1213
                                // draw and labels: derive the irregular tick lengths from labeling
1214
                                Vec3d start=fpt;
×
1215
                                Vec3d end= label.isEmpty() ? part1 : part10;
×
1216
                                if (label.contains("5"))
×
1217
                                        end=part5;
×
UNCOV
1218
                                Vec3d end10=part10;
×
1219

1220
                                const Mat4d& rotDay = Mat4d::rotation(partZAxis, lng);
×
1221
                                start.transfo4d(rotDay);
×
1222
                                end.transfo4d(rotDay);
×
UNCOV
1223
                                end10.transfo4d(rotDay);
×
1224

UNCOV
1225
                                sPainter.drawGreatCircleArc(start, end, nullptr, nullptr, nullptr);
×
1226

UNCOV
1227
                                if (!label.isEmpty() && (
×
1228
                                        currentFoV<60. // all labels
1229
                                        || (currentFoV<=180. && !label.contains("5")) // 1.MM/10.MM/20.MM
×
UNCOV
1230
                                        || label.startsWith("1.") // in any case
×
1231
                                        ))
1232
                                {
1233
                                        Vec3d screenPosTgt, screenPosTgtL;
×
1234
                                        prj->project(start, screenPosTgt);
×
1235
                                        prj->project(end10, screenPosTgtL);
×
1236
                                        double dx=screenPosTgtL[0]-screenPosTgt[0];
×
1237
                                        double dy=screenPosTgtL[1]-screenPosTgt[1];
×
UNCOV
1238
                                        float textAngle=static_cast<float>(atan2(dy,dx))+extraTextAngle;
×
1239
                                        // Gravity labels look outright terrible here! Disable them.
1240
                                        float shiftx = - static_cast<float>(sPainter.getFontMetrics().boundingRect(label).width()) * 0.5f;
×
UNCOV
1241
                                        sPainter.drawText(end10, label, textAngle*M_180_PIf, shiftx, shifty, true);
×
1242
                                }
1243
                        }
1244
                }
UNCOV
1245
                else for (int i=0; i<i_max; ++i)
×
1246
                {
UNCOV
1247
                        if ((line_type==CURRENT_VERTICAL && i>=i_min) || (line_type!=CURRENT_VERTICAL))
×
1248
                        {
UNCOV
1249
                                if (i%30 == 0 && (viewPortSphericalCap.contains(part0) || viewPortSphericalCap.contains(part30)))
×
1250
                                {
UNCOV
1251
                                        sPainter.drawGreatCircleArc(part0, part30, nullptr, nullptr, nullptr);
×
1252

UNCOV
1253
                                        if (showLabel)
×
1254
                                        {
1255
                                                // we must adapt (rotate) some labels to observers on the southern hemisphere.
1256
                                                const bool southernHemi = core->getCurrentLocation().getLatitude() < 0.f;
×
1257
                                                int value=i;
×
UNCOV
1258
                                                float extraTextAngle=0.f;
×
1259
                                                // shiftx/y is OK for equator, horizon, ecliptic.
1260
                                                float shiftx = - static_cast<float>(sPainter.getFontMetrics().boundingRect(QString("%1°").arg(value)).width()) * 0.5f;
×
1261
                                                float shifty = - static_cast<float>(sPainter.getFontMetrics().height());
×
1262
                                                QString unit("°");
×
1263
                                                QString label;
×
UNCOV
1264
                                                switch (line_type)
×
1265
                                                {
UNCOV
1266
                                                        case EQUATOR_J2000:
×
1267
                                                        case EQUATOR_OF_DATE:
1268
                                                        case FIXED_EQUATOR:
1269
                                                                if (line_type==FIXED_EQUATOR) value=(360-i) % 360;
×
UNCOV
1270
                                                                if (!StelApp::getInstance().getFlagShowDecimalDegrees())
×
1271
                                                                {
1272
                                                                        value /= 15;
×
UNCOV
1273
                                                                        unit="h";
×
1274
                                                                }
1275
                                                                extraTextAngle = southernHemi ? -90.f : 90.f;
×
1276
                                                                if (southernHemi) shifty*=-0.25f;
×
1277
                                                                break;
×
1278
                                                        case HORIZON:
×
1279
                                                                value=(360-i+(StelApp::getInstance().getFlagSouthAzimuthUsage() ? 0 : 180)) % 360;
×
1280
                                                                extraTextAngle=90.f;
×
1281
                                                                break;
×
UNCOV
1282
                                                        case MERIDIAN:
×
1283
                                                        case COLURE_1: // Equinoctial Colure
1284
                                                                shifty = - static_cast<float>(sPainter.getFontMetrics().height()) * 0.25f;
×
UNCOV
1285
                                                                if (i<90) // South..Nadir | ARI0..CSP
×
1286
                                                                {
1287
                                                                        value=-i;
×
1288
                                                                        extraTextAngle = (line_type==COLURE_1 && southernHemi) ? 0.f : 180.f;
×
UNCOV
1289
                                                                        shiftx = (line_type==COLURE_1 && southernHemi) ? 3.f : - static_cast<float>(sPainter.getFontMetrics().boundingRect(QString("%1°").arg(value)).width()) - 3.f;
×
1290
                                                                }
UNCOV
1291
                                                                else if (i>270) // Zenith..South | CNP..ARI0
×
1292
                                                                {
1293
                                                                        value=360-i;
×
1294
                                                                        extraTextAngle = (line_type==COLURE_1 && southernHemi) ? 0.f : 180.f;
×
UNCOV
1295
                                                                        shiftx = (line_type==COLURE_1 && southernHemi) ? 3.f : - static_cast<float>(sPainter.getFontMetrics().boundingRect(QString("%1°").arg(value)).width()) - 3.f;
×
1296
                                                                }
1297
                                                                else // Nadir..North..Zenith | CSP..Equator:12h..CNP
1298
                                                                {
1299
                                                                        value=i-180;
×
1300
                                                                        extraTextAngle = (line_type==COLURE_1 && southernHemi) ? 180.f : 0.f;
×
UNCOV
1301
                                                                        shiftx = (line_type==COLURE_1 && southernHemi) ? - static_cast<float>(sPainter.getFontMetrics().boundingRect(QString("%1°").arg(value)).width()) - 3.f : 3.f;
×
1302
                                                                }
1303
                                                                break;
×
UNCOV
1304
                                                        case PRIME_VERTICAL:
×
1305
                                                        case COLURE_2: // Solstitial Colure
1306
                                                                shifty = - static_cast<float>(sPainter.getFontMetrics().height()) * 0.25f;
×
UNCOV
1307
                                                                if (i<90) // East..Zenith | Equator:6h..SummerSolstice..CNP
×
1308
                                                                {
1309
                                                                        value=i;
×
1310
                                                                        extraTextAngle = (line_type==COLURE_2 && southernHemi) ? 0.f : 180.f;
×
UNCOV
1311
                                                                        shiftx = (line_type==COLURE_2 && southernHemi) ? 3.f : - static_cast<float>(sPainter.getFontMetrics().boundingRect(QString("%1°").arg(value)).width()) - 3.f;
×
1312
                                                                }
UNCOV
1313
                                                                else if (i<270) // Zenith..West..Nadir | CNP..WinterSolstice..CSP
×
1314
                                                                {
1315
                                                                        value=180-i;
×
1316
                                                                        extraTextAngle = (line_type==COLURE_2 && southernHemi) ? 180.f : 0.f;
×
UNCOV
1317
                                                                        shiftx = (line_type==COLURE_2 && southernHemi) ? - static_cast<float>(sPainter.getFontMetrics().boundingRect(QString("%1°").arg(value)).width()) - 3.f : 3.f;
×
1318
                                                                }
1319
                                                                else // Nadir..East | CSP..Equator:6h
1320
                                                                {
1321
                                                                        value=i-360;
×
1322
                                                                        extraTextAngle = (line_type==COLURE_2 && southernHemi) ? 0.f : 180.f;
×
UNCOV
1323
                                                                        shiftx = (line_type==COLURE_2 && southernHemi) ? 3.f : - static_cast<float>(sPainter.getFontMetrics().boundingRect(QString("%1°").arg(value)).width()) - 3.f;
×
1324
                                                                }
1325
                                                                break;
×
1326
                                                        case CURRENT_VERTICAL:
×
1327
                                                                shifty = - static_cast<float>(sPainter.getFontMetrics().height()) * 0.25f;
×
1328
                                                                value=90-i;
×
1329
                                                                shiftx = 3.0f;
×
1330
                                                                break;
×
1331
                                                        case LONGITUDE:
×
1332
                                                                value=( i<180 ? 90-i : i-270 );
×
1333
                                                                shifty = - static_cast<float>(sPainter.getFontMetrics().height()) * 0.25f;
×
1334
                                                                shiftx = ((i<180) ^ southernHemi) ? 3.f : -static_cast<float>(sPainter.getFontMetrics().boundingRect(QString("%1°").arg(value)).width()) - 3.f;
×
1335
                                                                extraTextAngle = ((i<180) ^ southernHemi) ? 0.f : 180.f;
×
1336
                                                                break;
×
UNCOV
1337
                                                        case GALACTICEQUATOR:
×
1338
                                                        case SUPERGALACTICEQUATOR:
1339
                                                                extraTextAngle = 90.f;
×
1340
                                                                break;
×
1341
                                                        default:
×
1342
                                                                extraTextAngle = southernHemi ? -90.f : 90.f;
×
1343
                                                                if (southernHemi) shifty*=-0.25f;
×
UNCOV
1344
                                                                break;
×
1345
                                                }
1346
                                                label = QString("%1%2").arg(value).arg(unit);
×
1347
                                                Vec3d screenPosTgt, screenPosTgtL;
×
1348
                                                prj->project(part30, screenPosTgt);
×
1349
                                                prj->project(part30l, screenPosTgtL);
×
1350
                                                double dx=screenPosTgtL[0]-screenPosTgt[0];
×
1351
                                                double dy=screenPosTgtL[1]-screenPosTgt[1];
×
UNCOV
1352
                                                float textAngle=static_cast<float>(atan2(dy,dx));
×
1353
                                                // Gravity labels look outright terrible here! Disable them.
1354
                                                sPainter.drawText(part30l, label, textAngle*M_180_PIf + extraTextAngle, shiftx, shifty, true);
×
UNCOV
1355
                                        }
×
1356
                                }
1357

1358
                                else if (i%10 == 0 && (viewPortSphericalCap.contains(part0) || viewPortSphericalCap.contains(part10)))
×
1359
                                        sPainter.drawGreatCircleArc(part0, part10, nullptr, nullptr, nullptr);
×
1360
                                else if (i%5 == 0 && (viewPortSphericalCap.contains(part0) || viewPortSphericalCap.contains(part5)))
×
1361
                                        sPainter.drawGreatCircleArc(part0, part5, nullptr, nullptr, nullptr);
×
1362
                                else if( viewPortSphericalCap.contains(part0) || viewPortSphericalCap.contains(part1))
×
UNCOV
1363
                                        sPainter.drawGreatCircleArc(part0, part1, nullptr, nullptr, nullptr);
×
1364
                        }
1365
                        part0.transfo4d(rotZ1);
×
1366
                        part1.transfo4d(rotZ1);
×
1367
                        part5.transfo4d(rotZ1);
×
1368
                        part10.transfo4d(rotZ1);
×
1369
                        part30.transfo4d(rotZ1);
×
UNCOV
1370
                        part30l.transfo4d(rotZ1);
×
1371
                }
UNCOV
1372
                sPainter.setLineWidth(lineThickness);
×
1373
        }
1374

1375
        Vec3d p1, p2;
×
UNCOV
1376
        if (line_type==CURRENT_VERTICAL)
×
1377
        {
1378
                // The usual handling should always project this circle into a straight line. However, with some projections we see ugly artifacts. Better handle this line specially.
1379
                p1.set(0.,0.,1.);
×
1380
                p2.set(0.,0.,-1.);
×
1381
                Vec3d pHori;
×
1382
                StelUtils::spheToRect(az, 0., pHori);
×
UNCOV
1383
                if (sMvMgr->getMountMode()==StelMovementMgr::MountAltAzimuthal)
×
1384
                {
UNCOV
1385
                        switch (core->getCurrentProjectionType())
×
1386
                        {
1387
                                case StelCore::ProjectionOrthographic:
×
1388
                                        StelUtils::spheToRect(az, qMin(M_PI_2, alt+M_PI_2), p1);
×
1389
                                        StelUtils::spheToRect(az, qMax(-M_PI_2, alt-M_PI_2), p2);
×
1390
                                        break;
×
1391
                                case StelCore::ProjectionEqualArea:
×
1392
                                        if (alt*M_180_PI<-89.0) StelUtils::spheToRect(az,  89.5*M_PI_180, p1);
×
1393
                                        if (alt*M_180_PI> 89.0) StelUtils::spheToRect(az, -89.5*M_PI_180, p2);
×
1394
                                        break;
×
UNCOV
1395
                                case StelCore::ProjectionHammer:
×
1396
                                case StelCore::ProjectionSinusoidal:
1397
                                case StelCore::ProjectionMercator:
1398
                                case StelCore::ProjectionMiller:
1399
                                case StelCore::ProjectionCylinder:
1400
                                        StelUtils::spheToRect(az, qMin(M_PI_2, alt+M_PI_2)-0.05*M_PI_180, p1);
×
1401
                                        StelUtils::spheToRect(az, qMax(-M_PI_2, alt-M_PI_2)+0.05*M_PI_180, p2);
×
1402
                                        break;
×
1403
                                default:
×
UNCOV
1404
                                        break;
×
1405
                        }
1406
                }
1407
                // Now draw through a middle point.
1408
                sPainter.drawGreatCircleArc(p1, pHori, nullptr, viewportEdgeIntersectCallback, &userData);
×
UNCOV
1409
                sPainter.drawGreatCircleArc(p2, pHori, nullptr, viewportEdgeIntersectCallback, &userData);
×
1410
        }
UNCOV
1411
        else if (line_type!=ECLIPTIC_WITH_DATE) // Exclude the pseudo-line ecliptic with date marks: This has only partitions!
×
1412
        {
UNCOV
1413
                if (!SphericalCap::intersectionPoints(viewPortSphericalCap, sphericalCap, p1, p2))
×
1414
                {
1415
                        if ((viewPortSphericalCap.d< sphericalCap.d && viewPortSphericalCap.contains( sphericalCap.n))
×
UNCOV
1416
                         || (viewPortSphericalCap.d<-sphericalCap.d && viewPortSphericalCap.contains(-sphericalCap.n)))
×
1417
                        {
1418
                                // The meridian is fully included in the viewport, draw it in 3 sub-arcs to avoid length > 180.
1419
                                const Mat4d& rotLon120 = Mat4d::rotation(sphericalCap.n, 120.*M_PI_180);
×
1420
                                Vec3d rotFpt=fpt;
×
1421
                                rotFpt.transfo4d(rotLon120);
×
1422
                                Vec3d rotFpt2=rotFpt;
×
1423
                                rotFpt2.transfo4d(rotLon120);
×
1424
                                sPainter.drawGreatCircleArc(fpt, rotFpt, nullptr, viewportEdgeIntersectCallback, &userData);
×
1425
                                sPainter.drawGreatCircleArc(rotFpt, rotFpt2, nullptr, viewportEdgeIntersectCallback, &userData);
×
UNCOV
1426
                                sPainter.drawGreatCircleArc(rotFpt2, fpt, nullptr, viewportEdgeIntersectCallback, &userData);
×
1427
                        }
1428
                }
1429
                else
1430
                {
1431
                        Vec3d middlePoint = p1+p2;
×
1432
                        middlePoint.normalize();
×
1433
                        if (!viewPortSphericalCap.contains(middlePoint))
×
UNCOV
1434
                                middlePoint*=-1.;
×
1435

1436
                        // Draw the arc in 2 sub-arcs to avoid lengths > 180 deg
1437
                        sPainter.drawGreatCircleArc(p1, middlePoint, nullptr, viewportEdgeIntersectCallback, &userData);
×
UNCOV
1438
                        sPainter.drawGreatCircleArc(p2, middlePoint, nullptr, viewportEdgeIntersectCallback, &userData);
×
1439
                }
1440
        }
1441

1442
        sPainter.setLineWidth(oldLineWidth); // restore line thickness
×
1443
        sPainter.setLineSmooth(false);
×
1444
        sPainter.setBlending(false);
×
UNCOV
1445
}
×
1446

UNCOV
1447
SkyPoint::SkyPoint(SKY_POINT_TYPE _point_type) : point_type(_point_type), color(0.f, 0.f, 1.f)
×
1448
{
1449
        // Font size is 14
1450
        font.setPixelSize(StelApp::getInstance().getScreenFontSize()+1);
×
UNCOV
1451
        texCross = StelApp::getInstance().getTextureManager().createTexture(StelFileMgr::getInstallationDir()+"/textures/cross.png");
×
1452

1453
        earth = GETSTELMODULE(SolarSystem)->getEarth();
×
UNCOV
1454
        sun = GETSTELMODULE(SolarSystem)->getSun();
×
1455

1456
        updateLabel();
×
UNCOV
1457
}
×
1458

UNCOV
1459
SkyPoint::~SkyPoint()
×
1460
{
1461
        texCross.clear();
×
UNCOV
1462
}
×
1463

UNCOV
1464
void SkyPoint::setFontSize(int newFontSize)
×
1465
{
1466
        font.setPixelSize(newFontSize);
×
UNCOV
1467
}
×
1468

UNCOV
1469
void SkyPoint::updateLabel()
×
1470
{
UNCOV
1471
        switch (point_type)
×
1472
        {
UNCOV
1473
                case CELESTIALPOLES_J2000:
×
1474
                {
UNCOV
1475
                        frameType = StelCore::FrameJ2000;
×
1476
                        // TRANSLATORS: North Celestial Pole
UNCOV
1477
                        northernLabel = q_("NCP");
×
1478
                        // TRANSLATORS: South Celestial Pole
1479
                        southernLabel = q_("SCP");
×
UNCOV
1480
                        break;
×
1481
                }
UNCOV
1482
                case CELESTIALPOLES_OF_DATE:
×
1483
                {
UNCOV
1484
                        frameType = StelCore::FrameEquinoxEqu;
×
1485
                        // TRANSLATORS: North Celestial Pole
UNCOV
1486
                        northernLabel = q_("NCP");
×
1487
                        // TRANSLATORS: South Celestial Pole
1488
                        southernLabel = q_("SCP");
×
UNCOV
1489
                        break;
×
1490
                }
UNCOV
1491
                case ZENITH_NADIR:
×
1492
                {
UNCOV
1493
                        frameType = StelCore::FrameAltAz;
×
1494
                        // TRANSLATORS: Zenith
UNCOV
1495
                        northernLabel = qc_("Z", "zenith");
×
1496
                        // TRANSLATORS: Nadir
1497
                        southernLabel = qc_("Z'", "nadir");
×
UNCOV
1498
                        break;
×
1499
                }
UNCOV
1500
                case ECLIPTICPOLES_J2000:
×
1501
                {
UNCOV
1502
                        frameType = StelCore::FrameObservercentricEclipticJ2000;
×
1503
                        // TRANSLATORS: North Ecliptic Pole
UNCOV
1504
                        northernLabel = q_("NEP");
×
1505
                        // TRANSLATORS: South Ecliptic Pole
1506
                        southernLabel = q_("SEP");
×
UNCOV
1507
                        break;
×
1508
                }
UNCOV
1509
                case ECLIPTICPOLES_OF_DATE:
×
1510
                {
UNCOV
1511
                        frameType = StelCore::FrameObservercentricEclipticOfDate;
×
1512
                        // TRANSLATORS: North Ecliptic Pole
UNCOV
1513
                        northernLabel = q_("NEP");
×
1514
                        // TRANSLATORS: South Ecliptic Pole
1515
                        southernLabel = q_("SEP");
×
UNCOV
1516
                        break;
×
1517
                }
UNCOV
1518
                case GALACTICPOLES:
×
1519
                {
UNCOV
1520
                        frameType = StelCore::FrameGalactic;
×
1521
                        // TRANSLATORS: North Galactic Pole
UNCOV
1522
                        northernLabel = q_("NGP");
×
1523
                        // TRANSLATORS: South Galactic Pole
1524
                        southernLabel = q_("SGP");
×
UNCOV
1525
                        break;
×
1526
                }
UNCOV
1527
                case GALACTICCENTER:
×
1528
                {
UNCOV
1529
                        frameType = StelCore::FrameGalactic;
×
1530
                        // TRANSLATORS: Galactic Center point
UNCOV
1531
                        northernLabel = q_("GC");
×
1532
                        // TRANSLATORS: Galactic Anticenter point
1533
                        southernLabel = q_("GA");
×
UNCOV
1534
                        break;
×
1535
                }
UNCOV
1536
                case SUPERGALACTICPOLES:
×
1537
                {
UNCOV
1538
                        frameType = StelCore::FrameSupergalactic;
×
1539
                        // TRANSLATORS: North Supergalactic Pole
UNCOV
1540
                        northernLabel = q_("NSGP");
×
1541
                        // TRANSLATORS: South Supergalactic Pole
1542
                        southernLabel = q_("SSGP");
×
UNCOV
1543
                        break;
×
1544
                }
UNCOV
1545
                case EQUINOXES_J2000:
×
1546
                {
1547
                        frameType = StelCore::FrameJ2000;
×
1548
                        northernLabel = QChar(0x2648); // Vernal equinox
×
1549
                        southernLabel = QChar(0x264E); // Autumnal equinox
×
UNCOV
1550
                        break;
×
1551
                }
UNCOV
1552
                case EQUINOXES_OF_DATE:
×
1553
                {
1554
                        frameType = StelCore::FrameEquinoxEqu;
×
1555
                        northernLabel = QChar(0x2648); // Vernal equinox
×
1556
                        southernLabel = QChar(0x264E); // Autumnal equinox
×
UNCOV
1557
                        break;
×
1558
                }
UNCOV
1559
                case SOLSTICES_J2000:
×
1560
                {
1561
                        frameType = StelCore::FrameObservercentricEclipticJ2000;
×
1562
                        northernLabel = QChar(0x264B); // Summer solstice
×
1563
                        southernLabel = QChar(0x2651); // Winter solstice
×
UNCOV
1564
                        break;
×
1565
                }
UNCOV
1566
                case SOLSTICES_OF_DATE:
×
1567
                {
1568
                        frameType = StelCore::FrameObservercentricEclipticOfDate;
×
1569
                        northernLabel = QChar(0x264B); // Summer solstice
×
1570
                        southernLabel = QChar(0x2651); // Winter solstice
×
UNCOV
1571
                        break;
×
1572
                }
UNCOV
1573
                case ANTISOLAR:
×
1574
                {
UNCOV
1575
                        frameType = StelCore::FrameObservercentricEclipticJ2000;
×
1576
                        // TRANSLATORS: Antisolar Point
1577
                        northernLabel = q_("ASP");
×
UNCOV
1578
                        break;
×
1579
                }
UNCOV
1580
                case EARTH_UMBRA_CENTER:
×
1581
                {
UNCOV
1582
                        frameType = StelCore::FrameHeliocentricEclipticJ2000;
×
1583
                        // TRANSLATORS: Center of the umbra
1584
                        northernLabel = q_("C.U.");
×
UNCOV
1585
                        break;
×
1586
                }
UNCOV
1587
                case APEX:
×
1588
                {
UNCOV
1589
                        frameType = StelCore::FrameObservercentricEclipticJ2000;
×
1590
                        // TRANSLATORS: Apex Point, where the observer planet is heading to
UNCOV
1591
                        northernLabel = q_("Apex");
×
1592
                        // TRANSLATORS: Antapex Point, where the observer planet is receding from
UNCOV
1593
                        southernLabel = q_("Antapex");
×
1594
                        // add heliocentric speed
1595
                        StelCore *core=StelApp::getInstance().getCore();
×
1596
                        QSharedPointer<Planet> planet=core->getCurrentObserver()->getHomePlanet();
×
1597
                        Q_ASSERT(planet);
×
1598
                        const Vec3d dir=planet->getHeliocentricEclipticVelocity();
×
UNCOV
1599
                        const double speed=dir.norm()*(AU/86400.0);
×
1600
                        // In some cases we don't have a valid speed vector
UNCOV
1601
                        if (speed>0.)
×
1602
                        {
1603
                                const QString kms = qc_("km/s", "speed");
×
1604
                                QString speedStr = QString(" (%1 %2)").arg(QString::number(speed, 'f', 2), kms);
×
1605
                                northernLabel += speedStr;
×
1606
                                speedStr = QString(" (-%1 %2)").arg(QString::number(speed, 'f', 2), kms);
×
1607
                                southernLabel += speedStr;
×
1608
                        }
×
1609
                        break;
×
1610
                }                
×
1611
                default:
×
UNCOV
1612
                        Q_ASSERT(0);
×
1613
        }
UNCOV
1614
}
×
1615

UNCOV
1616
void SkyPoint::draw(StelCore *core) const
×
1617
{
1618
        if (!fader.getInterstate())
×
UNCOV
1619
                return;
×
1620

UNCOV
1621
        StelProjectorP prj = core->getProjection(frameType, frameType!=StelCore::FrameAltAz ? StelCore::RefractionAuto : StelCore::RefractionOff);
×
1622

1623
        // Initialize a painter and set openGL state
1624
        StelPainter sPainter(prj);
×
1625
        sPainter.setColor(color, fader.getInterstate());
×
UNCOV
1626
        Vec4f textColor(color, fader.getInterstate());
×
1627

UNCOV
1628
        sPainter.setFont(font);
×
1629
        /////////////////////////////////////////////////
1630
        // Draw the point
1631

1632
        texCross->bind();
×
1633
        const float size = 0.00001f*M_PI_180f*sPainter.getProjector()->getPixelPerRadAtCenter();
×
UNCOV
1634
        const float shift = 4.f + size/1.8f;
×
1635

UNCOV
1636
        sPainter.setBlending(true, GL_ONE, GL_ONE);
×
1637

UNCOV
1638
        switch (point_type)
×
1639
        {
UNCOV
1640
                case CELESTIALPOLES_J2000:
×
1641
                case CELESTIALPOLES_OF_DATE:
1642
                case ZENITH_NADIR:
1643
                case ECLIPTICPOLES_J2000:
1644
                case ECLIPTICPOLES_OF_DATE:
1645
                case GALACTICPOLES:                
1646
                case SUPERGALACTICPOLES:
1647
                {
1648
                        // North Pole
1649
                        sPainter.drawSprite2dMode(Vec3d(0,0,1), 5.f);
×
UNCOV
1650
                        sPainter.drawText(Vec3d(0,0,1), northernLabel, 0, shift, shift, false);
×
1651

1652
                        // South Pole
1653
                        sPainter.drawSprite2dMode(Vec3d(0,0,-1), 5.f);
×
1654
                        sPainter.drawText(Vec3d(0,0,-1), southernLabel, 0, shift, shift, false);
×
UNCOV
1655
                        break;
×
1656
                }
UNCOV
1657
                case EQUINOXES_J2000:
×
1658
                case EQUINOXES_OF_DATE:
1659
                {
1660
                        // Vernal equinox
1661
                        sPainter.drawSprite2dMode(Vec3d(1,0,0), 5.f);
×
UNCOV
1662
                        sPainter.drawText(Vec3d(1,0,0), northernLabel, 0, shift, shift, false);
×
1663

1664
                        // Autumnal equinox
1665
                        sPainter.drawSprite2dMode(Vec3d(-1,0,0), 5.f);
×
1666
                        sPainter.drawText(Vec3d(-1,0,0), southernLabel, 0, shift, shift, false);
×
UNCOV
1667
                        break;
×
1668
                }
UNCOV
1669
                case SOLSTICES_J2000:
×
1670
                case SOLSTICES_OF_DATE:
1671
                {
1672
                        // Summer solstice
1673
                        sPainter.drawSprite2dMode(Vec3d(0,1,0), 5.f);
×
UNCOV
1674
                        sPainter.drawText(Vec3d(0,1,0), northernLabel, 0, shift, shift, false);
×
1675

1676
                        // Winter solstice
1677
                        sPainter.drawSprite2dMode(Vec3d(0,-1,0), 5.f);
×
1678
                        sPainter.drawText(Vec3d(0,-1,0), southernLabel, 0, shift, shift, false);
×
UNCOV
1679
                        break;
×
1680
                }
UNCOV
1681
                case GALACTICCENTER:
×
1682
                {
1683
                        // Galactic Center point
1684
                        sPainter.drawSprite2dMode(Vec3d(1,0,0), 5.f);
×
UNCOV
1685
                        sPainter.drawText(Vec3d(1,0,0), northernLabel, 0, shift, shift, false);
×
1686

1687
                        // Galactic Anticenter point
1688
                        sPainter.drawSprite2dMode(Vec3d(-1,0,0), 5.f);
×
1689
                        sPainter.drawText(Vec3d(-1,0,0), southernLabel, 0, shift, shift, false);
×
UNCOV
1690
                        break;
×
1691
                }
UNCOV
1692
                case ANTISOLAR:
×
1693
                {
1694
                        // Antisolar Point
1695
                        Vec3d coord=core->getCurrentObserver()->getHomePlanet()->getHeliocentricEclipticPos();
×
1696
                        sPainter.drawSprite2dMode(coord, 5.f);
×
1697
                        sPainter.drawText(coord, northernLabel, 0, shift, shift, false);
×
UNCOV
1698
                        break;
×
1699
                }
UNCOV
1700
                case EARTH_UMBRA_CENTER:
×
1701
                {
1702
                        // We compute the shadow center attached to the geocenter, but must point it in the opposite direction of the sun's aberrated position.
1703
                        static PlanetP moon=GETSTELMODULE(SolarSystem)->getMoon();
×
1704
                        const Vec3d pos=earth->getEclipticPos();
×
UNCOV
1705
                        const Vec3d dir= - sun->getAberrationPush() + pos;
×
1706
                        double lambda, beta;
1707
                        StelUtils::rectToSphe(&lambda, &beta, dir);
×
1708
                        const double dist=moon->getEclipticPos().norm();
×
UNCOV
1709
                        const Mat4d rot=Mat4d::zrotation(lambda)*Mat4d::yrotation(-beta);
×
1710

1711
                        Vec3d point(dist, 0.0, 0.0);
×
1712
                        rot.transfo(point);
×
1713
                        Vec3d coord = pos+point;
×
1714
                        sPainter.drawSprite2dMode(coord, 5.f);
×
1715
                        sPainter.drawText(coord, northernLabel, 0, shift, shift, false);
×
UNCOV
1716
                        break;
×
1717
                }
UNCOV
1718
                case APEX:
×
1719
                {
1720
                        // Observer planet apex (heading point)
1721
                        QSharedPointer<Planet> planet=core->getCurrentObserver()->getHomePlanet();
×
1722
                        Q_ASSERT(planet);
×
UNCOV
1723
                        const Vec3d dir=planet->getHeliocentricEclipticVelocity();
×
1724
                        // In some cases we don't have a valid speed vector
UNCOV
1725
                        if (dir.normSquared()>0.)
×
1726
                        {
1727
                                sPainter.drawSprite2dMode(dir, 5.f);
×
1728
                                sPainter.drawText(dir, northernLabel, 0, shift, shift, false);
×
1729
                                sPainter.drawSprite2dMode(-dir, 5.f);
×
UNCOV
1730
                                sPainter.drawText(-dir, southernLabel, 0, shift, shift, false);
×
1731
                        }
1732
                        break;
×
1733
                }                
×
1734
                default:
×
UNCOV
1735
                        Q_ASSERT(0);
×
1736
        }
UNCOV
1737
}
×
1738

1739

1740
GridLinesMgr::GridLinesMgr()
×
UNCOV
1741
        : gridlinesDisplayed(true)
×
1742
{
1743
        setObjectName("GridLinesMgr");
×
UNCOV
1744
        SkyLine::init();
×
1745

1746
        equGrid = new SkyGrid(StelCore::FrameEquinoxEqu);
×
1747
        fixedEquatorialGrid = new SkyGrid(StelCore::FrameFixedEquatorial);
×
1748
        equJ2000Grid = new SkyGrid(StelCore::FrameJ2000);
×
1749
        eclJ2000Grid = new SkyGrid(StelCore::FrameObservercentricEclipticJ2000);
×
1750
        eclGrid = new SkyGrid(StelCore::FrameObservercentricEclipticOfDate);
×
1751
        galacticGrid = new SkyGrid(StelCore::FrameGalactic);
×
1752
        supergalacticGrid = new SkyGrid(StelCore::FrameSupergalactic);
×
1753
        aziGrid = new SkyGrid(StelCore::FrameAltAz);
×
1754
        equatorLine = new SkyLine(SkyLine::EQUATOR_OF_DATE);
×
1755
        equatorJ2000Line = new SkyLine(SkyLine::EQUATOR_J2000);
×
1756
        fixedEquatorLine = new SkyLine(SkyLine::FIXED_EQUATOR);
×
1757
        eclipticJ2000Line = new SkyLine(SkyLine::ECLIPTIC_J2000);
×
1758
        eclipticLine = new SkyLine(SkyLine::ECLIPTIC_OF_DATE);
×
1759
        eclipticWithDateLine = new SkyLine(SkyLine::ECLIPTIC_WITH_DATE);
×
1760
        invariablePlaneLine = new SkyLine(SkyLine::INVARIABLEPLANE);
×
1761
        solarEquatorLine = new SkyLine(SkyLine::SOLAR_EQUATOR);
×
1762
        precessionCircleN = new SkyLine(SkyLine::PRECESSIONCIRCLE_N);
×
1763
        precessionCircleS = new SkyLine(SkyLine::PRECESSIONCIRCLE_S);
×
1764
        meridianLine = new SkyLine(SkyLine::MERIDIAN);
×
1765
        horizonLine = new SkyLine(SkyLine::HORIZON);
×
1766
        galacticEquatorLine = new SkyLine(SkyLine::GALACTICEQUATOR);
×
1767
        supergalacticEquatorLine = new SkyLine(SkyLine::SUPERGALACTICEQUATOR);
×
1768
        longitudeLine = new SkyLine(SkyLine::LONGITUDE);
×
1769
        quadratureLine = new SkyLine(SkyLine::QUADRATURE);
×
1770
        primeVerticalLine = new SkyLine(SkyLine::PRIME_VERTICAL);
×
1771
        currentVerticalLine = new SkyLine(SkyLine::CURRENT_VERTICAL);
×
1772
        colureLine_1 = new SkyLine(SkyLine::COLURE_1);
×
1773
        colureLine_2 = new SkyLine(SkyLine::COLURE_2);
×
1774
        circumpolarCircleN = new SkyLine(SkyLine::CIRCUMPOLARCIRCLE_N);
×
1775
        circumpolarCircleS = new SkyLine(SkyLine::CIRCUMPOLARCIRCLE_S);
×
1776
        umbraCircle = new SkyLine(SkyLine::EARTH_UMBRA);
×
1777
        penumbraCircle = new SkyLine(SkyLine::EARTH_PENUMBRA);
×
1778
        celestialJ2000Poles = new SkyPoint(SkyPoint::CELESTIALPOLES_J2000);
×
1779
        celestialPoles = new SkyPoint(SkyPoint::CELESTIALPOLES_OF_DATE);
×
1780
        zenithNadir = new SkyPoint(SkyPoint::ZENITH_NADIR);
×
1781
        eclipticJ2000Poles = new SkyPoint(SkyPoint::ECLIPTICPOLES_J2000);
×
1782
        eclipticPoles = new SkyPoint(SkyPoint::ECLIPTICPOLES_OF_DATE);
×
1783
        galacticPoles = new SkyPoint(SkyPoint::GALACTICPOLES);
×
1784
        galacticCenter = new SkyPoint(SkyPoint::GALACTICCENTER);
×
1785
        supergalacticPoles = new SkyPoint(SkyPoint::SUPERGALACTICPOLES);
×
1786
        equinoxJ2000Points = new SkyPoint(SkyPoint::EQUINOXES_J2000);
×
1787
        equinoxPoints = new SkyPoint(SkyPoint::EQUINOXES_OF_DATE);
×
1788
        solsticeJ2000Points = new SkyPoint(SkyPoint::SOLSTICES_J2000);
×
1789
        solsticePoints = new SkyPoint(SkyPoint::SOLSTICES_OF_DATE);
×
1790
        antisolarPoint = new SkyPoint(SkyPoint::ANTISOLAR);
×
1791
        umbraCenterPoint = new SkyPoint(SkyPoint::EARTH_UMBRA_CENTER);
×
UNCOV
1792
        apexPoints = new SkyPoint(SkyPoint::APEX);        
×
1793

1794
        earth = GETSTELMODULE(SolarSystem)->getEarth();
×
UNCOV
1795
        connect(GETSTELMODULE(SolarSystem), SIGNAL(solarSystemDataReloaded()), this, SLOT(connectSolarSystem()));
×
1796

1797
        // Whenever year changes we must recompute the labels for the ecliptic when dates are shown.
UNCOV
1798
        connect(StelApp::getInstance().getCore(), &StelCore::dateChangedByYear, this, [=](const int year){ SkyLine::computeEclipticDatePartitions(year);});
×
1799
        // Likewise, recreate when switching them on...
UNCOV
1800
        connect(this, &GridLinesMgr::eclipticDatesLabeledChanged, this, [=](const bool displayed){ if (displayed) SkyLine::computeEclipticDatePartitions();});
×
1801
        // ... or as timezone changes
1802
        connect(StelApp::getInstance().getCore(), &StelCore::currentTimeZoneChanged, this, [=](const QString&){ SkyLine::computeEclipticDatePartitions();});
×
UNCOV
1803
}
×
1804

UNCOV
1805
GridLinesMgr::~GridLinesMgr()
×
1806
{
1807
        delete equGrid;
×
1808
        delete fixedEquatorialGrid;
×
1809
        delete equJ2000Grid;
×
1810
        delete eclJ2000Grid;
×
1811
        delete eclGrid;
×
1812
        delete galacticGrid;
×
1813
        delete supergalacticGrid;
×
1814
        delete aziGrid;
×
1815
        delete equatorLine;
×
1816
        delete equatorJ2000Line;
×
1817
        delete fixedEquatorLine;
×
1818
        delete eclipticLine;
×
1819
        delete eclipticWithDateLine;
×
1820
        delete eclipticJ2000Line;
×
1821
        delete invariablePlaneLine;
×
1822
        delete solarEquatorLine;
×
1823
        delete precessionCircleN;
×
1824
        delete precessionCircleS;
×
1825
        delete meridianLine;
×
1826
        delete horizonLine;
×
1827
        delete galacticEquatorLine;
×
1828
        delete supergalacticEquatorLine;
×
1829
        delete longitudeLine;
×
1830
        delete quadratureLine;
×
1831
        delete primeVerticalLine;
×
1832
        delete currentVerticalLine;
×
1833
        delete colureLine_1;
×
1834
        delete colureLine_2;
×
1835
        delete circumpolarCircleN;
×
1836
        delete circumpolarCircleS;
×
1837
        delete umbraCircle;
×
1838
        delete penumbraCircle;
×
1839
        delete celestialJ2000Poles;
×
1840
        delete celestialPoles;
×
1841
        delete zenithNadir;
×
1842
        delete eclipticJ2000Poles;
×
1843
        delete eclipticPoles;
×
1844
        delete galacticPoles;
×
1845
        delete galacticCenter;
×
1846
        delete supergalacticPoles;
×
1847
        delete equinoxJ2000Points;
×
1848
        delete equinoxPoints;
×
1849
        delete solsticeJ2000Points;
×
1850
        delete solsticePoints;
×
1851
        delete antisolarPoint;
×
1852
        delete umbraCenterPoint;
×
1853
        delete apexPoints;        
×
1854
        SkyLine::deinit();
×
UNCOV
1855
}
×
1856

1857
/*************************************************************************
1858
 Reimplementation of the getCallOrder method
1859
*************************************************************************/
UNCOV
1860
double GridLinesMgr::getCallOrder(StelModuleActionName actionName) const
×
1861
{
1862
        if (actionName==StelModule::ActionDraw)
×
1863
                return StelApp::getInstance().getModuleMgr().getModule("NebulaMgr")->getCallOrder(actionName)+10.;
×
UNCOV
1864
        return 0.;
×
1865
}
1866

UNCOV
1867
void GridLinesMgr::init()
×
1868
{
1869
        QSettings* conf = StelApp::getInstance().getSettings();
×
UNCOV
1870
        Q_ASSERT(conf);
×
1871

1872
        // Upgrade config keys
UNCOV
1873
        if (conf->contains("color/longitude_color"))
×
1874
        {
1875
                conf->setValue("color/oc_longitude_color", conf->value("color/longitude_color", "0.2,0.4,0.4").toString());
×
UNCOV
1876
                conf->remove("color/longitude_color");
×
1877
        }
1878

1879
        setFlagGridlines(conf->value("viewing/flag_gridlines", true).toBool());
×
1880
        setFlagAzimuthalGrid(conf->value("viewing/flag_azimuthal_grid").toBool());
×
1881
        setFlagEquatorGrid(conf->value("viewing/flag_equatorial_grid").toBool());
×
1882
        setFlagFixedEquatorGrid(conf->value("viewing/flag_fixed_equatorial_grid").toBool());
×
1883
        setFlagEquatorJ2000Grid(conf->value("viewing/flag_equatorial_J2000_grid").toBool());
×
1884
        setFlagEclipticJ2000Grid(conf->value("viewing/flag_ecliptic_J2000_grid").toBool());
×
1885
        setFlagEclipticGrid(conf->value("viewing/flag_ecliptic_grid").toBool());
×
1886
        setFlagGalacticGrid(conf->value("viewing/flag_galactic_grid").toBool());
×
1887
        setFlagSupergalacticGrid(conf->value("viewing/flag_supergalactic_grid").toBool());
×
1888
        setFlagEquatorLine(conf->value("viewing/flag_equator_line").toBool());
×
1889
        setFlagEquatorParts(conf->value("viewing/flag_equator_parts").toBool());
×
1890
        setFlagEquatorLabeled(conf->value("viewing/flag_equator_labels").toBool());
×
1891
        setFlagEquatorJ2000Line(conf->value("viewing/flag_equator_J2000_line").toBool());
×
1892
        setFlagEquatorJ2000Parts(conf->value("viewing/flag_equator_J2000_parts").toBool());
×
1893
        setFlagEquatorJ2000Labeled(conf->value("viewing/flag_equator_J2000_labels").toBool());
×
1894
        setFlagFixedEquatorLine(conf->value("viewing/flag_fixed_equator_line").toBool());
×
1895
        setFlagFixedEquatorParts(conf->value("viewing/flag_fixed_equator_parts").toBool());
×
1896
        setFlagFixedEquatorLabeled(conf->value("viewing/flag_fixed_equator_labels").toBool());
×
1897
        setFlagEclipticLine(conf->value("viewing/flag_ecliptic_line").toBool());
×
1898
        setFlagEclipticParts(conf->value("viewing/flag_ecliptic_parts").toBool());
×
1899
        setFlagEclipticLabeled(conf->value("viewing/flag_ecliptic_labels").toBool());
×
1900
        setFlagEclipticDatesLabeled(conf->value("viewing/flag_ecliptic_dates_labels", true).toBool());
×
1901
        setFlagEclipticJ2000Line(conf->value("viewing/flag_ecliptic_J2000_line").toBool());
×
1902
        setFlagEclipticJ2000Parts(conf->value("viewing/flag_ecliptic_J2000_parts").toBool());
×
1903
        setFlagEclipticJ2000Labeled(conf->value("viewing/flag_ecliptic_J2000_labels").toBool());        
×
1904
        setFlagInvariablePlaneLine(conf->value("viewing/flag_invariable_plane_line").toBool());
×
1905
        setFlagSolarEquatorLine(conf->value("viewing/flag_solar_equator_line").toBool());
×
1906
        setFlagSolarEquatorParts(conf->value("viewing/flag_solar_equator_parts").toBool());
×
1907
        setFlagSolarEquatorLabeled(conf->value("viewing/flag_solar_equator_labels").toBool());
×
1908
        setFlagPrecessionCircles(conf->value("viewing/flag_precession_circles").toBool());
×
1909
        setFlagPrecessionParts(conf->value("viewing/flag_precession_parts").toBool());
×
1910
        setFlagPrecessionLabeled(conf->value("viewing/flag_precession_labels").toBool());
×
1911
        setFlagMeridianLine(conf->value("viewing/flag_meridian_line").toBool());
×
1912
        setFlagMeridianParts(conf->value("viewing/flag_meridian_parts").toBool());
×
1913
        setFlagMeridianLabeled(conf->value("viewing/flag_meridian_labels").toBool());
×
1914
        setFlagHorizonLine(conf->value("viewing/flag_horizon_line").toBool());
×
1915
        setFlagHorizonParts(conf->value("viewing/flag_horizon_parts").toBool());
×
1916
        setFlagHorizonLabeled(conf->value("viewing/flag_horizon_labels").toBool());
×
1917
        setFlagGalacticEquatorLine(conf->value("viewing/flag_galactic_equator_line").toBool());
×
1918
        setFlagGalacticEquatorParts(conf->value("viewing/flag_galactic_equator_parts").toBool());
×
1919
        setFlagGalacticEquatorLabeled(conf->value("viewing/flag_galactic_equator_labels").toBool());
×
1920
        setFlagSupergalacticEquatorLine(conf->value("viewing/flag_supergalactic_equator_line").toBool());
×
1921
        setFlagSupergalacticEquatorParts(conf->value("viewing/flag_supergalactic_equator_parts").toBool());
×
1922
        setFlagSupergalacticEquatorLabeled(conf->value("viewing/flag_supergalactic_equator_labels").toBool());
×
1923
        setFlagLongitudeLine(conf->value("viewing/flag_longitude_line").toBool());
×
1924
        setFlagLongitudeParts(conf->value("viewing/flag_longitude_parts").toBool());
×
1925
        setFlagLongitudeLabeled(conf->value("viewing/flag_longitude_labels").toBool());
×
1926
        setFlagQuadratureLine(conf->value("viewing/flag_quadrature_line").toBool());
×
1927
        setFlagPrimeVerticalLine(conf->value("viewing/flag_prime_vertical_line").toBool());
×
1928
        setFlagPrimeVerticalParts(conf->value("viewing/flag_prime_vertical_parts").toBool());
×
1929
        setFlagPrimeVerticalLabeled(conf->value("viewing/flag_prime_vertical_labels").toBool());
×
1930
        setFlagCurrentVerticalLine(conf->value("viewing/flag_current_vertical_line").toBool());
×
1931
        setFlagCurrentVerticalParts(conf->value("viewing/flag_current_vertical_parts").toBool());
×
1932
        setFlagCurrentVerticalLabeled(conf->value("viewing/flag_current_vertical_labels").toBool());
×
1933
        setFlagColureLines(conf->value("viewing/flag_colure_lines").toBool());
×
1934
        setFlagColureParts(conf->value("viewing/flag_colure_parts").toBool());
×
1935
        setFlagColureLabeled(conf->value("viewing/flag_colure_labels").toBool());
×
1936
        setFlagCircumpolarCircles(conf->value("viewing/flag_circumpolar_circles").toBool());
×
1937
        setFlagUmbraCircle(conf->value("viewing/flag_umbra_circle").toBool());
×
1938
        setFlagPenumbraCircle(conf->value("viewing/flag_penumbra_circle").toBool());
×
1939
        setFlagCelestialJ2000Poles(conf->value("viewing/flag_celestial_J2000_poles").toBool());
×
1940
        setFlagCelestialPoles(conf->value("viewing/flag_celestial_poles").toBool());
×
1941
        setFlagZenithNadir(conf->value("viewing/flag_zenith_nadir").toBool());
×
1942
        setFlagEclipticJ2000Poles(conf->value("viewing/flag_ecliptic_J2000_poles").toBool());
×
1943
        setFlagEclipticPoles(conf->value("viewing/flag_ecliptic_poles").toBool());
×
1944
        setFlagGalacticPoles(conf->value("viewing/flag_galactic_poles").toBool());
×
1945
        setFlagGalacticCenter(conf->value("viewing/flag_galactic_center").toBool());
×
1946
        setFlagSupergalacticPoles(conf->value("viewing/flag_supergalactic_poles").toBool());
×
1947
        setFlagEquinoxJ2000Points(conf->value("viewing/flag_equinox_J2000_points").toBool());
×
1948
        setFlagEquinoxPoints(conf->value("viewing/flag_equinox_points").toBool());
×
1949
        setFlagSolsticeJ2000Points(conf->value("viewing/flag_solstice_J2000_points").toBool());
×
1950
        setFlagSolsticePoints(conf->value("viewing/flag_solstice_points").toBool());
×
1951
        setFlagAntisolarPoint(conf->value("viewing/flag_antisolar_point").toBool());
×
1952
        setFlagUmbraCenterPoint(conf->value("viewing/flag_umbra_center_point").toBool());
×
UNCOV
1953
        setFlagApexPoints(conf->value("viewing/flag_apex_points").toBool());
×
1954

1955
        // Set the line thickness for grids and lines
1956
        setLineThickness(conf->value("viewing/line_thickness", 1.f).toFloat());
×
UNCOV
1957
        setPartThickness(conf->value("viewing/part_thickness", 1.f).toFloat());
×
1958

1959
        // Load colors from config file
1960
        QString defaultColor = conf->value("color/default_color", "0.5,0.5,0.7").toString();
×
1961
        setColorEquatorGrid(             Vec3f(conf->value("color/equatorial_color", defaultColor).toString()));
×
1962
        setColorFixedEquatorGrid(        Vec3f(conf->value("color/fixed_equatorial_color", defaultColor).toString()));
×
1963
        setColorEquatorJ2000Grid(        Vec3f(conf->value("color/equatorial_J2000_color", defaultColor).toString()));
×
1964
        setColorEclipticJ2000Grid(       Vec3f(conf->value("color/ecliptical_J2000_color", defaultColor).toString()));
×
1965
        setColorEclipticGrid(            Vec3f(conf->value("color/ecliptical_color", defaultColor).toString()));
×
1966
        setColorGalacticGrid(            Vec3f(conf->value("color/galactic_color", defaultColor).toString()));
×
1967
        setColorSupergalacticGrid(       Vec3f(conf->value("color/supergalactic_color", defaultColor).toString()));
×
1968
        setColorAzimuthalGrid(           Vec3f(conf->value("color/azimuthal_color", defaultColor).toString()));
×
1969
        setColorEquatorLine(             Vec3f(conf->value("color/equator_color", defaultColor).toString()));
×
1970
        setColorEquatorJ2000Line(        Vec3f(conf->value("color/equator_J2000_color", defaultColor).toString()));
×
1971
        setColorFixedEquatorLine(        Vec3f(conf->value("color/fixed_equator_color", defaultColor).toString()));
×
1972
        setColorEclipticLine(            Vec3f(conf->value("color/ecliptic_color", defaultColor).toString()));
×
1973
        setColorEclipticJ2000Line(       Vec3f(conf->value("color/ecliptic_J2000_color", defaultColor).toString()));
×
1974
        setColorInvariablePlaneLine(     Vec3f(conf->value("color/invariable_plane_color", defaultColor).toString()));
×
1975
        setColorSolarEquatorLine(        Vec3f(conf->value("color/solar_equator_color", defaultColor).toString()));
×
1976
        setColorPrecessionCircles(       Vec3f(conf->value("color/precession_circles_color", defaultColor).toString()));
×
1977
        setColorMeridianLine(            Vec3f(conf->value("color/meridian_color", defaultColor).toString()));
×
1978
        setColorHorizonLine(             Vec3f(conf->value("color/horizon_color", defaultColor).toString()));
×
1979
        setColorGalacticEquatorLine(     Vec3f(conf->value("color/galactic_equator_color", defaultColor).toString()));
×
1980
        setColorSupergalacticEquatorLine(Vec3f(conf->value("color/supergalactic_equator_color", defaultColor).toString()));
×
1981
        setColorLongitudeLine(                 Vec3f(conf->value("color/oc_longitude_color", defaultColor).toString()));
×
1982
        setColorQuadratureLine(                 Vec3f(conf->value("color/quadrature_color", defaultColor).toString()));
×
1983
        setColorPrimeVerticalLine(       Vec3f(conf->value("color/prime_vertical_color", defaultColor).toString()));
×
1984
        setColorCurrentVerticalLine(     Vec3f(conf->value("color/current_vertical_color", defaultColor).toString()));
×
1985
        setColorColureLines(             Vec3f(conf->value("color/colures_color", defaultColor).toString()));
×
1986
        setColorCircumpolarCircles(      Vec3f(conf->value("color/circumpolar_circles_color", defaultColor).toString()));
×
1987
        setColorUmbraCircle(                 Vec3f(conf->value("color/umbra_circle_color", defaultColor).toString()));
×
1988
        setColorPenumbraCircle(                 Vec3f(conf->value("color/penumbra_circle_color", defaultColor).toString()));
×
1989
        setColorCelestialJ2000Poles(     Vec3f(conf->value("color/celestial_J2000_poles_color", defaultColor).toString()));
×
1990
        setColorCelestialPoles(          Vec3f(conf->value("color/celestial_poles_color", defaultColor).toString()));
×
1991
        setColorZenithNadir(             Vec3f(conf->value("color/zenith_nadir_color", defaultColor).toString()));
×
1992
        setColorEclipticJ2000Poles(      Vec3f(conf->value("color/ecliptic_J2000_poles_color", defaultColor).toString()));
×
1993
        setColorEclipticPoles(           Vec3f(conf->value("color/ecliptic_poles_color", defaultColor).toString()));
×
1994
        setColorGalacticPoles(           Vec3f(conf->value("color/galactic_poles_color", defaultColor).toString()));
×
1995
        setColorGalacticCenter(          Vec3f(conf->value("color/galactic_center_color", defaultColor).toString()));
×
1996
        setColorSupergalacticPoles(      Vec3f(conf->value("color/supergalactic_poles_color", defaultColor).toString()));
×
1997
        setColorEquinoxJ2000Points(      Vec3f(conf->value("color/equinox_J2000_points_color", defaultColor).toString()));
×
1998
        setColorEquinoxPoints(           Vec3f(conf->value("color/equinox_points_color", defaultColor).toString()));
×
1999
        setColorSolsticeJ2000Points(     Vec3f(conf->value("color/solstice_J2000_points_color", defaultColor).toString()));
×
2000
        setColorSolsticePoints(          Vec3f(conf->value("color/solstice_points_color", defaultColor).toString()));
×
2001
        setColorAntisolarPoint(          Vec3f(conf->value("color/antisolar_point_color", defaultColor).toString()));
×
UNCOV
2002
        setColorApexPoints(              Vec3f(conf->value("color/apex_points_color", defaultColor).toString()));
×
2003

2004
        StelApp& app = StelApp::getInstance();
×
2005
        connect(&app, SIGNAL(languageChanged()), this, SLOT(updateLabels()));
×
UNCOV
2006
        connect(&app, SIGNAL(screenFontSizeChanged(int)), this, SLOT(setFontSizeFromApp(int)));
×
2007
        
2008
        QString displayGroup = N_("Display Options");
×
2009
        addAction("actionShow_Gridlines",                  displayGroup, N_("Grids and lines"), "gridlinesDisplayed");
×
2010
        addAction("actionShow_Equatorial_Grid",            displayGroup, N_("Equatorial grid"), "equatorGridDisplayed", "E");
×
2011
        addAction("actionShow_Fixed_Equatorial_Grid",      displayGroup, N_("Fixed Equatorial grid"), "fixedEquatorGridDisplayed");
×
2012
        addAction("actionShow_Azimuthal_Grid",             displayGroup, N_("Azimuthal grid"), "azimuthalGridDisplayed", "Z");
×
2013
        addAction("actionShow_Ecliptic_Line",              displayGroup, N_("Ecliptic line"), "eclipticLineDisplayed", ",");
×
2014
        addAction("actionShow_Ecliptic_J2000_Line",        displayGroup, N_("Ecliptic J2000 line"), "eclipticJ2000LineDisplayed");
×
2015
        addAction("actionShow_Invariable_Plane_Line",      displayGroup, N_("Invariable Plane line"), "invariablePlaneLineDisplayed");
×
2016
        addAction("actionShow_Solar_Equator_Line",         displayGroup, N_("Solar Equator Plane line"), "solarEquatorLineDisplayed");
×
2017
        addAction("actionShow_Equator_Line",               displayGroup, N_("Equator line"), "equatorLineDisplayed", ".");
×
2018
        addAction("actionShow_Equator_J2000_Line",         displayGroup, N_("Equator J2000 line"), "equatorJ2000LineDisplayed"); // or with Hotkey??
×
2019
        addAction("actionShow_Fixed_Equator_Line",         displayGroup, N_("Fixed Equator line"), "fixedEquatorLineDisplayed");
×
2020
        addAction("actionShow_Meridian_Line",              displayGroup, N_("Meridian line"), "meridianLineDisplayed", ";");
×
2021
        addAction("actionShow_Horizon_Line",               displayGroup, N_("Horizon line"), "horizonLineDisplayed", "H");
×
2022
        addAction("actionShow_Equatorial_J2000_Grid",      displayGroup, N_("Equatorial J2000 grid"), "equatorJ2000GridDisplayed");
×
2023
        addAction("actionShow_Ecliptic_J2000_Grid",        displayGroup, N_("Ecliptic J2000 grid"), "eclipticJ2000GridDisplayed");
×
2024
        addAction("actionShow_Ecliptic_Grid",              displayGroup, N_("Ecliptic grid"), "eclipticGridDisplayed");
×
2025
        addAction("actionShow_Galactic_Grid",              displayGroup, N_("Galactic grid"), "galacticGridDisplayed");
×
2026
        addAction("actionShow_Galactic_Equator_Line",      displayGroup, N_("Galactic equator"), "galacticEquatorLineDisplayed");
×
2027
        addAction("actionShow_Supergalactic_Grid",         displayGroup, N_("Supergalactic grid"), "supergalacticGridDisplayed");
×
2028
        addAction("actionShow_Supergalactic_Equator_Line", displayGroup, N_("Supergalactic equator"), "supergalacticEquatorLineDisplayed");
×
2029
        addAction("actionShow_Longitude_Line",             displayGroup, N_("Opposition/conjunction longitude line"), "longitudeLineDisplayed");
×
2030
        addAction("actionShow_Quadrature_Line",            displayGroup, N_("Quadrature line"), "quadratureLineDisplayed");
×
2031
        addAction("actionShow_Precession_Circles",         displayGroup, N_("Precession Circles"), "precessionCirclesDisplayed");
×
2032
        addAction("actionShow_Prime_Vertical_Line",        displayGroup, N_("Prime Vertical"), "primeVerticalLineDisplayed");
×
2033
        addAction("actionShow_Current_Vertical_Line",      displayGroup, N_("Current Vertical"), "currentVerticalLineDisplayed");
×
2034
        addAction("actionShow_Colure_Lines",               displayGroup, N_("Colure Lines"), "colureLinesDisplayed");
×
2035
        addAction("actionShow_Circumpolar_Circles",        displayGroup, N_("Circumpolar Circles"), "circumpolarCirclesDisplayed");
×
2036
        addAction("actionShow_Umbra_Circle",               displayGroup, N_("Umbra Circle"), "umbraCircleDisplayed");
×
2037
        addAction("actionShow_Penumbra_Circle",            displayGroup, N_("Penumbra Circle"), "penumbraCircleDisplayed");
×
2038
        addAction("actionShow_Celestial_J2000_Poles",      displayGroup, N_("Celestial J2000 poles"), "celestialJ2000PolesDisplayed");
×
2039
        addAction("actionShow_Celestial_Poles",            displayGroup, N_("Celestial poles"), "celestialPolesDisplayed");
×
2040
        addAction("actionShow_Zenith_Nadir",               displayGroup, N_("Zenith and nadir"), "zenithNadirDisplayed");
×
2041
        addAction("actionShow_Ecliptic_J2000_Poles",       displayGroup, N_("Ecliptic J2000 poles"), "eclipticJ2000PolesDisplayed");
×
2042
        addAction("actionShow_Ecliptic_Poles",             displayGroup, N_("Ecliptic poles"), "eclipticPolesDisplayed");
×
2043
        addAction("actionShow_Galactic_Poles",             displayGroup, N_("Galactic poles"), "galacticPolesDisplayed");
×
2044
        addAction("actionShow_Galactic_Center",            displayGroup, N_("Galactic center and anticenter"), "galacticCenterDisplayed");
×
2045
        addAction("actionShow_Supergalactic_Poles",        displayGroup, N_("Supergalactic poles"), "supergalacticPolesDisplayed");
×
2046
        addAction("actionShow_Equinox_J2000_Points",       displayGroup, N_("Equinox J2000 points"), "equinoxJ2000PointsDisplayed");
×
2047
        addAction("actionShow_Equinox_Points",             displayGroup, N_("Equinox points"), "equinoxPointsDisplayed");
×
2048
        addAction("actionShow_Solstice_J2000_Points",      displayGroup, N_("Solstice J2000 points"), "solsticeJ2000PointsDisplayed");
×
2049
        addAction("actionShow_Solstice_Points",            displayGroup, N_("Solstice points"), "solsticePointsDisplayed");
×
2050
        addAction("actionShow_Antisolar_Point",            displayGroup, N_("Antisolar point"), "antisolarPointDisplayed");
×
2051
        addAction("actionShow_Umbra_Center_Point",         displayGroup, N_("The center of the Earth's umbra"), "umbraCenterPointDisplayed");
×
2052
        addAction("actionShow_Apex_Points",                displayGroup, N_("Apex points"), "apexPointsDisplayed");
×
UNCOV
2053
}
×
2054

UNCOV
2055
void GridLinesMgr::connectSolarSystem()
×
2056
{
2057
        SolarSystem *ss=GETSTELMODULE(SolarSystem);
×
2058
        earth = ss->getEarth();
×
2059
        SkyLine::setSolarSystem(ss);
×
UNCOV
2060
}
×
2061

UNCOV
2062
void GridLinesMgr::update(double deltaTime)
×
2063
{
2064
        // Update faders
2065
        equGrid->update(deltaTime);
×
2066
        fixedEquatorialGrid->update(deltaTime);
×
2067
        equJ2000Grid->update(deltaTime);
×
2068
        eclJ2000Grid->update(deltaTime);
×
2069
        eclGrid->update(deltaTime);
×
2070
        galacticGrid->update(deltaTime);
×
2071
        supergalacticGrid->update(deltaTime);
×
2072
        aziGrid->update(deltaTime);
×
2073
        equatorLine->update(deltaTime);
×
2074
        equatorJ2000Line->update(deltaTime);
×
2075
        fixedEquatorLine->update(deltaTime);
×
2076
        eclipticLine->update(deltaTime);
×
2077
        eclipticWithDateLine->update(deltaTime);
×
2078
        eclipticJ2000Line->update(deltaTime);
×
2079
        invariablePlaneLine->update(deltaTime);
×
2080
        solarEquatorLine->update(deltaTime);
×
2081
        precessionCircleN->update(deltaTime);
×
2082
        precessionCircleS->update(deltaTime);
×
2083
        meridianLine->update(deltaTime);
×
2084
        horizonLine->update(deltaTime);
×
2085
        galacticEquatorLine->update(deltaTime);
×
2086
        supergalacticEquatorLine->update(deltaTime);
×
2087
        longitudeLine->update(deltaTime);
×
2088
        quadratureLine->update(deltaTime);
×
2089
        primeVerticalLine->update(deltaTime);
×
2090
        currentVerticalLine->update(deltaTime);
×
2091
        colureLine_1->update(deltaTime);
×
2092
        colureLine_2->update(deltaTime);
×
2093
        circumpolarCircleN->update(deltaTime);
×
2094
        circumpolarCircleS->update(deltaTime);
×
2095
        umbraCircle->update(deltaTime);
×
2096
        penumbraCircle->update(deltaTime);
×
2097
        celestialJ2000Poles->update(deltaTime);
×
2098
        celestialPoles->update(deltaTime);
×
2099
        zenithNadir->update(deltaTime);
×
2100
        eclipticJ2000Poles->update(deltaTime);
×
2101
        eclipticPoles->update(deltaTime);
×
2102
        galacticPoles->update(deltaTime);
×
2103
        galacticCenter->update(deltaTime);
×
2104
        supergalacticPoles->update(deltaTime);
×
2105
        equinoxJ2000Points->update(deltaTime);
×
2106
        equinoxPoints->update(deltaTime);
×
2107
        solsticeJ2000Points->update(deltaTime);
×
2108
        solsticePoints->update(deltaTime);
×
2109
        antisolarPoint->update(deltaTime);
×
2110
        umbraCenterPoint->update(deltaTime);
×
2111
        apexPoints->update(deltaTime);
×
2112
        apexPoints->updateLabel();        
×
UNCOV
2113
}
×
2114

UNCOV
2115
void GridLinesMgr::draw(StelCore* core)
×
2116
{
2117
        if (!gridlinesDisplayed)
×
UNCOV
2118
                return;
×
2119

2120
        // Draw elements from the outside in.
2121
        // Lines after corresponding grids, to be able to e.g. draw equators in different color!
2122
        // Points should come last, to avoid text overdraw.
2123
        supergalacticGrid->draw(core);
×
2124
        galacticGrid->draw(core);
×
2125
        supergalacticEquatorLine->draw(core);
×
2126
        galacticEquatorLine->draw(core);
×
2127
        invariablePlaneLine->draw(core);
×
UNCOV
2128
        solarEquatorLine->draw(core);
×
2129

2130
        eclJ2000Grid->draw(core);
×
UNCOV
2131
        eclipticJ2000Line->draw(core);
×
2132

2133
        equJ2000Grid->draw(core);
×
UNCOV
2134
        equatorJ2000Line->draw(core);
×
2135

2136
        equGrid->draw(core);
×
UNCOV
2137
        equatorLine->draw(core);
×
2138
        // While ecliptic of J2000 may be helpful to get a feeling of the Z=0 plane of VSOP87,
2139
        // ecliptic of date is related to Earth and does not make much sense for the other planets.
2140
        // Of course, orbital plane of respective planet would be better, but is not implemented.
UNCOV
2141
        if (core->getCurrentPlanet()==earth)
×
2142
        {
2143
                penumbraCircle->draw(core);
×
2144
                umbraCircle->draw(core);
×
2145
                eclGrid->draw(core);
×
2146
                eclipticLine->draw(core);
×
2147
                eclipticWithDateLine->draw(core);
×
2148
                precessionCircleN->draw(core);
×
2149
                precessionCircleS->draw(core);
×
2150
                colureLine_1->draw(core);
×
2151
                colureLine_2->draw(core);
×
2152
                eclipticPoles->draw(core);
×
2153
                equinoxPoints->draw(core);
×
2154
                solsticePoints->draw(core);
×
2155
                longitudeLine->draw(core);
×
2156
                quadratureLine->draw(core);
×
UNCOV
2157
                umbraCenterPoint->draw(core);
×
2158
        }
2159
        circumpolarCircleN->draw(core);
×
UNCOV
2160
        circumpolarCircleS->draw(core);
×
2161

UNCOV
2162
        if (core->getCurrentPlanet()->getPlanetType()!=Planet::isObserver)
×
2163
        {
2164
                fixedEquatorialGrid->draw(core);
×
UNCOV
2165
                fixedEquatorLine->draw(core);
×
2166
        }
2167

2168
        aziGrid->draw(core);
×
2169
        meridianLine->draw(core);
×
2170
        horizonLine->draw(core);
×
UNCOV
2171
        primeVerticalLine->draw(core);
×
2172

UNCOV
2173
        currentVerticalLine->draw(core);
×
2174

2175
        supergalacticPoles->draw(core);
×
2176
        galacticPoles->draw(core);
×
2177
        galacticCenter->draw(core);
×
2178
        apexPoints->draw(core);
×
2179
        antisolarPoint->draw(core);
×
2180
        eclipticJ2000Poles->draw(core);
×
2181
        equinoxJ2000Points->draw(core);
×
2182
        solsticeJ2000Points->draw(core);
×
2183
        celestialJ2000Poles->draw(core);
×
UNCOV
2184
        celestialPoles->draw(core);
×
2185

UNCOV
2186
        zenithNadir->draw(core);
×
2187
}
2188

UNCOV
2189
void GridLinesMgr::updateLabels()
×
2190
{
2191
        equatorJ2000Line->updateLabel();
×
2192
        equatorLine->updateLabel();
×
2193
        fixedEquatorLine->updateLabel();
×
2194
        eclipticLine->updateLabel();
×
2195
        eclipticWithDateLine->updateLabel();
×
2196
        eclipticJ2000Line->updateLabel();
×
2197
        invariablePlaneLine->updateLabel();
×
2198
        solarEquatorLine->updateLabel();
×
2199
        precessionCircleN->updateLabel();
×
2200
        precessionCircleS->updateLabel();
×
2201
        meridianLine->updateLabel();
×
2202
        horizonLine->updateLabel();
×
2203
        galacticEquatorLine->updateLabel();
×
2204
        supergalacticEquatorLine->updateLabel();
×
2205
        longitudeLine->updateLabel();
×
2206
        quadratureLine->updateLabel();
×
2207
        primeVerticalLine->updateLabel();
×
2208
        currentVerticalLine->updateLabel();
×
2209
        colureLine_1->updateLabel();
×
2210
        colureLine_2->updateLabel();
×
2211
        circumpolarCircleN->updateLabel();
×
2212
        circumpolarCircleS->updateLabel();
×
2213
        umbraCircle->updateLabel();
×
2214
        penumbraCircle->updateLabel();
×
2215
        celestialJ2000Poles->updateLabel();
×
2216
        celestialPoles->updateLabel();
×
2217
        zenithNadir->updateLabel();
×
2218
        eclipticJ2000Poles->updateLabel();
×
2219
        eclipticPoles->updateLabel();
×
2220
        galacticPoles->updateLabel();
×
2221
        galacticCenter->updateLabel();
×
2222
        supergalacticPoles->updateLabel();
×
2223
        equinoxJ2000Points->updateLabel();
×
2224
        equinoxPoints->updateLabel();
×
2225
        solsticeJ2000Points->updateLabel();
×
2226
        solsticePoints->updateLabel();
×
2227
        antisolarPoint->updateLabel();
×
2228
        umbraCenterPoint->updateLabel();
×
2229
        apexPoints->updateLabel();        
×
UNCOV
2230
}
×
2231

2232
//! Setter ("master switch") for displaying any grid/line.
UNCOV
2233
void GridLinesMgr::setFlagGridlines(const bool displayed)
×
2234
{
UNCOV
2235
        if(displayed != gridlinesDisplayed)
×
2236
        {
2237
                gridlinesDisplayed=displayed;
×
2238
                StelApp::immediateSave("viewing/flag_gridlines", displayed);
×
UNCOV
2239
                emit gridlinesDisplayedChanged(displayed);
×
2240
        }
UNCOV
2241
}
×
2242
//! Accessor ("master switch") for displaying any grid/line.
UNCOV
2243
bool GridLinesMgr::getFlagGridlines() const
×
2244
{
UNCOV
2245
        return gridlinesDisplayed;
×
2246
}
2247

2248
//! Setter ("master switch by type") for displaying all grids esp. for scripting
UNCOV
2249
void GridLinesMgr::setFlagAllGrids(const bool displayed)
×
2250
{
2251
        setFlagEquatorGrid(displayed);
×
2252
        setFlagFixedEquatorGrid(displayed);
×
2253
        setFlagEclipticGrid(displayed);
×
2254
        setFlagGalacticGrid(displayed);
×
2255
        setFlagAzimuthalGrid(displayed);
×
2256
        setFlagEquatorJ2000Grid(displayed);
×
2257
        setFlagEclipticJ2000Grid(displayed);
×
2258
        setFlagSupergalacticGrid(displayed);
×
UNCOV
2259
}
×
2260

2261
//! Setter ("master switch by type") for displaying all lines esp. for scripting
UNCOV
2262
void GridLinesMgr::setFlagAllLines(const bool displayed)
×
2263
{
2264
        setFlagColureLines(displayed);
×
2265
        setFlagEquatorLine(displayed);
×
2266
        setFlagFixedEquatorLine(displayed);
×
2267
        setFlagHorizonLine(displayed);
×
2268
        setFlagEclipticLine(displayed);
×
2269
        setFlagMeridianLine(displayed);
×
2270
        setFlagLongitudeLine(displayed);
×
2271
        setFlagQuadratureLine(displayed);
×
2272
        setFlagEquatorJ2000Line(displayed);
×
2273
        setFlagEclipticJ2000Line(displayed);
×
2274
        setFlagInvariablePlaneLine(displayed);
×
2275
        setFlagSolarEquatorLine(displayed);
×
2276
        setFlagPrecessionCircles(displayed);
×
2277
        setFlagPrimeVerticalLine(displayed);
×
2278
        setFlagCurrentVerticalLine(displayed);
×
2279
        setFlagCircumpolarCircles(displayed);
×
2280
        setFlagUmbraCircle(displayed);
×
2281
        setFlagPenumbraCircle(displayed);
×
2282
        setFlagGalacticEquatorLine(displayed);
×
2283
        setFlagSupergalacticEquatorLine(displayed);
×
UNCOV
2284
}
×
2285

2286
//! Setter ("master switch by type") for displaying all points esp. for scripting
UNCOV
2287
void GridLinesMgr::setFlagAllPoints(const bool displayed)
×
2288
{
2289
        setFlagZenithNadir(displayed);
×
2290
        setFlagEclipticPoles(displayed);
×
2291
        setFlagEquinoxPoints(displayed);
×
2292
        setFlagGalacticPoles(displayed);
×
2293
        setFlagGalacticCenter(displayed);
×
2294
        setFlagAntisolarPoint(displayed);
×
2295
        setFlagCelestialPoles(displayed);
×
2296
        setFlagSolsticePoints(displayed);
×
2297
        setFlagEclipticJ2000Poles(displayed);
×
2298
        setFlagEquinoxJ2000Points(displayed);
×
2299
        setFlagSupergalacticPoles(displayed);
×
2300
        setFlagCelestialJ2000Poles(displayed);
×
2301
        setFlagSolsticeJ2000Points(displayed);
×
2302
        setFlagApexPoints(displayed);
×
2303
        setFlagUmbraCenterPoint(displayed);
×
UNCOV
2304
}
×
2305

2306
//! Set flag for displaying Azimuthal Grid
UNCOV
2307
void GridLinesMgr::setFlagAzimuthalGrid(const bool displayed)
×
2308
{
UNCOV
2309
        if(displayed != aziGrid->isDisplayed())
×
2310
        {
2311
                aziGrid->setDisplayed(displayed);
×
2312
                StelApp::immediateSave("viewing/flag_azimuthal_grid", displayed);
×
UNCOV
2313
                emit azimuthalGridDisplayedChanged(displayed);
×
2314
        }
UNCOV
2315
}
×
2316
//! Get flag for displaying Azimuthal Grid
UNCOV
2317
bool GridLinesMgr::getFlagAzimuthalGrid() const
×
2318
{
UNCOV
2319
        return aziGrid->isDisplayed();
×
2320
}
UNCOV
2321
Vec3f GridLinesMgr::getColorAzimuthalGrid() const
×
2322
{
UNCOV
2323
        return aziGrid->getColor();
×
2324
}
UNCOV
2325
void GridLinesMgr::setColorAzimuthalGrid(const Vec3f& newColor)
×
2326
{
UNCOV
2327
        if(newColor != aziGrid->getColor())
×
2328
        {
2329
                aziGrid->setColor(newColor);
×
UNCOV
2330
                emit azimuthalGridColorChanged(newColor);
×
2331
        }
UNCOV
2332
}
×
2333

2334
//! Set flag for displaying Equatorial Grid
UNCOV
2335
void GridLinesMgr::setFlagEquatorGrid(const bool displayed)
×
2336
{
UNCOV
2337
        if(displayed != equGrid->isDisplayed())
×
2338
        {
2339
                equGrid->setDisplayed(displayed);
×
2340
                StelApp::immediateSave("viewing/flag_equatorial_grid", displayed);
×
UNCOV
2341
                emit equatorGridDisplayedChanged(displayed);
×
2342
        }
UNCOV
2343
}
×
2344
//! Get flag for displaying Equatorial Grid
UNCOV
2345
bool GridLinesMgr::getFlagEquatorGrid() const
×
2346
{
UNCOV
2347
        return equGrid->isDisplayed();
×
2348
}
UNCOV
2349
Vec3f GridLinesMgr::getColorEquatorGrid() const
×
2350
{
UNCOV
2351
        return equGrid->getColor();
×
2352
}
UNCOV
2353
void GridLinesMgr::setColorEquatorGrid(const Vec3f& newColor)
×
2354
{
UNCOV
2355
        if(newColor != equGrid->getColor())
×
2356
        {
2357
                equGrid->setColor(newColor);
×
UNCOV
2358
                emit equatorGridColorChanged(newColor);
×
2359
        }
UNCOV
2360
}
×
2361

2362
//! Set flag for displaying Fixed Equatorial Grid (Hour Angle/Declination)
UNCOV
2363
void GridLinesMgr::setFlagFixedEquatorGrid(const bool displayed)
×
2364
{
UNCOV
2365
        if(displayed != fixedEquatorialGrid->isDisplayed())
×
2366
        {
2367
                fixedEquatorialGrid->setDisplayed(displayed);
×
2368
                StelApp::immediateSave("viewing/flag_fixed_equatorial_grid", displayed);
×
UNCOV
2369
                emit fixedEquatorGridDisplayedChanged(displayed);
×
2370
        }
UNCOV
2371
}
×
2372
//! Get flag for displaying Fixed Equatorial Grid (Hour Angle/Declination)
UNCOV
2373
bool GridLinesMgr::getFlagFixedEquatorGrid() const
×
2374
{
UNCOV
2375
        return fixedEquatorialGrid->isDisplayed();
×
2376
}
UNCOV
2377
Vec3f GridLinesMgr::getColorFixedEquatorGrid() const
×
2378
{
UNCOV
2379
        return fixedEquatorialGrid->getColor();
×
2380
}
UNCOV
2381
void GridLinesMgr::setColorFixedEquatorGrid(const Vec3f& newColor)
×
2382
{
UNCOV
2383
        if(newColor != fixedEquatorialGrid->getColor())
×
2384
        {
2385
                fixedEquatorialGrid->setColor(newColor);
×
UNCOV
2386
                emit fixedEquatorGridColorChanged(newColor);
×
2387
        }
UNCOV
2388
}
×
2389

2390
//! Set flag for displaying Equatorial J2000 Grid
UNCOV
2391
void GridLinesMgr::setFlagEquatorJ2000Grid(const bool displayed)
×
2392
{
UNCOV
2393
        if(displayed != equJ2000Grid->isDisplayed())
×
2394
        {
2395
                equJ2000Grid->setDisplayed(displayed);
×
2396
                StelApp::immediateSave("viewing/flag_equatorial_J2000_grid", displayed);
×
UNCOV
2397
                emit equatorJ2000GridDisplayedChanged(displayed);
×
2398
        }
UNCOV
2399
}
×
2400
//! Get flag for displaying Equatorial J2000 Grid
UNCOV
2401
bool GridLinesMgr::getFlagEquatorJ2000Grid() const
×
2402
{
UNCOV
2403
        return equJ2000Grid->isDisplayed();
×
2404
}
UNCOV
2405
Vec3f GridLinesMgr::getColorEquatorJ2000Grid() const
×
2406
{
UNCOV
2407
        return equJ2000Grid->getColor();
×
2408
}
UNCOV
2409
void GridLinesMgr::setColorEquatorJ2000Grid(const Vec3f& newColor)
×
2410
{
UNCOV
2411
        if(newColor != equJ2000Grid->getColor())
×
2412
        {
2413
                equJ2000Grid->setColor(newColor);
×
UNCOV
2414
                emit equatorJ2000GridColorChanged(newColor);
×
2415
        }
UNCOV
2416
}
×
2417

2418
//! Set flag for displaying Ecliptic J2000 Grid
UNCOV
2419
void GridLinesMgr::setFlagEclipticJ2000Grid(const bool displayed)
×
2420
{
UNCOV
2421
        if(displayed != eclJ2000Grid->isDisplayed())
×
2422
        {
2423
                eclJ2000Grid->setDisplayed(displayed);
×
2424
                StelApp::immediateSave("viewing/flag_ecliptic_J2000_grid", displayed);
×
UNCOV
2425
                emit eclipticJ2000GridDisplayedChanged(displayed);
×
2426
        }
UNCOV
2427
}
×
2428
//! Get flag for displaying Ecliptic J2000 Grid
UNCOV
2429
bool GridLinesMgr::getFlagEclipticJ2000Grid() const
×
2430
{
UNCOV
2431
        return eclJ2000Grid->isDisplayed();
×
2432
}
UNCOV
2433
Vec3f GridLinesMgr::getColorEclipticJ2000Grid() const
×
2434
{
UNCOV
2435
        return eclJ2000Grid->getColor();
×
2436
}
UNCOV
2437
void GridLinesMgr::setColorEclipticJ2000Grid(const Vec3f& newColor)
×
2438
{
UNCOV
2439
        if(newColor != eclJ2000Grid->getColor())
×
2440
        {
2441
                eclJ2000Grid->setColor(newColor);
×
UNCOV
2442
                emit eclipticJ2000GridColorChanged(newColor);
×
2443
        }
UNCOV
2444
}
×
2445

2446
//! Set flag for displaying Ecliptic of Date Grid
UNCOV
2447
void GridLinesMgr::setFlagEclipticGrid(const bool displayed)
×
2448
{
UNCOV
2449
        if(displayed != eclGrid->isDisplayed())
×
2450
        {
2451
                eclGrid->setDisplayed(displayed);
×
2452
                StelApp::immediateSave("viewing/flag_ecliptic_grid", displayed);
×
UNCOV
2453
                emit eclipticGridDisplayedChanged(displayed);
×
2454
        }
UNCOV
2455
}
×
2456
//! Get flag for displaying Ecliptic of Date Grid
UNCOV
2457
bool GridLinesMgr::getFlagEclipticGrid() const
×
2458
{
UNCOV
2459
        return eclGrid->isDisplayed();
×
2460
}
UNCOV
2461
Vec3f GridLinesMgr::getColorEclipticGrid() const
×
2462
{
UNCOV
2463
        return eclGrid->getColor();
×
2464
}
UNCOV
2465
void GridLinesMgr::setColorEclipticGrid(const Vec3f& newColor)
×
2466
{
UNCOV
2467
        if(newColor != eclGrid->getColor())
×
2468
        {
2469
                eclGrid->setColor(newColor);
×
UNCOV
2470
                emit eclipticGridColorChanged(newColor);
×
2471
        }
UNCOV
2472
}
×
2473

2474
//! Set flag for displaying Galactic Grid
UNCOV
2475
void GridLinesMgr::setFlagGalacticGrid(const bool displayed)
×
2476
{
UNCOV
2477
        if(displayed != galacticGrid->isDisplayed())
×
2478
        {
2479
                galacticGrid->setDisplayed(displayed);
×
2480
                StelApp::immediateSave("viewing/flag_galactic_grid", displayed);
×
UNCOV
2481
                emit galacticGridDisplayedChanged(displayed);
×
2482
        }
UNCOV
2483
}
×
2484
//! Get flag for displaying Galactic Grid
UNCOV
2485
bool GridLinesMgr::getFlagGalacticGrid() const
×
2486
{
UNCOV
2487
        return galacticGrid->isDisplayed();
×
2488
}
UNCOV
2489
Vec3f GridLinesMgr::getColorGalacticGrid() const
×
2490
{
UNCOV
2491
        return galacticGrid->getColor();
×
2492
}
UNCOV
2493
void GridLinesMgr::setColorGalacticGrid(const Vec3f& newColor)
×
2494
{
UNCOV
2495
        if(newColor != galacticGrid->getColor())
×
2496
        {
2497
                galacticGrid->setColor(newColor);
×
UNCOV
2498
                emit galacticGridColorChanged(newColor);
×
2499
        }
UNCOV
2500
}
×
2501

2502
//! Set flag for displaying Supergalactic Grid
UNCOV
2503
void GridLinesMgr::setFlagSupergalacticGrid(const bool displayed)
×
2504
{
UNCOV
2505
        if(displayed != supergalacticGrid->isDisplayed())
×
2506
        {
2507
                supergalacticGrid->setDisplayed(displayed);
×
2508
                StelApp::immediateSave("viewing/flag_supergalactic_grid", displayed);
×
UNCOV
2509
                emit supergalacticGridDisplayedChanged(displayed);
×
2510
        }
UNCOV
2511
}
×
2512
//! Get flag for displaying Supergalactic Grid
UNCOV
2513
bool GridLinesMgr::getFlagSupergalacticGrid() const
×
2514
{
UNCOV
2515
        return supergalacticGrid->isDisplayed();
×
2516
}
UNCOV
2517
Vec3f GridLinesMgr::getColorSupergalacticGrid() const
×
2518
{
UNCOV
2519
        return supergalacticGrid->getColor();
×
2520
}
UNCOV
2521
void GridLinesMgr::setColorSupergalacticGrid(const Vec3f& newColor)
×
2522
{
UNCOV
2523
        if(newColor != supergalacticGrid->getColor())
×
2524
        {
2525
                supergalacticGrid->setColor(newColor);
×
UNCOV
2526
                emit supergalacticGridColorChanged(newColor);
×
2527
        }
UNCOV
2528
}
×
2529

2530
//! Set flag for displaying Equatorial Line
UNCOV
2531
void GridLinesMgr::setFlagEquatorLine(const bool displayed)
×
2532
{
UNCOV
2533
        if(displayed != equatorLine->isDisplayed())
×
2534
        {
2535
                equatorLine->setDisplayed(displayed);
×
2536
                StelApp::immediateSave("viewing/flag_equator_line", displayed);
×
UNCOV
2537
                emit equatorLineDisplayedChanged(displayed);
×
2538
        }
UNCOV
2539
}
×
2540
//! Get flag for displaying Equatorial Line
UNCOV
2541
bool GridLinesMgr::getFlagEquatorLine() const
×
2542
{
UNCOV
2543
        return equatorLine->isDisplayed();
×
2544
}
2545
//! Set flag for displaying Equatorial Line partitions
UNCOV
2546
void GridLinesMgr::setFlagEquatorParts(const bool displayed)
×
2547
{
UNCOV
2548
        if(displayed != equatorLine->showsPartitions())
×
2549
        {
2550
                equatorLine->setPartitions(displayed);
×
2551
                StelApp::immediateSave("viewing/flag_equator_parts", displayed);
×
UNCOV
2552
                emit equatorPartsDisplayedChanged(displayed);
×
2553
        }
UNCOV
2554
}
×
2555
//! Get flag for displaying Equatorial Line partitions
UNCOV
2556
bool GridLinesMgr::getFlagEquatorParts() const
×
2557
{
UNCOV
2558
        return equatorLine->showsPartitions();
×
2559
}
UNCOV
2560
void GridLinesMgr::setFlagEquatorLabeled(const bool displayed)
×
2561
{
UNCOV
2562
        if(displayed != equatorLine->isLabeled())
×
2563
        {
2564
                equatorLine->setLabeled(displayed);
×
2565
                StelApp::immediateSave("viewing/flag_equator_labels", displayed);
×
UNCOV
2566
                emit equatorPartsLabeledChanged(displayed);
×
2567
        }
2568
}
×
UNCOV
2569
bool GridLinesMgr::getFlagEquatorLabeled() const
×
2570
{
UNCOV
2571
        return equatorLine->isLabeled();
×
2572
}
UNCOV
2573
Vec3f GridLinesMgr::getColorEquatorLine() const
×
2574
{
UNCOV
2575
        return equatorLine->getColor();
×
2576
}
UNCOV
2577
void GridLinesMgr::setColorEquatorLine(const Vec3f& newColor)
×
2578
{
UNCOV
2579
        if(newColor != equatorLine->getColor())
×
2580
        {
2581
                equatorLine->setColor(newColor);
×
UNCOV
2582
                emit equatorLineColorChanged(newColor);
×
2583
        }
UNCOV
2584
}
×
2585

2586
//! Set flag for displaying J2000 Equatorial Line
UNCOV
2587
void GridLinesMgr::setFlagEquatorJ2000Line(const bool displayed)
×
2588
{
UNCOV
2589
        if(displayed != equatorJ2000Line->isDisplayed())
×
2590
        {
2591
                equatorJ2000Line->setDisplayed(displayed);
×
2592
                StelApp::immediateSave("viewing/flag_equator_J2000_line", displayed);
×
UNCOV
2593
                emit equatorJ2000LineDisplayedChanged(displayed);
×
2594
        }
UNCOV
2595
}
×
2596
//! Get flag for displaying J2000 Equatorial Line
UNCOV
2597
bool GridLinesMgr::getFlagEquatorJ2000Line() const
×
2598
{
UNCOV
2599
        return equatorJ2000Line->isDisplayed();
×
2600
}
2601
//! Set flag for displaying J2000 Equatorial Line partitions
UNCOV
2602
void GridLinesMgr::setFlagEquatorJ2000Parts(const bool displayed)
×
2603
{
UNCOV
2604
        if(displayed != equatorJ2000Line->showsPartitions())
×
2605
        {
2606
                equatorJ2000Line->setPartitions(displayed);
×
2607
                StelApp::immediateSave("viewing/flag_equator_J2000_parts", displayed);
×
UNCOV
2608
                emit equatorJ2000PartsDisplayedChanged(displayed);
×
2609
        }
UNCOV
2610
}
×
2611
//! Get flag for displaying J2000 Equatorial Line partitions
UNCOV
2612
bool GridLinesMgr::getFlagEquatorJ2000Parts() const
×
2613
{
UNCOV
2614
        return equatorJ2000Line->showsPartitions();
×
2615
}
UNCOV
2616
void GridLinesMgr::setFlagEquatorJ2000Labeled(const bool displayed)
×
2617
{
UNCOV
2618
        if(displayed != equatorJ2000Line->isLabeled())
×
2619
        {
2620
                equatorJ2000Line->setLabeled(displayed);
×
2621
                StelApp::immediateSave("viewing/flag_equator_J2000_labels", displayed);
×
UNCOV
2622
                emit equatorJ2000PartsLabeledChanged(displayed);
×
2623
        }
2624
}
×
UNCOV
2625
bool GridLinesMgr::getFlagEquatorJ2000Labeled() const
×
2626
{
UNCOV
2627
        return equatorJ2000Line->isLabeled();
×
2628
}
UNCOV
2629
Vec3f GridLinesMgr::getColorEquatorJ2000Line() const
×
2630
{
UNCOV
2631
        return equatorJ2000Line->getColor();
×
2632
}
UNCOV
2633
void GridLinesMgr::setColorEquatorJ2000Line(const Vec3f& newColor)
×
2634
{
UNCOV
2635
        if(newColor != equatorJ2000Line->getColor())
×
2636
        {
2637
                equatorJ2000Line->setColor(newColor);
×
UNCOV
2638
                emit equatorJ2000LineColorChanged(newColor);
×
2639
        }
UNCOV
2640
}
×
2641

2642
//! Set flag for displaying Fixed Equator Line
UNCOV
2643
void GridLinesMgr::setFlagFixedEquatorLine(const bool displayed)
×
2644
{
UNCOV
2645
        if(displayed != fixedEquatorLine->isDisplayed())
×
2646
        {
2647
                fixedEquatorLine->setDisplayed(displayed);
×
2648
                StelApp::immediateSave("viewing/flag_fixed_equator_line", displayed);
×
UNCOV
2649
                emit fixedEquatorLineDisplayedChanged(displayed);
×
2650
        }
UNCOV
2651
}
×
2652
//! Get flag for displaying Fixed Equator Line
UNCOV
2653
bool GridLinesMgr::getFlagFixedEquatorLine() const
×
2654
{
UNCOV
2655
        return fixedEquatorLine->isDisplayed();
×
2656
}
2657
//! Set flag for displaying Fixed Equator Line partitions
UNCOV
2658
void GridLinesMgr::setFlagFixedEquatorParts(const bool displayed)
×
2659
{
UNCOV
2660
        if(displayed != fixedEquatorLine->showsPartitions())
×
2661
        {
2662
                fixedEquatorLine->setPartitions(displayed);
×
2663
                StelApp::immediateSave("viewing/flag_fixed_equator_parts", displayed);
×
UNCOV
2664
                emit fixedEquatorPartsDisplayedChanged(displayed);
×
2665
        }
UNCOV
2666
}
×
2667
//! Get flag for displaying Fixed Equator Line partitions
UNCOV
2668
bool GridLinesMgr::getFlagFixedEquatorParts() const
×
2669
{
UNCOV
2670
        return fixedEquatorLine->showsPartitions();
×
2671
}
UNCOV
2672
void GridLinesMgr::setFlagFixedEquatorLabeled(const bool displayed)
×
2673
{
UNCOV
2674
        if(displayed != fixedEquatorLine->isLabeled())
×
2675
        {
2676
                fixedEquatorLine->setLabeled(displayed);
×
2677
                StelApp::immediateSave("viewing/flag_fixed_equator_labels", displayed);
×
UNCOV
2678
                emit fixedEquatorPartsLabeledChanged(displayed);
×
2679
        }
2680
}
×
UNCOV
2681
bool GridLinesMgr::getFlagFixedEquatorLabeled() const
×
2682
{
UNCOV
2683
        return fixedEquatorLine->isLabeled();
×
2684
}
UNCOV
2685
Vec3f GridLinesMgr::getColorFixedEquatorLine() const
×
2686
{
UNCOV
2687
        return fixedEquatorLine->getColor();
×
2688
}
UNCOV
2689
void GridLinesMgr::setColorFixedEquatorLine(const Vec3f& newColor)
×
2690
{
UNCOV
2691
        if(newColor != fixedEquatorLine->getColor())
×
2692
        {
2693
                fixedEquatorLine->setColor(newColor);
×
UNCOV
2694
                emit fixedEquatorLineColorChanged(newColor);
×
2695
        }
UNCOV
2696
}
×
2697

2698
//! Set flag for displaying Ecliptic Line
UNCOV
2699
void GridLinesMgr::setFlagEclipticLine(const bool displayed)
×
2700
{
UNCOV
2701
        if(displayed != eclipticLine->isDisplayed())
×
2702
        {
2703
                eclipticLine->setDisplayed(displayed);
×
2704
                eclipticWithDateLine->setDisplayed(displayed);
×
2705
                StelApp::immediateSave("viewing/flag_ecliptic_line", displayed);
×
UNCOV
2706
                emit eclipticLineDisplayedChanged(displayed);
×
2707
        }
UNCOV
2708
}
×
2709
//! Get flag for displaying Ecliptic Line
UNCOV
2710
bool GridLinesMgr::getFlagEclipticLine() const
×
2711
{
UNCOV
2712
        return eclipticLine->isDisplayed();
×
2713
}
2714
//! Set flag for displaying Ecliptic Line partitions
UNCOV
2715
void GridLinesMgr::setFlagEclipticParts(const bool displayed)
×
2716
{
UNCOV
2717
        if(displayed != eclipticLine->showsPartitions())
×
2718
        {
2719
                eclipticLine->setPartitions(displayed);
×
2720
                StelApp::immediateSave("viewing/flag_ecliptic_parts", displayed);
×
UNCOV
2721
                emit eclipticPartsDisplayedChanged(displayed);
×
2722
        }
UNCOV
2723
}
×
2724
//! Get flag for displaying Ecliptic Line partitions
UNCOV
2725
bool GridLinesMgr::getFlagEclipticParts() const
×
2726
{
UNCOV
2727
        return eclipticLine->showsPartitions();
×
2728
}
2729
//! Set flag for displaying Ecliptic Line partitions
UNCOV
2730
void GridLinesMgr::setFlagEclipticLabeled(const bool displayed)
×
2731
{
UNCOV
2732
        if(displayed != eclipticLine->isLabeled())
×
2733
        {
2734
                eclipticLine->setLabeled(displayed);
×
2735
                StelApp::immediateSave("viewing/flag_ecliptic_labels", displayed);
×
UNCOV
2736
                emit eclipticPartsLabeledChanged(displayed);
×
2737
        }
UNCOV
2738
}
×
2739
//! Get flag for displaying Ecliptic Line partitions
UNCOV
2740
bool GridLinesMgr::getFlagEclipticLabeled() const
×
2741
{
UNCOV
2742
        return eclipticLine->isLabeled();
×
2743
}
2744

2745
//! Set flag for displaying Ecliptic Date partitions
UNCOV
2746
void GridLinesMgr::setFlagEclipticDatesLabeled(const bool displayed)
×
2747
{
UNCOV
2748
        if(displayed != eclipticWithDateLine->isLabeled())
×
2749
        {
2750
                eclipticWithDateLine->setPartitions(displayed);
×
2751
                eclipticWithDateLine->setLabeled(displayed);
×
2752
                StelApp::immediateSave("viewing/flag_ecliptic_date_labels", displayed);
×
UNCOV
2753
                emit eclipticDatesLabeledChanged(displayed);
×
2754
        }
UNCOV
2755
}
×
2756
//! Get flag for displaying Ecliptic Line partitions
UNCOV
2757
bool GridLinesMgr::getFlagEclipticDatesLabeled() const
×
2758
{
UNCOV
2759
        return eclipticWithDateLine->isLabeled();
×
2760
}
UNCOV
2761
Vec3f GridLinesMgr::getColorEclipticLine() const
×
2762
{
UNCOV
2763
        return eclipticLine->getColor();
×
2764
}
UNCOV
2765
void GridLinesMgr::setColorEclipticLine(const Vec3f& newColor)
×
2766
{
UNCOV
2767
        if(newColor != eclipticLine->getColor())
×
2768
        {
2769
                eclipticLine->setColor(newColor);
×
2770
                eclipticWithDateLine->setColor(newColor); // One color for both!
×
UNCOV
2771
                emit eclipticLineColorChanged(newColor);
×
2772
        }
UNCOV
2773
}
×
2774

2775
//! Set flag for displaying Ecliptic J2000 Line
UNCOV
2776
void GridLinesMgr::setFlagEclipticJ2000Line(const bool displayed)
×
2777
{
UNCOV
2778
        if(displayed != eclipticJ2000Line->isDisplayed())
×
2779
        {
2780
                eclipticJ2000Line->setDisplayed(displayed);
×
2781
                StelApp::immediateSave("viewing/flag_ecliptic_J2000_line", displayed);
×
UNCOV
2782
                emit eclipticJ2000LineDisplayedChanged(displayed);
×
2783
        }
UNCOV
2784
}
×
2785
//! Get flag for displaying Ecliptic J2000 Line
UNCOV
2786
bool GridLinesMgr::getFlagEclipticJ2000Line() const
×
2787
{
UNCOV
2788
        return eclipticJ2000Line->isDisplayed();
×
2789
}
2790
//! Set flag for displaying Ecliptic J2000 Line partitions
UNCOV
2791
void GridLinesMgr::setFlagEclipticJ2000Parts(const bool displayed)
×
2792
{
UNCOV
2793
        if(displayed != eclipticJ2000Line->showsPartitions())
×
2794
        {
2795
                eclipticJ2000Line->setPartitions(displayed);
×
2796
                StelApp::immediateSave("viewing/flag_ecliptic_J2000_parts", displayed);
×
UNCOV
2797
                emit eclipticJ2000PartsDisplayedChanged(displayed);
×
2798
        }
UNCOV
2799
}
×
2800
//! Get flag for displaying Ecliptic J2000 Line partitions
UNCOV
2801
bool GridLinesMgr::getFlagEclipticJ2000Parts() const
×
2802
{
UNCOV
2803
        return eclipticJ2000Line->showsPartitions();
×
2804
}
2805
//! Set flag for displaying Ecliptic J2000 Line partitions
UNCOV
2806
void GridLinesMgr::setFlagEclipticJ2000Labeled(const bool displayed)
×
2807
{
UNCOV
2808
        if(displayed != eclipticJ2000Line->isLabeled())
×
2809
        {
2810
                eclipticJ2000Line->setLabeled(displayed);
×
2811
                StelApp::immediateSave("viewing/flag_ecliptic_J2000_labels", displayed);
×
UNCOV
2812
                emit eclipticJ2000PartsLabeledChanged(displayed);
×
2813
        }
UNCOV
2814
}
×
2815
//! Get flag for displaying Ecliptic J2000 Line partitions
UNCOV
2816
bool GridLinesMgr::getFlagEclipticJ2000Labeled() const
×
2817
{
UNCOV
2818
        return eclipticJ2000Line->isLabeled();
×
2819
}
UNCOV
2820
Vec3f GridLinesMgr::getColorEclipticJ2000Line() const
×
2821
{
UNCOV
2822
        return eclipticJ2000Line->getColor();
×
2823
}
UNCOV
2824
void GridLinesMgr::setColorEclipticJ2000Line(const Vec3f& newColor)
×
2825
{
UNCOV
2826
        if(newColor != eclipticJ2000Line->getColor())
×
2827
        {
2828
                eclipticJ2000Line->setColor(newColor);
×
UNCOV
2829
                emit eclipticJ2000LineColorChanged(newColor);
×
2830
        }
UNCOV
2831
}
×
2832

2833
//! Set flag for displaying Invariable Plane Line
UNCOV
2834
void GridLinesMgr::setFlagInvariablePlaneLine(const bool displayed)
×
2835
{
UNCOV
2836
        if(displayed != invariablePlaneLine->isDisplayed())
×
2837
        {
2838
                invariablePlaneLine->setDisplayed(displayed);
×
2839
                StelApp::immediateSave("viewing/flag_invariable_plane_line", displayed);
×
UNCOV
2840
                emit invariablePlaneLineDisplayedChanged(displayed);
×
2841
        }
UNCOV
2842
}
×
2843
//! Get flag for displaying Invariable Plane Line
UNCOV
2844
bool GridLinesMgr::getFlagInvariablePlaneLine() const
×
2845
{
UNCOV
2846
        return invariablePlaneLine->isDisplayed();
×
2847
}
UNCOV
2848
Vec3f GridLinesMgr::getColorInvariablePlaneLine() const
×
2849
{
UNCOV
2850
        return invariablePlaneLine->getColor();
×
2851
}
UNCOV
2852
void GridLinesMgr::setColorInvariablePlaneLine(const Vec3f& newColor)
×
2853
{
UNCOV
2854
        if(newColor != invariablePlaneLine->getColor())
×
2855
        {
2856
                invariablePlaneLine->setColor(newColor);
×
UNCOV
2857
                emit invariablePlaneLineColorChanged(newColor);
×
2858
        }
UNCOV
2859
}
×
2860

2861
//! Set flag for displaying Solar Equator Line
UNCOV
2862
void GridLinesMgr::setFlagSolarEquatorLine(const bool displayed)
×
2863
{
UNCOV
2864
        if(displayed != solarEquatorLine->isDisplayed())
×
2865
        {
2866
                solarEquatorLine->setDisplayed(displayed);
×
2867
                StelApp::immediateSave("viewing/flag_solar_equator_line", displayed);
×
UNCOV
2868
                emit solarEquatorLineDisplayedChanged(displayed);
×
2869
        }
UNCOV
2870
}
×
2871
//! Get flag for displaying Solar Equator Line
UNCOV
2872
bool GridLinesMgr::getFlagSolarEquatorLine() const
×
2873
{
UNCOV
2874
        return solarEquatorLine->isDisplayed();
×
2875
}
2876
//! Set flag for displaying Solar Equator Line partitions
UNCOV
2877
void GridLinesMgr::setFlagSolarEquatorParts(const bool displayed)
×
2878
{
UNCOV
2879
        if(displayed != solarEquatorLine->showsPartitions())
×
2880
        {
2881
                solarEquatorLine->setPartitions(displayed);
×
2882
                StelApp::immediateSave("viewing/flag_solar_equator_parts", displayed);
×
UNCOV
2883
                emit solarEquatorPartsDisplayedChanged(displayed);
×
2884
        }
UNCOV
2885
}
×
2886
//! Get flag for displaying Solar Equator Line partitions
UNCOV
2887
bool GridLinesMgr::getFlagSolarEquatorParts() const
×
2888
{
UNCOV
2889
        return solarEquatorLine->showsPartitions();
×
2890
}
2891
//! Set flag for displaying Solar Equator Line partitions
UNCOV
2892
void GridLinesMgr::setFlagSolarEquatorLabeled(const bool displayed)
×
2893
{
UNCOV
2894
        if(displayed != solarEquatorLine->isLabeled())
×
2895
        {
2896
                solarEquatorLine->setLabeled(displayed);
×
2897
                StelApp::immediateSave("viewing/flag_solar_equator_labels", displayed);
×
UNCOV
2898
                emit solarEquatorPartsLabeledChanged(displayed);
×
2899
        }
UNCOV
2900
}
×
2901
//! Get flag for displaying Solar Equator Line partitions
UNCOV
2902
bool GridLinesMgr::getFlagSolarEquatorLabeled() const
×
2903
{
UNCOV
2904
        return solarEquatorLine->isLabeled();
×
2905
}
UNCOV
2906
Vec3f GridLinesMgr::getColorSolarEquatorLine() const
×
2907
{
UNCOV
2908
        return solarEquatorLine->getColor();
×
2909
}
UNCOV
2910
void GridLinesMgr::setColorSolarEquatorLine(const Vec3f& newColor)
×
2911
{
UNCOV
2912
        if(newColor != solarEquatorLine->getColor())
×
2913
        {
2914
                solarEquatorLine->setColor(newColor);
×
UNCOV
2915
                emit solarEquatorLineColorChanged(newColor);
×
2916
        }
UNCOV
2917
}
×
2918

2919
//! Set flag for displaying Precession Circles
UNCOV
2920
void GridLinesMgr::setFlagPrecessionCircles(const bool displayed)
×
2921
{
UNCOV
2922
        if(displayed != precessionCircleN->isDisplayed())
×
2923
        {
2924
                precessionCircleN->setDisplayed(displayed);
×
2925
                precessionCircleS->setDisplayed(displayed);
×
2926
                StelApp::immediateSave("viewing/flag_precession_circles", displayed);
×
UNCOV
2927
                emit precessionCirclesDisplayedChanged(displayed);
×
2928
        }
UNCOV
2929
}
×
2930
//! Get flag for displaying Precession Circles
UNCOV
2931
bool GridLinesMgr::getFlagPrecessionCircles() const
×
2932
{
2933
        // precessionCircleS is always synchronous, no separate queries.
UNCOV
2934
        return precessionCircleN->isDisplayed();
×
2935
}
2936
//! Set flag for displaying Precession Circle partitions
UNCOV
2937
void GridLinesMgr::setFlagPrecessionParts(const bool displayed)
×
2938
{
UNCOV
2939
        if(displayed != precessionCircleN->showsPartitions())
×
2940
        {
2941
                precessionCircleN->setPartitions(displayed);
×
2942
                precessionCircleS->setPartitions(displayed);
×
2943
                StelApp::immediateSave("viewing/flag_precession_parts", displayed);
×
UNCOV
2944
                emit precessionPartsDisplayedChanged(displayed);
×
2945
        }
UNCOV
2946
}
×
2947
//! Get flag for displaying Precession Circle partitions
UNCOV
2948
bool GridLinesMgr::getFlagPrecessionParts() const
×
2949
{
2950
        // precessionCircleS is always synchronous, no separate queries.
UNCOV
2951
        return precessionCircleN->showsPartitions();
×
2952
}
2953
//! Set flag for displaying Precession Circle partitions
UNCOV
2954
void GridLinesMgr::setFlagPrecessionLabeled(const bool displayed)
×
2955
{
UNCOV
2956
        if(displayed != precessionCircleN->isLabeled())
×
2957
        {
2958
                precessionCircleN->setLabeled(displayed);
×
2959
                precessionCircleS->setLabeled(displayed);
×
2960
                StelApp::immediateSave("viewing/flag_precession_labels", displayed);
×
UNCOV
2961
                emit precessionPartsLabeledChanged(displayed);
×
2962
        }
UNCOV
2963
}
×
2964
//! Get flag for displaying Precession Circle partitions
UNCOV
2965
bool GridLinesMgr::getFlagPrecessionLabeled() const
×
2966
{
2967
        // precessionCircleS is always synchronous, no separate queries.
UNCOV
2968
        return precessionCircleN->isLabeled();
×
2969
}
UNCOV
2970
Vec3f GridLinesMgr::getColorPrecessionCircles() const
×
2971
{
UNCOV
2972
        return precessionCircleN->getColor();
×
2973
}
UNCOV
2974
void GridLinesMgr::setColorPrecessionCircles(const Vec3f& newColor)
×
2975
{
UNCOV
2976
        if(newColor != precessionCircleN->getColor())
×
2977
        {
2978
                precessionCircleN->setColor(newColor);
×
2979
                precessionCircleS->setColor(newColor);
×
UNCOV
2980
                emit precessionCirclesColorChanged(newColor);
×
2981
        }
UNCOV
2982
}
×
2983

2984
//! Set flag for displaying Meridian Line
UNCOV
2985
void GridLinesMgr::setFlagMeridianLine(const bool displayed)
×
2986
{
UNCOV
2987
        if(displayed != meridianLine->isDisplayed())
×
2988
        {
2989
                meridianLine->setDisplayed(displayed);
×
2990
                StelApp::immediateSave("viewing/flag_meridian_line", displayed);
×
UNCOV
2991
                emit meridianLineDisplayedChanged(displayed);
×
2992
        }
UNCOV
2993
}
×
2994
//! Get flag for displaying Meridian Line
UNCOV
2995
bool GridLinesMgr::getFlagMeridianLine() const
×
2996
{
UNCOV
2997
        return meridianLine->isDisplayed();
×
2998
}
2999
//! Set flag for displaying Meridian Line partitions
UNCOV
3000
void GridLinesMgr::setFlagMeridianParts(const bool displayed)
×
3001
{
UNCOV
3002
        if(displayed != meridianLine->showsPartitions())
×
3003
        {
3004
                meridianLine->setPartitions(displayed);
×
3005
                StelApp::immediateSave("viewing/flag_meridian_parts", displayed);
×
UNCOV
3006
                emit meridianPartsDisplayedChanged(displayed);
×
3007
        }
UNCOV
3008
}
×
3009
//! Get flag for displaying Meridian Line partitions
UNCOV
3010
bool GridLinesMgr::getFlagMeridianParts() const
×
3011
{
UNCOV
3012
        return meridianLine->showsPartitions();
×
3013
}
3014
//! Set flag for displaying Meridian Line partitions
UNCOV
3015
void GridLinesMgr::setFlagMeridianLabeled(const bool displayed)
×
3016
{
UNCOV
3017
        if(displayed != meridianLine->isLabeled())
×
3018
        {
3019
                meridianLine->setLabeled(displayed);
×
3020
                StelApp::immediateSave("viewing/flag_meridian_labels", displayed);
×
UNCOV
3021
                emit meridianPartsLabeledChanged(displayed);
×
3022
        }
UNCOV
3023
}
×
3024
//! Get flag for displaying Meridian Line partitions
UNCOV
3025
bool GridLinesMgr::getFlagMeridianLabeled() const
×
3026
{
UNCOV
3027
        return meridianLine->isLabeled();
×
3028
}
UNCOV
3029
Vec3f GridLinesMgr::getColorMeridianLine() const
×
3030
{
UNCOV
3031
        return meridianLine->getColor();
×
3032
}
UNCOV
3033
void GridLinesMgr::setColorMeridianLine(const Vec3f& newColor)
×
3034
{
UNCOV
3035
        if(newColor != meridianLine->getColor())
×
3036
        {
3037
                meridianLine->setColor(newColor);
×
UNCOV
3038
                emit meridianLineColorChanged(newColor);
×
3039
        }
UNCOV
3040
}
×
3041

3042
//! Set flag for displaying opposition/conjunction longitude line
UNCOV
3043
void GridLinesMgr::setFlagLongitudeLine(const bool displayed)
×
3044
{
UNCOV
3045
        if(displayed != longitudeLine->isDisplayed())
×
3046
        {
3047
                longitudeLine->setDisplayed(displayed);
×
3048
                StelApp::immediateSave("viewing/flag_longitude_line", displayed);
×
UNCOV
3049
                emit longitudeLineDisplayedChanged(displayed);
×
3050
        }
UNCOV
3051
}
×
3052
//! Get flag for displaying opposition/conjunction longitude line
UNCOV
3053
bool GridLinesMgr::getFlagLongitudeLine() const
×
3054
{
UNCOV
3055
        return longitudeLine->isDisplayed();
×
3056
}
3057
//! Set flag for displaying opposition/conjunction longitude line partitions
UNCOV
3058
void GridLinesMgr::setFlagLongitudeParts(const bool displayed)
×
3059
{
UNCOV
3060
        if(displayed != longitudeLine->showsPartitions())
×
3061
        {
3062
                longitudeLine->setPartitions(displayed);
×
3063
                StelApp::immediateSave("viewing/flag_longitude_parts", displayed);
×
UNCOV
3064
                emit longitudePartsDisplayedChanged(displayed);
×
3065
        }
UNCOV
3066
}
×
3067
//! Get flag for displaying opposition/conjunction longitude line partitions
UNCOV
3068
bool GridLinesMgr::getFlagLongitudeParts() const
×
3069
{
UNCOV
3070
        return longitudeLine->showsPartitions();
×
3071
}
3072
//! Set flag for displaying opposition/conjunction longitude line partitions
UNCOV
3073
void GridLinesMgr::setFlagLongitudeLabeled(const bool displayed)
×
3074
{
UNCOV
3075
        if(displayed != longitudeLine->isLabeled())
×
3076
        {
3077
                longitudeLine->setLabeled(displayed);
×
3078
                StelApp::immediateSave("viewing/flag_longitude_labels", displayed);
×
UNCOV
3079
                emit longitudePartsLabeledChanged(displayed);
×
3080
        }
3081
}
×
UNCOV
3082
bool GridLinesMgr::getFlagLongitudeLabeled() const
×
3083
{
UNCOV
3084
        return longitudeLine->isLabeled();
×
3085
}
UNCOV
3086
Vec3f GridLinesMgr::getColorLongitudeLine() const
×
3087
{
UNCOV
3088
        return longitudeLine->getColor();
×
3089
}
UNCOV
3090
void GridLinesMgr::setColorLongitudeLine(const Vec3f& newColor)
×
3091
{
UNCOV
3092
        if(newColor != longitudeLine->getColor())
×
3093
        {
3094
                longitudeLine->setColor(newColor);
×
UNCOV
3095
                emit longitudeLineColorChanged(newColor);
×
3096
        }
UNCOV
3097
}
×
3098

3099
//! Set flag for displaying quadrature line
UNCOV
3100
void GridLinesMgr::setFlagQuadratureLine(const bool displayed)
×
3101
{
UNCOV
3102
        if(displayed != quadratureLine->isDisplayed())
×
3103
        {
3104
                quadratureLine->setDisplayed(displayed);
×
3105
                StelApp::immediateSave("viewing/flag_quadrature_line", displayed);
×
UNCOV
3106
                emit quadratureLineDisplayedChanged(displayed);
×
3107
        }
UNCOV
3108
}
×
3109
//! Get flag for displaying quadrature line
UNCOV
3110
bool GridLinesMgr::getFlagQuadratureLine() const
×
3111
{
UNCOV
3112
        return quadratureLine->isDisplayed();
×
3113
}
UNCOV
3114
Vec3f GridLinesMgr::getColorQuadratureLine() const
×
3115
{
UNCOV
3116
        return quadratureLine->getColor();
×
3117
}
UNCOV
3118
void GridLinesMgr::setColorQuadratureLine(const Vec3f& newColor)
×
3119
{
UNCOV
3120
        if(newColor != quadratureLine->getColor())
×
3121
        {
3122
                quadratureLine->setColor(newColor);
×
UNCOV
3123
                emit quadratureLineColorChanged(newColor);
×
3124
        }
UNCOV
3125
}
×
3126

3127
//! Set flag for displaying Horizon Line
UNCOV
3128
void GridLinesMgr::setFlagHorizonLine(const bool displayed)
×
3129
{
UNCOV
3130
        if(displayed != horizonLine->isDisplayed())
×
3131
        {
3132
                horizonLine->setDisplayed(displayed);
×
3133
                StelApp::immediateSave("viewing/flag_horizon_line", displayed);
×
UNCOV
3134
                emit horizonLineDisplayedChanged(displayed);
×
3135
        }
UNCOV
3136
}
×
3137
//! Get flag for displaying Horizon Line
UNCOV
3138
bool GridLinesMgr::getFlagHorizonLine() const
×
3139
{
UNCOV
3140
        return horizonLine->isDisplayed();
×
3141
}
3142
//! Set flag for displaying Horizon Line partitions
UNCOV
3143
void GridLinesMgr::setFlagHorizonParts(const bool displayed)
×
3144
{
UNCOV
3145
        if(displayed != horizonLine->showsPartitions())
×
3146
        {
3147
                horizonLine->setPartitions(displayed);
×
3148
                StelApp::immediateSave("viewing/flag_horizon_parts", displayed);
×
UNCOV
3149
                emit horizonPartsDisplayedChanged(displayed);
×
3150
        }
UNCOV
3151
}
×
3152
//! Get flag for displaying Horizon Line partitions
UNCOV
3153
bool GridLinesMgr::getFlagHorizonParts() const
×
3154
{
UNCOV
3155
        return horizonLine->showsPartitions();
×
3156
}
3157
//! Set flag for displaying Horizon Line partitions
UNCOV
3158
void GridLinesMgr::setFlagHorizonLabeled(const bool displayed)
×
3159
{
UNCOV
3160
        if(displayed != horizonLine->isLabeled())
×
3161
        {
3162
                horizonLine->setLabeled(displayed);
×
3163
                StelApp::immediateSave("viewing/flag_horizon_labels", displayed);
×
UNCOV
3164
                emit horizonPartsLabeledChanged(displayed);
×
3165
        }
UNCOV
3166
}
×
3167
//! Get flag for displaying Horizon Line partitions
UNCOV
3168
bool GridLinesMgr::getFlagHorizonLabeled() const
×
3169
{
UNCOV
3170
        return horizonLine->isLabeled();
×
3171
}
UNCOV
3172
Vec3f GridLinesMgr::getColorHorizonLine() const
×
3173
{
UNCOV
3174
        return horizonLine->getColor();
×
3175
}
UNCOV
3176
void GridLinesMgr::setColorHorizonLine(const Vec3f& newColor)
×
3177
{
UNCOV
3178
        if(newColor != horizonLine->getColor())
×
3179
        {
3180
                horizonLine->setColor(newColor);
×
UNCOV
3181
                emit horizonLineColorChanged(newColor);
×
3182
        }
UNCOV
3183
}
×
3184

3185
//! Set flag for displaying Galactic Equator Line
UNCOV
3186
void GridLinesMgr::setFlagGalacticEquatorLine(const bool displayed)
×
3187
{
UNCOV
3188
        if(displayed != galacticEquatorLine->isDisplayed())
×
3189
        {
3190
                galacticEquatorLine->setDisplayed(displayed);
×
3191
                StelApp::immediateSave("viewing/flag_galactic_equator_line", displayed);
×
UNCOV
3192
                emit galacticEquatorLineDisplayedChanged(displayed);
×
3193
        }
UNCOV
3194
}
×
3195
//! Get flag for displaying Galactic Equator Line
UNCOV
3196
bool GridLinesMgr::getFlagGalacticEquatorLine() const
×
3197
{
UNCOV
3198
        return galacticEquatorLine->isDisplayed();
×
3199
}
3200
//! Set flag for displaying Galactic Equator Line partitions
UNCOV
3201
void GridLinesMgr::setFlagGalacticEquatorParts(const bool displayed)
×
3202
{
UNCOV
3203
        if(displayed != galacticEquatorLine->showsPartitions())
×
3204
        {
3205
                galacticEquatorLine->setPartitions(displayed);
×
3206
                StelApp::immediateSave("viewing/flag_galactic_equator_parts", displayed);
×
UNCOV
3207
                emit galacticEquatorPartsDisplayedChanged(displayed);
×
3208
        }
UNCOV
3209
}
×
3210
//! Get flag for displaying Galactic Equator Line partitions
UNCOV
3211
bool GridLinesMgr::getFlagGalacticEquatorParts() const
×
3212
{
UNCOV
3213
        return galacticEquatorLine->showsPartitions();
×
3214
}
3215
//! Set flag for displaying Galactic Equator Line partitions
UNCOV
3216
void GridLinesMgr::setFlagGalacticEquatorLabeled(const bool displayed)
×
3217
{
UNCOV
3218
        if(displayed != galacticEquatorLine->isLabeled())
×
3219
        {
3220
                galacticEquatorLine->setLabeled(displayed);
×
3221
                StelApp::immediateSave("viewing/flag_galactic_equator_labels", displayed);
×
UNCOV
3222
                emit galacticEquatorPartsLabeledChanged(displayed);
×
3223
        }
UNCOV
3224
}
×
3225
//! Get flag for displaying Galactic Equator Line partitions
UNCOV
3226
bool GridLinesMgr::getFlagGalacticEquatorLabeled() const
×
3227
{
UNCOV
3228
        return galacticEquatorLine->isLabeled();
×
3229
}
UNCOV
3230
Vec3f GridLinesMgr::getColorGalacticEquatorLine() const
×
3231
{
UNCOV
3232
        return galacticEquatorLine->getColor();
×
3233
}
UNCOV
3234
void GridLinesMgr::setColorGalacticEquatorLine(const Vec3f& newColor)
×
3235
{
UNCOV
3236
        if(newColor != galacticEquatorLine->getColor())
×
3237
        {
3238
                galacticEquatorLine->setColor(newColor);
×
UNCOV
3239
                emit galacticEquatorLineColorChanged(newColor);
×
3240
        }
UNCOV
3241
}
×
3242

3243
//! Set flag for displaying Supergalactic Equator Line
UNCOV
3244
void GridLinesMgr::setFlagSupergalacticEquatorLine(const bool displayed)
×
3245
{
UNCOV
3246
        if(displayed != supergalacticEquatorLine->isDisplayed())
×
3247
        {
3248
                supergalacticEquatorLine->setDisplayed(displayed);
×
3249
                StelApp::immediateSave("viewing/flag_supergalactic_equator_line", displayed);
×
UNCOV
3250
                emit supergalacticEquatorLineDisplayedChanged(displayed);
×
3251
        }
UNCOV
3252
}
×
3253
//! Get flag for displaying Supergalactic Equator Line
UNCOV
3254
bool GridLinesMgr::getFlagSupergalacticEquatorLine() const
×
3255
{
UNCOV
3256
        return supergalacticEquatorLine->isDisplayed();
×
3257
}
3258
//! Set flag for displaying Supergalactic Equator Line partitions
UNCOV
3259
void GridLinesMgr::setFlagSupergalacticEquatorParts(const bool displayed)
×
3260
{
UNCOV
3261
        if(displayed != supergalacticEquatorLine->showsPartitions())
×
3262
        {
3263
                supergalacticEquatorLine->setPartitions(displayed);
×
3264
                StelApp::immediateSave("viewing/flag_supergalactic_equator_parts", displayed);
×
UNCOV
3265
                emit supergalacticEquatorPartsDisplayedChanged(displayed);
×
3266
        }
UNCOV
3267
}
×
3268
//! Get flag for displaying Supergalactic Equator Line partitions
UNCOV
3269
bool GridLinesMgr::getFlagSupergalacticEquatorParts() const
×
3270
{
UNCOV
3271
        return supergalacticEquatorLine->showsPartitions();
×
3272
}
3273
//! Set flag for displaying Supergalactic Equator Line partitions
UNCOV
3274
void GridLinesMgr::setFlagSupergalacticEquatorLabeled(const bool displayed)
×
3275
{
UNCOV
3276
        if(displayed != supergalacticEquatorLine->isLabeled())
×
3277
        {
3278
                supergalacticEquatorLine->setLabeled(displayed);
×
3279
                StelApp::immediateSave("viewing/flag_supergalactic_equator_labels", displayed);
×
UNCOV
3280
                emit supergalacticEquatorPartsLabeledChanged(displayed);
×
3281
        }
UNCOV
3282
}
×
3283
//! Get flag for displaying Supergalactic Equator Line partitions
UNCOV
3284
bool GridLinesMgr::getFlagSupergalacticEquatorLabeled() const
×
3285
{
UNCOV
3286
        return supergalacticEquatorLine->isLabeled();
×
3287
}
UNCOV
3288
Vec3f GridLinesMgr::getColorSupergalacticEquatorLine() const
×
3289
{
UNCOV
3290
        return supergalacticEquatorLine->getColor();
×
3291
}
UNCOV
3292
void GridLinesMgr::setColorSupergalacticEquatorLine(const Vec3f& newColor)
×
3293
{
UNCOV
3294
        if(newColor != supergalacticEquatorLine->getColor())
×
3295
        {
3296
                supergalacticEquatorLine->setColor(newColor);
×
UNCOV
3297
                emit supergalacticEquatorLineColorChanged(newColor);
×
3298
        }
UNCOV
3299
}
×
3300

3301
//! Set flag for displaying Prime Vertical Line
UNCOV
3302
void GridLinesMgr::setFlagPrimeVerticalLine(const bool displayed)
×
3303
{
UNCOV
3304
        if(displayed != primeVerticalLine->isDisplayed())
×
3305
        {
3306
                primeVerticalLine->setDisplayed(displayed);
×
3307
                StelApp::immediateSave("viewing/flag_prime_vertical_line", displayed);
×
UNCOV
3308
                emit  primeVerticalLineDisplayedChanged(displayed);
×
3309
        }
UNCOV
3310
}
×
3311
//! Get flag for displaying Prime Vertical Line
UNCOV
3312
bool GridLinesMgr::getFlagPrimeVerticalLine() const
×
3313
{
UNCOV
3314
        return primeVerticalLine->isDisplayed();
×
3315
}
3316
//! Set flag for displaying Prime Vertical Line partitions
UNCOV
3317
void GridLinesMgr::setFlagPrimeVerticalParts(const bool displayed)
×
3318
{
UNCOV
3319
        if(displayed != primeVerticalLine->showsPartitions())
×
3320
        {
3321
                primeVerticalLine->setPartitions(displayed);
×
3322
                StelApp::immediateSave("viewing/flag_prime_vertical_parts", displayed);
×
UNCOV
3323
                emit  primeVerticalPartsDisplayedChanged(displayed);
×
3324
        }
UNCOV
3325
}
×
3326
//! Get flag for displaying Prime Vertical Line partitions
UNCOV
3327
bool GridLinesMgr::getFlagPrimeVerticalParts() const
×
3328
{
UNCOV
3329
        return primeVerticalLine->showsPartitions();
×
3330
}
3331
//! Set flag for displaying Prime Vertical Line partitions
UNCOV
3332
void GridLinesMgr::setFlagPrimeVerticalLabeled(const bool displayed)
×
3333
{
UNCOV
3334
        if(displayed != primeVerticalLine->isLabeled())
×
3335
        {
3336
                primeVerticalLine->setLabeled(displayed);
×
3337
                StelApp::immediateSave("viewing/flag_prime_vertical_labels", displayed);
×
UNCOV
3338
                emit  primeVerticalPartsLabeledChanged(displayed);
×
3339
        }
UNCOV
3340
}
×
3341
//! Get flag for displaying Prime Vertical Line partitions
UNCOV
3342
bool GridLinesMgr::getFlagPrimeVerticalLabeled() const
×
3343
{
UNCOV
3344
        return primeVerticalLine->isLabeled();
×
3345
}
UNCOV
3346
Vec3f GridLinesMgr::getColorPrimeVerticalLine() const
×
3347
{
UNCOV
3348
        return primeVerticalLine->getColor();
×
3349
}
UNCOV
3350
void GridLinesMgr::setColorPrimeVerticalLine(const Vec3f& newColor)
×
3351
{
UNCOV
3352
        if(newColor != primeVerticalLine->getColor())
×
3353
        {
3354
                primeVerticalLine->setColor(newColor);
×
UNCOV
3355
                emit primeVerticalLineColorChanged(newColor);
×
3356
        }
UNCOV
3357
}
×
3358

3359
//! Set flag for displaying Current Vertical Line
UNCOV
3360
void GridLinesMgr::setFlagCurrentVerticalLine(const bool displayed)
×
3361
{
UNCOV
3362
        if(displayed != currentVerticalLine->isDisplayed())
×
3363
        {
3364
                currentVerticalLine->setDisplayed(displayed);
×
3365
                StelApp::immediateSave("viewing/flag_current_vertical_line", displayed);
×
UNCOV
3366
                emit  currentVerticalLineDisplayedChanged(displayed);
×
3367
        }
UNCOV
3368
}
×
3369
//! Get flag for displaying Current Vertical Line
UNCOV
3370
bool GridLinesMgr::getFlagCurrentVerticalLine() const
×
3371
{
UNCOV
3372
        return currentVerticalLine->isDisplayed();
×
3373
}
3374
//! Set flag for displaying Current Vertical Line partitions
UNCOV
3375
void GridLinesMgr::setFlagCurrentVerticalParts(const bool displayed)
×
3376
{
UNCOV
3377
        if(displayed != currentVerticalLine->showsPartitions())
×
3378
        {
3379
                currentVerticalLine->setPartitions(displayed);
×
3380
                StelApp::immediateSave("viewing/flag_current_vertical_parts", displayed);
×
UNCOV
3381
                emit  currentVerticalPartsDisplayedChanged(displayed);
×
3382
        }
UNCOV
3383
}
×
3384
//! Get flag for displaying Current Vertical Line partitions
UNCOV
3385
bool GridLinesMgr::getFlagCurrentVerticalParts() const
×
3386
{
UNCOV
3387
        return currentVerticalLine->showsPartitions();
×
3388
}
3389
//! Set flag for displaying Current Vertical Line partitions
UNCOV
3390
void GridLinesMgr::setFlagCurrentVerticalLabeled(const bool displayed)
×
3391
{
UNCOV
3392
        if(displayed != currentVerticalLine->isLabeled())
×
3393
        {
3394
                currentVerticalLine->setLabeled(displayed);
×
3395
                StelApp::immediateSave("viewing/flag_current_vertical_labels", displayed);
×
UNCOV
3396
                emit  currentVerticalPartsLabeledChanged(displayed);
×
3397
        }
UNCOV
3398
}
×
3399
//! Get flag for displaying Current Vertical Line partitions
UNCOV
3400
bool GridLinesMgr::getFlagCurrentVerticalLabeled() const
×
3401
{
UNCOV
3402
        return currentVerticalLine->isLabeled();
×
3403
}
UNCOV
3404
Vec3f GridLinesMgr::getColorCurrentVerticalLine() const
×
3405
{
UNCOV
3406
        return currentVerticalLine->getColor();
×
3407
}
UNCOV
3408
void GridLinesMgr::setColorCurrentVerticalLine(const Vec3f& newColor)
×
3409
{
UNCOV
3410
        if(newColor != currentVerticalLine->getColor())
×
3411
        {
3412
                currentVerticalLine->setColor(newColor);
×
UNCOV
3413
                emit currentVerticalLineColorChanged(newColor);
×
3414
        }
UNCOV
3415
}
×
3416

3417
//! Set flag for displaying Colure Lines
UNCOV
3418
void GridLinesMgr::setFlagColureLines(const bool displayed)
×
3419
{
UNCOV
3420
        if(displayed != colureLine_1->isDisplayed())
×
3421
        {
3422
                colureLine_1->setDisplayed(displayed);
×
3423
                colureLine_2->setDisplayed(displayed);
×
3424
                StelApp::immediateSave("viewing/flag_colure_lines", displayed);
×
UNCOV
3425
                emit  colureLinesDisplayedChanged(displayed);
×
3426
        }
UNCOV
3427
}
×
3428
//! Get flag for displaying Colure Lines
UNCOV
3429
bool GridLinesMgr::getFlagColureLines() const
×
3430
{
UNCOV
3431
        return colureLine_1->isDisplayed();
×
3432
}
3433
//! Set flag for displaying Colure Line partitions
UNCOV
3434
void GridLinesMgr::setFlagColureParts(const bool displayed)
×
3435
{
UNCOV
3436
        if(displayed != colureLine_1->showsPartitions())
×
3437
        {
3438
                colureLine_1->setPartitions(displayed);
×
3439
                colureLine_2->setPartitions(displayed);
×
3440
                StelApp::immediateSave("viewing/flag_colure_parts", displayed);
×
UNCOV
3441
                emit  colurePartsDisplayedChanged(displayed);
×
3442
        }
UNCOV
3443
}
×
3444
//! Get flag for displaying Colure Line partitions
UNCOV
3445
bool GridLinesMgr::getFlagColureParts() const
×
3446
{
UNCOV
3447
        return colureLine_1->showsPartitions();
×
3448
}
UNCOV
3449
void GridLinesMgr::setFlagColureLabeled(const bool displayed)
×
3450
{
UNCOV
3451
        if(displayed != colureLine_1->isLabeled())
×
3452
        {
3453
                colureLine_1->setLabeled(displayed);
×
3454
                colureLine_2->setLabeled(displayed);
×
3455
                StelApp::immediateSave("viewing/flag_colure_labels", displayed);
×
UNCOV
3456
                emit  colurePartsLabeledChanged(displayed);
×
3457
        }
UNCOV
3458
}
×
3459
//! Get flag for displaying Colure Line partitions
UNCOV
3460
bool GridLinesMgr::getFlagColureLabeled() const
×
3461
{
UNCOV
3462
        return colureLine_1->isLabeled();
×
3463
}
UNCOV
3464
Vec3f GridLinesMgr::getColorColureLines() const
×
3465
{
UNCOV
3466
        return colureLine_1->getColor();
×
3467
}
UNCOV
3468
void GridLinesMgr::setColorColureLines(const Vec3f& newColor)
×
3469
{
UNCOV
3470
        if(newColor != colureLine_1->getColor())
×
3471
        {
3472
                colureLine_1->setColor(newColor);
×
3473
                colureLine_2->setColor(newColor);
×
UNCOV
3474
                emit colureLinesColorChanged(newColor);
×
3475
        }
UNCOV
3476
}
×
3477

3478
//! Set flag for displaying Circumpolar Circles
UNCOV
3479
void GridLinesMgr::setFlagCircumpolarCircles(const bool displayed)
×
3480
{
UNCOV
3481
        if(displayed != circumpolarCircleN->isDisplayed())
×
3482
        {
3483
                circumpolarCircleN->setDisplayed(displayed);
×
3484
                circumpolarCircleS->setDisplayed(displayed);
×
3485
                StelApp::immediateSave("viewing/flag_circumpolar_circles", displayed);
×
UNCOV
3486
                emit circumpolarCirclesDisplayedChanged(displayed);
×
3487
        }
UNCOV
3488
}
×
3489
//! Get flag for displaying Circumpolar Circles
UNCOV
3490
bool GridLinesMgr::getFlagCircumpolarCircles() const
×
3491
{
3492
        // circumpolarCircleS is always synchronous, no separate queries.
UNCOV
3493
        return circumpolarCircleN->isDisplayed();
×
3494
}
UNCOV
3495
Vec3f GridLinesMgr::getColorCircumpolarCircles() const
×
3496
{
UNCOV
3497
        return circumpolarCircleN->getColor();
×
3498
}
UNCOV
3499
void GridLinesMgr::setColorCircumpolarCircles(const Vec3f& newColor)
×
3500
{
UNCOV
3501
        if(newColor != circumpolarCircleN->getColor())
×
3502
        {
3503
                circumpolarCircleN->setColor(newColor);
×
3504
                circumpolarCircleS->setColor(newColor);
×
UNCOV
3505
                emit circumpolarCirclesColorChanged(newColor);
×
3506
        }
UNCOV
3507
}
×
3508

3509
//! Set flag for displaying Umbra Circle
UNCOV
3510
void GridLinesMgr::setFlagUmbraCircle(const bool displayed)
×
3511
{
UNCOV
3512
        if(displayed != umbraCircle->isDisplayed())
×
3513
        {
3514
                umbraCircle->setDisplayed(displayed);
×
3515
                StelApp::immediateSave("viewing/flag_umbra_circle", displayed);
×
UNCOV
3516
                emit umbraCircleDisplayedChanged(displayed);
×
3517
        }
UNCOV
3518
}
×
3519
//! Get flag for displaying Umbra Circle
UNCOV
3520
bool GridLinesMgr::getFlagUmbraCircle() const
×
3521
{
UNCOV
3522
        return umbraCircle->isDisplayed();
×
3523
}
UNCOV
3524
Vec3f GridLinesMgr::getColorUmbraCircle() const
×
3525
{
UNCOV
3526
        return umbraCircle->getColor();
×
3527
}
UNCOV
3528
void GridLinesMgr::setColorUmbraCircle(const Vec3f& newColor)
×
3529
{
UNCOV
3530
        if(newColor != umbraCircle->getColor())
×
3531
        {
3532
                umbraCircle->setColor(newColor);
×
3533
                umbraCenterPoint->setColor(newColor);
×
UNCOV
3534
                emit umbraCircleColorChanged(newColor);
×
3535
        }
UNCOV
3536
}
×
3537

3538
//! Set flag for displaying Penumbra Circle
UNCOV
3539
void GridLinesMgr::setFlagPenumbraCircle(const bool displayed)
×
3540
{
UNCOV
3541
        if(displayed != penumbraCircle->isDisplayed())
×
3542
        {
3543
                penumbraCircle->setDisplayed(displayed);
×
3544
                StelApp::immediateSave("viewing/flag_penumbra_circle", displayed);
×
UNCOV
3545
                emit penumbraCircleDisplayedChanged(displayed);
×
3546
        }
UNCOV
3547
}
×
3548
//! Get flag for displaying Penumbra Circle
UNCOV
3549
bool GridLinesMgr::getFlagPenumbraCircle() const
×
3550
{
UNCOV
3551
        return penumbraCircle->isDisplayed();
×
3552
}
UNCOV
3553
Vec3f GridLinesMgr::getColorPenumbraCircle() const
×
3554
{
UNCOV
3555
        return penumbraCircle->getColor();
×
3556
}
UNCOV
3557
void GridLinesMgr::setColorPenumbraCircle(const Vec3f& newColor)
×
3558
{
UNCOV
3559
        if(newColor != penumbraCircle->getColor())
×
3560
        {
3561
                penumbraCircle->setColor(newColor);
×
UNCOV
3562
                emit penumbraCircleColorChanged(newColor);
×
3563
        }
UNCOV
3564
}
×
3565

3566
//! Set flag for displaying celestial poles of J2000
UNCOV
3567
void GridLinesMgr::setFlagCelestialJ2000Poles(const bool displayed)
×
3568
{
UNCOV
3569
        if(displayed != celestialJ2000Poles->isDisplayed())
×
3570
        {
3571
                celestialJ2000Poles->setDisplayed(displayed);
×
3572
                StelApp::immediateSave("viewing/flag_celestial_J2000_poles", displayed);
×
UNCOV
3573
                emit celestialJ2000PolesDisplayedChanged(displayed);
×
3574
        }
UNCOV
3575
}
×
3576
//! Get flag for displaying celestial poles of J2000
UNCOV
3577
bool GridLinesMgr::getFlagCelestialJ2000Poles() const
×
3578
{
UNCOV
3579
        return celestialJ2000Poles->isDisplayed();
×
3580
}
UNCOV
3581
Vec3f GridLinesMgr::getColorCelestialJ2000Poles() const
×
3582
{
UNCOV
3583
        return celestialJ2000Poles->getColor();
×
3584
}
UNCOV
3585
void GridLinesMgr::setColorCelestialJ2000Poles(const Vec3f& newColor)
×
3586
{
UNCOV
3587
        if(newColor != celestialJ2000Poles->getColor())
×
3588
        {
3589
                celestialJ2000Poles->setColor(newColor);
×
UNCOV
3590
                emit celestialJ2000PolesColorChanged(newColor);
×
3591
        }
UNCOV
3592
}
×
3593

3594
//! Set flag for displaying celestial poles
UNCOV
3595
void GridLinesMgr::setFlagCelestialPoles(const bool displayed)
×
3596
{
UNCOV
3597
        if(displayed != celestialPoles->isDisplayed())
×
3598
        {
3599
                celestialPoles->setDisplayed(displayed);
×
3600
                StelApp::immediateSave("viewing/flag_celestial_poles", displayed);
×
UNCOV
3601
                emit celestialPolesDisplayedChanged(displayed);
×
3602
        }
UNCOV
3603
}
×
3604
//! Get flag for displaying celestial poles
UNCOV
3605
bool GridLinesMgr::getFlagCelestialPoles() const
×
3606
{
UNCOV
3607
        return celestialPoles->isDisplayed();
×
3608
}
UNCOV
3609
Vec3f GridLinesMgr::getColorCelestialPoles() const
×
3610
{
UNCOV
3611
        return celestialPoles->getColor();
×
3612
}
UNCOV
3613
void GridLinesMgr::setColorCelestialPoles(const Vec3f& newColor)
×
3614
{
UNCOV
3615
        if(newColor != celestialPoles->getColor())
×
3616
        {
3617
                celestialPoles->setColor(newColor);
×
UNCOV
3618
                emit celestialPolesColorChanged(newColor);
×
3619
        }
UNCOV
3620
}
×
3621

3622
//! Set flag for displaying zenith and nadir
UNCOV
3623
void GridLinesMgr::setFlagZenithNadir(const bool displayed)
×
3624
{
UNCOV
3625
        if(displayed != zenithNadir->isDisplayed())
×
3626
        {
3627
                zenithNadir->setDisplayed(displayed);
×
3628
                StelApp::immediateSave("viewing/flag_zenith_nadir", displayed);
×
UNCOV
3629
                emit zenithNadirDisplayedChanged(displayed);
×
3630
        }
UNCOV
3631
}
×
3632
//! Get flag for displaying zenith and nadir
UNCOV
3633
bool GridLinesMgr::getFlagZenithNadir() const
×
3634
{
UNCOV
3635
        return zenithNadir->isDisplayed();
×
3636
}
UNCOV
3637
Vec3f GridLinesMgr::getColorZenithNadir() const
×
3638
{
UNCOV
3639
        return zenithNadir->getColor();
×
3640
}
UNCOV
3641
void GridLinesMgr::setColorZenithNadir(const Vec3f& newColor)
×
3642
{
UNCOV
3643
        if(newColor != zenithNadir->getColor())
×
3644
        {
3645
                zenithNadir->setColor(newColor);
×
UNCOV
3646
                emit zenithNadirColorChanged(newColor);
×
3647
        }
UNCOV
3648
}
×
3649

3650
//! Set flag for displaying ecliptic poles of J2000
UNCOV
3651
void GridLinesMgr::setFlagEclipticJ2000Poles(const bool displayed)
×
3652
{
UNCOV
3653
        if(displayed != eclipticJ2000Poles->isDisplayed())
×
3654
        {
3655
                eclipticJ2000Poles->setDisplayed(displayed);
×
3656
                StelApp::immediateSave("viewing/flag_ecliptic_J2000_poles", displayed);
×
UNCOV
3657
                emit eclipticJ2000PolesDisplayedChanged(displayed);
×
3658
        }
UNCOV
3659
}
×
3660
//! Get flag for displaying ecliptic poles of J2000
UNCOV
3661
bool GridLinesMgr::getFlagEclipticJ2000Poles() const
×
3662
{
UNCOV
3663
        return eclipticJ2000Poles->isDisplayed();
×
3664
}
UNCOV
3665
Vec3f GridLinesMgr::getColorEclipticJ2000Poles() const
×
3666
{
UNCOV
3667
        return eclipticJ2000Poles->getColor();
×
3668
}
UNCOV
3669
void GridLinesMgr::setColorEclipticJ2000Poles(const Vec3f& newColor)
×
3670
{
UNCOV
3671
        if(newColor != eclipticJ2000Poles->getColor())
×
3672
        {
3673
                eclipticJ2000Poles->setColor(newColor);
×
UNCOV
3674
                emit eclipticJ2000PolesColorChanged(newColor);
×
3675
        }
UNCOV
3676
}
×
3677

3678
//! Set flag for displaying ecliptic poles
UNCOV
3679
void GridLinesMgr::setFlagEclipticPoles(const bool displayed)
×
3680
{
UNCOV
3681
        if(displayed != eclipticPoles->isDisplayed())
×
3682
        {
3683
                eclipticPoles->setDisplayed(displayed);
×
3684
                StelApp::immediateSave("viewing/flag_ecliptic_poles", displayed);
×
UNCOV
3685
                emit eclipticPolesDisplayedChanged(displayed);
×
3686
        }
UNCOV
3687
}
×
3688
//! Get flag for displaying ecliptic poles
UNCOV
3689
bool GridLinesMgr::getFlagEclipticPoles() const
×
3690
{
UNCOV
3691
        return eclipticPoles->isDisplayed();
×
3692
}
UNCOV
3693
Vec3f GridLinesMgr::getColorEclipticPoles() const
×
3694
{
UNCOV
3695
        return eclipticPoles->getColor();
×
3696
}
UNCOV
3697
void GridLinesMgr::setColorEclipticPoles(const Vec3f& newColor)
×
3698
{
UNCOV
3699
        if(newColor != eclipticPoles->getColor())
×
3700
        {
3701
                eclipticPoles->setColor(newColor);
×
UNCOV
3702
                emit eclipticPolesColorChanged(newColor);
×
3703
        }
UNCOV
3704
}
×
3705

3706
//! Set flag for displaying galactic poles
UNCOV
3707
void GridLinesMgr::setFlagGalacticPoles(const bool displayed)
×
3708
{
UNCOV
3709
        if(displayed != galacticPoles->isDisplayed())
×
3710
        {
3711
                galacticPoles->setDisplayed(displayed);
×
3712
                StelApp::immediateSave("viewing/flag_galactic_poles", displayed);
×
UNCOV
3713
                emit galacticPolesDisplayedChanged(displayed);
×
3714
        }
UNCOV
3715
}
×
3716
//! Get flag for displaying galactic poles
UNCOV
3717
bool GridLinesMgr::getFlagGalacticPoles() const
×
3718
{
UNCOV
3719
        return galacticPoles->isDisplayed();
×
3720
}
UNCOV
3721
Vec3f GridLinesMgr::getColorGalacticPoles() const
×
3722
{
UNCOV
3723
        return galacticPoles->getColor();
×
3724
}
UNCOV
3725
void GridLinesMgr::setColorGalacticPoles(const Vec3f& newColor)
×
3726
{
UNCOV
3727
        if(newColor != galacticPoles->getColor())
×
3728
        {
3729
                galacticPoles->setColor(newColor);
×
UNCOV
3730
                emit galacticPolesColorChanged(newColor);
×
3731
        }
UNCOV
3732
}
×
3733

3734
//! Set flag for displaying galactic center and anticenter markers
UNCOV
3735
void GridLinesMgr::setFlagGalacticCenter(const bool displayed)
×
3736
{
UNCOV
3737
        if(displayed != galacticCenter->isDisplayed())
×
3738
        {
3739
                galacticCenter->setDisplayed(displayed);
×
3740
                StelApp::immediateSave("viewing//flag_galactic_center", displayed);
×
UNCOV
3741
                emit galacticCenterDisplayedChanged(displayed);
×
3742
        }
UNCOV
3743
}
×
3744
//! Get flag for displaying galactic center and anticenter markers
UNCOV
3745
bool GridLinesMgr::getFlagGalacticCenter() const
×
3746
{
UNCOV
3747
        return galacticCenter->isDisplayed();
×
3748
}
UNCOV
3749
Vec3f GridLinesMgr::getColorGalacticCenter() const
×
3750
{
UNCOV
3751
        return galacticCenter->getColor();
×
3752
}
UNCOV
3753
void GridLinesMgr::setColorGalacticCenter(const Vec3f& newColor)
×
3754
{
UNCOV
3755
        if(newColor != galacticCenter->getColor())
×
3756
        {
3757
                galacticCenter->setColor(newColor);
×
UNCOV
3758
                emit galacticCenterColorChanged(newColor);
×
3759
        }
UNCOV
3760
}
×
3761

3762
//! Set flag for displaying supergalactic poles
UNCOV
3763
void GridLinesMgr::setFlagSupergalacticPoles(const bool displayed)
×
3764
{
UNCOV
3765
        if(displayed != supergalacticPoles->isDisplayed())
×
3766
        {
3767
                supergalacticPoles->setDisplayed(displayed);
×
3768
                StelApp::immediateSave("viewing/flag_supergalactic_poles", displayed);
×
UNCOV
3769
                emit supergalacticPolesDisplayedChanged(displayed);
×
3770
        }
UNCOV
3771
}
×
3772
//! Get flag for displaying supergalactic poles
UNCOV
3773
bool GridLinesMgr::getFlagSupergalacticPoles() const
×
3774
{
UNCOV
3775
        return supergalacticPoles->isDisplayed();
×
3776
}
UNCOV
3777
Vec3f GridLinesMgr::getColorSupergalacticPoles() const
×
3778
{
UNCOV
3779
        return supergalacticPoles->getColor();
×
3780
}
UNCOV
3781
void GridLinesMgr::setColorSupergalacticPoles(const Vec3f& newColor)
×
3782
{
UNCOV
3783
        if(newColor != supergalacticPoles->getColor())
×
3784
        {
3785
                supergalacticPoles->setColor(newColor);
×
UNCOV
3786
                emit supergalacticPolesColorChanged(newColor);
×
3787
        }
UNCOV
3788
}
×
3789

3790
//! Set flag for displaying equinox points of J2000
UNCOV
3791
void GridLinesMgr::setFlagEquinoxJ2000Points(const bool displayed)
×
3792
{
UNCOV
3793
        if(displayed != equinoxJ2000Points->isDisplayed())
×
3794
        {
3795
                equinoxJ2000Points->setDisplayed(displayed);
×
3796
                StelApp::immediateSave("viewing/flag_equinox_J2000_points", displayed);
×
UNCOV
3797
                emit equinoxJ2000PointsDisplayedChanged(displayed);
×
3798
        }
UNCOV
3799
}
×
3800
//! Get flag for displaying equinox points of J2000
UNCOV
3801
bool GridLinesMgr::getFlagEquinoxJ2000Points() const
×
3802
{
UNCOV
3803
        return equinoxJ2000Points->isDisplayed();
×
3804
}
UNCOV
3805
Vec3f GridLinesMgr::getColorEquinoxJ2000Points() const
×
3806
{
UNCOV
3807
        return equinoxJ2000Points->getColor();
×
3808
}
UNCOV
3809
void GridLinesMgr::setColorEquinoxJ2000Points(const Vec3f& newColor)
×
3810
{
UNCOV
3811
        if(newColor != equinoxJ2000Points->getColor())
×
3812
        {
3813
                equinoxJ2000Points->setColor(newColor);
×
UNCOV
3814
                emit equinoxJ2000PointsColorChanged(newColor);
×
3815
        }
UNCOV
3816
}
×
3817

3818
//! Set flag for displaying equinox points
UNCOV
3819
void GridLinesMgr::setFlagEquinoxPoints(const bool displayed)
×
3820
{
UNCOV
3821
        if(displayed != equinoxPoints->isDisplayed())
×
3822
        {
3823
                equinoxPoints->setDisplayed(displayed);
×
3824
                StelApp::immediateSave("viewing/flag_equinox_points", displayed);
×
UNCOV
3825
                emit equinoxPointsDisplayedChanged(displayed);
×
3826
        }
UNCOV
3827
}
×
3828
//! Get flag for displaying equinox points
UNCOV
3829
bool GridLinesMgr::getFlagEquinoxPoints() const
×
3830
{
UNCOV
3831
        return equinoxPoints->isDisplayed();
×
3832
}
UNCOV
3833
Vec3f GridLinesMgr::getColorEquinoxPoints() const
×
3834
{
UNCOV
3835
        return equinoxPoints->getColor();
×
3836
}
UNCOV
3837
void GridLinesMgr::setColorEquinoxPoints(const Vec3f& newColor)
×
3838
{
UNCOV
3839
        if(newColor != equinoxPoints->getColor())
×
3840
        {
3841
                equinoxPoints->setColor(newColor);
×
UNCOV
3842
                emit equinoxPointsColorChanged(newColor);
×
3843
        }
UNCOV
3844
}
×
3845

3846
//! Set flag for displaying solstice points of J2000
UNCOV
3847
void GridLinesMgr::setFlagSolsticeJ2000Points(const bool displayed)
×
3848
{
UNCOV
3849
        if(displayed != solsticeJ2000Points->isDisplayed())
×
3850
        {
3851
                solsticeJ2000Points->setDisplayed(displayed);
×
3852
                StelApp::immediateSave("viewing/flag_solstice_J2000_points", displayed);
×
UNCOV
3853
                emit solsticeJ2000PointsDisplayedChanged(displayed);
×
3854
        }
UNCOV
3855
}
×
3856
//! Get flag for displaying solstice points of J2000
UNCOV
3857
bool GridLinesMgr::getFlagSolsticeJ2000Points() const
×
3858
{
UNCOV
3859
        return solsticeJ2000Points->isDisplayed();
×
3860
}
UNCOV
3861
Vec3f GridLinesMgr::getColorSolsticeJ2000Points() const
×
3862
{
UNCOV
3863
        return solsticeJ2000Points->getColor();
×
3864
}
UNCOV
3865
void GridLinesMgr::setColorSolsticeJ2000Points(const Vec3f& newColor)
×
3866
{
UNCOV
3867
        if(newColor != solsticeJ2000Points->getColor())
×
3868
        {
3869
                solsticeJ2000Points->setColor(newColor);
×
UNCOV
3870
                emit solsticeJ2000PointsColorChanged(newColor);
×
3871
        }
UNCOV
3872
}
×
3873

3874
//! Set flag for displaying solstice points
UNCOV
3875
void GridLinesMgr::setFlagSolsticePoints(const bool displayed)
×
3876
{
UNCOV
3877
        if(displayed != solsticePoints->isDisplayed())
×
3878
        {
3879
                solsticePoints->setDisplayed(displayed);
×
3880
                StelApp::immediateSave("viewing/flag_solstice_points", displayed);
×
UNCOV
3881
                emit solsticePointsDisplayedChanged(displayed);
×
3882
        }
UNCOV
3883
}
×
3884
//! Get flag for displaying solstice points
UNCOV
3885
bool GridLinesMgr::getFlagSolsticePoints() const
×
3886
{
UNCOV
3887
        return solsticePoints->isDisplayed();
×
3888
}
UNCOV
3889
Vec3f GridLinesMgr::getColorSolsticePoints() const
×
3890
{
UNCOV
3891
        return solsticePoints->getColor();
×
3892
}
UNCOV
3893
void GridLinesMgr::setColorSolsticePoints(const Vec3f& newColor)
×
3894
{
UNCOV
3895
        if(newColor != solsticePoints->getColor())
×
3896
        {
3897
                solsticePoints->setColor(newColor);
×
UNCOV
3898
                emit solsticePointsColorChanged(newColor);
×
3899
        }
UNCOV
3900
}
×
3901

3902
//! Set flag for displaying antisolar point
UNCOV
3903
void GridLinesMgr::setFlagAntisolarPoint(const bool displayed)
×
3904
{
UNCOV
3905
        if(displayed != antisolarPoint->isDisplayed())
×
3906
        {
3907
                antisolarPoint->setDisplayed(displayed);
×
3908
                StelApp::immediateSave("viewing/flag_antisolar_point", displayed);
×
UNCOV
3909
                emit antisolarPointDisplayedChanged(displayed);
×
3910
        }
UNCOV
3911
}
×
3912
//! Get flag for displaying antisolar point
UNCOV
3913
bool GridLinesMgr::getFlagAntisolarPoint() const
×
3914
{
UNCOV
3915
        return antisolarPoint->isDisplayed();
×
3916
}
UNCOV
3917
Vec3f GridLinesMgr::getColorAntisolarPoint() const
×
3918
{
UNCOV
3919
        return antisolarPoint->getColor();
×
3920
}
UNCOV
3921
void GridLinesMgr::setColorAntisolarPoint(const Vec3f& newColor)
×
3922
{
UNCOV
3923
        if(newColor != antisolarPoint->getColor())
×
3924
        {
3925
                antisolarPoint->setColor(newColor);
×
UNCOV
3926
                emit antisolarPointColorChanged(newColor);
×
3927
        }
UNCOV
3928
}
×
3929

UNCOV
3930
void GridLinesMgr::setFlagUmbraCenterPoint(const bool displayed)
×
3931
{
UNCOV
3932
        if(displayed != umbraCenterPoint->isDisplayed())
×
3933
        {
3934
                umbraCenterPoint->setDisplayed(displayed);
×
3935
                StelApp::immediateSave("viewing/flag_umbra_center_point", displayed);
×
UNCOV
3936
                emit umbraCenterPointDisplayedChanged(displayed);
×
3937
        }
3938
}
×
UNCOV
3939
bool GridLinesMgr::getFlagUmbraCenterPoint() const
×
3940
{
UNCOV
3941
        return umbraCenterPoint->isDisplayed();
×
3942
}
3943

3944
//! Set flag for displaying vector point
UNCOV
3945
void GridLinesMgr::setFlagApexPoints(const bool displayed)
×
3946
{
UNCOV
3947
        if(displayed != apexPoints->isDisplayed())
×
3948
        {
3949
                apexPoints->setDisplayed(displayed);
×
3950
                StelApp::immediateSave("viewing/flag_apex_points", displayed);
×
UNCOV
3951
                emit apexPointsDisplayedChanged(displayed);
×
3952
        }
UNCOV
3953
}
×
3954
//! Get flag for displaying vector point
UNCOV
3955
bool GridLinesMgr::getFlagApexPoints() const
×
3956
{
UNCOV
3957
        return apexPoints->isDisplayed();
×
3958
}
UNCOV
3959
Vec3f GridLinesMgr::getColorApexPoints() const
×
3960
{
UNCOV
3961
        return apexPoints->getColor();
×
3962
}
UNCOV
3963
void GridLinesMgr::setColorApexPoints(const Vec3f& newColor)
×
3964
{
UNCOV
3965
        if(newColor != apexPoints->getColor())
×
3966
        {
3967
                apexPoints->setColor(newColor);
×
UNCOV
3968
                emit apexPointsColorChanged(newColor);
×
3969
        }
UNCOV
3970
}
×
3971

UNCOV
3972
void GridLinesMgr::setLineThickness(const float thickness)
×
3973
{
3974
        float lineThickness = equGrid->getLineThickness();
×
UNCOV
3975
        if (!qFuzzyCompare(lineThickness, thickness))
×
3976
        {
UNCOV
3977
                lineThickness=qBound(1.f, thickness, 5.f);
×
3978
                // Grids
3979
                equGrid->setLineThickness(lineThickness);
×
3980
                equJ2000Grid->setLineThickness(lineThickness);
×
3981
                fixedEquatorialGrid->setLineThickness(lineThickness);
×
3982
                galacticGrid->setLineThickness(lineThickness);
×
3983
                supergalacticGrid->setLineThickness(lineThickness);
×
3984
                eclGrid->setLineThickness(lineThickness);
×
3985
                eclJ2000Grid->setLineThickness(lineThickness);
×
UNCOV
3986
                aziGrid->setLineThickness(lineThickness);
×
3987
                // Lines
3988
                equatorLine->setLineThickness(lineThickness);
×
3989
                equatorJ2000Line->setLineThickness(lineThickness);
×
3990
                fixedEquatorLine->setLineThickness(lineThickness);
×
3991
                eclipticLine->setLineThickness(lineThickness);
×
3992
                eclipticWithDateLine->setLineThickness(lineThickness);
×
3993
                eclipticJ2000Line->setLineThickness(lineThickness);
×
3994
                invariablePlaneLine->setLineThickness(lineThickness);
×
3995
                solarEquatorLine->setLineThickness(lineThickness);
×
3996
                precessionCircleN->setLineThickness(lineThickness);
×
3997
                precessionCircleS->setLineThickness(lineThickness);
×
3998
                meridianLine->setLineThickness(lineThickness);
×
3999
                longitudeLine->setLineThickness(lineThickness);
×
4000
                quadratureLine->setLineThickness(lineThickness);
×
4001
                horizonLine->setLineThickness(lineThickness);
×
4002
                galacticEquatorLine->setLineThickness(lineThickness);
×
4003
                supergalacticEquatorLine->setLineThickness(lineThickness);
×
4004
                primeVerticalLine->setLineThickness(lineThickness);
×
4005
                currentVerticalLine->setLineThickness(lineThickness);
×
4006
                colureLine_1->setLineThickness(lineThickness);
×
4007
                colureLine_2->setLineThickness(lineThickness);
×
4008
                circumpolarCircleN->setLineThickness(lineThickness);
×
4009
                circumpolarCircleS->setLineThickness(lineThickness);
×
4010
                umbraCircle->setLineThickness(lineThickness);
×
UNCOV
4011
                penumbraCircle->setLineThickness(lineThickness);
×
4012

4013
                StelApp::immediateSave("viewing/line_thickness", lineThickness);
×
UNCOV
4014
                emit lineThicknessChanged(lineThickness);
×
4015
        }
UNCOV
4016
}
×
4017

UNCOV
4018
float GridLinesMgr::getLineThickness() const
×
4019
{
UNCOV
4020
        return equGrid->getLineThickness();
×
4021
}
4022

UNCOV
4023
void GridLinesMgr::setPartThickness(const float thickness)
×
4024
{
4025
        float partThickness = equatorLine->getPartThickness();
×
UNCOV
4026
        if (!qFuzzyCompare(partThickness, thickness))
×
4027
        {
UNCOV
4028
                partThickness=qBound(1.f, thickness, 5.f);
×
4029
                // Lines
4030
                equatorLine->setPartThickness(partThickness);
×
4031
                equatorJ2000Line->setPartThickness(partThickness);
×
4032
                fixedEquatorLine->setPartThickness(partThickness);
×
4033
                eclipticLine->setPartThickness(partThickness);
×
4034
                eclipticWithDateLine->setPartThickness(partThickness);
×
UNCOV
4035
                eclipticJ2000Line->setPartThickness(partThickness);
×
4036
                //invariablePlaneLine->setPartThickness(partThickness);
4037
                solarEquatorLine->setPartThickness(partThickness);
×
4038
                precessionCircleN->setPartThickness(partThickness);
×
4039
                precessionCircleS->setPartThickness(partThickness);
×
4040
                meridianLine->setPartThickness(partThickness);
×
4041
                longitudeLine->setPartThickness(partThickness);
×
4042
                horizonLine->setPartThickness(partThickness);
×
4043
                galacticEquatorLine->setPartThickness(partThickness);
×
4044
                supergalacticEquatorLine->setPartThickness(partThickness);
×
4045
                primeVerticalLine->setPartThickness(partThickness);
×
4046
                currentVerticalLine->setPartThickness(partThickness);
×
4047
                colureLine_1->setPartThickness(partThickness);
×
UNCOV
4048
                colureLine_2->setPartThickness(partThickness);
×
4049
                //circumpolarCircleN->setPartThickness(partThickness);
4050
                //circumpolarCircleS->setPartThickness(partThickness);
4051

4052
                StelApp::immediateSave("viewing/part_thickness", partThickness);
×
UNCOV
4053
                emit partThicknessChanged(partThickness);
×
4054
        }
UNCOV
4055
}
×
4056

UNCOV
4057
float GridLinesMgr::getPartThickness() const
×
4058
{
UNCOV
4059
        return equatorLine->getPartThickness();
×
4060
}
4061

UNCOV
4062
void GridLinesMgr::setFontSizeFromApp(int size)
×
4063
{
4064
        const int gridFontSize=size-1;
×
4065
        const int lineFontSize=size+1;
×
UNCOV
4066
        const int pointFontSize=size+1;
×
4067

4068
        equGrid->setFontSize(gridFontSize);
×
4069
        equJ2000Grid->setFontSize(gridFontSize);
×
4070
        fixedEquatorialGrid->setFontSize(gridFontSize);
×
4071
        galacticGrid->setFontSize(gridFontSize);
×
4072
        supergalacticGrid->setFontSize(gridFontSize);
×
4073
        eclGrid->setFontSize(gridFontSize);
×
4074
        eclJ2000Grid->setFontSize(gridFontSize);
×
4075
        aziGrid->setFontSize(gridFontSize);
×
4076
        equatorLine->setFontSize(lineFontSize);
×
4077
        equatorJ2000Line->setFontSize(lineFontSize);
×
4078
        fixedEquatorLine->setFontSize(lineFontSize);
×
4079
        eclipticLine->setFontSize(lineFontSize);
×
4080
        eclipticWithDateLine->setFontSize(lineFontSize);
×
4081
        eclipticJ2000Line->setFontSize(lineFontSize);
×
4082
        invariablePlaneLine->setFontSize(lineFontSize);
×
4083
        solarEquatorLine->setFontSize(lineFontSize);
×
4084
        precessionCircleN->setFontSize(lineFontSize);
×
4085
        precessionCircleS->setFontSize(lineFontSize);
×
4086
        meridianLine->setFontSize(lineFontSize);
×
4087
        longitudeLine->setFontSize(lineFontSize);
×
4088
        quadratureLine->setFontSize(lineFontSize);
×
4089
        horizonLine->setFontSize(lineFontSize);
×
4090
        galacticEquatorLine->setFontSize(lineFontSize);
×
4091
        supergalacticEquatorLine->setFontSize(lineFontSize);
×
4092
        primeVerticalLine->setFontSize(lineFontSize);
×
4093
        currentVerticalLine->setFontSize(lineFontSize);
×
4094
        colureLine_1->setFontSize(lineFontSize);
×
4095
        colureLine_2->setFontSize(lineFontSize);
×
4096
        circumpolarCircleN->setFontSize(lineFontSize);
×
4097
        circumpolarCircleS->setFontSize(lineFontSize);
×
4098
        umbraCircle->setFontSize(lineFontSize);
×
4099
        penumbraCircle->setFontSize(lineFontSize);
×
4100
        celestialJ2000Poles->setFontSize(pointFontSize);
×
4101
        celestialPoles->setFontSize(pointFontSize);
×
4102
        zenithNadir->setFontSize(pointFontSize);
×
4103
        eclipticJ2000Poles->setFontSize(pointFontSize);
×
4104
        eclipticPoles->setFontSize(pointFontSize);
×
4105
        galacticPoles->setFontSize(pointFontSize);
×
4106
        galacticCenter->setFontSize(pointFontSize);
×
4107
        supergalacticPoles->setFontSize(pointFontSize);
×
4108
        equinoxJ2000Points->setFontSize(pointFontSize);
×
4109
        equinoxPoints->setFontSize(pointFontSize);
×
4110
        solsticeJ2000Points->setFontSize(pointFontSize);
×
4111
        solsticePoints->setFontSize(pointFontSize);
×
4112
        apexPoints->setFontSize(pointFontSize);
×
4113
        umbraCenterPoint->setFontSize(pointFontSize);
×
UNCOV
4114
}
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc