1 // SPDX-License-Identifier: LGPL-2.1-or-later
2 //
3 // SPDX-FileCopyrightText: 2012 Rene Kuettner <rene@bitkanal.net>
4 //
5 
6 #include "EclipsesModel.h"
7 
8 #include "EclipsesItem.h"
9 #include "MarbleDebug.h"
10 #include "MarbleClock.h"
11 
12 #include <eclsolar.h>
13 
14 #include <QIcon>
15 
16 namespace Marble
17 {
18 
EclipsesModel(const MarbleModel * model,QObject * parent)19 EclipsesModel::EclipsesModel( const MarbleModel *model, QObject *parent )
20     : QAbstractItemModel( parent ),
21       m_marbleModel( model ),
22       m_currentYear( 0 ),
23       m_withLunarEclipses( false )
24 {
25     m_ecl = new EclSolar();
26     m_ecl->setTimezone( model->clock()->timezone() / 3600. );
27     m_ecl->setLunarEcl( m_withLunarEclipses );
28 
29     // observation point defaults to home location
30     qreal lon, lat;
31     int zoom;
32     m_marbleModel->home( lon, lat, zoom );
33     GeoDataCoordinates homeLocation( lon, lat, 0, GeoDataCoordinates::Degree );
34     setObservationPoint( homeLocation );
35 }
36 
~EclipsesModel()37 EclipsesModel::~EclipsesModel()
38 {
39     clear();
40     delete m_ecl;
41 }
observationPoint() const42 const GeoDataCoordinates& EclipsesModel::observationPoint() const
43 {
44     return m_observationPoint;
45 }
46 
setObservationPoint(const GeoDataCoordinates & coords)47 void EclipsesModel::setObservationPoint( const GeoDataCoordinates &coords )
48 {
49     m_observationPoint = coords;
50     m_ecl->setLocalPos( coords.latitude(), coords.altitude(), 6000. );
51 }
52 
setYear(int year)53 void EclipsesModel::setYear( int year )
54 {
55     if( m_currentYear != year ) {
56 
57         mDebug() << "Year changed - Calculating eclipses...";
58         m_currentYear = year;
59         m_ecl->putYear( year );
60 
61         update();
62     }
63 }
64 
year() const65 int EclipsesModel::year() const
66 {
67     return m_currentYear;
68 }
69 
setWithLunarEclipses(const bool enable)70 void EclipsesModel::setWithLunarEclipses( const bool enable )
71 {
72     if( m_withLunarEclipses != enable ) {
73         m_withLunarEclipses = enable;
74         m_ecl->setLunarEcl( m_withLunarEclipses );
75         update();
76     }
77 }
78 
withLunarEclipses() const79 bool EclipsesModel::withLunarEclipses() const
80 {
81     return m_withLunarEclipses;
82 }
83 
eclipseWithIndex(int index)84 EclipsesItem* EclipsesModel::eclipseWithIndex( int index )
85 {
86     for( EclipsesItem *item: m_items ) {
87         if( item->index() == index ) {
88             return item;
89         }
90     }
91 
92     return nullptr;
93 }
94 
items() const95 QList<EclipsesItem*> EclipsesModel::items() const
96 {
97     return m_items;
98 }
99 
index(int row,int column,const QModelIndex & parent) const100 QModelIndex EclipsesModel::index( int row, int column, const QModelIndex &parent ) const
101 {
102     if( !hasIndex( row, column, parent ) ) {
103         return QModelIndex();
104     }
105 
106     if( row >= m_items.count() ) {
107         return QModelIndex();
108     }
109 
110     return createIndex( row, column, m_items.at( row ) );
111 }
112 
parent(const QModelIndex & index) const113 QModelIndex EclipsesModel::parent( const QModelIndex &index ) const
114 {
115     Q_UNUSED( index );
116     return QModelIndex(); // no parents
117 }
118 
rowCount(const QModelIndex & parent) const119 int EclipsesModel::rowCount( const QModelIndex &parent ) const
120 {
121     Q_UNUSED( parent );
122     return m_items.count();
123 }
124 
columnCount(const QModelIndex & parent) const125 int EclipsesModel::columnCount( const QModelIndex &parent ) const
126 {
127     Q_UNUSED( parent );
128     return 4; // start, end, type magnitude
129 }
130 
data(const QModelIndex & index,int role) const131 QVariant EclipsesModel::data( const QModelIndex &index, int role ) const
132 {
133     if( !index.isValid() ) {
134         return QVariant();
135     }
136 
137     Q_ASSERT( index.column() < 4 );
138 
139     EclipsesItem *item = static_cast<EclipsesItem*>( index.internalPointer() );
140     if( role == Qt::DisplayRole ) {
141         switch( index.column() ) {
142             case 0: return QVariant( item->startDatePartial() );
143             case 1: return QVariant( item->endDatePartial() );
144             case 2: return QVariant( item->phaseText() );
145             case 3: return QVariant( item->magnitude() );
146             default: break; // should never happen
147         }
148     }
149     if( role == Qt::DecorationRole ) {
150         if ( index.column() == 2 ) return QVariant( item->icon() );
151     }
152 
153     return QVariant();
154 }
155 
headerData(int section,Qt::Orientation orientation,int role) const156 QVariant EclipsesModel::headerData( int section, Qt::Orientation orientation,
157                                     int role ) const
158 {
159     if( orientation != Qt::Horizontal || role != Qt::DisplayRole ) {
160         return QVariant();
161     }
162 
163     switch( section ) {
164         case 0: return QVariant( tr( "Start" ) );
165         case 1: return QVariant( tr( "End" ) );
166         case 2: return QVariant( tr( "Type" ) );
167         case 3: return QVariant( tr( "Magnitude" ) );
168         default: break;
169     }
170 
171     return QVariant();
172 }
173 
addItem(EclipsesItem * item)174 void EclipsesModel::addItem( EclipsesItem *item )
175 {
176     m_items.append( item );
177 }
178 
clear()179 void EclipsesModel::clear()
180 {
181     beginResetModel();
182 
183     qDeleteAll( m_items );
184     m_items.clear();
185 
186     endResetModel();
187 }
188 
update()189 void EclipsesModel::update()
190 {
191     clear();
192 
193     beginInsertRows( QModelIndex(), 0, rowCount() );
194 
195     int num = m_ecl->getNumberEclYear();
196     for( int i = 1; i <= num; ++i ) {
197         EclipsesItem *item = new EclipsesItem( m_ecl, i );
198         addItem( item );
199     }
200 
201     endInsertRows();
202 }
203 
204 } // namespace Marble
205 
206 #include "moc_EclipsesModel.cpp"
207 
208