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

0001 // SPDX-License-Identifier: LGPL-2.1-or-later
0002 //
0003 // SPDX-FileCopyrightText: 2015 Mikhail Ivchenko <ematirov@gmail.com>
0004 //
0005 
0006 #include "NodeModel.h"
0007 
0008 #include "MarbleLocale.h"
0009 
0010 namespace Marble
0011 {
0012 
0013 NodeModel::NodeModel( QObject *parent ) : QAbstractListModel( parent )
0014 {
0015 
0016 }
0017 
0018 int NodeModel::rowCount( const QModelIndex &parent ) const
0019 {
0020     if( parent == QModelIndex() ) {
0021         return m_nodes.size();
0022     } else {
0023         return 0;
0024     }
0025 }
0026 
0027 int NodeModel::columnCount( const QModelIndex &parent ) const
0028 {
0029     Q_UNUSED( parent )
0030     return 4;
0031 }
0032 
0033 QVariant NodeModel::data( const QModelIndex &index, int role ) const
0034 {
0035     if( !index.isValid() ) {
0036         return QVariant();
0037     }
0038     if( role == Qt::DisplayRole ) {
0039         switch( index.column() ) {
0040         case 0:
0041             return index.row();
0042         case 1: {
0043             return m_nodes[ index.row() ].lonToString();
0044         }
0045         case 2: {
0046             return m_nodes[ index.row() ].latToString();
0047         }
0048         case 3: {
0049             qreal altitude = m_nodes[ index.row() ].altitude();
0050             MarbleLocale *locale = MarbleGlobal::getInstance()->locale();
0051             qreal convertedAltitude;
0052             const MarbleLocale::MeasurementSystem currentSystem = locale->measurementSystem();
0053             MarbleLocale::MeasureUnit elevationUnit;
0054             switch ( locale->measurementSystem() ) {
0055             case MarbleLocale::MetricSystem:
0056                 elevationUnit = MarbleLocale::Meter;
0057                 break;
0058             case MarbleLocale::ImperialSystem:
0059                 elevationUnit = MarbleLocale::Foot;
0060                 break;
0061             case MarbleLocale::NauticalSystem:
0062                 elevationUnit = MarbleLocale::NauticalMile;
0063                 break;
0064             }
0065             locale->meterToTargetUnit( altitude, currentSystem, convertedAltitude, elevationUnit );
0066             return convertedAltitude;
0067         }
0068         default:
0069             return QVariant();
0070         }
0071     }
0072     return QVariant();
0073 }
0074 
0075 QVariant NodeModel::headerData( int section, Qt::Orientation orientation, int role ) const
0076 {
0077     if( role == Qt::DisplayRole && orientation == Qt::Horizontal ) {
0078         switch( section ) {
0079         case 0:
0080             return tr( "No." );
0081         case 1:
0082             return tr( "Longitude" );
0083         case 2:
0084             return tr( "Latitude" );
0085         case 3:
0086             return tr( "Elevation" );
0087         }
0088     }
0089     return QAbstractListModel::headerData( section, orientation, role );
0090 }
0091 
0092 void NodeModel::clear()
0093 {
0094     int last = rowCount( QModelIndex() ) - 1;
0095     beginRemoveRows( QModelIndex(), 0, last );
0096     m_nodes.clear();
0097     endRemoveRows();
0098 }
0099 
0100 int NodeModel::addNode( const GeoDataCoordinates &node )
0101 {
0102     int row = rowCount( QModelIndex() );
0103     beginInsertRows( QModelIndex(), row, row );
0104     m_nodes.append( node );
0105     endInsertRows();
0106     return row;
0107 }
0108 
0109 Qt::ItemFlags NodeModel::flags(const QModelIndex & index) const
0110 {
0111     if ( index.column() == 1 || index.column() == 2 ) {
0112         return Qt::ItemIsSelectable |  Qt::ItemIsEditable | Qt::ItemIsEnabled;
0113     }
0114     else
0115         return Qt::ItemIsSelectable | Qt::ItemIsEnabled;
0116 }
0117 
0118 }
0119 
0120 #include "moc_NodeModel.cpp"