File indexing completed on 2024-12-08 06:35:35
0001 // SPDX-License-Identifier: LGPL-2.1-or-later 0002 // 0003 // SPDX-FileCopyrightText: 2011-2012 Florian Eßer <f.esser@rwth-aachen.de> 0004 // SPDX-FileCopyrightText: 2012 Bernhard Beschow <bbeschow@cs.tu-berlin.de> 0005 // SPDX-FileCopyrightText: 2013 Roman Karlstetter <roman.karlstetter@googlemail.com> 0006 // 0007 #include "ElevationProfileContextMenu.h" 0008 0009 #include "ElevationProfileDataSource.h" 0010 #include "ElevationProfileFloatItem.h" 0011 #include "MarbleDebug.h" 0012 0013 namespace Marble { 0014 0015 ElevationProfileContextMenu::ElevationProfileContextMenu(ElevationProfileFloatItem *floatItem): 0016 QObject(floatItem), 0017 m_floatItem(floatItem), 0018 m_sourceGrp(nullptr), 0019 m_contextMenu(nullptr), 0020 m_trackMapper(nullptr) 0021 { 0022 } 0023 0024 QMenu *ElevationProfileContextMenu::getMenu() 0025 { 0026 if (!m_contextMenu) { 0027 m_contextMenu = m_floatItem->contextMenu(); 0028 0029 for ( QAction *action: m_contextMenu->actions() ) { 0030 if ( action->text() == tr( "&Configure..." ) ) { 0031 m_contextMenu->removeAction( action ); 0032 break; 0033 } 0034 } 0035 0036 QAction *zoomToViewportAction = m_contextMenu->addAction( tr("&Zoom to viewport"), m_floatItem, 0037 SLOT(toggleZoomToViewport()) ); 0038 zoomToViewportAction->setCheckable( true ); 0039 zoomToViewportAction->setChecked( m_floatItem->m_zoomToViewport ); 0040 m_contextMenu->addSeparator(); 0041 0042 m_sourceGrp = new QActionGroup(this); 0043 m_trackMapper = new QSignalMapper(this); 0044 updateContextMenuEntries(); 0045 } 0046 return m_contextMenu; 0047 } 0048 0049 void ElevationProfileContextMenu::updateContextMenuEntries() 0050 { 0051 // context menu has not yet been initialized, this functions is called as last step of initialization 0052 if (!m_contextMenu) { 0053 return; 0054 } 0055 0056 // completely rebuild selection, TODO could be possibly improved to only add/remove items incrementally 0057 for (QAction* action: m_selectionActions) { 0058 m_contextMenu->removeAction( action ); 0059 } 0060 0061 // clear state 0062 qDeleteAll(m_selectionActions); 0063 m_selectionActions.clear(); 0064 0065 // add route data source (if available) 0066 if ( m_floatItem->m_routeDataSource.isDataAvailable()) { 0067 QAction *route = new QAction( tr( "Route" ), m_contextMenu ); 0068 route->setActionGroup(m_sourceGrp); 0069 route->setCheckable(true); 0070 route->setChecked(m_floatItem->m_activeDataSource == &m_floatItem->m_routeDataSource); 0071 connect( route, SIGNAL(triggered()), m_floatItem, SLOT(switchToRouteDataSource()) ); 0072 m_selectionActions.append(route); 0073 } 0074 0075 // add tracks (if available) 0076 if ( m_floatItem->m_trackDataSource.isDataAvailable()) { 0077 QStringList sources = m_floatItem->m_trackDataSource.sourceDescriptions(); 0078 for (int i = 0; i<sources.size(); ++i) { 0079 QAction *track = new QAction( tr("Track: ") + sources[i], m_contextMenu); 0080 connect(track, SIGNAL(triggered()), m_trackMapper, SLOT(map())); 0081 track->setCheckable(true); 0082 track->setChecked(m_floatItem->m_activeDataSource == &m_floatItem->m_trackDataSource && m_floatItem->m_trackDataSource.currentSourceIndex() == i); 0083 track->setActionGroup(m_sourceGrp); 0084 m_selectionActions.append(track); 0085 m_trackMapper->setMapping(track, i); 0086 } 0087 connect(m_trackMapper, SIGNAL(mapped(int)), m_floatItem, SLOT(switchToTrackDataSource(int))); 0088 } 0089 0090 // no route or track available, add disabled action to inform user about it 0091 if ( m_selectionActions.isEmpty() ) { 0092 QAction *disabledInformationAction = new QAction( tr( "Create a route or load a track from file to view its elevation profile." ), m_contextMenu); 0093 disabledInformationAction->setEnabled(false); 0094 m_selectionActions.append(disabledInformationAction); 0095 } 0096 0097 for (QAction *action: m_selectionActions) { 0098 m_contextMenu->addAction(action); 0099 } 0100 } 0101 0102 } 0103 0104 #include "moc_ElevationProfileContextMenu.cpp"