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