File indexing completed on 2024-05-05 03:50:42

0001 // SPDX-License-Identifier: LGPL-2.1-or-later
0002 //
0003 // SPDX-FileCopyrightText: 2012 Rene Kuettner <rene@bitkanal.net>
0004 //
0005 
0006 #include "EclipsesModel.h"
0007 
0008 #include "EclipsesItem.h"
0009 #include "MarbleDebug.h"
0010 #include "MarbleClock.h"
0011 
0012 #include <eclsolar.h>
0013 
0014 #include <QIcon>
0015 
0016 namespace Marble
0017 {
0018 
0019 EclipsesModel::EclipsesModel( const MarbleModel *model, QObject *parent )
0020     : QAbstractItemModel( parent ),
0021       m_marbleModel( model ),
0022       m_currentYear( 0 ),
0023       m_withLunarEclipses( false )
0024 {
0025     m_ecl = new EclSolar();
0026     m_ecl->setTimezone( model->clock()->timezone() / 3600. );
0027     m_ecl->setLunarEcl( m_withLunarEclipses );
0028 
0029     // observation point defaults to home location
0030     qreal lon, lat;
0031     int zoom;
0032     m_marbleModel->home( lon, lat, zoom );
0033     GeoDataCoordinates homeLocation( lon, lat, 0, GeoDataCoordinates::Degree );
0034     setObservationPoint( homeLocation );
0035 }
0036 
0037 EclipsesModel::~EclipsesModel()
0038 {
0039     clear();
0040     delete m_ecl;
0041 }
0042 const GeoDataCoordinates& EclipsesModel::observationPoint() const
0043 {
0044     return m_observationPoint;
0045 }
0046 
0047 void EclipsesModel::setObservationPoint( const GeoDataCoordinates &coords )
0048 {
0049     m_observationPoint = coords;
0050     m_ecl->setLocalPos( coords.latitude(), coords.altitude(), 6000. );
0051 }
0052 
0053 void EclipsesModel::setYear( int year )
0054 {
0055     if( m_currentYear != year ) {
0056 
0057         mDebug() << "Year changed - Calculating eclipses...";
0058         m_currentYear = year;
0059         m_ecl->putYear( year );
0060 
0061         update();
0062     }
0063 }
0064 
0065 int EclipsesModel::year() const
0066 {
0067     return m_currentYear;
0068 }
0069 
0070 void EclipsesModel::setWithLunarEclipses( const bool enable )
0071 {
0072     if( m_withLunarEclipses != enable ) {
0073         m_withLunarEclipses = enable;
0074         m_ecl->setLunarEcl( m_withLunarEclipses );
0075         update();
0076     }
0077 }
0078 
0079 bool EclipsesModel::withLunarEclipses() const
0080 {
0081     return m_withLunarEclipses;
0082 }
0083 
0084 EclipsesItem* EclipsesModel::eclipseWithIndex( int index )
0085 {
0086     for( EclipsesItem *item: m_items ) {
0087         if( item->index() == index ) {
0088             return item;
0089         }
0090     }
0091 
0092     return nullptr;
0093 }
0094 
0095 QList<EclipsesItem*> EclipsesModel::items() const
0096 {
0097     return m_items;
0098 }
0099 
0100 QModelIndex EclipsesModel::index( int row, int column, const QModelIndex &parent ) const
0101 {
0102     if( !hasIndex( row, column, parent ) ) {
0103         return QModelIndex();
0104     }
0105 
0106     if( row >= m_items.count() ) {
0107         return QModelIndex();
0108     }
0109 
0110     return createIndex( row, column, m_items.at( row ) );
0111 }
0112 
0113 QModelIndex EclipsesModel::parent( const QModelIndex &index ) const
0114 {
0115     Q_UNUSED( index );
0116     return QModelIndex(); // no parents
0117 }
0118 
0119 int EclipsesModel::rowCount( const QModelIndex &parent ) const
0120 {
0121     Q_UNUSED( parent );
0122     return m_items.count();
0123 }
0124 
0125 int EclipsesModel::columnCount( const QModelIndex &parent ) const
0126 {
0127     Q_UNUSED( parent );
0128     return 4; // start, end, type magnitude
0129 }
0130 
0131 QVariant EclipsesModel::data( const QModelIndex &index, int role ) const
0132 {
0133     if( !index.isValid() ) {
0134         return QVariant();
0135     }
0136 
0137     Q_ASSERT( index.column() < 4 );
0138 
0139     EclipsesItem *item = static_cast<EclipsesItem*>( index.internalPointer() );
0140     if( role == Qt::DisplayRole ) {
0141         switch( index.column() ) {
0142             case 0: return QVariant( item->startDatePartial() );
0143             case 1: return QVariant( item->endDatePartial() );
0144             case 2: return QVariant( item->phaseText() );
0145             case 3: return QVariant( item->magnitude() );
0146             default: break; // should never happen
0147         }
0148     }
0149     if( role == Qt::DecorationRole ) {
0150         if ( index.column() == 2 ) return QVariant( item->icon() );
0151     }
0152 
0153     return QVariant();
0154 }
0155 
0156 QVariant EclipsesModel::headerData( int section, Qt::Orientation orientation,
0157                                     int role ) const
0158 {
0159     if( orientation != Qt::Horizontal || role != Qt::DisplayRole ) {
0160         return QVariant();
0161     }
0162 
0163     switch( section ) {
0164         case 0: return QVariant( tr( "Start" ) );
0165         case 1: return QVariant( tr( "End" ) );
0166         case 2: return QVariant( tr( "Type" ) );
0167         case 3: return QVariant( tr( "Magnitude" ) );
0168         default: break;
0169     }
0170 
0171     return QVariant();
0172 }
0173 
0174 void EclipsesModel::addItem( EclipsesItem *item )
0175 {
0176     m_items.append( item );
0177 }
0178 
0179 void EclipsesModel::clear()
0180 {
0181     beginResetModel();
0182 
0183     qDeleteAll( m_items );
0184     m_items.clear();
0185 
0186     endResetModel();
0187 }
0188 
0189 void EclipsesModel::update()
0190 {
0191     clear();
0192 
0193     beginInsertRows( QModelIndex(), 0, rowCount() );
0194 
0195     int num = m_ecl->getNumberEclYear();
0196     for( int i = 1; i <= num; ++i ) {
0197         EclipsesItem *item = new EclipsesItem( m_ecl, i );
0198         addItem( item );
0199     }
0200 
0201     endInsertRows();
0202 }
0203 
0204 } // namespace Marble
0205 
0206 #include "moc_EclipsesModel.cpp"
0207