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