1 // SPDX-License-Identifier: LGPL-2.1-or-later
2 //
3 // SPDX-FileCopyrightText: 2015 Mikhail Ivchenko <ematirov@gmail.com>
4 //
5 
6 #include "NodeModel.h"
7 
8 #include "MarbleLocale.h"
9 
10 namespace Marble
11 {
12 
NodeModel(QObject * parent)13 NodeModel::NodeModel( QObject *parent ) : QAbstractListModel( parent )
14 {
15 
16 }
17 
rowCount(const QModelIndex & parent) const18 int NodeModel::rowCount( const QModelIndex &parent ) const
19 {
20     if( parent == QModelIndex() ) {
21         return m_nodes.size();
22     } else {
23         return 0;
24     }
25 }
26 
columnCount(const QModelIndex & parent) const27 int NodeModel::columnCount( const QModelIndex &parent ) const
28 {
29     Q_UNUSED( parent )
30     return 4;
31 }
32 
data(const QModelIndex & index,int role) const33 QVariant NodeModel::data( const QModelIndex &index, int role ) const
34 {
35     if( !index.isValid() ) {
36         return QVariant();
37     }
38     if( role == Qt::DisplayRole ) {
39         switch( index.column() ) {
40         case 0:
41             return index.row();
42         case 1: {
43             return m_nodes[ index.row() ].lonToString();
44         }
45         case 2: {
46             return m_nodes[ index.row() ].latToString();
47         }
48         case 3: {
49             qreal altitude = m_nodes[ index.row() ].altitude();
50             MarbleLocale *locale = MarbleGlobal::getInstance()->locale();
51             qreal convertedAltitude;
52             const MarbleLocale::MeasurementSystem currentSystem = locale->measurementSystem();
53             MarbleLocale::MeasureUnit elevationUnit;
54             switch ( locale->measurementSystem() ) {
55             case MarbleLocale::MetricSystem:
56                 elevationUnit = MarbleLocale::Meter;
57                 break;
58             case MarbleLocale::ImperialSystem:
59                 elevationUnit = MarbleLocale::Foot;
60                 break;
61             case MarbleLocale::NauticalSystem:
62                 elevationUnit = MarbleLocale::NauticalMile;
63                 break;
64             }
65             locale->meterToTargetUnit( altitude, currentSystem, convertedAltitude, elevationUnit );
66             return convertedAltitude;
67         }
68         default:
69             return QVariant();
70         }
71     }
72     return QVariant();
73 }
74 
headerData(int section,Qt::Orientation orientation,int role) const75 QVariant NodeModel::headerData( int section, Qt::Orientation orientation, int role ) const
76 {
77     if( role == Qt::DisplayRole && orientation == Qt::Horizontal ) {
78         switch( section ) {
79         case 0:
80             return tr( "No." );
81         case 1:
82             return tr( "Longitude" );
83         case 2:
84             return tr( "Latitude" );
85         case 3:
86             return tr( "Elevation" );
87         }
88     }
89     return QAbstractListModel::headerData( section, orientation, role );
90 }
91 
clear()92 void NodeModel::clear()
93 {
94     int last = rowCount( QModelIndex() ) - 1;
95     beginRemoveRows( QModelIndex(), 0, last );
96     m_nodes.clear();
97     endRemoveRows();
98 }
99 
addNode(const GeoDataCoordinates & node)100 int NodeModel::addNode( const GeoDataCoordinates &node )
101 {
102     int row = rowCount( QModelIndex() );
103     beginInsertRows( QModelIndex(), row, row );
104     m_nodes.append( node );
105     endInsertRows();
106     return row;
107 }
108 
flags(const QModelIndex & index) const109 Qt::ItemFlags NodeModel::flags(const QModelIndex & index) const
110 {
111     if ( index.column() == 1 || index.column() == 2 ) {
112         return Qt::ItemIsSelectable |  Qt::ItemIsEditable | Qt::ItemIsEnabled;
113     }
114     else
115         return Qt::ItemIsSelectable | Qt::ItemIsEnabled;
116 }
117 
118 }
119 
120 #include "moc_NodeModel.cpp"
121