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"