diff --git a/src/apps/marble-kde/kdemain.cpp b/src/apps/marble-kde/kdemain.cpp index dadaeb213..33cd9508e 100644 --- a/src/apps/marble-kde/kdemain.cpp +++ b/src/apps/marble-kde/kdemain.cpp @@ -1,444 +1,444 @@ // // This file is part of the Marble Virtual Globe. // // This program is free software licensed under the GNU LGPL. You can // find a copy of this license in LICENSE.txt in the top directory of // the source code. // // Copyright 2007 Torsten Rahn // Copyright 2007 Inge Wallin // Copyright 2009 Jens-Michael Hoffmann // #include #include #include #include #include #include #include #include #include #include #include #include #include "ControlView.h" #include "KdeMainWindow.h" #include "GeoUriParser.h" #include "MarbleDebug.h" #include "MapThemeManager.h" #include "MarbleTest.h" #ifdef STATIC_BUILD #include Q_IMPORT_PLUGIN(qjpeg) Q_IMPORT_PLUGIN(qsvg) #endif using namespace Marble; static bool loadTranslation(const QString &localeDirName, QApplication &app) { const QString subPath = QLatin1String("locale/") + localeDirName + QLatin1String("/LC_MESSAGES/marble_qt.qm"); const QString fullPath = QStandardPaths::locate(QStandardPaths::GenericDataLocation, subPath); if (fullPath.isEmpty()) { return false; } QTranslator* translator = new QTranslator(&app); if (!translator->load(fullPath)) { delete translator; return false; } app.installTranslator(translator); return true; } static void loadLibAndPluginTranslations(QApplication &app) { // Quote from ecm_create_qm_loader created code: // The way Qt translation system handles plural forms makes it necessary to // have a translation file which contains only plural forms for `en`. // That's why we load the `en` translation unconditionally, then load the // translation for the current locale to overload it. const QString en(QStringLiteral("en")); loadTranslation(en, app); QLocale locale = QLocale::system(); if (locale.name() != en) { if (!loadTranslation(locale.name(), app)) { loadTranslation(locale.bcp47Name(), app); } } } int main ( int argc, char *argv[] ) { QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps, true); QApplication app( argc, argv ); // Load Qt translation system catalog for the plugins and libmarblewidget loadLibAndPluginTranslations(app); // Init KF5 translation system KLocalizedString::setApplicationDomain("marble"); KAboutData aboutData( "marble", i18n( "Marble Virtual Globe" ), ControlView::applicationVersion(), i18n( "A World Atlas." ), KAboutLicense::LGPL_V2, i18n( "(c) 2007-%1", QLatin1String("2016") ), QString(), "http://marble.kde.org/" ); // Active Development Team of Marble aboutData.addAuthor( i18n( "Torsten Rahn" ), i18n( "Developer and Original Author" ), "rahn@kde.org" ); aboutData.addAuthor( i18n( "Bernhard Beschow" ), i18n( "WMS Support, Mobile, Performance" ), "bbeschow@cs.tu-berlin.de" ); aboutData.addAuthor( i18n( "Thibaut Gridel" ), i18n( "Geodata" ), "tgridel@free.fr" ); aboutData.addAuthor( i18n( "Jens-Michael Hoffmann" ), i18n( "OpenStreetMap Integration, OSM Namefinder, Download Management" ), "jmho@c-xx.com", "http://www.c-xx.com" ); aboutData.addAuthor( i18n( "Florian Eßer" ), i18n( "Elevation Profile" ), "f.esser@rwth-aachen.de" ); aboutData.addAuthor( i18n( "Wes Hardaker" ), i18n( "APRS Plugin" ), "marble@hardakers.net" ); aboutData.addAuthor( i18n( "Bastian Holst" ), i18n( "Online Services support" ), "bastianholst@gmx.de" ); aboutData.addAuthor( i18n( "Guillaume Martres" ), i18n( "Satellites" ), "smarter@ubuntu.com" ); aboutData.addAuthor( i18n( "Rene Kuettner" ), i18n( "Satellites, Eclipses" ), "rene@bitkanal.net" ); aboutData.addAuthor( i18n( "Friedrich W. H. Kossebau" ), i18n( "Plasma Integration, Bugfixes" ), "kossebau@kde.org" ); aboutData.addAuthor( i18n( "Dennis Nienhüser" ), i18n( "Routing, Navigation, Mobile" ), "nienhueser@kde.org" ); aboutData.addAuthor( i18n( "Niko Sams" ), i18n( "Routing, Elevation Profile" ), "niko.sams@gmail.com" ); aboutData.addAuthor( i18n( "Patrick Spendrin" ), i18n( "Core Developer: KML and Windows support" ), "pspendrin@gmail.com" ); aboutData.addAuthor( i18n( "Eckhart Wörner" ), i18n( "Bugfixes" ), "kde@ewsoftware.de" ); // Developers: aboutData.addAuthor( i18n( "Inge Wallin" ), i18n( "Core Developer and Co-Maintainer" ), "inge@lysator.liu.se" ); aboutData.addAuthor( i18n( "Henry de Valence" ), i18n( "Core Developer: Marble Runners, World-Clock Plasmoid" ), "hdevalence@gmail.com" ); aboutData.addAuthor( i18n( "Pino Toscano" ), i18n( "Network plugins" ), "pino@kde.org" ); aboutData.addAuthor( i18n( "Harshit Jain" ), i18n( "Planet filter" ), "sonu.itbhu@googlemail.com" ); aboutData.addAuthor( i18n( "Simon Edwards" ), i18n( "Marble Python Bindings" ), "simon@simonzone.com" ); aboutData.addAuthor( i18n( "Magnus Valle" ), i18n( "Historical Maps" ), "" ); aboutData.addAuthor( i18n( "Médéric Boquien" ), i18n( "Astronomical Observatories" ), "mboquien@free.fr" ); // ESA Summer of Code in Space aboutData.addAuthor( i18n( "Rene Kuettner" ), i18n( "ESA Summer of Code in Space 2012 Project:" " Visualization of planetary satellites" ), "rene@bitkanal.net" ); aboutData.addAuthor( i18n( "Guillaume Martres" ), i18n( "ESA Summer of Code in Space 2011 Project:" " Visualization of Satellite Orbits" ), "smarter@ubuntu.com" ); // Google Summer of Code aboutData.addAuthor( i18n( "Konstantin Oblaukhov" ), i18n( "Google Summer of Code 2011 Project:" " OpenStreetMap Vector Rendering" ), "oblaukhov.konstantin@gmail.com" ); aboutData.addAuthor( i18n( "Daniel Marth" ), i18n( "Google Summer of Code 2011 Project:" " Marble Touch on MeeGo" ), "danielmarth@gmx.at" ); aboutData.addAuthor( i18n( "Gaurav Gupta" ), i18n( "Google Summer of Code 2010 Project:" " Bookmarks" ), "1989.gaurav@gmail.com" ); aboutData.addAuthor( i18n( "Harshit Jain " ), i18n( "Google Summer of Code 2010 Project:" " Time Support" ), "hjain.itbhu@gmail.com" ); aboutData.addAuthor( i18n( "Siddharth Srivastava" ), i18n( "Google Summer of Code 2010 Project:" " Turn-by-turn Navigation" ), "akssps011@gmail.com" ); aboutData.addAuthor( i18n( "Andrew Manson" ), i18n( "Google Summer of Code 2009 Project:" " OSM Annotation" ), "g.real.ate@gmail.com" ); aboutData.addAuthor( i18n( "Bastian Holst" ), i18n( "Google Summer of Code 2009 Project:" " Online Services" ), "bastianholst@gmx.de" ); aboutData.addAuthor( i18n( "Patrick Spendrin" ), i18n( "Google Summer of Code 2008 Project:" " Vector Tiles for Marble" ), "pspendrin@gmail.com" ); aboutData.addAuthor( i18n( "Shashank Singh" ), i18n( "Google Summer of Code 2008 Project:" " Panoramio / Wikipedia -photo support for Marble" ), "shashank.personal@gmail.com" ); aboutData.addAuthor( i18n( "Carlos Licea" ), i18n( "Google Summer of Code 2007 Project:" " Equirectangular Projection (\"Flat Map\")" ), "carlos.licea@kdemail.net" ); aboutData.addAuthor( i18n( "Andrew Manson" ), i18n( "Google Summer of Code 2007 Project:" " GPS Support for Marble" ), "g.real.ate@gmail.com" ); aboutData.addAuthor( i18n( "Murad Tagirov" ), i18n( "Google Summer of Code 2007 Project:" " KML Support for Marble" ), "tmurad@gmail.com" ); // Developers aboutData.addAuthor( i18n( "Simon Schmeisser" ), i18n( "Development & Patches" )); aboutData.addAuthor( i18n( "Claudiu Covaci" ), i18n( "Development & Patches" )); aboutData.addAuthor( i18n( "David Roberts" ), i18n( "Development & Patches" )); aboutData.addAuthor( i18n( "Nikolas Zimmermann" ), i18n( "Development & Patches" )); aboutData.addAuthor( i18n( "Jan Becker" ), i18n( "Development & Patches" )); aboutData.addAuthor( i18n( "Stefan Asserhäll" ), i18n( "Development & Patches" )); aboutData.addAuthor( i18n( "Laurent Montel" ), i18n( "Development & Patches" )); aboutData.addAuthor( i18n( "Mayank Madan" ), i18n( "Development & Patches" )); aboutData.addAuthor( i18n( "Prashanth Udupa" ), i18n( "Development & Patches" )); aboutData.addAuthor( i18n( "Anne-Marie Mahfouf" ), i18n( "Development & Patches" )); aboutData.addAuthor( i18n( "Josef Spillner" ), i18n( "Development & Patches" )); aboutData.addAuthor( i18n( "Frerich Raabe" ), i18n( "Development & Patches" )); aboutData.addAuthor( i18n( "Frederik Gladhorn" ), i18n( "Development & Patches" )); aboutData.addAuthor( i18n( "Fredrik Höglund" ), i18n( "Development & Patches" )); aboutData.addAuthor( i18n( "Albert Astals Cid" ), i18n( "Development & Patches" )); aboutData.addAuthor( i18n( "Thomas Zander" ), i18n( "Development & Patches" )); aboutData.addAuthor( i18n( "Joseph Wenninger" ), i18n( "Development & Patches" )); aboutData.addAuthor( i18n( "Kris Thomsen" ), i18n( "Development & Patches" )); aboutData.addAuthor( i18n( "Daniel Molkentin" ), i18n( "Development & Patches" )); aboutData.addAuthor( i18n( "Christophe Leske" ), i18n( "Platforms & Distributions" )); aboutData.addAuthor( i18n( "Sebastian Wiedenroth" ), i18n( "Platforms & Distributions" )); aboutData.addAuthor( i18n( "Tim Sutton" ), i18n( "Platforms & Distributions" )); aboutData.addAuthor( i18n( "Christian Ehrlicher" ), i18n( "Platforms & Distributions" )); aboutData.addAuthor( i18n( "Ralf Habacker" ), i18n( "Platforms & Distributions" )); aboutData.addAuthor( i18n( "Steffen Joeris" ), i18n( "Platforms & Distributions" )); aboutData.addAuthor( i18n( "Marcus Czeslinski" ), i18n( "Platforms & Distributions" )); aboutData.addAuthor( i18n( "Marcus D. Hanwell" ), i18n( "Platforms & Distributions" )); aboutData.addAuthor( i18n( "Chitlesh Goorah" ), i18n( "Platforms & Distributions" )); aboutData.addAuthor( i18n( "Nuno Pinheiro" ), i18n( "Artwork" )); aboutData.addAuthor( i18n( "Torsten Rahn" ), i18n( "Artwork" )); // Credits aboutData.addCredit( i18n( "Luis Silva" ), i18n( "Various Suggestions & Testing" )); aboutData.addCredit( i18n( "Stefan Jordan" ), i18n( "Various Suggestions & Testing" )); aboutData.addCredit( i18n( "Robert Scott" ), i18n( "Various Suggestions & Testing" )); aboutData.addCredit( i18n( "Lubos Petrovic" ), i18n( "Various Suggestions & Testing" )); aboutData.addCredit( i18n( "Benoit Sigoure" ), i18n( "Various Suggestions & Testing" )); aboutData.addCredit( i18n( "Martin Konold" ), i18n( "Various Suggestions & Testing" )); aboutData.addCredit( i18n( "Matthias Welwarsky" ), i18n( "Various Suggestions & Testing" )); aboutData.addCredit( i18n( "Rainer Endres" ), i18n( "Various Suggestions & Testing" )); aboutData.addCredit( i18n( "Ralf Gesellensetter" ), i18n( "Various Suggestions & Testing" )); aboutData.addCredit( i18n( "Tim Alder" ), i18n( "Various Suggestions & Testing" )); aboutData.addCredit( i18n( "John Layt" ), i18n( "Special thanks for providing an" " important source of inspiration by creating" " Marble's predecessor \"Kartographer\"." )); KCrash::setCrashHandler(KCrash::defaultCrashHandler); KCrash::setDrKonqiEnabled(true); KAboutData::setApplicationData(aboutData); QApplication::setWindowIcon(QIcon::fromTheme(QStringLiteral("marble"))); QCommandLineParser parser; parser.addHelpOption(); parser.addVersionOption(); aboutData.setupCommandLine(&parser); // Autodetect profiles MarbleGlobal::Profiles profiles = MarbleGlobal::getInstance()->profiles(); QCommandLineOption debugOption( "debug-info", i18n( "Enable debug output" ) ); parser.addOption( debugOption ); QCommandLineOption timeOption( "timedemo", i18n( "Make a time measurement to check performance" ) ); parser.addOption( timeOption ); QCommandLineOption fpsOption( "fps", i18n( "Show frame rate" ) ); parser.addOption( fpsOption ); QCommandLineOption tileOption( "tile-id", i18n( "Show tile IDs" ) ); parser.addOption( tileOption ); QCommandLineOption traceOption( "runtimeTrace", i18n( "Show time spent in each layer" ) ); parser.addOption( traceOption ); QCommandLineOption dataPathOption("marbledatapath", i18n("Use a different directory which contains map data."), "directory"); parser.addOption( dataPathOption ); QCommandLineOption noSmallScreenOption( "nosmallscreen", i18n( "Do not use the interface optimized for small screens" ) ); QCommandLineOption smallScreenOption( "smallscreen", i18n( "Use the interface optimized for small screens" ) ); parser.addOption( (profiles & MarbleGlobal::SmallScreen) ? noSmallScreenOption : smallScreenOption ); QCommandLineOption noHighResOption( "nohighresolution", i18n( "Do not use the interface optimized for high resolutions" ) ); QCommandLineOption highResOption( "highresolution", i18n( "Use the interface optimized for high resolutions" ) ); parser.addOption( (profiles & MarbleGlobal::HighResolution) ? noHighResOption : highResOption ); QCommandLineOption coordinatesOption("latlon", i18n("Show map at given lat lon "), "coordinates"); parser.addOption( coordinatesOption ); QCommandLineOption geoUriOption("geo-uri", i18n("Show map at given geo "), "uri"); parser.addOption( geoUriOption ); QCommandLineOption distanceOption("distance", i18n("Set the distance of the observer to the globe (in km)"), "distance"); parser.addOption( distanceOption ); QCommandLineOption mapIdOption("map", i18n("Use map (e.g. \"earth/openstreetmap/openstreetmap.dgml\")"), "id"); parser.addOption( mapIdOption ); parser.addPositionalArgument("file", i18n( "One or more placemark files to be opened") ); parser.process( app ); aboutData.processCommandLine(&parser); // use ecm_create_qm_loader(marblewidget_SRCS marble_qt) // in the library src/lib/marble/CMakeList.txt to load the second catalog MarbleDebug::setEnabled( parser.isSet( debugOption ) ); if ( parser.isSet( smallScreenOption ) ) { profiles |= MarbleGlobal::SmallScreen; } else { profiles &= ~MarbleGlobal::SmallScreen; } if ( parser.isSet( highResOption ) ) { profiles |= MarbleGlobal::HighResolution; } else { profiles &= ~MarbleGlobal::HighResolution; } MarbleGlobal::getInstance()->setProfiles( profiles ); QString marbleDataPath = parser.value( dataPathOption ); MainWindow *window = new MainWindow( marbleDataPath ); window->setAttribute( Qt::WA_DeleteOnClose, true ); window->show(); if ( parser.isSet( timeOption ) ) { window->resize(900, 640); MarbleTest test( window->marbleWidget() ); test.timeDemo(); return 0; } if ( parser.isSet( fpsOption ) ) { window->marbleControl()->marbleWidget()->setShowFrameRate( true ); } if ( parser.isSet( tileOption ) ) { window->marbleControl()->marbleWidget()->setShowTileId( true ); } const QString map = parser.value( mapIdOption ); if ( !map.isEmpty() ) { window->marbleWidget()->setMapThemeId(map); } const QString coordinatesString = parser.value( coordinatesOption ); if ( !coordinatesString.isEmpty() ) { bool success = false; const GeoDataCoordinates coordinates = GeoDataCoordinates::fromString(coordinatesString, success); if ( success ) { const qreal longitude = coordinates.longitude(GeoDataCoordinates::Degree); const qreal latitude = coordinates.latitude(GeoDataCoordinates::Degree); window->marbleWidget()->centerOn(longitude, latitude); } } const QString geoUriString = parser.value( geoUriOption ); if ( !geoUriString.isEmpty() ) { window->marbleControl()->openGeoUri( geoUriString ); } const QString distance = parser.value( distanceOption ); if ( !distance.isEmpty() ) { bool success = false; const qreal distanceValue = distance.toDouble(&success); if ( success ) window->marbleWidget()->setDistance(distanceValue); } // Read the files that are given on the command line. - foreach( const QString &file, parser.positionalArguments() ) { + for( const QString &file: parser.positionalArguments() ) { // FIXME: Use openUrl( args->url(i) ) instead? if ( QFile::exists( file ) ) { window->marbleControl()->addGeoDataFile( file ); } } return app.exec(); } diff --git a/src/apps/marble-kde/marble_part.cpp b/src/apps/marble-kde/marble_part.cpp index b6978efea..0f56863b6 100644 --- a/src/apps/marble-kde/marble_part.cpp +++ b/src/apps/marble-kde/marble_part.cpp @@ -1,1832 +1,1832 @@ // // This file is part of the Marble Virtual Globe. // // This program is free software licensed under the GNU LGPL. You can // find a copy of this license in LICENSE.txt in the top directory of // the source code. // // Copyright 2007 Tobias Koenig // Copyright 2008 Inge Wallin // Copyright 2009 Jens-Michael Hoffmann // Copyright 2010 Harshit Jain // // Own #include "marble_part.h" // Qt #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // KF #include #include #include #include #include #include #include #include #include #include #include #include // Marble library classes #include "AbstractFloatItem.h" #include "EditBookmarkDialog.h" #include "BookmarkManager.h" #include "BookmarkManagerDialog.h" #include "CurrentLocationWidget.h" #include "DownloadRegionDialog.h" #include "GeoDataCoordinates.h" #include "GeoDataFolder.h" #include "GeoDataLatLonAltBox.h" #include "GeoDataLookAt.h" #include "GeoDataPlacemark.h" #include "HttpDownloadManager.h" #include "MarbleDirs.h" #include "MarbleDebug.h" #include "MarbleLocale.h" #include "MarbleModel.h" #include "MarblePluginSettingsWidget.h" #include "MapWizard.h" #include "NewBookmarkFolderDialog.h" #include "RenderPluginModel.h" #include "routing/RoutingManager.h" #include "routing/RoutingProfilesModel.h" #include "routing/RoutingProfilesWidget.h" #include "routing/RouteRequest.h" #include "SunControlWidget.h" #include "TimeControlWidget.h" #include "TileCoordsPyramid.h" #include "ViewportParams.h" #include "MarbleClock.h" #include "ParseRunnerPlugin.h" #include "PositionTracking.h" #include "PositionProviderPlugin.h" #include "PluginManager.h" #include "SearchInputWidget.h" #include "MarbleWidgetInputHandler.h" #include "Planet.h" #include "MapThemeDownloadDialog.h" #include "cloudsync/BookmarkSyncManager.h" #include "MovieCaptureDialog.h" #include "cloudsync/RouteSyncManager.h" #include "cloudsync/CloudSyncManager.h" // Marble non-library classes #include "ControlView.h" #include "settings.h" using namespace Marble; #include "ui_MarbleCacheSettingsWidget.h" #include "ui_MarbleViewSettingsWidget.h" #include "ui_MarbleNavigationSettingsWidget.h" #include "ui_MarbleTimeSettingsWidget.h" namespace Marble { namespace { const char POSITION_STRING[] = I18N_NOOP( "Position: %1" ); const char DISTANCE_STRING[] = I18N_NOOP( "Altitude: %1" ); const char TILEZOOMLEVEL_STRING[] = I18N_NOOP( "Tile Zoom Level: %1" ); const char DATETIME_STRING[] = I18N_NOOP( "Time: %1" ); } K_PLUGIN_FACTORY(MarblePartFactory, registerPlugin();) K_EXPORT_PLUGIN(MarblePartFactory("marble")) MarblePart::MarblePart( QWidget *parentWidget, QObject *parent, const QVariantList &arguments ) : KParts::ReadOnlyPart( parent ), m_sunControlDialog( 0 ), m_timeControlDialog( 0 ), m_downloadRegionDialog( 0 ), m_movieCaptureDialog( 0 ), m_externalMapEditorAction( 0 ), m_recordMovieAction( 0 ), m_stopRecordingAction( 0 ), m_recentFilesAction( 0 ), m_configDialog( 0 ), m_position( QCoreApplication::translate( "Marble", NOT_AVAILABLE ) ), m_tileZoomLevel( QCoreApplication::translate( "Marble", NOT_AVAILABLE ) ), m_positionLabel( 0 ), m_distanceLabel( 0 ) { // only set marble data path when a path was given if ( arguments.count() != 0 && !arguments.first().toString().isEmpty() ) MarbleDirs::setMarbleDataPath( arguments.first().toString() ); // Setting measure system to provide nice standards for all unit questions. // This has to happen before any initialization so plugins (for example) can // use it during initialization. MarbleLocale *marbleLocale = MarbleGlobal::getInstance()->locale(); // KF5 TODO: Read Connecting Calls to Catalogs" in ki18n programmer's guide // and enable translations // KLocale *kLocale = KGlobal::locale(); // if ( kLocale->measureSystem() == KLocale::Metric ) { // marbleLocale->setMeasurementSystem( QLocale::MetricSystem ); // } // else { // marbleLocale->setMeasurementSystem( QLocale::ImperialSystem ); // } marbleLocale->setMeasurementSystem( MarbleLocale::ImperialSystem ); migrateNewstuffConfigFiles(); m_externalEditorMapping[0] = ""; m_externalEditorMapping[1] = "potlatch"; m_externalEditorMapping[2] = "josm"; m_externalEditorMapping[3] = "merkaartor"; m_controlView = new ControlView( parentWidget ); setWidget( m_controlView ); setupActions(); setXMLFile( "marble_part.rc" ); m_statusBarExtension = new KParts::StatusBarExtension( this ); m_statusBarExtension->statusBar()->setUpdatesEnabled( false ); // Load bookmark file. If it does not exist, a default one will be used. m_controlView->marbleModel()->bookmarkManager()->loadFile( "bookmarks/bookmarks.kml" ); initializeCustomTimezone(); setupStatusBar(); readSettings(); m_statusBarExtension->statusBar()->setUpdatesEnabled( true ); // Show startup location switch ( MarbleSettings::onStartup() ) { case LastLocationVisited: { GeoDataLookAt target; target.setLongitude( MarbleSettings::quitLongitude() ); target.setLatitude( MarbleSettings::quitLatitude() ); target.setRange( MarbleSettings::quitRange() ); m_controlView->marbleWidget()->flyTo( target, Instant ); } break; case ShowHomeLocation: m_controlView->marbleWidget()->goHome( Instant ); break; } connect( m_controlView, SIGNAL(showUploadDialog()), this, SLOT(showUploadNewStuffDialog()) ); connect( m_controlView, SIGNAL(showMapWizard()), this, SLOT(showMapWizard()) ); connect( m_controlView, SIGNAL(mapThemeDeleted()), this, SLOT(fallBackToDefaultTheme()) ); } MarblePart::~MarblePart() { writeSettings(); // Check whether this delete is really needed. delete m_configDialog; } ControlView* MarblePart::controlView() const { return m_controlView; } KAboutData *MarblePart::createAboutData() { return new KAboutData( QString( I18N_NOOP( "marble_part" ) ), QString( "Marble" ), ControlView::applicationVersion(), i18n( "A Virtual Globe" ), KAboutLicense::LGPL_V2 ); } bool MarblePart::openUrl( const QUrl &url ) { QFileInfo fileInfo( url.toLocalFile() ); if ( fileInfo.isReadable() ) { m_controlView->marbleModel()->addGeoDataFile( url.toLocalFile() ); m_recentFilesAction->addUrl( url ); return true; } KMessageBox::error( widget(), i18n( "Sorry, unable to open '%1'. The file is not accessible.", fileInfo.fileName() ), i18n( "File not accessible" ) ); return false; } bool MarblePart::openFile() { const PluginManager *const pluginManager = m_controlView->marbleModel()->pluginManager(); QStringList allFileExtensions; QStringList filters; - foreach ( const ParseRunnerPlugin *plugin, pluginManager->parsingRunnerPlugins() ) { + for ( const ParseRunnerPlugin *plugin: pluginManager->parsingRunnerPlugins() ) { if (plugin->nameId() == QLatin1String("Cache")) continue; const QStringList fileExtensions = plugin->fileExtensions().replaceInStrings( QRegExp( "^" ), "*." ); const QString filter = plugin->fileFormatDescription() + QLatin1String(" (") + fileExtensions.join(QLatin1Char(' ')) + QLatin1Char(')'); filters << filter; allFileExtensions << fileExtensions; } allFileExtensions.sort(); // sort since file extensions are visible under Windows const QString allFileTypes = i18n("All Supported Files") + QLatin1String(" (") + allFileExtensions.join(QLatin1Char(' ')) + QLatin1Char(')'); filters.sort(); filters.prepend( allFileTypes ); const QString filter = filters.join( ";;" ); QStringList fileNames = QFileDialog::getOpenFileNames( widget(), i18n("Open File"), m_lastFileOpenPath, filter ); if ( !fileNames.isEmpty() ) { const QString firstFile = fileNames.first(); m_lastFileOpenPath = QFileInfo( firstFile ).absolutePath(); } - foreach( const QString &fileName, fileNames ) { + for( const QString &fileName: fileNames ) { openUrl( QUrl::fromLocalFile(fileName) ); } return true; } void MarblePart::exportMapScreenShot() { QString fileName = QFileDialog::getSaveFileName( widget(), i18n("Export Map"), QDir::homePath(), i18n( "Images *.jpg *.png" ) ); if ( !fileName.isEmpty() ) { // Take the case into account where no file format is indicated const char * format = 0; if ( !fileName.endsWith(QLatin1String( "png" ), Qt::CaseInsensitive) && !fileName.endsWith(QLatin1String( "jpg" ), Qt::CaseInsensitive) ) { format = "JPG"; } QPixmap mapPixmap = m_controlView->mapScreenShot(); bool success = mapPixmap.save( fileName, format ); if ( !success ) { KMessageBox::error( widget(), i18nc( "Application name", "Marble" ), i18n( "An error occurred while trying to save the file.\n" ), KMessageBox::Notify ); } } } void MarblePart::setShowBookmarks( bool show ) { m_controlView->marbleModel()->bookmarkManager()->setShowBookmarks( show ); m_toggleBookmarkDisplayAction->setChecked( show ); // Sync state with the GUI } void MarblePart::setShowClouds( bool isChecked ) { m_controlView->marbleWidget()->setShowClouds( isChecked ); m_showCloudsAction->setChecked( isChecked ); // Sync state with the GUI } void MarblePart::showPositionLabel( bool isChecked ) { m_positionLabel->setVisible( isChecked ); } void MarblePart::showAltitudeLabel( bool isChecked ) { m_distanceLabel->setVisible( isChecked ); } void MarblePart::showTileZoomLevelLabel( bool isChecked ) { m_tileZoomLevelLabel->setVisible( isChecked ); } void MarblePart::showDateTimeLabel( bool isChecked ) { m_clockLabel->setVisible( isChecked ); } void MarblePart::showDownloadProgressBar( bool isChecked ) { MarbleSettings::setShowDownloadProgressBar( isChecked ); // Change visibility only if there is a download happening m_downloadProgressBar->setVisible( isChecked && m_downloadProgressBar->value() >= 0 ); } void MarblePart::showFullScreen( bool isChecked ) { if ( QApplication::activeWindow() ) KToggleFullScreenAction::setFullScreen( QApplication::activeWindow(), isChecked ); m_fullScreenAct->setChecked( isChecked ); // Sync state with the GUI } void MarblePart::showStatusBar( bool isChecked ) { if ( !m_statusBarExtension->statusBar() ) return; m_statusBarExtension->statusBar()->setVisible( isChecked ); } void MarblePart::controlSun() { if ( !m_sunControlDialog ) { m_sunControlDialog = new SunControlWidget( m_controlView->marbleWidget(), m_controlView ); connect( m_sunControlDialog, SIGNAL(showSun(bool)), this, SLOT (showSun(bool)) ); connect( m_sunControlDialog, SIGNAL(showSun(bool)), m_showShadow, SLOT (setChecked(bool)) ); connect( m_sunControlDialog, SIGNAL(isLockedToSubSolarPoint(bool)), m_lockToSubSolarPoint, SLOT (setChecked(bool)) ); connect( m_sunControlDialog, SIGNAL(isSubSolarPointIconVisible(bool)), m_setSubSolarPointIconVisible, SLOT (setChecked(bool)) ); } m_sunControlDialog->show(); m_sunControlDialog->raise(); m_sunControlDialog->activateWindow(); } void MarblePart::controlTime() { if ( !m_timeControlDialog ) { m_timeControlDialog = new TimeControlWidget( m_controlView->marbleModel()->clock() ); } m_timeControlDialog->show(); m_timeControlDialog->raise(); m_timeControlDialog->activateWindow(); } void MarblePart::showSun( bool active ) { m_controlView->marbleWidget()->setShowSunShading( active ); m_sunControlDialog->setSunShading( active ); } void MarblePart::lockToSubSolarPoint( bool lock ) { m_controlView->marbleWidget()->setLockToSubSolarPoint( lock ); } void MarblePart::setSubSolarPointIconVisible( bool show ) { m_controlView->marbleWidget()->setSubSolarPointIconVisible( show ); } void MarblePart::workOffline( bool offline ) { m_controlView->setWorkOffline( offline ); m_newStuffAction->setEnabled( !offline ); m_downloadRegionAction->setEnabled( !offline ); } void MarblePart::copyMap() { QPixmap mapPixmap = m_controlView->mapScreenShot(); QClipboard *clipboard = QApplication::clipboard(); clipboard->setPixmap( mapPixmap ); } void MarblePart::copyCoordinates() { qreal lon = m_controlView->marbleWidget()->centerLongitude(); qreal lat = m_controlView->marbleWidget()->centerLatitude(); QString positionString = GeoDataCoordinates( lon, lat, 0.0, GeoDataCoordinates::Degree ).toString(); QClipboard *clipboard = QApplication::clipboard(); clipboard->setText( positionString ); } void MarblePart::readSettings() { qDebug() << "Start: MarblePart::readSettings()"; // Set home position m_controlView->marbleModel()->setHome( MarbleSettings::homeLongitude(), MarbleSettings::homeLatitude(), MarbleSettings::homeZoom() ); // Map theme and projection QString mapTheme = MarbleSettings::mapTheme(); if ( mapTheme.isEmpty() ) { mapTheme = m_controlView->defaultMapThemeId(); } m_controlView->marbleWidget()->setMapThemeId( mapTheme ); m_controlView->marbleWidget()->setProjection( (Projection) MarbleSettings::projection() ); m_controlView->marbleWidget()->setShowClouds( MarbleSettings::showClouds() ); m_showCloudsAction->setChecked( MarbleSettings::showClouds() ); workOffline( MarbleSettings::workOffline() ); m_workOfflineAction->setChecked( MarbleSettings::workOffline() ); m_lockFloatItemsAct->setChecked(MarbleSettings::lockFloatItemPositions()); lockFloatItemPosition(MarbleSettings::lockFloatItemPositions()); setShowBookmarks( MarbleSettings::showBookmarks() ); // Sun m_controlView->marbleWidget()->setShowSunShading( MarbleSettings::showSun() ); m_showShadow->setChecked( MarbleSettings::showSun() ); m_controlView->marbleWidget()->setShowCityLights( MarbleSettings::showCitylights() ); m_controlView->marbleWidget()->setSubSolarPointIconVisible( MarbleSettings::subSolarPointIconVisible() ); m_controlView->marbleWidget()->setLockToSubSolarPoint( MarbleSettings::lockToSubSolarPoint() ); m_setSubSolarPointIconVisible->setChecked( MarbleSettings::subSolarPointIconVisible() ); m_lockToSubSolarPoint->setChecked( MarbleSettings::lockToSubSolarPoint() ); // View m_lastFileOpenPath = MarbleSettings::lastFileOpenDir(); // Tracking settings readTrackingSettings(); // Load previous route settings m_controlView->marbleModel()->routingManager()->readSettings(); bool const startupWarning = MarbleSettings::showGuidanceModeStartupWarning(); m_controlView->marbleModel()->routingManager()->setShowGuidanceModeStartupWarning( startupWarning ); KSharedConfig::Ptr sharedConfig = KSharedConfig::openConfig(); if ( sharedConfig->hasGroup( "Routing Profiles" ) ) { QList profiles; KConfigGroup profilesGroup = sharedConfig->group( "Routing Profiles" ); int numProfiles = profilesGroup.readEntry( "Num", 0 ); for ( int i = 0; i < numProfiles; ++i ) { KConfigGroup profileGroup = profilesGroup.group( QString( "Profile %0" ).arg(i) ); QString name = profileGroup.readEntry( "Name", i18n( "Unnamed" ) ); RoutingProfile profile( name ); - foreach ( const QString& pluginName, profileGroup.groupList() ) { + for ( const QString& pluginName: profileGroup.groupList() ) { KConfigGroup pluginGroup = profileGroup.group( pluginName ); profile.pluginSettings().insert( pluginName, QHash() ); - foreach ( const QString& key, pluginGroup.keyList() ) { + for ( const QString& key: pluginGroup.keyList() ) { if (key != QLatin1String("Enabled")) { profile.pluginSettings()[ pluginName ].insert( key, pluginGroup.readEntry( key ) ); } } } profiles << profile; } m_controlView->marbleModel()->routingManager()->profilesModel()->setProfiles( profiles ); } else { m_controlView->marbleModel()->routingManager()->profilesModel()->loadDefaultProfiles(); } int const profileIndex = MarbleSettings::currentRoutingProfile(); if ( profileIndex >= 0 && profileIndex < m_controlView->marbleModel()->routingManager()->profilesModel()->rowCount() ) { RoutingProfile profile = m_controlView->marbleModel()->routingManager()->profilesModel()->profiles().at( profileIndex ); m_controlView->marbleModel()->routingManager()->routeRequest()->setRoutingProfile( profile ); } PositionTracking *const tracking = m_controlView->marbleModel()->positionTracking(); tracking->readSettings(); QString positionProvider = MarbleSettings::activePositionTrackingPlugin(); if ( !positionProvider.isEmpty() ) { const PluginManager* pluginManager = m_controlView->marbleModel()->pluginManager(); - foreach( const PositionProviderPlugin* plugin, pluginManager->positionProviderPlugins() ) { + for( const PositionProviderPlugin* plugin: pluginManager->positionProviderPlugins() ) { if ( plugin->nameId() == positionProvider ) { PositionProviderPlugin* instance = plugin->newInstance(); tracking->setPositionProviderPlugin( instance ); break; } } } readStatusBarSettings(); updateSettings(); // Time if( MarbleSettings::systemTime() == true ) { /* nothing to do */ } else if( MarbleSettings::lastSessionTime() == true ) { m_controlView->marbleModel()->setClockDateTime( MarbleSettings::dateTime() ); m_controlView->marbleModel()->setClockSpeed( MarbleSettings::speedSlider() ); } readPluginSettings(); m_controlView->setExternalMapEditor( m_externalEditorMapping[MarbleSettings::externalMapEditor()] ); CloudSyncManager* cloudSyncManager = m_controlView->cloudSyncManager(); cloudSyncManager->setOwncloudCredentials( MarbleSettings::owncloudServer(), MarbleSettings::owncloudUsername(), MarbleSettings::owncloudPassword()); cloudSyncManager->setSyncEnabled( MarbleSettings::enableSync() ); cloudSyncManager->routeSyncManager()->setRouteSyncEnabled( MarbleSettings::syncRoutes() ); cloudSyncManager->bookmarkSyncManager()->setBookmarkSyncEnabled( MarbleSettings::syncBookmarks() ); } void MarblePart::readTrackingSettings() { if( MarbleSettings::autoCenter() || MarbleSettings::recenterMode() ) { CurrentLocationWidget *trackingWidget = m_controlView->currentLocationWidget(); if( trackingWidget ) { trackingWidget->setRecenterMode( MarbleSettings::recenterMode() ); trackingWidget->setAutoZoom( MarbleSettings::autoZoom() ); trackingWidget->setTrackVisible( MarbleSettings::trackVisible() ); trackingWidget->setLastOpenPath( MarbleSettings::lastTrackOpenPath() ); trackingWidget->setLastSavePath( MarbleSettings::lastTrackSavePath() ); } } } void MarblePart::readStatusBarSettings() { const bool showPos = MarbleSettings::showPositionLabel(); m_showPositionAction->setChecked( showPos ); showPositionLabel( showPos ); const bool showAlt = MarbleSettings::showAltitudeLabel(); m_showAltitudeAction->setChecked( showAlt ); showAltitudeLabel( showAlt ); const bool showTileZoom = MarbleSettings::showTileZoomLevelLabel(); m_showTileZoomLevelAction->setChecked( showTileZoom ); showTileZoomLevelLabel( showTileZoom ); const bool showDateTime = MarbleSettings::showDateTimeLabel(); m_showDateTimeAction->setChecked( showDateTime ); showDateTimeLabel( showDateTime ); const bool showProgress = MarbleSettings::showDownloadProgressBar(); m_showDownloadProgressAction->setChecked( showProgress ); showDownloadProgressBar( showProgress ); } void MarblePart::writeSettings() { // Get the 'quit' values from the widget and store them in the settings. qreal quitLon = m_controlView->marbleWidget()->lookAt().longitude(); qreal quitLat = m_controlView->marbleWidget()->lookAt().latitude(); qreal quitRange = m_controlView->marbleWidget()->lookAt().range(); MarbleSettings::setQuitLongitude( quitLon ); MarbleSettings::setQuitLatitude( quitLat ); MarbleSettings::setQuitRange( quitRange ); // Get the 'home' values from the widget and store them in the settings. qreal homeLon = 0; qreal homeLat = 0; int homeZoom = 0; m_controlView->marbleModel()->home( homeLon, homeLat, homeZoom ); MarbleSettings::setHomeLongitude( homeLon ); MarbleSettings::setHomeLatitude( homeLat ); MarbleSettings::setHomeZoom( homeZoom ); // Set default font MarbleSettings::setMapFont( m_controlView->marbleWidget()->defaultFont() ); // Get whether animations to the target are enabled MarbleSettings::setAnimateTargetVoyage( m_controlView->marbleWidget()->animationsEnabled() ); // Map theme and projection MarbleSettings::setMapTheme( m_controlView->marbleWidget()->mapThemeId() ); MarbleSettings::setProjection( m_controlView->marbleWidget()->projection() ); MarbleSettings::setShowClouds( m_controlView->marbleWidget()->showClouds() ); MarbleSettings::setWorkOffline( m_workOfflineAction->isChecked() ); MarbleSettings::setStillQuality( m_controlView->marbleWidget()->mapQuality( Still ) ); MarbleSettings::setAnimationQuality( m_controlView->marbleWidget()-> mapQuality( Animation ) ); MarbleSettings::setShowBookmarks( m_controlView->marbleModel()->bookmarkManager()->showBookmarks() ); MarbleSettings::setLastFileOpenDir( m_lastFileOpenPath ); MarbleSettings::setDistanceUnit( MarbleGlobal::getInstance()->locale()->measurementSystem() ); MarbleSettings::setAngleUnit( m_controlView->marbleWidget()->defaultAngleUnit() ); // Sun MarbleSettings::setShowSun( m_controlView->marbleWidget()->showSunShading() ); MarbleSettings::setShowCitylights( m_controlView->marbleWidget()->showCityLights() ); MarbleSettings::setLockToSubSolarPoint( m_controlView->marbleWidget()->isLockedToSubSolarPoint() ); MarbleSettings::setSubSolarPointIconVisible( m_controlView->marbleWidget()->isSubSolarPointIconVisible() ); // Tracking CurrentLocationWidget *trackingWidget = m_controlView->currentLocationWidget(); if( trackingWidget ) { MarbleSettings::setRecenterMode( trackingWidget->recenterMode() ); MarbleSettings::setAutoZoom( trackingWidget->autoZoom() ); MarbleSettings::setTrackVisible( trackingWidget->trackVisible() ); MarbleSettings::setLastTrackOpenPath( trackingWidget->lastOpenPath() ); MarbleSettings::setLastTrackSavePath( trackingWidget->lastSavePath() ); } // Caches MarbleSettings::setVolatileTileCacheLimit( m_controlView->marbleWidget()-> volatileTileCacheLimit() / 1024 ); MarbleSettings::setPersistentTileCacheLimit( m_controlView->marbleModel()-> persistentTileCacheLimit() / 1024 ); // Time MarbleSettings::setDateTime( m_controlView->marbleModel()->clockDateTime() ); MarbleSettings::setSpeedSlider( m_controlView->marbleModel()->clockSpeed() ); // Plugins writePluginSettings(); QString positionProvider; PositionTracking* tracking = m_controlView->marbleModel()->positionTracking(); tracking->writeSettings(); if ( tracking->positionProviderPlugin() ) { positionProvider = tracking->positionProviderPlugin()->nameId(); } MarbleSettings::setActivePositionTrackingPlugin( positionProvider ); MarbleSettings::setLockFloatItemPositions( m_lockFloatItemsAct->isChecked() ); writeStatusBarSettings(); // Store recent files KSharedConfig::Ptr sharedConfig = KSharedConfig::openConfig(); m_recentFilesAction->saveEntries( sharedConfig->group( "RecentFiles" ) ); // Store current route settings RoutingManager *routingManager = m_controlView->marbleWidget()->model()->routingManager(); routingManager->writeSettings(); bool const startupWarning = routingManager->showGuidanceModeStartupWarning(); MarbleSettings::setShowGuidanceModeStartupWarning( startupWarning ); QList profiles = routingManager->profilesModel()->profiles(); RoutingProfile const profile = routingManager->routeRequest()->routingProfile(); MarbleSettings::setCurrentRoutingProfile( profiles.indexOf( profile ) ); QList const editors = m_externalEditorMapping.values(); MarbleSettings::setExternalMapEditor( editors.indexOf( m_controlView->externalMapEditor() ) ); applyPluginState(); MarbleSettings::self()->save(); } void MarblePart::writeStatusBarSettings() { MarbleSettings::setShowPositionLabel( m_showPositionAction->isChecked() ); MarbleSettings::setShowAltitudeLabel( m_showAltitudeAction->isChecked() ); MarbleSettings::setShowTileZoomLevelLabel( m_showTileZoomLevelAction->isChecked() ); MarbleSettings::setShowDateTimeLabel( m_showDateTimeAction->isChecked() ); MarbleSettings::setShowDownloadProgressBar( m_showDownloadProgressAction->isChecked() ); } void MarblePart::setupActions() { // Action: Recent Files m_recentFilesAction = KStandardAction::openRecent( this, SLOT(openUrl(QUrl)), actionCollection() ); KSharedConfig::Ptr sharedConfig = KSharedConfig::openConfig(); m_recentFilesAction->loadEntries( sharedConfig->group( "RecentFiles" ) ); // Action: Download Region m_downloadRegionAction = new QAction( this ); m_downloadRegionAction->setText( i18nc( "Action for downloading an entire region of a map", "Download Region..." )); actionCollection()->addAction( "file_download_region", m_downloadRegionAction ); connect( m_downloadRegionAction, SIGNAL(triggered()), SLOT(showDownloadRegionDialog())); // Action: Print Map m_printMapAction = KStandardAction::print( this, SLOT(printMapScreenShot()), actionCollection() ); m_printPreviewAction = KStandardAction::printPreview( m_controlView, SLOT(printPreview()), actionCollection() ); // Action: Export Map m_exportMapAction = new QAction( this ); actionCollection()->addAction( "exportMap", m_exportMapAction ); m_exportMapAction->setText( i18nc( "Action for saving the map to a file", "&Export Map..." ) ); m_exportMapAction->setIcon( QIcon::fromTheme( "document-save-as" ) ); actionCollection()->setDefaultShortcut( m_exportMapAction, Qt::CTRL + Qt::Key_S ); connect( m_exportMapAction, SIGNAL(triggered(bool)), this, SLOT(exportMapScreenShot()) ); // Action: Work Offline m_workOfflineAction = new QAction( this ); actionCollection()->addAction( "workOffline", m_workOfflineAction ); m_workOfflineAction->setText( i18nc( "Action for toggling offline mode", "&Work Offline" ) ); m_workOfflineAction->setIcon( QIcon::fromTheme( "user-offline" ) ); m_workOfflineAction->setCheckable( true ); m_workOfflineAction->setChecked( false ); connect( m_workOfflineAction, SIGNAL(triggered(bool)), this, SLOT(workOffline(bool)) ); // Action: Copy Map to the Clipboard m_copyMapAction = KStandardAction::copy( this, SLOT(copyMap()), actionCollection() ); m_copyMapAction->setText( i18nc( "Action for copying the map to the clipboard", "&Copy Map" ) ); // Action: Copy Coordinates string m_copyCoordinatesAction = new QAction( this ); actionCollection()->addAction( "edit_copy_coordinates", m_copyCoordinatesAction ); m_copyCoordinatesAction->setText( i18nc( "Action for copying the coordinates to the clipboard", "C&opy Coordinates" ) ); m_copyCoordinatesAction->setIcon(QIcon(QStringLiteral(":/icons/copy-coordinates.png"))); connect( m_copyCoordinatesAction, SIGNAL(triggered(bool)), this, SLOT(copyCoordinates()) ); // Action: Open a Gpx or a Kml File m_openAct = KStandardAction::open( this, SLOT(openFile()), actionCollection() ); m_openAct->setText( i18nc( "Action for opening a file", "&Open..." ) ); // Standard actions. So far only Quit. KStandardAction::quit( qApp, SLOT(closeAllWindows()), actionCollection() ); // Action: Get hot new stuff m_newStuffAction = KNS3::standardAction( i18nc( "Action for downloading maps (GHNS)", "Download Maps..."), this, SLOT(showNewStuffDialog()), actionCollection(), "new_stuff" ); m_newStuffAction->setStatusTip( i18nc( "Status tip", "Download new maps")); actionCollection()->setDefaultShortcut( m_newStuffAction, Qt::CTRL + Qt::Key_N ); // Action: Create a New Map m_mapWizardAct = new QAction( i18nc( "Action for creating new maps", "&Create a New Map..." ), this ); m_mapWizardAct->setIcon(QIcon(QStringLiteral(":/icons/create-new-map.png"))); actionCollection()->addAction( "createMap", m_mapWizardAct ); m_mapWizardAct->setStatusTip( i18nc( "Status tip", "A wizard guides you through the creation of your own map theme." ) ); connect( m_mapWizardAct, SIGNAL(triggered()), SLOT(showMapWizard()) ); KStandardAction::showStatusbar( this, SLOT(showStatusBar(bool)), actionCollection() ); m_fullScreenAct = KStandardAction::fullScreen( 0, 0, widget(), actionCollection() ); connect( m_fullScreenAct, SIGNAL(triggered(bool)), this, SLOT(showFullScreen(bool)) ); // Action: Show Crosshairs option QList pluginList = m_controlView->marbleWidget()->renderPlugins(); QList::const_iterator i = pluginList.constBegin(); QList::const_iterator const end = pluginList.constEnd(); for (; i != end; ++i ) { if ((*i)->nameId() == QLatin1String("crosshairs")) { actionCollection()->addAction( "show_crosshairs", (*i)->action() ); } } // Action: Show Clouds option m_showCloudsAction = new QAction( this ); actionCollection()->addAction( "show_clouds", m_showCloudsAction ); m_showCloudsAction->setCheckable( true ); m_showCloudsAction->setChecked( true ); m_showCloudsAction->setIcon(QIcon(QStringLiteral(":/icons/clouds.png"))); m_showCloudsAction->setText( i18nc( "Action for toggling clouds", "&Clouds" ) ); connect( m_showCloudsAction, SIGNAL(triggered(bool)), this, SLOT(setShowClouds(bool)) ); // Action: Show Sunshade options m_controlSunAction = new QAction( this ); actionCollection()->addAction( "control_sun", m_controlSunAction ); m_controlSunAction->setText( i18nc( "Action for sun control dialog", "S&un Control..." ) ); connect( m_controlSunAction, SIGNAL(triggered(bool)), this, SLOT(controlSun()) ); KStandardAction::redisplay( m_controlView->marbleWidget(), SLOT(reloadMap()), actionCollection() ); // Action: Show Time options m_controlTimeAction = new QAction( this ); actionCollection()->addAction( "control_time", m_controlTimeAction ); m_controlTimeAction->setIcon(QIcon(QStringLiteral(":/icons/clock.png"))); m_controlTimeAction->setText( i18nc( "Action for time control dialog", "&Time Control..." ) ); connect( m_controlTimeAction, SIGNAL(triggered(bool)), this, SLOT(controlTime()) ); // Action: Lock float items m_lockFloatItemsAct = new QAction ( this ); actionCollection()->addAction( "options_lock_floatitems", m_lockFloatItemsAct ); m_lockFloatItemsAct->setText( i18nc( "Action for locking float items on the map", "Lock Position" ) ); m_lockFloatItemsAct->setIcon(QIcon(QStringLiteral(":/icons/unlock.png"))); m_lockFloatItemsAct->setCheckable( true ); m_lockFloatItemsAct->setChecked( false ); connect( m_lockFloatItemsAct, SIGNAL(triggered(bool)), this, SLOT(lockFloatItemPosition(bool)) ); KStandardAction::preferences( this, SLOT(editSettings()), actionCollection() ); //Toggle Action: Show sun shadow m_showShadow = new KToggleAction( i18n( "Show Shadow" ), this ); // m_showShadow->setIcon(QIcon(QStringLiteral(""))); // Fixme: Add Icon actionCollection()->addAction( "sun_shadow", m_showShadow ); m_showShadow->setCheckedState( KGuiItem( i18n( "Hide Shadow" ) ) ); m_showShadow->setToolTip(i18n("Shows and hides the shadow of the sun")); connect( m_showShadow, SIGNAL(triggered(bool)), this, SLOT(showSun(bool))); //Toggle Action: Show Sun icon on the Sub-Solar Point m_setSubSolarPointIconVisible = new KToggleAction( i18n( "Show sun icon on the Sub-Solar Point" ), this ); actionCollection()->addAction( "show_icon_on_subsolarpoint", m_setSubSolarPointIconVisible ); m_setSubSolarPointIconVisible->setCheckedState( KGuiItem( i18n( "Hide sun icon on the Sub-Solar Point" ) ) ); m_setSubSolarPointIconVisible->setToolTip( i18n( "Show sun icon on the sub-solar point" ) ); connect( m_setSubSolarPointIconVisible, SIGNAL(triggered(bool)), this, SLOT(setSubSolarPointIconVisible(bool))); //Toggle Action: Lock globe to the Sub-Solar Point m_lockToSubSolarPoint = new KToggleAction( i18n( "Lock Globe to the Sub-Solar Point" ), this ); actionCollection()->addAction( "lock_to_subsolarpoint", m_lockToSubSolarPoint ); m_lockToSubSolarPoint->setCheckedState( KGuiItem( i18n( "Unlock Globe to the Sub-Solar Point" ) ) ); m_lockToSubSolarPoint->setToolTip( i18n( "Lock globe to the sub-solar point" ) ); connect( m_lockToSubSolarPoint, SIGNAL(triggered(bool)), this, SLOT(lockToSubSolarPoint(bool))); // FIXME: Discuss if this is the best place to put this QList::const_iterator it = pluginList.constBegin(); QList::const_iterator const itEnd = pluginList.constEnd(); for (; it != itEnd; ++it ) { if ((*it)->nameId() != QLatin1String("annotation")) { connect( (*it), SIGNAL(actionGroupsChanged()), this, SLOT(createPluginMenus()) ); } } m_addBookmarkAction = new QAction( this ); actionCollection()->addAction( "add_bookmark", m_addBookmarkAction ); m_addBookmarkAction->setText( i18nc( "Add Bookmark", "&Add Bookmark" ) ); m_addBookmarkAction->setIcon(QIcon(QStringLiteral(":/icons/bookmark-new.png"))); actionCollection()->setDefaultShortcut( m_addBookmarkAction, Qt::CTRL + Qt::Key_B ); connect( m_addBookmarkAction, SIGNAL(triggered()), this, SLOT(openEditBookmarkDialog()) ); m_toggleBookmarkDisplayAction = new QAction( this ); actionCollection()->addAction( "show_bookmarks", m_toggleBookmarkDisplayAction ); m_toggleBookmarkDisplayAction->setText( i18nc( "Show Bookmarks", "Show &Bookmarks" ) ); m_toggleBookmarkDisplayAction->setStatusTip( i18n( "Show or hide bookmarks in the map" ) ); m_toggleBookmarkDisplayAction->setCheckable( true ); m_toggleBookmarkDisplayAction->setChecked( m_controlView->marbleModel()->bookmarkManager()->showBookmarks() ); connect( m_toggleBookmarkDisplayAction, SIGNAL(toggled(bool)), m_controlView->marbleModel()->bookmarkManager(), SLOT(setShowBookmarks(bool)) ); m_setHomeAction = new QAction( this ); actionCollection()->addAction( "set_home", m_setHomeAction ); m_setHomeAction->setText( i18n( "&Set Home Location" ) ); m_setHomeAction->setIcon( QIcon::fromTheme( "go-home" ) ); connect( m_setHomeAction, SIGNAL(triggered()), this, SLOT(setHome()) ); m_manageBookmarksAction = new QAction( this ); actionCollection()->addAction( "manage_bookmarks", m_manageBookmarksAction ); m_manageBookmarksAction->setText( i18nc( "Manage Bookmarks", "&Manage Bookmarks" ) ); m_manageBookmarksAction->setIcon(QIcon(QStringLiteral(":/icons/bookmarks-organize.png"))); connect( m_manageBookmarksAction, SIGNAL(triggered()), this, SLOT(openManageBookmarksDialog()) ); createFolderList(); connect( m_controlView->marbleModel()->bookmarkManager(), SIGNAL(bookmarksChanged()), this, SLOT(createFolderList()) ); m_externalMapEditorAction = new QAction( this ); actionCollection()->addAction( "external_editor", m_externalMapEditorAction ); m_externalMapEditorAction->setText( i18nc( "Edit the map in an external application", "&Edit Map" ) ); m_externalMapEditorAction->setIcon(QIcon(QStringLiteral(":/icons/edit-map.png"))); actionCollection()->setDefaultShortcut( m_externalMapEditorAction, Qt::CTRL + Qt::Key_E ); connect( m_externalMapEditorAction, SIGNAL(triggered()), m_controlView, SLOT(launchExternalMapEditor()) ); connect( m_controlView->marbleWidget(), SIGNAL(themeChanged(QString)), this, SLOT(updateMapEditButtonVisibility(QString)) ); m_recordMovieAction = new QAction( i18n( "&Record Movie" ), this ); actionCollection()->addAction( "record_movie" , m_recordMovieAction ); m_recordMovieAction->setStatusTip( i18n( "Records a movie of the globe" ) ); actionCollection()->setDefaultShortcut( m_recordMovieAction, Qt::CTRL + Qt::SHIFT + Qt::Key_R ); m_recordMovieAction->setIcon(QIcon(QStringLiteral(":/icons/animator.png"))); connect( m_recordMovieAction, SIGNAL(triggered()), this, SLOT(showMovieCaptureDialog()) ); m_stopRecordingAction = new QAction( i18n( "&Stop recording" ), this ); actionCollection()->addAction( "stop_recording" , m_stopRecordingAction ); m_stopRecordingAction->setStatusTip( i18n( "Stop recording a movie of the globe" ) ); actionCollection()->setDefaultShortcut( m_recordMovieAction, Qt::CTRL + Qt::SHIFT + Qt::Key_S ); m_stopRecordingAction->setEnabled( false ); connect( m_stopRecordingAction, SIGNAL(triggered()), this, SLOT(stopRecording()) ); } void MarblePart::createFolderList() { QList actionList; QVector folders = m_controlView->marbleModel()->bookmarkManager()->folders(); QVector::const_iterator i = folders.constBegin(); QVector::const_iterator end = folders.constEnd(); for (; i != end; ++i ) { QMenu *m_bookmarksListMenu = new QMenu( (*i)->name() ); createBookmarksListMenu( m_bookmarksListMenu, *(*i) ); connect( m_bookmarksListMenu, SIGNAL(triggered(QAction*)), this, SLOT(lookAtBookmark(QAction*)) ); actionList.append( m_bookmarksListMenu->menuAction() ); } unplugActionList("folders"); plugActionList( "folders", actionList ); } void MarblePart::createBookmarksListMenu( QMenu *m_bookmarksListMenu, const GeoDataFolder &folder ) { m_bookmarksListMenu->clear(); QVector bookmarks = folder.placemarkList(); QVector::const_iterator i = bookmarks.constBegin(); QVector::const_iterator end = bookmarks.constEnd(); for (; i != end; ++i ) { QAction *bookmarkAct = new QAction( (*i)->name(), this ); QVariant var; GeoDataLookAt* lookAt = (*i)->lookAt(); if ( !lookAt ) { GeoDataLookAt coordinateToLookAt; coordinateToLookAt.setCoordinates( (*i)->coordinate() ); coordinateToLookAt.setRange( (*i)->coordinate().altitude() ); } else { var.setValue( *lookAt ); } bookmarkAct->setData( var ); m_bookmarksListMenu->addAction( bookmarkAct ); } } void MarblePart::createInfoBoxesMenu() { QList floatItemList = m_controlView->marbleWidget()->floatItems(); QList actionList; QList::const_iterator i = floatItemList.constBegin(); QList::const_iterator const end = floatItemList.constEnd(); for (; i != end; ++i ) { actionList.append( (*i)->action() ); } unplugActionList( "infobox_actionlist" ); plugActionList( "infobox_actionlist", actionList ); } void MarblePart::createOnlineServicesMenu() { QList renderPluginList = m_controlView->marbleWidget()->renderPlugins(); QList actionList; QList::const_iterator i = renderPluginList.constBegin(); QList::const_iterator const end = renderPluginList.constEnd(); for (; i != end; ++i ) { // FIXME: This will go into the layer manager when AbstractDataPlugin is an interface if( (*i)->renderType() == RenderPlugin::OnlineRenderType ) { actionList.append( (*i)->action() ); } } unplugActionList( "onlineservices_actionlist" ); plugActionList( "onlineservices_actionlist", actionList ); } void MarblePart::createRenderPluginActions() { QList renderPluginList = m_controlView->marbleWidget()->renderPlugins(); QList actionList; QList::const_iterator i = renderPluginList.constBegin(); QList::const_iterator const end = renderPluginList.constEnd(); for (; i != end; ++i ) { if( (*i)->renderType() == RenderPlugin::ThemeRenderType ) { actionList.append( (*i)->action() ); } } unplugActionList( "themerender_actionlist" ); plugActionList( "themerender_actionlist", actionList ); } void MarblePart::showDateTime() { m_clock = QLocale().toString( m_controlView->marbleModel()->clockDateTime().addSecs( m_controlView->marbleModel()->clockTimezone() ), QLocale::ShortFormat ); updateStatusBar(); } void MarblePart::showPosition( const QString& position ) { m_position = position; updateStatusBar(); } void MarblePart::showZoomLevel( const int tileLevel ) { if ( tileLevel == -1 ) m_tileZoomLevel = QCoreApplication::translate( "Marble", NOT_AVAILABLE ); else { m_tileZoomLevel.setNum( tileLevel ); } updateStatusBar(); } void MarblePart::mapThemeChanged( const QString& newMapTheme ) { Q_UNUSED( newMapTheme ); updateTileZoomLevel(); updateStatusBar(); } void MarblePart::createPluginMenus() { unplugActionList("plugins_actionlist"); unplugActionList("plugins_menuactionlist"); QList renderPluginList = m_controlView->marbleWidget()->renderPlugins(); QList::const_iterator i = renderPluginList.constBegin(); QList::const_iterator const end = renderPluginList.constEnd(); for (; i != end; ++i ) { // menus const QList *tmp_actionGroups = (*i)->actionGroups(); if( (*i)->enabled() && tmp_actionGroups ) { - foreach( QActionGroup *ag, *tmp_actionGroups ) { + for( QActionGroup *ag: *tmp_actionGroups ) { plugActionList( "plugins_menuactionlist", ag->actions() ); } } // toolbars const QList *tmp_toolbarActionGroups = (*i)->toolbarActionGroups(); if ( (*i)->enabled() && tmp_toolbarActionGroups ) { - foreach( QActionGroup* ag, *tmp_toolbarActionGroups ) { + for( QActionGroup* ag: *tmp_toolbarActionGroups ) { plugActionList( "plugins_actionlist", ag->actions() ); } } } } void MarblePart::updateTileZoomLevel() { const int tileZoomLevel = m_controlView->marbleWidget()->tileZoomLevel(); if ( tileZoomLevel == -1 ) m_tileZoomLevel = QCoreApplication::translate( "Marble", NOT_AVAILABLE ); else { m_tileZoomLevel.setNum( tileZoomLevel ); } } void MarblePart::migrateNewstuffConfigFiles() const { // Newstuff config files used to be in the KDE data directory of the user, but are now // shared between Marble KDE and Marble Qt in Marble's data path of the user. // This method moves an old KDE newstuff config file to the new location if the former // exists and the latter not. QFileInfo const target(MarbleDirs::localPath() + QLatin1String("/newstuff/marble-map-themes.knsregistry")); if ( !target.exists() ) { QString const source = QStandardPaths::locate( QStandardPaths::GenericDataLocation, "knewstuff3/marble.knsregistry" ); if ( !source.isEmpty() ) { if ( !target.absoluteDir().exists() ) { if ( !QDir::root().mkpath( target.absolutePath() ) ) { mDebug() << "Failed to create target directory " << target.absolutePath() << " needed for newstuff migration"; return; } } QFile registryFile( source ); if ( !registryFile.open( QFile::ReadOnly ) ) { mDebug() << "Cannot parse newstuff xml file"; return; } QDomDocument xml; if ( !xml.setContent( registryFile.readAll() ) ) { mDebug() << "Cannot parse newstuff xml data"; return; } QDomNodeList items = xml.elementsByTagName( "stuff" ); for ( int i = 0; i < items.length(); ++i ) { repairNode( items.item(i), QString("summary") ); repairNode( items.item(i), QString("author") ); } QFile output( target.absoluteFilePath() ); if ( !output.open( QFile::WriteOnly ) ) { mDebug() << "Cannot open " << target.absoluteFilePath() << " for writing"; } else { QTextStream outStream( &output ); outStream << xml.toString( 2 ); outStream.flush(); output.close(); } } } } void MarblePart::repairNode( QDomNode node, const QString &child ) { int const size = node.namedItem( child ).toElement().text().size(); if ( size > 1024 ) { QString const theme = node.namedItem(QStringLiteral("name")).toElement().text(); mDebug() << "Removing GHNS field " << child << " of map theme " << theme << ": Size " << size << " exceeds maximum size (see bug 319542)."; node.removeChild( node.namedItem( child ) ); } } void MarblePart::updateCloudSyncStatus(const QString& status ) { m_ui_cloudSyncSettings.cloudSyncStatus->setText(status); switch (m_controlView->cloudSyncManager()->status()){ case CloudSyncManager::Success: m_ui_cloudSyncSettings.cloudSyncStatus->setStyleSheet("QLabel { color : green; }"); break; case CloudSyncManager::Error: m_ui_cloudSyncSettings.cloudSyncStatus->setStyleSheet("QLabel { color : red; }"); break; case CloudSyncManager::Unknown: m_ui_cloudSyncSettings.cloudSyncStatus->setStyleSheet("QLabel { color : grey; }"); break; } } void MarblePart::updateCloudSyncCredentials() { m_controlView->cloudSyncManager()->setOwncloudCredentials( m_ui_cloudSyncSettings.kcfg_owncloudServer->text(), m_ui_cloudSyncSettings.kcfg_owncloudUsername->text(), m_ui_cloudSyncSettings.kcfg_owncloudPassword->text() ); } void MarblePart::updateStatusBar() { if ( m_positionLabel ) m_positionLabel->setText( i18n( POSITION_STRING, m_position ) ); if ( m_distanceLabel ) m_distanceLabel->setText( i18n( DISTANCE_STRING, m_controlView->marbleWidget()->distanceString() ) ); if ( m_tileZoomLevelLabel ) m_tileZoomLevelLabel->setText( i18n( TILEZOOMLEVEL_STRING, m_tileZoomLevel ) ); if ( m_clockLabel ) m_clockLabel->setText( i18n( DATETIME_STRING, m_clock ) ); } void MarblePart::setupStatusBar() { QFontMetrics statusBarFontMetrics( m_statusBarExtension->statusBar()->fontMetrics() ); // UTM syntax is used in the template string, as it is longer than the lon/lat one QString templatePositionString = QString( "%1 00Z 000000.00 m E, 00000000.00 m N_" ).arg(POSITION_STRING); m_positionLabel = setupStatusBarLabel( templatePositionString ); QString templateDistanceString = QString( "%1 00.000,0 mu" ).arg(DISTANCE_STRING); m_distanceLabel = setupStatusBarLabel( templateDistanceString ); QString templateDateTimeString = QString( "%1 %2" ).arg( DATETIME_STRING , QLocale().toString( QDateTime::fromString ( "01:01:1000", "dd:mm:yyyy"), QLocale::ShortFormat ) ); m_clockLabel = setupStatusBarLabel( templateDateTimeString ); const QString templateTileZoomLevelString = i18n( TILEZOOMLEVEL_STRING, m_tileZoomLevel ); m_tileZoomLevelLabel = setupStatusBarLabel( templateTileZoomLevelString ); connect( m_controlView->marbleWidget(), SIGNAL(mouseMoveGeoPosition(QString)), this, SLOT(showPosition(QString)) ); connect( m_controlView->marbleWidget(), SIGNAL(distanceChanged(QString)), this, SLOT(updateStatusBar()) ); connect( m_controlView->marbleWidget(), SIGNAL(tileLevelChanged(int)), SLOT(showZoomLevel(int))); connect( m_controlView->marbleWidget(), SIGNAL(themeChanged(QString)), this, SLOT(mapThemeChanged(QString)), Qt::QueuedConnection ); connect( m_controlView->marbleModel()->clock(), SIGNAL(timeChanged()), this, SLOT(showDateTime()) ); setupDownloadProgressBar(); setupStatusBarActions(); updateStatusBar(); } QLabel * MarblePart::setupStatusBarLabel( const QString& templateString ) { QFontMetrics statusBarFontMetrics( m_statusBarExtension->statusBar()->fontMetrics() ); QLabel * const label = new QLabel( m_statusBarExtension->statusBar() ); label->setIndent( 5 ); int maxWidth = statusBarFontMetrics.boundingRect( templateString ).width() + 2 * label->margin() + 2 * label->indent(); label->setFixedWidth( maxWidth ); m_statusBarExtension->addStatusBarItem( label, -1, false ); return label; } void MarblePart::setupDownloadProgressBar() { // get status bar and add progress widget QStatusBar * const statusBar = m_statusBarExtension->statusBar(); Q_ASSERT( statusBar ); m_downloadProgressBar = new QProgressBar; m_downloadProgressBar->setVisible( MarbleSettings::showDownloadProgressBar() ); statusBar->addPermanentWidget( m_downloadProgressBar ); HttpDownloadManager * const downloadManager = m_controlView->marbleModel()->downloadManager(); Q_ASSERT( downloadManager ); connect( downloadManager, SIGNAL(progressChanged(int,int)), SLOT(handleProgress(int,int)) ); connect( downloadManager, SIGNAL(jobRemoved()), SLOT(removeProgressItem()) ); } void MarblePart::setupStatusBarActions() { QStatusBar * const statusBar = m_statusBarExtension->statusBar(); Q_ASSERT( statusBar ); statusBar->setContextMenuPolicy( Qt::CustomContextMenu ); connect( statusBar, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showStatusBarContextMenu(QPoint))); m_showPositionAction = new KToggleAction( i18nc( "Action for toggling", "Show Position" ), this ); m_showDateTimeAction = new KToggleAction( i18nc( "Action for toggling", "Show Date and Time" ), this ); m_showAltitudeAction = new KToggleAction( i18nc( "Action for toggling", "Show Altitude" ), this ); m_showTileZoomLevelAction = new KToggleAction( i18nc( "Action for toggling", "Show Tile Zoom Level" ), this ); m_showDownloadProgressAction = new KToggleAction( i18nc( "Action for toggling", "Show Download Progress Bar" ), this ); connect( m_showPositionAction, SIGNAL(triggered(bool)), this, SLOT(showPositionLabel(bool)) ); connect( m_showAltitudeAction, SIGNAL(triggered(bool)), this, SLOT(showAltitudeLabel(bool)) ); connect( m_showTileZoomLevelAction, SIGNAL(triggered(bool)), this, SLOT(showTileZoomLevelLabel(bool)) ); connect( m_showDateTimeAction, SIGNAL(triggered(bool)), this, SLOT(showDateTimeLabel(bool)) ); connect( m_showDownloadProgressAction, SIGNAL(triggered(bool)), this, SLOT(showDownloadProgressBar(bool)) ); } void MarblePart::showNewStuffDialog() { QPointer dialog( new MapThemeDownloadDialog( m_controlView->marbleWidget() ) ); dialog->exec(); delete dialog; } void MarblePart::showUploadNewStuffDialog() { QString newStuffConfig = QStandardPaths::locate( QStandardPaths::GenericDataLocation, "marble/marble.knsrc" ); qDebug() << "KNS config file:" << newStuffConfig; QPointer dialog( new KNS3::UploadDialog( newStuffConfig, m_controlView ) ); qDebug() << "Creating the archive"; dialog->setUploadFile( QUrl( MapWizard::createArchive( m_controlView, m_controlView->marbleWidget()->mapThemeId() ) ) ); dialog->exec(); MapWizard::deleteArchive( m_controlView->marbleWidget()->mapThemeId() ); delete dialog; } void MarblePart::showDownloadRegionDialog() { MarbleWidget * const marbleWidget = m_controlView->marbleWidget(); if ( !m_downloadRegionDialog ) { m_downloadRegionDialog = new DownloadRegionDialog( marbleWidget, widget() ); // it might be tempting to move the connects to DownloadRegionDialog's "accepted" and // "applied" signals, be aware that the "hidden" signal might be come before the "accepted" // signal, leading to a too early disconnect. connect( m_downloadRegionDialog, SIGNAL(accepted()), SLOT(downloadRegion())); connect( m_downloadRegionDialog, SIGNAL(applied()), SLOT(downloadRegion())); } // FIXME: get allowed range from current map theme m_downloadRegionDialog->setAllowedTileLevelRange( 0, 16 ); m_downloadRegionDialog->setSelectionMethod( DownloadRegionDialog::VisibleRegionMethod ); ViewportParams const * const viewport = marbleWidget->viewport(); m_downloadRegionDialog->setSpecifiedLatLonAltBox( viewport->viewLatLonAltBox() ); m_downloadRegionDialog->setVisibleLatLonAltBox( viewport->viewLatLonAltBox() ); m_downloadRegionDialog->setVisibleTileLevel( marbleWidget->tileZoomLevel() ); m_downloadRegionDialog->show(); m_downloadRegionDialog->raise(); m_downloadRegionDialog->activateWindow(); } void MarblePart::downloadRegion() { Q_ASSERT( m_downloadRegionDialog ); QVector const pyramid = m_downloadRegionDialog->region(); if ( !pyramid.isEmpty() ) { m_controlView->marbleWidget()->downloadRegion( pyramid ); } } void MarblePart::showStatusBarContextMenu( const QPoint& pos ) { QStatusBar * const statusBar = m_statusBarExtension->statusBar(); Q_ASSERT( statusBar ); QMenu statusBarContextMenu( m_controlView->marbleWidget() ); statusBarContextMenu.addAction( m_showPositionAction ); statusBarContextMenu.addAction( m_showDateTimeAction ); statusBarContextMenu.addAction( m_showAltitudeAction ); statusBarContextMenu.addAction( m_showTileZoomLevelAction ); statusBarContextMenu.addAction( m_showDownloadProgressAction ); statusBarContextMenu.exec( statusBar->mapToGlobal( pos )); } void MarblePart::showMapWizard() { // Map Wizard QPointer mapWizard = new MapWizard( m_controlView ); mapWizard->setWmsServers( MarbleSettings::wmsServers() ); mapWizard->setStaticUrlServers( MarbleSettings::staticUrlServers() ); mapWizard->exec(); MarbleSettings::setWmsServers( mapWizard->wmsServers() ); MarbleSettings::setStaticUrlServers( mapWizard->staticUrlServers() ); mapWizard->deleteLater(); } void MarblePart::editSettings() { if ( KConfigDialog::showDialog( "settings" ) ) return; m_configDialog = new KConfigDialog( m_controlView, "settings", MarbleSettings::self() ); // view page Ui_MarbleViewSettingsWidget ui_viewSettings; QWidget *w_viewSettings = new QWidget( 0 ); w_viewSettings->setObjectName( "view_page" ); ui_viewSettings.setupUi( w_viewSettings ); m_configDialog->addPage( w_viewSettings, i18n( "View" ), "configure" ); ui_viewSettings.label_labelLocalization->hide(); ui_viewSettings.kcfg_labelLocalization->hide(); // navigation page Ui_MarbleNavigationSettingsWidget ui_navigationSettings; QWidget *w_navigationSettings = new QWidget( 0 ); w_navigationSettings->setObjectName( "navigation_page" ); ui_navigationSettings.setupUi( w_navigationSettings ); m_configDialog->addPage( w_navigationSettings, i18n( "Navigation" ), "transform-move" ); ui_navigationSettings.kcfg_dragLocation->hide(); ui_navigationSettings.label_dragLocation->hide(); // cache page Ui_MarbleCacheSettingsWidget ui_cacheSettings; QWidget *w_cacheSettings = new QWidget( 0 ); w_cacheSettings->setObjectName( "cache_page" ); ui_cacheSettings.setupUi( w_cacheSettings ); m_configDialog->addPage( w_cacheSettings, i18n( "Cache & Proxy" ), "preferences-web-browser-cache" ); connect( ui_cacheSettings.button_clearVolatileCache, SIGNAL(clicked()), m_controlView->marbleWidget(), SLOT(clearVolatileTileCache()) ); connect( ui_cacheSettings.button_clearPersistentCache, SIGNAL(clicked()), m_controlView->marbleModel(), SLOT(clearPersistentTileCache()) ); // time page Ui_MarbleTimeSettingsWidget ui_timeSettings; QWidget *w_timeSettings = new QWidget( 0 ); w_timeSettings->setObjectName( "time_page" ); ui_timeSettings.setupUi( w_timeSettings ); m_configDialog->addPage( w_timeSettings, i18n( "Date & Time" ), "clock" ); // Sync page QWidget *w_cloudSyncSettings = new QWidget( 0 ); w_cloudSyncSettings->setObjectName( "sync_page" ); m_ui_cloudSyncSettings.setupUi( w_cloudSyncSettings ); m_ui_cloudSyncSettings.button_syncNow->setEnabled( MarbleSettings::syncBookmarks() ); m_configDialog->addPage( w_cloudSyncSettings, i18n( "Synchronization" ), "folder-sync" ); connect( m_ui_cloudSyncSettings.button_syncNow, SIGNAL(clicked()), m_controlView->cloudSyncManager()->bookmarkSyncManager(), SLOT(startBookmarkSync()) ); connect( m_ui_cloudSyncSettings.testLoginButton, SIGNAL(clicked()), this, SLOT(updateCloudSyncCredentials()) ); connect( m_controlView->cloudSyncManager(), SIGNAL(statusChanged(QString)), this, SLOT(updateCloudSyncStatus(QString))); // routing page RoutingProfilesWidget *w_routingSettings = new RoutingProfilesWidget( m_controlView->marbleModel() ); w_routingSettings->setObjectName( "routing_page" ); m_configDialog->addPage( w_routingSettings, i18n( "Routing" ), "flag"); // plugin page MarblePluginSettingsWidget *w_pluginSettings = new MarblePluginSettingsWidget(); RenderPluginModel *const pluginModel = new RenderPluginModel( w_pluginSettings ); pluginModel->setRenderPlugins( m_controlView->marbleWidget()->renderPlugins() ); w_pluginSettings->setModel( pluginModel ); w_pluginSettings->setObjectName( "plugin_page" ); m_configDialog->addPage( w_pluginSettings, i18n( "Plugins" ), "preferences-plugin" ); // Setting the icons of the pluginSettings page. w_pluginSettings->setConfigIcon( QIcon::fromTheme( "configure" ) ); w_pluginSettings->setAboutIcon( QIcon::fromTheme( "help-about" ) ); connect( w_pluginSettings, SIGNAL(pluginListViewClicked()), SLOT(enableApplyButton()) ); connect( m_configDialog, SIGNAL(settingsChanged(QString)), SLOT(updateSettings()) ); connect( m_configDialog, SIGNAL(accepted()), SLOT(applyPluginState()) ); connect( m_configDialog, SIGNAL(accepted()), pluginModel, SLOT(applyPluginState()) ); connect( m_configDialog, SIGNAL(rejected()), pluginModel, SLOT(retrievePluginState()) ); m_configDialog->show(); } void MarblePart::enableApplyButton() { //m_configDialog->enableButtonApply( true ); } void MarblePart::applyPluginState() { QList profiles = m_controlView->marbleWidget() ->model()->routingManager()->profilesModel()->profiles(); KSharedConfig::Ptr sharedConfig = KSharedConfig::openConfig(); KConfigGroup profilesGroup = sharedConfig->group( "Routing Profiles" ); profilesGroup.writeEntry( "Num", profiles.count() ); for ( int i = 0; i < profiles.count(); ++i ) { KConfigGroup profileGroup = profilesGroup.group( QString( "Profile %0" ).arg(i) ); RoutingProfile profile = profiles.at( i ); profileGroup.writeEntry( "Name", profile.name() ); - foreach ( const QString &pluginName, profileGroup.groupList() ) { + for ( const QString &pluginName: profileGroup.groupList() ) { profileGroup.group( pluginName ).deleteGroup(); } - foreach ( const QString &key, profile.pluginSettings().keys() ) { + for ( const QString &key: profile.pluginSettings().keys() ) { KConfigGroup pluginGroup = profileGroup.group( key ); pluginGroup.writeEntry( "Enabled", true ); - foreach ( const QString& settingKey, profile.pluginSettings()[ key ].keys() ) { + for ( const QString& settingKey: profile.pluginSettings()[ key ].keys() ) { Q_ASSERT(settingKey != QLatin1String("Enabled")); pluginGroup.writeEntry( settingKey, profile.pluginSettings()[ key ][ settingKey ] ); } } } } void MarblePart::updateSettings() { qDebug() << "Updating Settings ..."; // FIXME: Font doesn't get updated instantly. m_controlView->marbleWidget()->setDefaultFont( MarbleSettings::mapFont() ); m_controlView->marbleWidget()-> setMapQualityForViewContext( (MapQuality) MarbleSettings::stillQuality(), Still ); m_controlView->marbleWidget()-> setMapQualityForViewContext( (MapQuality) MarbleSettings::animationQuality(), Animation ); m_controlView->marbleWidget()-> setDefaultAngleUnit( (AngleUnit) MarbleSettings::angleUnit() ); MarbleGlobal::getInstance()->locale()-> setMeasurementSystem( (MarbleLocale::MeasurementSystem) MarbleSettings::distanceUnit() ); updateStatusBar(); m_controlView->marbleWidget()->setAnimationsEnabled( MarbleSettings::animateTargetVoyage() ); // Cache m_controlView->marbleModel()-> setPersistentTileCacheLimit( MarbleSettings::persistentTileCacheLimit() * 1024 ); m_controlView->marbleWidget()-> setVolatileTileCacheLimit( MarbleSettings::volatileTileCacheLimit() * 1024 ); //Create and export the proxy QNetworkProxy proxy; // Make sure that no proxy is used for an empty string or the default value: if (MarbleSettings::proxyUrl().isEmpty() || MarbleSettings::proxyUrl() == QLatin1String("http://")) { proxy.setType( QNetworkProxy::NoProxy ); } else { if ( MarbleSettings::proxyType() == Marble::Socks5Proxy ) { proxy.setType( QNetworkProxy::Socks5Proxy ); } else if ( MarbleSettings::proxyType() == Marble::HttpProxy ) { proxy.setType( QNetworkProxy::HttpProxy ); } else { qDebug() << "Unknown proxy type! Using Http Proxy instead."; proxy.setType( QNetworkProxy::HttpProxy ); } } proxy.setHostName( MarbleSettings::proxyUrl() ); proxy.setPort( MarbleSettings::proxyPort() ); if ( MarbleSettings::proxyAuth() ) { proxy.setUser( MarbleSettings::proxyUser() ); proxy.setPassword( MarbleSettings::proxyPass() ); } QNetworkProxy::setApplicationProxy(proxy); m_controlView->marbleWidget()->update(); // Time if( MarbleSettings::systemTimezone() == true ) { QDateTime localTime = QDateTime::currentDateTime().toLocalTime(); localTime.setTimeSpec( Qt::UTC ); m_controlView->marbleModel()->setClockTimezone( QDateTime::currentDateTime().toUTC().secsTo( localTime ) ); } else if( MarbleSettings::utc() == true ) { m_controlView->marbleModel()->setClockTimezone( 0 ); } else if( MarbleSettings::customTimezone() == true ) { m_controlView->marbleModel()->setClockTimezone( m_timezone.value( MarbleSettings::chosenTimezone() ) ); } // Route rendering colors and alpha values QColor tempColor; tempColor = MarbleSettings::routeColorStandard(); tempColor.setAlpha( MarbleSettings::routeAlphaStandard() ); m_controlView->marbleModel()->routingManager()->setRouteColorStandard( tempColor ); tempColor = MarbleSettings::routeColorHighlighted(); tempColor.setAlpha( MarbleSettings::routeAlphaHighlighted() ); m_controlView->marbleModel()->routingManager()->setRouteColorHighlighted( tempColor ); tempColor = MarbleSettings::routeColorAlternative(); tempColor.setAlpha( MarbleSettings::routeAlphaAlternative() ); m_controlView->marbleModel()->routingManager()->setRouteColorAlternative( tempColor ); // External map editor m_controlView->setExternalMapEditor( m_externalEditorMapping[MarbleSettings::externalMapEditor()] ); m_controlView->marbleWidget()->inputHandler()->setInertialEarthRotationEnabled( MarbleSettings::inertialEarthRotation() ); CloudSyncManager* cloudSyncManager = m_controlView->cloudSyncManager(); cloudSyncManager->setOwncloudCredentials( MarbleSettings::owncloudServer(), MarbleSettings::owncloudUsername(), MarbleSettings::owncloudPassword()); cloudSyncManager->setSyncEnabled( MarbleSettings::enableSync() ); cloudSyncManager->routeSyncManager()->setRouteSyncEnabled( MarbleSettings::syncRoutes() ); cloudSyncManager->bookmarkSyncManager()->setBookmarkSyncEnabled( MarbleSettings::syncBookmarks() ); } void MarblePart::writePluginSettings() { KSharedConfig::Ptr sharedConfig = KSharedConfig::openConfig(); - foreach( RenderPlugin *plugin, m_controlView->marbleWidget()->renderPlugins() ) { + for( RenderPlugin *plugin: m_controlView->marbleWidget()->renderPlugins() ) { KConfigGroup group = sharedConfig->group( QString( "plugin_" ) + plugin->nameId() ); const QHash hash = plugin->settings(); QHash::const_iterator it = hash.begin(); while( it != hash.end() ) { group.writeEntry( it.key(), it.value() ); ++it; } group.sync(); } } void MarblePart::readPluginSettings() { disconnect( m_controlView->marbleWidget(), SIGNAL(pluginSettingsChanged()), this, SLOT(writePluginSettings()) ); KSharedConfig::Ptr sharedConfig = KSharedConfig::openConfig(); - foreach( RenderPlugin *plugin, m_controlView->marbleWidget()->renderPlugins() ) { + for( RenderPlugin *plugin: m_controlView->marbleWidget()->renderPlugins() ) { KConfigGroup group = sharedConfig->group( QString( "plugin_" ) + plugin->nameId() ); QHash hash; - foreach ( const QString& key, group.keyList() ) { + for ( const QString& key: group.keyList() ) { hash.insert( key, group.readEntry( key ) ); } plugin->setSettings( hash ); } connect( m_controlView->marbleWidget(), SIGNAL(pluginSettingsChanged()), this, SLOT(writePluginSettings()) ); } void MarblePart::lockFloatItemPosition( bool enabled ) { QList floatItemList = m_controlView->marbleWidget()->floatItems(); QList::const_iterator i = floatItemList.constBegin(); QList::const_iterator const end = floatItemList.constEnd(); for (; i != end; ++i ) { // Locking one would suffice as it affects all. // Nevertheless go through all. (*i)->setPositionLocked(enabled); } } void MarblePart::handleProgress( int active, int queued ) { m_downloadProgressBar->setUpdatesEnabled( false ); if ( m_downloadProgressBar->value() < 0 ) { m_downloadProgressBar->setMaximum( 1 ); m_downloadProgressBar->setValue( 0 ); m_downloadProgressBar->setVisible( MarbleSettings::showDownloadProgressBar() ); } else { m_downloadProgressBar->setMaximum( qMax( m_downloadProgressBar->maximum(), active + queued ) ); } // qDebug() << "downloadProgressJobAdded: value/maximum: " // << m_downloadProgressBar->value() << '/' << m_downloadProgressBar->maximum(); m_downloadProgressBar->setUpdatesEnabled( true ); } void MarblePart::removeProgressItem() { m_downloadProgressBar->setUpdatesEnabled( false ); m_downloadProgressBar->setValue( m_downloadProgressBar->value() + 1 ); if ( m_downloadProgressBar->value() == m_downloadProgressBar->maximum() ) { m_downloadProgressBar->reset(); m_downloadProgressBar->setVisible( false ); } // qDebug() << "downloadProgressJobCompleted: value/maximum: " // << m_downloadProgressBar->value() << '/' << m_downloadProgressBar->maximum(); m_downloadProgressBar->setUpdatesEnabled( true ); } void MarblePart::openEditBookmarkDialog() { MarbleWidget *widget = m_controlView->marbleWidget(); QPointer dialog = new EditBookmarkDialog( widget->model()->bookmarkManager(), widget ); dialog->setCoordinates( widget->lookAt().coordinates() ); dialog->setRange( widget->lookAt().range() ); dialog->setMarbleWidget( widget ); dialog->setReverseGeocodeName(); if ( dialog->exec() == QDialog::Accepted ) { widget->model()->bookmarkManager()->addBookmark( dialog->folder(), dialog->bookmark() ); } delete dialog; } void MarblePart::setHome() { MarbleWidget *widget = m_controlView->marbleWidget(); widget->model()->setHome( widget->centerLongitude(), widget->centerLatitude(), widget->zoom() ); } void MarblePart::openManageBookmarksDialog() { MarbleModel * const model = m_controlView->marbleModel(); QPointer dialog = new BookmarkManagerDialog( model, m_controlView->marbleWidget() ); dialog->exec(); delete dialog; } void MarblePart::lookAtBookmark( QAction *action) { GeoDataLookAt temp = qvariant_cast( action->data() ) ; m_controlView->marbleWidget()->flyTo( temp ) ; mDebug() << " looking at bookmark having longitude : "<< temp.longitude(GeoDataCoordinates::Degree) << " latitude : "<< temp.latitude(GeoDataCoordinates::Degree) << " distance : " << temp.range(); } void MarblePart::initializeCustomTimezone() { if( m_timezone.count() == 0) { m_timezone.insert( 0, 0 ); m_timezone.insert( 1, 3600 ); m_timezone.insert( 2, 7200 ); m_timezone.insert( 3, 7200 ); m_timezone.insert( 4, 10800 ); m_timezone.insert( 5, 12600 ); m_timezone.insert( 6, 14400 ); m_timezone.insert( 7, 18000 ); m_timezone.insert( 8, 19800 ); m_timezone.insert( 9, 21600 ); m_timezone.insert( 10, 25200 ); m_timezone.insert( 11, 28800 ); m_timezone.insert( 12, 32400 ); m_timezone.insert( 13, 34200 ); m_timezone.insert( 14, 36000 ); m_timezone.insert( 15, 39600 ); m_timezone.insert( 16, 43200 ); m_timezone.insert( 17, -39600 ); m_timezone.insert( 18, -36000 ); m_timezone.insert( 19, -32400 ); m_timezone.insert( 20, -28800 ); m_timezone.insert( 21, -25200 ); m_timezone.insert( 22, -25200 ); m_timezone.insert( 23, -21600 ); m_timezone.insert( 24, -18000 ); m_timezone.insert( 25, -18000 ); m_timezone.insert( 26, -14400 ); m_timezone.insert( 27, -12600 ); m_timezone.insert( 28, -10800 ); m_timezone.insert( 29, -10800 ); m_timezone.insert( 30, -3600 ); } } void MarblePart::printMapScreenShot() { #ifndef QT_NO_PRINTER QPrinter printer( QPrinter::HighResolution ); QPointer printDialog = new QPrintDialog( &printer, widget() ); m_controlView->printMapScreenShot( printDialog ); delete printDialog; #endif } void MarblePart::updateMapEditButtonVisibility( const QString &mapTheme ) { Q_ASSERT( m_externalMapEditorAction ); m_externalMapEditorAction->setVisible(mapTheme == QLatin1String("earth/openstreetmap/openstreetmap.dgml")); } void MarblePart::fallBackToDefaultTheme() { m_controlView->marbleWidget()->setMapThemeId( m_controlView->defaultMapThemeId() ); } void MarblePart::showMovieCaptureDialog() { if (m_movieCaptureDialog == 0) { m_movieCaptureDialog = new MovieCaptureDialog(m_controlView->marbleWidget(), m_controlView->marbleWidget()); connect( m_movieCaptureDialog, SIGNAL(started()), this, SLOT(changeRecordingState())); } m_movieCaptureDialog->show(); } void MarblePart::stopRecording() { if ( m_movieCaptureDialog ) { m_movieCaptureDialog->stopRecording(); changeRecordingState(); } } void MarblePart::changeRecordingState() { m_recordMovieAction->setEnabled( !m_recordMovieAction->isEnabled() ); m_stopRecordingAction->setEnabled( !m_stopRecordingAction->isEnabled() ); } } #include "moc_marble_part.cpp" #include "marble_part.moc" diff --git a/src/apps/marble-qt/QtMainWindow.cpp b/src/apps/marble-qt/QtMainWindow.cpp index c628b9575..03bfd79d3 100644 --- a/src/apps/marble-qt/QtMainWindow.cpp +++ b/src/apps/marble-qt/QtMainWindow.cpp @@ -1,1666 +1,1666 @@ // // This file is part of the Marble Virtual Globe. // // This program is free software licensed under the GNU LGPL. You can // find a copy of this license in LICENSE.txt in the top directory of // the source code. // // Copyright 2006-2010 Torsten Rahn // Copyright 2007 Inge Wallin // Copyright 2011-2013 Bernhard Beschow // Copyright 2012 Illya Kovalevskyy // Copyright 2012 Mohammed Nafees // #include "QtMainWindow.h" #include "MarbleDebug.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "EditBookmarkDialog.h" #include "BookmarkManagerDialog.h" #include "CurrentLocationWidget.h" #include "MapViewWidget.h" #include "MarbleDirs.h" #include "MarbleAboutDialog.h" #include "QtMarbleConfigDialog.h" #include "SunControlWidget.h" #include "TimeControlWidget.h" #include "MarbleLocale.h" #include "DownloadRegionDialog.h" #include "ViewportParams.h" #include "AbstractFloatItem.h" #include "MarbleModel.h" #include "MarbleClock.h" #include "HttpDownloadManager.h" #include "BookmarkManager.h" #include "NewBookmarkFolderDialog.h" #include "GeoSceneDocument.h" #include "GeoSceneHead.h" #include "GeoDataLookAt.h" #include "GeoDataCoordinates.h" #include "GeoDataDocument.h" #include "GeoDataFolder.h" #include "GeoDataPlacemark.h" #include "GeoUriParser.h" #include "routing/RoutingManager.h" #include "routing/RoutingProfilesModel.h" #include "routing/RoutingWidget.h" #include "routing/RouteRequest.h" #include "ParseRunnerPlugin.h" #include "PositionTracking.h" #include "PositionProviderPlugin.h" #include "PluginManager.h" #include "MapThemeDownloadDialog.h" #include "MapWizard.h" #include "MarbleWidgetInputHandler.h" #include "Planet.h" #include "cloudsync/CloudSyncManager.h" #include "cloudsync/BookmarkSyncManager.h" #include "cloudsync/RouteSyncManager.h" #include "MovieCaptureDialog.h" #include "DataMigration.h" #include "TileCoordsPyramid.h" using namespace Marble; /* TRANSLATOR Marble::MainWindow */ MainWindow::MainWindow(const QString& marbleDataPath, const QVariantMap& cmdLineSettings, QWidget *parent) : QMainWindow(parent), m_controlView( 0 ), m_savedSize( QSize(-1, -1) ), m_sunControlDialog( 0 ), m_timeControlDialog( 0 ), m_configDialog( 0 ), m_downloadRegionDialog( 0 ), m_movieCaptureDialog( 0 ), // File Menu m_fileMenu( 0 ), m_viewMenu( 0 ), m_helpMenu( 0 ), m_settingsMenu( 0 ), m_panelMenu( 0 ), m_viewSizeMenu( 0 ), m_infoBoxesMenu( 0 ), m_onlineServicesMenu( 0 ), m_bookmarkMenu( 0 ), m_openAction( 0 ), m_exportMapAction( 0 ), m_downloadAction( 0 ), m_downloadRegionAction( 0 ), m_printPreviewAction( 0 ), m_printAction( 0 ), m_workOfflineAction( 0 ), m_quitAction( 0 ), m_mapWizardAction( 0 ), // Edit Menu m_copyMapAction( 0 ), m_copyCoordinatesAction( 0 ), m_osmEditAction( 0 ), m_recordMovieAction( 0 ), m_stopRecordingAction( 0 ), // View Menu m_showCloudsAction( 0 ),\ m_controlSunAction( 0 ), m_controlTimeAction( 0 ), m_reloadAction( 0 ), // Settings Menu m_fullScreenAction( 0 ), m_statusBarAction( 0 ), m_configDialogAction( 0 ), m_viewSizeActsGroup( 0 ), // Help Menu m_whatsThisAction( 0 ), m_aboutMarbleAction( 0 ), m_aboutQtAction( 0 ), m_lockFloatItemsAction( 0 ), m_handbookAction( 0 ), m_forumAction( 0 ), // Status Bar m_positionLabel( 0 ), m_distanceLabel( 0 ), m_zoomLabel( 0 ), m_clockLabel( 0 ), m_downloadProgressBar( 0 ), m_toggleTileLevelAction( 0 ), m_angleDisplayUnitActionGroup( 0 ), m_dmsDegreeAction( 0 ), m_decimalDegreeAction( 0 ), m_utmAction( 0 ), //Bookmark Menu m_addBookmarkAction( 0 ), m_setHomeAction( 0 ), m_toggleBookmarkDisplayAction( 0 ), m_manageBookmarksAction( 0 ) { setUpdatesEnabled( false ); QString selectedPath = marbleDataPath.isEmpty() ? readMarbleDataPath() : marbleDataPath; if ( !selectedPath.isEmpty() ) MarbleDirs::setMarbleDataPath( selectedPath ); #ifdef Q_OS_WIN QPointer migration = new DataMigration(this); migration->exec(); #endif m_controlView = new ControlView( this ); setWindowIcon(QIcon(QStringLiteral(":/icons/marble.png"))); setCentralWidget( m_controlView ); // Initializing config dialog m_configDialog = new QtMarbleConfigDialog( m_controlView->marbleWidget(), m_controlView->cloudSyncManager(), this ); connect( m_configDialog, SIGNAL(settingsChanged()), this, SLOT(updateSettings()) ); connect( m_configDialog, SIGNAL(clearVolatileCacheClicked()), m_controlView->marbleWidget(), SLOT(clearVolatileTileCache()) ); connect( m_configDialog, SIGNAL(clearPersistentCacheClicked()), m_controlView->marbleModel(), SLOT(clearPersistentTileCache()) ); connect( m_configDialog, SIGNAL(syncNowClicked()), m_controlView->cloudSyncManager()->bookmarkSyncManager(), SLOT(startBookmarkSync()) ); connect(m_configDialog, SIGNAL(syncNowClicked()), m_configDialog, SLOT(disableSyncNow())); // Load bookmark file. If it does not exist, a default one will be used. m_controlView->marbleModel()->bookmarkManager()->loadFile( "bookmarks/bookmarks.kml" ); createActions(); QList const panelActions = m_controlView->setupDockWidgets( this ); createMenus( panelActions ); createStatusBar(); connect( m_controlView->marbleWidget(), SIGNAL(themeChanged(QString)), this, SLOT(updateMapEditButtonVisibility(QString)) ); connect(m_controlView->marbleModel(), SIGNAL(themeChanged(QString)), this, SLOT(updateWindowTitle())); connect( m_controlView, SIGNAL(showMapWizard()), this, SLOT(showMapWizard()) ); connect( m_controlView, SIGNAL(mapThemeDeleted()), this, SLOT(fallBackToDefaultTheme()) ); updateWindowTitle(); setUpdatesEnabled( true ); m_position = QCoreApplication::translate( "Marble", NOT_AVAILABLE ); m_distance = marbleWidget()->distanceString(); m_zoom = QString::number( marbleWidget()->tileZoomLevel() ); m_clock = QLocale().toString( m_controlView->marbleModel()->clockDateTime().addSecs( m_controlView->marbleModel()->clockTimezone() ), QLocale::ShortFormat ); QMetaObject::invokeMethod(this, "initObject", Qt::QueuedConnection, Q_ARG(QVariantMap, cmdLineSettings)); } MainWindow::~MainWindow() { delete m_movieCaptureDialog; } void MainWindow::addGeoDataFile( const QString &fileName ) { QFileInfo file( fileName ); if ( !file.exists() ) return; // delay file loading to initObject(), such that restoring view from previous session in readSettings() // doesn't interfere with focusing on these files m_commandlineFilePaths << file.absoluteFilePath(); } void MainWindow::initObject(const QVariantMap& cmdLineSettings) { QCoreApplication::processEvents (); setupStatusBar(); readSettings(cmdLineSettings); - foreach ( const QString &path, m_commandlineFilePaths ) { + for ( const QString &path: m_commandlineFilePaths ) { m_controlView->marbleModel()->addGeoDataFile( path ); } if ( cmdLineSettings.contains( "tour" ) ) { QString const tour = cmdLineSettings.value( "tour" ).toString(); m_controlView->openTour( tour ); } m_commandlineFilePaths.clear(); } void MainWindow::createActions() { m_openAction = new QAction(QIcon(QStringLiteral(":/icons/document-open.png")), tr("&Open..."), this); m_openAction->setShortcut( tr( "Ctrl+O" ) ); m_openAction->setStatusTip( tr( "Open a file for viewing on Marble")); connect( m_openAction, SIGNAL(triggered()), this, SLOT(openFile()) ); m_downloadAction = new QAction(QIcon(QStringLiteral(":/icons/get-hot-new-stuff.png")), tr("&Download Maps..."), this); connect(m_downloadAction, SIGNAL(triggered()), this, SLOT(openMapDialog())); m_exportMapAction = new QAction(QIcon(QStringLiteral(":/icons/document-save-as.png")), tr("&Export Map..."), this); m_exportMapAction->setShortcut(tr("Ctrl+S")); m_exportMapAction->setStatusTip(tr("Save a screenshot of the map")); connect(m_exportMapAction, SIGNAL(triggered()), this, SLOT(exportMapScreenShot())); // Action: Download Region m_downloadRegionAction = new QAction( tr( "Download &Region..." ), this ); m_downloadRegionAction->setStatusTip( tr( "Download a map region in different zoom levels for offline usage" ) ); connect( m_downloadRegionAction, SIGNAL(triggered()), SLOT(showDownloadRegionDialog()) ); m_printAction = new QAction(QIcon(QStringLiteral(":/icons/document-print.png")), tr("&Print..."), this); m_printAction->setShortcut(tr("Ctrl+P")); m_printAction->setStatusTip(tr("Print a screenshot of the map")); connect(m_printAction, SIGNAL(triggered()), this, SLOT(printMapScreenShot())); m_printPreviewAction = new QAction(QIcon(QStringLiteral(":/icons/document-print-preview.png")), tr("Print Previe&w ..."), this); m_printPreviewAction->setStatusTip(tr("Print a screenshot of the map")); connect(m_printPreviewAction, SIGNAL(triggered()), m_controlView, SLOT(printPreview())); m_quitAction = new QAction(QIcon(QStringLiteral(":/icons/application-exit.png")), tr("&Quit"), this); m_quitAction->setShortcut(tr("Ctrl+Q")); m_quitAction->setStatusTip(tr("Quit the Application")); connect(m_quitAction, SIGNAL(triggered()), this, SLOT(close())); m_copyMapAction = new QAction(QIcon(QStringLiteral(":/icons/edit-copy.png")), tr("&Copy Map"), this); m_copyMapAction->setShortcut(tr("Ctrl+C")); m_copyMapAction->setStatusTip(tr("Copy a screenshot of the map")); connect(m_copyMapAction, SIGNAL(triggered()), this, SLOT(copyMap())); m_osmEditAction = new QAction(QIcon(QStringLiteral(":/icons/edit-map.png")), tr("&Edit Map"), this ); m_osmEditAction->setShortcut(tr( "Ctrl+E" ) ); m_osmEditAction->setStatusTip(tr( "Edit the current map region in an external editor" ) ); updateMapEditButtonVisibility( m_controlView->marbleWidget()->mapThemeId() ); connect( m_osmEditAction, SIGNAL(triggered()), m_controlView, SLOT(launchExternalMapEditor()) ); m_recordMovieAction = new QAction(tr("&Record Movie"), this); m_recordMovieAction->setStatusTip(tr("Records a movie of the globe")); m_recordMovieAction->setShortcut(QKeySequence("Ctrl+Shift+R")); m_recordMovieAction->setIcon(QIcon(QStringLiteral(":/icons/animator.png"))); connect(m_recordMovieAction, SIGNAL(triggered()), this, SLOT(showMovieCaptureDialog())); m_stopRecordingAction = new QAction( tr("&Stop Recording"), this ); m_stopRecordingAction->setStatusTip( tr("Stop recording a movie of the globe") ); m_stopRecordingAction->setShortcut(QKeySequence( "Ctrl+Shift+S" )); m_stopRecordingAction->setEnabled( false ); connect( m_stopRecordingAction, SIGNAL(triggered()), this, SLOT(stopRecording()) ); m_configDialogAction = new QAction(QIcon(QStringLiteral(":/icons/settings-configure.png")), tr("&Configure Marble"), this); m_configDialogAction->setStatusTip(tr("Show the configuration dialog")); connect(m_configDialogAction, SIGNAL(triggered()), this, SLOT(editSettings())); m_copyCoordinatesAction = new QAction(QIcon(QStringLiteral(":/icons/copy-coordinates.png")), tr("C&opy Coordinates"), this); m_copyCoordinatesAction->setStatusTip(tr("Copy the center coordinates as text")); connect(m_copyCoordinatesAction, SIGNAL(triggered()), this, SLOT(copyCoordinates())); m_fullScreenAction = new QAction(QIcon(QStringLiteral(":/icons/view-fullscreen.png")), tr("&Full Screen Mode"), this); m_fullScreenAction->setShortcut(tr("Ctrl+Shift+F")); m_fullScreenAction->setCheckable( true ); m_fullScreenAction->setStatusTip(tr("Full Screen Mode")); connect(m_fullScreenAction, SIGNAL(triggered(bool)), this, SLOT(showFullScreen(bool))); m_statusBarAction = new QAction( tr("&Show Status Bar"), this); m_statusBarAction->setCheckable( true ); m_statusBarAction->setStatusTip(tr("Show Status Bar")); connect(m_statusBarAction, SIGNAL(triggered(bool)), this, SLOT(showStatusBar(bool))); m_lockFloatItemsAction = new QAction(QIcon(QStringLiteral(":/icons/unlock.png")), tr("Lock Position"), this); m_lockFloatItemsAction->setCheckable( true ); m_lockFloatItemsAction->setStatusTip(tr("Lock Position of Floating Items")); connect(m_lockFloatItemsAction, SIGNAL(triggered(bool)), this, SLOT(lockPosition(bool))); m_showCloudsAction = new QAction(QIcon(QStringLiteral(":/icons/clouds.png")), tr("&Clouds"), this); m_showCloudsAction->setCheckable( true ); m_showCloudsAction->setStatusTip(tr("Show Real Time Cloud Cover")); connect(m_showCloudsAction, SIGNAL(triggered(bool)), this, SLOT(showClouds(bool))); m_workOfflineAction = new QAction(QIcon(QStringLiteral(":/icons/user-offline.png")), tr("Work Off&line"), this); m_workOfflineAction->setCheckable( true ); connect(m_workOfflineAction, SIGNAL(triggered(bool)), this, SLOT(workOffline(bool))); m_controlTimeAction = new QAction(QIcon(QStringLiteral(":/icons/clock.png")), tr("&Time Control..."), this ); m_controlTimeAction->setStatusTip( tr( "Configure Time Control " ) ); connect( m_controlTimeAction, SIGNAL(triggered()), this, SLOT(controlTime()) ); m_controlSunAction = new QAction( tr( "S&un Control..." ), this ); m_controlSunAction->setStatusTip( tr( "Configure Sun Control" ) ); connect( m_controlSunAction, SIGNAL(triggered()), this, SLOT(controlSun()) ); m_reloadAction = new QAction(QIcon(QStringLiteral(":/icons/view-refresh.png")), tr("&Redisplay"), this); m_reloadAction->setShortcut(tr("F5")); m_reloadAction->setStatusTip(tr("Reload Current Map")); connect(m_reloadAction, SIGNAL(triggered()), this, SLOT(reload())); m_handbookAction = new QAction(QIcon(QStringLiteral(":/icons/help-contents.png")), tr("Marble Virtual Globe &Handbook"), this); m_handbookAction->setShortcut(tr("F1")); m_handbookAction->setStatusTip(tr("Show the Handbook for Marble Virtual Globe")); connect(m_handbookAction, SIGNAL(triggered()), this, SLOT(handbook())); m_whatsThisAction = new QAction(QIcon(QStringLiteral(":/icons/help-whatsthis.png")), tr("What's &This"), this); m_whatsThisAction->setShortcut(tr("Shift+F1")); m_whatsThisAction->setStatusTip(tr("Show a detailed explanation of the action.")); connect(m_whatsThisAction, SIGNAL(triggered()), this, SLOT(enterWhatsThis())); m_forumAction = new QAction( tr("&Community Forum"), this); m_forumAction->setStatusTip(tr("Visit Marble's Community Forum")); connect(m_forumAction, SIGNAL(triggered()), this, SLOT(openForum())); m_aboutMarbleAction = new QAction(QIcon(QStringLiteral(":/icons/marble.png")), tr("&About Marble Virtual Globe"), this); m_aboutMarbleAction->setStatusTip(tr("Show the application's About Box")); connect(m_aboutMarbleAction, SIGNAL(triggered()), this, SLOT(aboutMarble())); m_aboutQtAction = new QAction(tr("About &Qt"), this); m_aboutQtAction->setStatusTip(tr("Show the Qt library's About box")); connect(m_aboutQtAction, SIGNAL(triggered()), qApp, SLOT(aboutQt())); //Bookmark Actions m_addBookmarkAction = new QAction(QIcon(QStringLiteral(":/icons/bookmark-new.png")), tr("&Add Bookmark"), this); m_addBookmarkAction->setShortcut(tr("Ctrl+B")); m_addBookmarkAction->setStatusTip(tr("Add Bookmark")); connect( m_addBookmarkAction, SIGNAL(triggered()), this, SLOT(openEditBookmarkDialog()) ); m_setHomeAction = new QAction(QIcon(QStringLiteral(":/icons/go-home.png")), tr("&Set Home Location"), this); m_setHomeAction->setStatusTip( tr( "&Set Home Location" ) ); connect( m_setHomeAction, SIGNAL(triggered()), this, SLOT(setHome()) ); m_toggleBookmarkDisplayAction = new QAction(tr( "Show &Bookmarks" ), this); m_toggleBookmarkDisplayAction->setStatusTip( tr( "Toggle display of Bookmarks" ) ); m_toggleBookmarkDisplayAction->setCheckable( true ); connect( m_toggleBookmarkDisplayAction, SIGNAL(triggered(bool)), this, SLOT(showBookmarks(bool)) ); m_manageBookmarksAction = new QAction(QIcon(QStringLiteral(":/icons/bookmarks-organize.png")), tr("&Manage Bookmarks"), this); m_manageBookmarksAction->setStatusTip( tr( "Manage Bookmarks" ) ); connect( m_manageBookmarksAction, SIGNAL(triggered()), this, SLOT(manageBookmarks()) ); // Map Wizard action m_mapWizardAction = new QAction(QIcon(QStringLiteral(":/icons/create-new-map.png")), tr("&Create a New Map..."), this); m_mapWizardAction->setStatusTip( tr( "A wizard guides you through the creation of your own map theme." ) ); connect( m_mapWizardAction, SIGNAL(triggered()), SLOT(showMapWizard()) ); // Statusbar Actions m_toggleTileLevelAction = new QAction( tr( "Show Tile Zoom Level" ), statusBar() ); m_toggleTileLevelAction->setCheckable( true ); m_toggleTileLevelAction->setChecked( false ); connect( m_toggleTileLevelAction, SIGNAL(triggered(bool)), this, SLOT(showZoomLevel(bool)) ); m_angleDisplayUnitActionGroup = new QActionGroup( statusBar() ); m_dmsDegreeAction = new QAction( tr( "Degree (DMS)" ), statusBar() ); m_dmsDegreeAction->setCheckable( true ); m_dmsDegreeAction->setData( (int)DMSDegree ); m_angleDisplayUnitActionGroup->addAction(m_dmsDegreeAction); m_decimalDegreeAction = new QAction( tr( "Degree (Decimal)" ), statusBar() ); m_decimalDegreeAction->setCheckable( true ); m_decimalDegreeAction->setData( (int)DecimalDegree ); m_angleDisplayUnitActionGroup->addAction(m_decimalDegreeAction); m_utmAction = new QAction( tr( "Universal Transverse Mercator (UTM)" ), statusBar() ); m_utmAction->setCheckable( true ); m_utmAction->setData( (int)UTM ); m_angleDisplayUnitActionGroup->addAction(m_utmAction); connect( m_angleDisplayUnitActionGroup, SIGNAL(triggered(QAction*)), this, SLOT(changeAngleDisplayUnit(QAction*)) ); // View size actions m_viewSizeActsGroup = ControlView::createViewSizeActionGroup( this ); connect( m_viewSizeActsGroup, SIGNAL(triggered(QAction*)), this, SLOT(changeViewSize(QAction*)) ); } void MainWindow::createMenus( const QList &panelActions ) { m_fileMenu = menuBar()->addMenu(tr("&File")); m_fileMenu->addAction(m_openAction); m_fileMenu->addAction(m_downloadAction); m_fileMenu->addAction( m_downloadRegionAction ); m_fileMenu->addAction( m_mapWizardAction ); m_fileMenu->addAction(m_exportMapAction); m_fileMenu->addSeparator(); m_fileMenu->addAction(m_printAction); m_fileMenu->addAction(m_printPreviewAction); m_fileMenu->addSeparator(); m_fileMenu->addAction(m_workOfflineAction); m_fileMenu->addAction(m_quitAction); m_fileMenu = menuBar()->addMenu(tr("&Edit")); m_fileMenu->addAction(m_copyMapAction); m_fileMenu->addAction(m_copyCoordinatesAction); m_fileMenu->addAction( m_osmEditAction ); m_fileMenu->addSeparator(); m_fileMenu->addAction(m_recordMovieAction); m_fileMenu->addAction(m_stopRecordingAction); m_viewMenu = menuBar()->addMenu(tr("&View")); m_infoBoxesMenu = new QMenu(tr("&Info Boxes"), this); m_onlineServicesMenu = new QMenu(tr("&Online Services"), this); createPluginsMenus(); m_bookmarkMenu = menuBar()->addMenu(tr("&Bookmarks")); createBookmarkMenu(); connect( m_bookmarkMenu, SIGNAL(aboutToShow()), this, SLOT(createBookmarkMenu()) ); m_panelMenu = new QMenu(tr("&Panels"), this); - foreach( QAction* action, panelActions ) { + for( QAction* action: panelActions ) { m_panelMenu->addAction( action ); } m_viewSizeMenu = new QMenu(tr("&View Size"), this); m_viewSizeMenu->addActions( m_viewSizeActsGroup->actions() ); m_settingsMenu = menuBar()->addMenu(tr("&Settings")); m_settingsMenu->addMenu( m_panelMenu ); m_settingsMenu->addAction(m_statusBarAction); m_settingsMenu->addSeparator(); m_settingsMenu->addMenu( m_viewSizeMenu ); m_settingsMenu->addAction(m_fullScreenAction); m_settingsMenu->addSeparator(); m_settingsMenu->addAction(m_configDialogAction); m_helpMenu = menuBar()->addMenu(tr("&Help")); m_helpMenu->addAction(m_handbookAction); m_helpMenu->addAction(m_forumAction); m_helpMenu->addSeparator(); m_helpMenu->addAction(m_whatsThisAction); m_helpMenu->addSeparator(); m_helpMenu->addAction(m_aboutMarbleAction); m_helpMenu->addAction(m_aboutQtAction); // FIXME: Discuss if this is the best place to put this QList pluginList = m_controlView->marbleWidget()->renderPlugins(); QList::const_iterator it = pluginList.constBegin(); QList::const_iterator const listEnd = pluginList.constEnd(); for (; it != listEnd; ++it ) { connect( (*it), SIGNAL(actionGroupsChanged()), this, SLOT(createPluginMenus()) ); } } void MainWindow::createPluginsMenus() { m_onlineServicesMenu->clear(); m_infoBoxesMenu->clear(); m_viewMenu->clear(); m_viewMenu->addAction(m_reloadAction); m_viewMenu->addSeparator(); // Do not create too many menu entries on a MID // FIXME: Set up another way of switching the plugins on and off. if( MarbleGlobal::getInstance()->profiles() & MarbleGlobal::SmallScreen ) { return; } m_infoBoxesMenu->addAction(m_lockFloatItemsAction); m_infoBoxesMenu->addSeparator(); QList themeActions; QList renderPluginList = m_controlView->marbleWidget()->renderPlugins(); QList::const_iterator i = renderPluginList.constBegin(); QList::const_iterator const end = renderPluginList.constEnd(); for (; i != end; ++i ) { switch( (*i)->renderType() ) { case RenderPlugin::TopLevelRenderType: m_viewMenu->addAction( (*i)->action() ); break; case RenderPlugin::PanelRenderType: m_infoBoxesMenu->addAction( (*i)->action() ); break; case RenderPlugin::OnlineRenderType: m_onlineServicesMenu->addAction( (*i)->action() ); break; case RenderPlugin::ThemeRenderType: themeActions.append( (*i)->action() ); break; default: mDebug() << "No menu entry created for plugin with unknown render type:" << (*i)->nameId(); break; } } m_viewMenu->addMenu( m_infoBoxesMenu ); m_viewMenu->addMenu( m_onlineServicesMenu ); m_viewMenu->addActions( themeActions ); m_viewMenu->addAction( m_showCloudsAction ); m_viewMenu->addSeparator(); m_viewMenu->addAction(m_controlSunAction); m_viewMenu->addAction(m_controlTimeAction); } void MainWindow::createBookmarksListMenu( QMenu *bookmarksListMenu, const GeoDataContainer *container ) { //m_bookmarksListMenu->clear(); QVector bookmarks = container->placemarkList(); - foreach ( const GeoDataPlacemark *placemark, bookmarks ) { + for ( const GeoDataPlacemark *placemark: bookmarks ) { QAction *bookmarkAction = new QAction( placemark->name(), this ); QVariant var; const GeoDataLookAt* lookAt = placemark->lookAt(); if ( !lookAt ) { GeoDataCoordinates coordinates = placemark->coordinate(); GeoDataLookAt coordinateToLookAt; coordinateToLookAt.setCoordinates( coordinates ); coordinateToLookAt.setRange( marbleWidget()->lookAt().range() ); var.setValue( coordinateToLookAt ); } else { var.setValue( *lookAt ); } bookmarkAction->setData( var ); bookmarksListMenu->addAction( bookmarkAction ); } } void MainWindow::createBookmarkMenu() { m_bookmarkMenu->clear(); m_bookmarkMenu->addAction( m_addBookmarkAction ); m_bookmarkMenu->addAction( m_toggleBookmarkDisplayAction ); m_toggleBookmarkDisplayAction->setChecked( m_controlView->marbleModel()->bookmarkManager()->document()->isVisible() ); m_bookmarkMenu->addAction( m_setHomeAction ); m_bookmarkMenu->addAction( m_manageBookmarksAction ); m_bookmarkMenu->addSeparator(); m_bookmarkMenu->addAction( QIcon(QStringLiteral(":/icons/go-home.png")), tr("&Home"), m_controlView->marbleWidget(), SLOT(goHome()) ); createFolderList( m_bookmarkMenu, m_controlView->marbleModel()->bookmarkManager()->document() ); } void MainWindow::createFolderList( QMenu *bookmarksListMenu, const GeoDataContainer *container ) { QVector folders = container->folderList(); if ( folders.size() == 1 && folders.first()->name() == tr("Default")) { createBookmarksListMenu( bookmarksListMenu, folders.first() ); } else { - foreach ( const GeoDataFolder *folder, folders ) { + for ( const GeoDataFolder *folder: folders ) { QMenu *subMenu = bookmarksListMenu->addMenu(QIcon(QStringLiteral(":/icons/folder-bookmark.png")), folder->name()); createFolderList( subMenu, folder ); connect( subMenu, SIGNAL(triggered(QAction*)), this, SLOT(lookAtBookmark(QAction*)) ); } } createBookmarksListMenu( bookmarksListMenu, container ); connect( bookmarksListMenu, SIGNAL(triggered(QAction*)), this, SLOT(lookAtBookmark(QAction*)) ); } void MainWindow::lookAtBookmark( QAction *action) { if ( action->data().isNull() ) { return; } GeoDataLookAt temp = qvariant_cast( action->data() ) ; m_controlView->marbleWidget()->flyTo( temp ) ; mDebug() << " looking at bookmark having longitude : "<< temp.longitude(GeoDataCoordinates::Degree) << " latitude : "<< temp.latitude(GeoDataCoordinates::Degree) << " distance : " << temp.range(); } void MainWindow::manageBookmarks() { MarbleModel * const model = m_controlView->marbleModel(); QPointer dialog = new BookmarkManagerDialog( model, this ); dialog->exec(); delete dialog; } void MainWindow::setHome() { MarbleWidget *widget = m_controlView->marbleWidget(); widget->model()->setHome( widget->centerLongitude(), widget->centerLatitude(), widget->zoom() ); } void MainWindow::openEditBookmarkDialog() { MarbleWidget *widget = m_controlView->marbleWidget(); QPointer dialog = new EditBookmarkDialog( widget->model()->bookmarkManager(), widget ); dialog->setMarbleWidget( widget ); dialog->setCoordinates( widget->lookAt().coordinates() ); dialog->setRange( widget->lookAt().range() ); dialog->setReverseGeocodeName(); if ( dialog->exec() == QDialog::Accepted ) { widget->model()->bookmarkManager()->addBookmark( dialog->folder(), dialog->bookmark() ); } delete dialog; } void MainWindow::createPluginMenus() { // Remove and delete toolbars if they exist while( !m_pluginToolbars.isEmpty() ) { QToolBar* tb = m_pluginToolbars.takeFirst(); this->removeToolBar(tb); tb->deleteLater(); } // Do not create too many menu entries on a MID // FIXME: Set up another way of switching the plugins on and off. if( MarbleGlobal::getInstance()->profiles() & MarbleGlobal::SmallScreen ) { return; } //remove and delete old menus if they exist while( !m_pluginMenus.isEmpty() ) { m_viewMenu->removeAction( m_pluginMenus.takeFirst() ); } QList renderPluginList = m_controlView->marbleWidget()->renderPlugins(); QList::const_iterator i = renderPluginList.constBegin(); QList::const_iterator const end = renderPluginList.constEnd(); for (; i != end; ++i ) { // menus const QList *tmp_actionGroups = (*i)->actionGroups(); if ((*i)->enabled() && tmp_actionGroups && (*i)->nameId() != QLatin1String("annotation")) { - foreach( QActionGroup *ag, *tmp_actionGroups ) { + for( QActionGroup *ag: *tmp_actionGroups ) { if( !ag->actions().isEmpty() ) { m_pluginMenus.append( m_viewMenu->addSeparator() ); } - foreach( QAction *action, ag->actions() ) { + for( QAction *action: ag->actions() ) { m_viewMenu->addAction( action ); m_pluginMenus.append( action ); } } } // toolbars const QList *tmp_toolbarActionGroups = (*i)->toolbarActionGroups(); if ( (*i)->enabled() && tmp_toolbarActionGroups ) { QToolBar* toolbar = new QToolBar(this); toolbar->setObjectName(QLatin1String("plugin-toolbar-") + (*i)->nameId()); - foreach( QActionGroup* ag, *tmp_toolbarActionGroups ) { + for( QActionGroup* ag: *tmp_toolbarActionGroups ) { toolbar->addActions( ag->actions() ); if ( tmp_toolbarActionGroups->last() != ag ) { toolbar->addSeparator(); } } m_pluginToolbars.append( toolbar ); this->addToolBar( toolbar ); } } // FIXME: load the menus once the method has been settled on } void MainWindow::createStatusBar() { statusBar()->showMessage(tr("Ready")); statusBar()->hide(); } void MainWindow::openMapDialog() { QPointer dialog( new MapThemeDownloadDialog( m_controlView->marbleWidget() ) ); dialog->exec(); delete dialog; } void MainWindow::exportMapScreenShot() { QString fileName = QFileDialog::getSaveFileName(this, tr("Export Map"), // krazy:exclude=qclasses QDir::homePath(), tr("Images (*.jpg *.png)")); if ( !fileName.isEmpty() ) { // Take the case into account where no file format is indicated const char * format = 0; if ( !fileName.endsWith(QLatin1String( "png" ), Qt::CaseInsensitive) && !fileName.endsWith(QLatin1String( "jpg" ), Qt::CaseInsensitive) ) { format = "JPG"; } QPixmap mapPixmap = m_controlView->mapScreenShot(); bool success = mapPixmap.save( fileName, format ); if ( !success ) { QMessageBox::warning(this, tr("Marble"), // krazy:exclude=qclasses tr( "An error occurred while trying to save the file.\n" ), QMessageBox::Ok); } } } void MainWindow::showFullScreen( bool isChecked ) { if ( isChecked ) { setWindowState( windowState() | Qt::WindowFullScreen ); // set } else { setWindowState( windowState() & ~Qt::WindowFullScreen ); // reset } m_fullScreenAction->setChecked( isChecked ); // Sync state with the GUI } void MainWindow::copyCoordinates() { qreal lon = m_controlView->marbleWidget()->centerLongitude(); qreal lat = m_controlView->marbleWidget()->centerLatitude(); QString positionString = GeoDataCoordinates( lon, lat, 0.0, GeoDataCoordinates::Degree ).toString(); QClipboard *clipboard = QApplication::clipboard(); clipboard->setText( positionString ); } void MainWindow::copyMap() { QPixmap mapPixmap = m_controlView->mapScreenShot(); QClipboard *clipboard = QApplication::clipboard(); clipboard->setPixmap( mapPixmap ); } void MainWindow::showStatusBar( bool isChecked ) { if ( isChecked ) { statusBar()->show(); } else { statusBar()->hide(); } m_statusBarAction->setChecked( isChecked ); // Sync state with the GUI } void MainWindow::showClouds( bool isChecked ) { m_controlView->marbleWidget()->setShowClouds( isChecked ); m_showCloudsAction->setChecked( isChecked ); // Sync state with the GUI } void MainWindow::showBookmarks( bool show ) { m_controlView->marbleModel()->bookmarkManager()->setShowBookmarks( show ); m_toggleBookmarkDisplayAction->setChecked( show ); // Sync state with the GUI } void MainWindow::workOffline( bool offline ) { m_controlView->setWorkOffline( offline ); m_workOfflineAction->setChecked( offline ); // Sync state with the GUI } void MainWindow::lockPosition( bool isChecked ) { QList floatItemList = m_controlView->marbleWidget()->floatItems(); QList::const_iterator i = floatItemList.constBegin(); QList::const_iterator const end = floatItemList.constEnd(); for (; i != end; ++i ) { // Locking one would suffice as it affects all. // Nevertheless go through all. (*i)->setPositionLocked(isChecked); } } void MainWindow::controlSun() { if (!m_sunControlDialog) { m_sunControlDialog = new SunControlWidget( m_controlView->marbleWidget(), this ); connect( m_sunControlDialog, SIGNAL(showSun(bool)), this, SLOT (showSun(bool)) ); } m_sunControlDialog->show(); m_sunControlDialog->raise(); m_sunControlDialog->activateWindow(); } void MainWindow::controlTime() { if ( !m_timeControlDialog ) { m_timeControlDialog = new TimeControlWidget( m_controlView->marbleModel()->clock() ); } /* m_timeControlDialog is a modeless dialog so that user may adjust time and interact with main application simultaneously.*/ m_timeControlDialog->show(); m_timeControlDialog->raise(); m_timeControlDialog->activateWindow(); } void MainWindow::showSun( bool active ) { m_controlView->marbleWidget()->setShowSunShading( active ); } void MainWindow::reload() { m_controlView->marbleWidget()->reloadMap(); } void MainWindow::enterWhatsThis() { QWhatsThis::enterWhatsThisMode(); } void MainWindow::aboutMarble() { MarbleAboutDialog dlg(this); dlg.setApplicationTitle( tr( "Marble Virtual Globe %1" ).arg( ControlView::applicationVersion() ) ); dlg.exec(); } void MainWindow::handbook() { const QString code = MarbleLocale::languageCode(); QUrl handbookLocation(QLatin1String("http://docs.kde.org/stable/") + code + QLatin1String("/kdeedu/marble/index.html")); // TODO: this logic seems broken. Should that check "code.isEmpty()" instead? // and how do we konw there is a doc for the code? if ( handbookLocation.isEmpty() ) handbookLocation = QUrl("http://docs.kde.org/stable/en/kdeedu/marble/index.html"); if( !QDesktopServices::openUrl( handbookLocation ) ) qDebug() << "URL not opened"; } void MainWindow::openForum() { QUrl forumLocation("https://forum.kde.org/viewforum.php?f=217"); if( !QDesktopServices::openUrl( forumLocation ) ) { mDebug() << "Failed to open URL " << forumLocation.toString(); } } void MainWindow::showPosition( const QString& position ) { m_position = position; updateStatusBar(); } void MainWindow::showDistance( const QString& distance ) { m_distance = distance; updateStatusBar(); } void MainWindow::showZoom( int zoom ) { m_zoom = QString::number( zoom ); updateStatusBar(); } void MainWindow::showDateTime() { m_clock = QLocale().toString( m_controlView->marbleModel()->clockDateTime().addSecs( m_controlView->marbleModel()->clockTimezone() ), QLocale::ShortFormat ); updateStatusBar(); } void MainWindow::updateStatusBar() { if ( m_positionLabel ) m_positionLabel->setText(tr("Position: %1").arg(m_position)); if ( m_distanceLabel ) m_distanceLabel->setText(tr("Altitude: %1").arg(m_distance)); if ( m_zoomLabel ) m_zoomLabel->setText(tr("Zoom: %1").arg(m_zoom)); if ( m_clockLabel ) m_clockLabel->setText(tr("Time: %1").arg(m_clock)); switch ( m_configDialog->angleUnit() ) { case DMSDegree: m_dmsDegreeAction->setChecked( true ); break; case DecimalDegree: m_decimalDegreeAction->setChecked( true ); break; case UTM: m_utmAction->setChecked( true ); break; } } void MainWindow::openFile() { const PluginManager *const pluginManager = m_controlView->marbleModel()->pluginManager(); QStringList allFileExtensions; QStringList filters; - foreach ( const ParseRunnerPlugin *plugin, pluginManager->parsingRunnerPlugins() ) { + for ( const ParseRunnerPlugin *plugin: pluginManager->parsingRunnerPlugins() ) { if (plugin->nameId() == QLatin1String("Cache")) continue; const QStringList fileExtensions = plugin->fileExtensions().replaceInStrings( QRegExp( "^" ), "*." ); const QString filter = plugin->fileFormatDescription() + QLatin1String(" (") + fileExtensions.join(QLatin1Char(' ')) + QLatin1Char(')'); filters << filter; allFileExtensions << fileExtensions; } allFileExtensions.sort(); // sort since file extensions are visible under Windows const QString allFileTypes = tr("All Supported Files") + QLatin1String(" (") + allFileExtensions.join(QLatin1Char(' ')) + QLatin1Char(')'); filters.sort(); filters.prepend( allFileTypes ); const QString filter = filters.join( ";;" ); QStringList fileNames = QFileDialog::getOpenFileNames( this, tr( "Open File" ), m_lastFileOpenPath, filter ); if ( !fileNames.isEmpty() ) { const QString firstFile = fileNames.first(); m_lastFileOpenPath = QFileInfo( firstFile ).absolutePath(); } - foreach( const QString &fileName, fileNames ) { + for( const QString &fileName: fileNames ) { m_controlView->marbleModel()->addGeoDataFile( fileName ); } } void MainWindow::setupStatusBar() { statusBar()->setSizeGripEnabled( true ); statusBar()->setContextMenuPolicy( Qt::ActionsContextMenu ); statusBar()->addAction( m_toggleTileLevelAction ); QMenu *angleDisplayUnitMenu = new QMenu(this); angleDisplayUnitMenu->addActions( m_angleDisplayUnitActionGroup->actions() ); QAction *angleDisplayUnitMenuAction = new QAction( tr("&Angle Display Unit"), statusBar() ); angleDisplayUnitMenuAction->setMenu( angleDisplayUnitMenu ); statusBar()->addAction( angleDisplayUnitMenuAction ); setupDownloadProgressBar(); m_positionLabel = new QLabel( ); m_positionLabel->setIndent( 5 ); // UTM syntax is used in the template string, as it is longer than the lon/lat one QString templatePositionString = tr("Position: %1").arg(QLatin1String(" 00Z 000000.00 m E, 00000000.00 m N_")); int maxPositionWidth = fontMetrics().boundingRect(templatePositionString).width() + 2 * m_positionLabel->margin() + 2 * m_positionLabel->indent(); m_positionLabel->setFixedWidth( maxPositionWidth ); statusBar()->addPermanentWidget ( m_positionLabel ); m_distanceLabel = new QLabel( ); m_distanceLabel->setIndent( 5 ); QString templateDistanceString = tr("Altitude: %1").arg(QLatin1String(" 00.000,0 mu")); int maxDistanceWidth = fontMetrics().boundingRect(templateDistanceString).width() + 2 * m_distanceLabel->margin() + 2 * m_distanceLabel->indent(); m_distanceLabel->setFixedWidth( maxDistanceWidth ); statusBar()->addPermanentWidget ( m_distanceLabel ); m_zoomLabel = new QLabel( ); m_zoomLabel->setIndent( 5 ); QString templateZoomString = tr("Zoom: %1").arg(QLatin1String(" 00")); int maxZoomWidth = fontMetrics().boundingRect(templateZoomString).width() + 2 * m_zoomLabel->margin() + 2 * m_zoomLabel->indent(); m_zoomLabel->setFixedWidth( maxZoomWidth ); // Not added here, but activated by the user with the context menu m_clockLabel = new QLabel( ); m_clockLabel->setIndent( 5 ); QString templateDateTimeString = tr("Time: %1").arg(QLocale().toString(QDateTime::fromString( "01:01:1000", "dd:mm:yyyy"), QLocale::ShortFormat)); int maxDateTimeWidth = fontMetrics().boundingRect( templateDateTimeString ).width() + 2 * m_clockLabel->margin() + 2 * m_clockLabel->indent(); m_clockLabel->setFixedWidth( maxDateTimeWidth ); statusBar()->addPermanentWidget ( m_clockLabel ); connect( marbleWidget(), SIGNAL(mouseMoveGeoPosition(QString)), this, SLOT(showPosition(QString)) ); connect( marbleWidget(), SIGNAL(distanceChanged(QString)), this, SLOT(showDistance(QString)) ); connect( marbleWidget(), SIGNAL(tileLevelChanged(int)), this, SLOT(showZoom(int)) ); connect( m_controlView->marbleModel()->clock(), SIGNAL(timeChanged()), this, SLOT(showDateTime()) ); updateStatusBar(); } void MainWindow::setupDownloadProgressBar() { m_downloadProgressBar = new QProgressBar; m_downloadProgressBar->setVisible( true ); statusBar()->addPermanentWidget( m_downloadProgressBar ); HttpDownloadManager * const downloadManager = m_controlView->marbleModel()->downloadManager(); Q_ASSERT( downloadManager ); connect( downloadManager, SIGNAL(progressChanged(int,int)), SLOT(handleProgress(int,int)) ); connect( downloadManager, SIGNAL(jobRemoved()), SLOT(removeProgressItem()) ); } void MainWindow::handleProgress( int active, int queued ){ m_downloadProgressBar->setUpdatesEnabled( false ); if ( m_downloadProgressBar->value() < 0 ) { m_downloadProgressBar->setMaximum( 1 ); m_downloadProgressBar->setValue( 0 ); m_downloadProgressBar->setVisible( true ); } else { m_downloadProgressBar->setMaximum( qMax( m_downloadProgressBar->maximum(), active + queued ) ); } m_downloadProgressBar->setUpdatesEnabled( true ); } void MainWindow::removeProgressItem(){ m_downloadProgressBar->setUpdatesEnabled( false ); m_downloadProgressBar->setValue( m_downloadProgressBar->value() + 1 ); if ( m_downloadProgressBar->value() == m_downloadProgressBar->maximum() ) { m_downloadProgressBar->reset(); m_downloadProgressBar->setVisible( false ); } m_downloadProgressBar->setUpdatesEnabled( true ); } void MainWindow::closeEvent( QCloseEvent *event ) { writeSettings(); QCloseEvent newEvent; QCoreApplication::sendEvent( m_controlView, &newEvent ); if ( newEvent.isAccepted() ) { event->accept(); } else { event->ignore(); } } QString MainWindow::readMarbleDataPath() { QSettings settings; settings.beginGroup("MarbleWidget"); QString marbleDataPath; marbleDataPath = settings.value("marbleDataPath", "").toString(), settings.endGroup(); return marbleDataPath; } void MainWindow::readSettings(const QVariantMap& overrideSettings) { QSettings settings; settings.beginGroup("MainWindow"); resize(settings.value("size", QSize(640, 480)).toSize()); move(settings.value("pos", QPoint(200, 200)).toPoint()); showFullScreen(settings.value("fullScreen", false ).toBool()); showStatusBar(settings.value("statusBar", false ).toBool()); showZoomLevel(settings.value("showZoomLevel",false).toBool()); show(); showClouds(settings.value("showClouds", true ).toBool()); workOffline(settings.value("workOffline", false ).toBool()); m_controlView->marbleWidget()->setShowAtmosphere(settings.value("showAtmosphere", true ).toBool()); m_lastFileOpenPath = settings.value("lastFileOpenDir", QDir::homePath()).toString(); showBookmarks( settings.value( "showBookmarks", true ).toBool() ); restoreState( settings.value("windowState").toByteArray() ); settings.endGroup(); setUpdatesEnabled(false); settings.beginGroup("MarbleWidget"); QString mapThemeId; const QVariantMap::ConstIterator mapThemeIdIt = overrideSettings.find(QLatin1String("mapTheme")); if ( mapThemeIdIt != overrideSettings.constEnd() ) { mapThemeId = mapThemeIdIt.value().toString(); } else { mapThemeId = settings.value("mapTheme", m_controlView->defaultMapThemeId() ).toString(); } mDebug() << Q_FUNC_INFO << "mapThemeId:" << mapThemeId; m_controlView->marbleWidget()->setMapThemeId( mapThemeId ); m_controlView->marbleWidget()->setProjection( (Projection)(settings.value("projection", Spherical ).toInt()) ); // Set home position m_controlView->marbleModel()->setHome( settings.value("homeLongitude", 9.4).toDouble(), settings.value("homeLatitude", 54.8).toDouble(), settings.value("homeZoom", 1050 ).toInt() ); // Center on/Distance const QVariantMap::ConstIterator distanceIt = overrideSettings.find(QLatin1String("distance")); const bool isDistanceOverwritten = (distanceIt != overrideSettings.constEnd()); const QVariantMap::ConstIterator lonLatIt = overrideSettings.find(QLatin1String("lonlat")); if ( lonLatIt != overrideSettings.constEnd() ) { const QVariantList lonLat = lonLatIt.value().toList(); m_controlView->marbleWidget()->centerOn( lonLat.at(0).toDouble(), lonLat.at(1).toDouble() ); } else { switch ( m_configDialog->onStartup() ) { case Marble::LastLocationVisited: m_controlView->marbleWidget()->centerOn( settings.value("quitLongitude", 0.0).toDouble(), settings.value("quitLatitude", 0.0).toDouble() ); if (! isDistanceOverwritten) { // set default radius to 1350 (Atlas theme's "sharp" radius) m_controlView->marbleWidget()->setRadius( settings.value("quitRadius", 1350).toInt() ); } break; case Marble::ShowHomeLocation: m_controlView->marbleWidget()->goHome(); break; default: break; } } if (isDistanceOverwritten) { m_controlView->marbleWidget()->setDistance(distanceIt.value().toDouble()); } // Geo URI parsing QString geoUriString = qvariant_cast( overrideSettings.value("geo-uri", "")); if ( !geoUriString.isEmpty() ) { m_controlView->openGeoUri( geoUriString ); } bool isLocked = settings.value( "lockFloatItemPositions", false ).toBool(); m_lockFloatItemsAction->setChecked( isLocked ); lockPosition(isLocked); settings.endGroup(); settings.beginGroup( "Sun" ); m_controlView->marbleWidget()->setShowSunShading( settings.value( "showSun", false ).toBool() ); m_controlView->marbleWidget()->setShowCityLights( settings.value( "showCitylights", false ).toBool() ); m_controlView->marbleWidget()->setLockToSubSolarPoint( settings.value( "lockToSubSolarPoint", false ).toBool() ); m_controlView->marbleWidget()->setSubSolarPointIconVisible( settings.value( "subSolarPointIconVisible", false ).toBool() ); settings.endGroup(); settings.beginGroup( "Time" ); if( settings.value( "systemTime", "true" ).toBool() == true ) { /* nothing to do */ } else if( settings.value( "lastSessionTime", "true" ).toBool() == true ) { m_controlView->marbleModel()->setClockDateTime( settings.value( "dateTime" ).toDateTime() ); m_controlView->marbleModel()->setClockSpeed( settings.value( "speedSlider", 1 ).toInt() ); } settings.endGroup(); setUpdatesEnabled(true); // Load previous route settings settings.beginGroup( "Routing" ); { RoutingManager *const routingManager = m_controlView->marbleModel()->routingManager(); routingManager->readSettings(); bool const startupWarning = settings.value( "showGuidanceModeStartupWarning", QVariant( true ) ).toBool(); routingManager->setShowGuidanceModeStartupWarning( startupWarning ); routingManager->setLastOpenPath( settings.value( "lastRouteOpenPath", QDir::homePath() ).toString() ); routingManager->setLastSavePath( settings.value( "lastRouteSavePath", QDir::homePath() ).toString() ); QColor tempColor; tempColor = QColor( settings.value( "routeColorStandard", Oxygen::skyBlue4.name() ).toString() ); tempColor.setAlpha( settings.value( "routeAlphaStandard", 200 ).toInt() ); routingManager->setRouteColorStandard( tempColor ); tempColor = QColor( settings.value( "routeColorHighlighted", Oxygen::skyBlue1.name() ).toString() ); tempColor.setAlpha( settings.value( "routeAlphaHighlighted", 200 ).toInt() ); routingManager->setRouteColorHighlighted( tempColor ); tempColor = QColor( settings.value( "routeColorAlternative", Oxygen::aluminumGray4.name() ).toString() ); tempColor.setAlpha( settings.value( "routeAlphaAlternative", 200 ).toInt() ); routingManager->setRouteColorAlternative( tempColor ); } settings.endGroup(); settings.beginGroup( "Routing Profile" ); if ( settings.contains( "Num" ) ) { QList profiles; int numProfiles = settings.value( "Num", 0 ).toInt(); for ( int i = 0; i < numProfiles; ++i ) { settings.beginGroup( QString( "Profile %0" ).arg(i) ); QString name = settings.value( "Name", tr( "Unnamed" ) ).toString(); RoutingProfile profile( name ); - foreach ( const QString& pluginName, settings.childGroups() ) { + for ( const QString& pluginName: settings.childGroups() ) { settings.beginGroup( pluginName ); profile.pluginSettings().insert( pluginName, QHash() ); - foreach ( const QString& key, settings.childKeys() ) { + for ( const QString& key: settings.childKeys() ) { if (key != QLatin1String("Enabled")) { profile.pluginSettings()[ pluginName ].insert( key, settings.value( key ) ); } } settings.endGroup(); } profiles << profile; settings.endGroup(); } m_controlView->marbleModel()->routingManager()->profilesModel()->setProfiles( profiles ); } else { m_controlView->marbleModel()->routingManager()->profilesModel()->loadDefaultProfiles(); } int const profileIndex = settings.value( "currentIndex", 0 ).toInt(); if ( profileIndex >= 0 && profileIndex < m_controlView->marbleModel()->routingManager()->profilesModel()->rowCount() ) { RoutingProfile profile = m_controlView->marbleModel()->routingManager()->profilesModel()->profiles().at( profileIndex ); m_controlView->marbleModel()->routingManager()->routeRequest()->setRoutingProfile( profile ); } settings.endGroup(); settings.beginGroup( "Plugins"); PositionTracking* tracking = m_controlView->marbleModel()->positionTracking(); tracking->readSettings(); QString positionProvider = settings.value( "activePositionTrackingPlugin", QString() ).toString(); if ( !positionProvider.isEmpty() ) { const PluginManager* pluginManager = m_controlView->marbleModel()->pluginManager(); - foreach( const PositionProviderPlugin* plugin, pluginManager->positionProviderPlugins() ) { + for( const PositionProviderPlugin* plugin: pluginManager->positionProviderPlugins() ) { if ( plugin->nameId() == positionProvider ) { PositionProviderPlugin* instance = plugin->newInstance(); tracking->setPositionProviderPlugin( instance ); break; } } } settings.endGroup(); settings.beginGroup( "Tracking" ); if ( settings.contains( "autoCenter" ) || settings.contains( "recenterMode" ) ) { CurrentLocationWidget* trackingWidget = m_controlView->currentLocationWidget(); Q_ASSERT( trackingWidget ); trackingWidget->setRecenterMode( settings.value( "recenterMode", 0 ).toInt() ); trackingWidget->setAutoZoom( settings.value( "autoZoom", false ).toBool() ); trackingWidget->setTrackVisible( settings.value( "trackVisible", true ).toBool() ); trackingWidget->setLastOpenPath( settings.value( "lastTrackOpenPath", QDir::homePath() ).toString() ); trackingWidget->setLastSavePath( settings.value( "lastTrackSavePath", QDir::homePath() ).toString() ); } settings.endGroup(); // The config dialog has to read settings. m_configDialog->readSettings(); settings.beginGroup( "Navigation" ); m_controlView->setExternalMapEditor( settings.value( "externalMapEditor", "" ).toString() ); settings.endGroup(); settings.beginGroup( "CloudSync" ); CloudSyncManager* cloudSyncManager = m_controlView->cloudSyncManager(); cloudSyncManager->setOwncloudCredentials( settings.value( "owncloudServer", "" ).toString(), settings.value( "owncloudUsername", "" ).toString(), settings.value( "owncloudPassword", "" ).toString() ); cloudSyncManager->setSyncEnabled( settings.value( "enableSync", false ).toBool() ); cloudSyncManager->routeSyncManager()->setRouteSyncEnabled( settings.value( "syncRoutes", true ).toBool() ); cloudSyncManager->bookmarkSyncManager()->setBookmarkSyncEnabled( settings.value( "syncBookmarks", true ).toBool() ); settings.endGroup(); } void MainWindow::writeSettings() { QSettings settings; settings.beginGroup( "MainWindow" ); settings.setValue( "size", size() ); settings.setValue( "pos", pos() ); settings.setValue( "fullScreen", m_fullScreenAction->isChecked() ); settings.setValue( "statusBar", m_statusBarAction->isChecked() ); settings.setValue( "showZoomLevel", m_toggleTileLevelAction->isChecked() ); settings.setValue( "showClouds", m_showCloudsAction->isChecked() ); settings.setValue( "workOffline", m_workOfflineAction->isChecked() ); settings.setValue( "showAtmosphere", m_controlView->marbleWidget()->showAtmosphere() ); settings.setValue( "lastFileOpenDir", m_lastFileOpenPath ); settings.setValue( "showBookmarks", m_toggleBookmarkDisplayAction->isChecked() ); settings.setValue( "windowState", saveState() ); settings.endGroup(); settings.beginGroup( "MarbleWidget" ); // Get the 'home' values from the widget and store them in the settings. qreal homeLon = 0; qreal homeLat = 0; int homeZoom = 0; m_controlView->marbleModel()->home( homeLon, homeLat, homeZoom ); QString mapTheme = m_controlView->marbleWidget()->mapThemeId(); int projection = (int)( m_controlView->marbleWidget()->projection() ); settings.setValue( "homeLongitude", homeLon ); settings.setValue( "homeLatitude", homeLat ); settings.setValue( "homeZoom", homeZoom ); settings.setValue( "mapTheme", mapTheme ); settings.setValue( "projection", projection ); // Get the 'quit' values from the widget and store them in the settings. qreal quitLon = m_controlView->marbleWidget()->centerLongitude(); qreal quitLat = m_controlView->marbleWidget()->centerLatitude(); const int quitRadius = m_controlView->marbleWidget()->radius(); settings.setValue( "quitLongitude", quitLon ); settings.setValue( "quitLatitude", quitLat ); settings.setValue( "quitRadius", quitRadius ); settings.setValue( "lockFloatItemPositions", m_lockFloatItemsAction->isChecked() ); settings.endGroup(); settings.beginGroup( "Sun" ); settings.setValue( "showSun", m_controlView->marbleWidget()->showSunShading() ); settings.setValue( "showCitylights", m_controlView->marbleWidget()->showCityLights() ); settings.setValue( "lockToSubSolarPoint", m_controlView->marbleWidget()->isLockedToSubSolarPoint() ); settings.setValue( "subSolarPointIconVisible", m_controlView->marbleWidget()->isSubSolarPointIconVisible() ); settings.endGroup(); settings.beginGroup( "Time" ); settings.setValue( "dateTime", m_controlView->marbleModel()->clockDateTime() ); settings.setValue( "speedSlider", m_controlView->marbleModel()->clockSpeed() ); settings.endGroup(); settings.beginGroup( "Routing Profile" ); QList profiles = m_controlView->marbleWidget() ->model()->routingManager()->profilesModel()->profiles(); settings.setValue( "Num", profiles.count() ); for ( int i = 0; i < profiles.count(); ++i ) { settings.beginGroup( QString( "Profile %0" ).arg(i) ); const RoutingProfile& profile = profiles.at( i ); settings.setValue( "Name", profile.name() ); - foreach ( const QString& pluginName, settings.childGroups() ) { + for ( const QString& pluginName: settings.childGroups() ) { settings.beginGroup( pluginName ); settings.remove(QString()); //remove all keys settings.endGroup(); } - foreach ( const QString &key, profile.pluginSettings().keys() ) { + for ( const QString &key: profile.pluginSettings().keys() ) { settings.beginGroup( key ); settings.setValue( "Enabled", true ); - foreach ( const QString& settingKey, profile.pluginSettings()[ key ].keys() ) { + for ( const QString& settingKey: profile.pluginSettings()[ key ].keys() ) { Q_ASSERT(settingKey != QLatin1String("Enabled")); settings.setValue( settingKey, profile.pluginSettings()[ key ][ settingKey ] ); } settings.endGroup(); } settings.endGroup(); } RoutingProfile const profile = m_controlView->marbleWidget()->model()->routingManager()->routeRequest()->routingProfile(); settings.setValue( "currentIndex", profiles.indexOf( profile ) ); settings.endGroup(); settings.beginGroup( "Plugins"); QString positionProvider; PositionTracking* tracking = m_controlView->marbleModel()->positionTracking(); tracking->writeSettings(); if ( tracking->positionProviderPlugin() ) { positionProvider = tracking->positionProviderPlugin()->nameId(); } settings.setValue( "activePositionTrackingPlugin", positionProvider ); settings.endGroup(); settings.beginGroup( "Tracking" ); CurrentLocationWidget* trackingWidget = m_controlView->currentLocationWidget(); if ( trackingWidget ) { // Can be null due to lazy initialization settings.setValue( "recenterMode", trackingWidget->recenterMode() ); settings.setValue( "autoZoom", trackingWidget->autoZoom() ); settings.setValue( "trackVisible", trackingWidget->trackVisible() ); settings.setValue( "lastTrackOpenPath", trackingWidget->lastOpenPath() ); settings.setValue( "lastTrackSavePath", trackingWidget->lastSavePath() ); } settings.endGroup(); // The config dialog has to write settings. m_configDialog->writeSettings(); // Store current route settings settings.beginGroup( "Routing" ); { RoutingManager *const routingManager = m_controlView->marbleModel()->routingManager(); routingManager->writeSettings(); settings.setValue( "showGuidanceModeStartupWarning", routingManager->showGuidanceModeStartupWarning() ); settings.setValue( "lastRouteOpenPath", routingManager->lastOpenPath() ); settings.setValue( "lastRouteSavePath", routingManager->lastSavePath() ); settings.setValue( "routeColorStandard", routingManager->routeColorStandard().name() ); settings.setValue( "routeAlphaStandard", routingManager->routeColorStandard().alpha() ); settings.setValue( "routeColorHighlighted", routingManager->routeColorHighlighted().name() ); settings.setValue( "routeAlphaHighlighted", routingManager->routeColorHighlighted().alpha() ); settings.setValue( "routeColorAlternative", routingManager->routeColorAlternative().name() ); settings.setValue( "routeAlphaAlternative", routingManager->routeColorAlternative().alpha() ); } settings.endGroup(); settings.beginGroup( "Navigation"); settings.setValue( "externalMapEditor", m_controlView->externalMapEditor() ); settings.endGroup(); } void MainWindow::editSettings() { // Show the settings dialog. m_configDialog->show(); m_configDialog->raise(); m_configDialog->activateWindow(); } void MainWindow::updateSettings() { mDebug() << Q_FUNC_INFO << "Updating Settings ..."; // FIXME: Font doesn't get updated instantly. m_controlView->marbleWidget()->setDefaultFont( m_configDialog->mapFont() ); m_controlView->marbleWidget()->setMapQualityForViewContext( m_configDialog->stillQuality(), Marble::Still ); m_controlView->marbleWidget()->setMapQualityForViewContext( m_configDialog->animationQuality(), Marble::Animation ); m_controlView->marbleWidget()->setDefaultAngleUnit( m_configDialog->angleUnit() ); MarbleGlobal::getInstance()->locale()->setMeasurementSystem( m_configDialog->measurementSystem() ); m_distance = m_controlView->marbleWidget()->distanceString(); updateStatusBar(); m_controlView->marbleWidget()->setAnimationsEnabled( m_configDialog->animateTargetVoyage() ); m_controlView->marbleWidget()->inputHandler()->setInertialEarthRotationEnabled( m_configDialog->inertialEarthRotation() ); if ( !m_configDialog->externalMapEditor().isEmpty() ) { m_controlView->setExternalMapEditor( m_configDialog->externalMapEditor() ); } // Cache m_controlView->marbleModel()->setPersistentTileCacheLimit( m_configDialog->persistentTileCacheLimit() * 1024 ); m_controlView->marbleWidget()->setVolatileTileCacheLimit( m_configDialog->volatileTileCacheLimit() * 1024 ); /* m_controlView->marbleWidget()->setProxy( m_configDialog->proxyUrl(), m_configDialog->proxyPort(), m_configDialog->user(), m_configDialog->password() ); */ CloudSyncManager* cloudSyncManager = m_controlView->cloudSyncManager(); cloudSyncManager->setOwncloudCredentials( m_configDialog->owncloudServer(), m_configDialog->owncloudUsername(), m_configDialog->owncloudPassword() ); cloudSyncManager->setSyncEnabled( m_configDialog->syncEnabled() ); cloudSyncManager->routeSyncManager()->setRouteSyncEnabled( m_configDialog->syncRoutes() ); cloudSyncManager->bookmarkSyncManager()->setBookmarkSyncEnabled( m_configDialog->syncBookmarks() ); m_controlView->marbleWidget()->update(); } void MainWindow::showDownloadRegionDialog() { if ( !m_downloadRegionDialog ) { m_downloadRegionDialog = new DownloadRegionDialog( m_controlView->marbleWidget(), m_controlView ); // it might be tempting to move the connects to DownloadRegionDialog's "accepted" and // "applied" signals, be aware that the "hidden" signal might be come before the "accepted" // signal, leading to a too early disconnect. connect( m_downloadRegionDialog, SIGNAL(accepted()), SLOT(downloadRegion())); connect( m_downloadRegionDialog, SIGNAL(applied()), SLOT(downloadRegion())); } // FIXME: get allowed range from current map theme m_downloadRegionDialog->setAllowedTileLevelRange( 0, 16 ); m_downloadRegionDialog->setSelectionMethod( DownloadRegionDialog::VisibleRegionMethod ); ViewportParams const * const viewport = m_controlView->marbleWidget()->viewport(); m_downloadRegionDialog->setSpecifiedLatLonAltBox( viewport->viewLatLonAltBox() ); m_downloadRegionDialog->setVisibleLatLonAltBox( viewport->viewLatLonAltBox() ); m_downloadRegionDialog->show(); m_downloadRegionDialog->raise(); m_downloadRegionDialog->activateWindow(); } void MainWindow::downloadRegion() { Q_ASSERT( m_downloadRegionDialog ); QVector const pyramid = m_downloadRegionDialog->region(); if ( !pyramid.isEmpty() ) { m_controlView->marbleWidget()->downloadRegion( pyramid ); } } void MainWindow::printMapScreenShot() { #ifndef QT_NO_PRINTER QPrinter printer( QPrinter::HighResolution ); QPointer printDialog = new QPrintDialog( &printer, this ); m_controlView->printMapScreenShot( printDialog ); delete printDialog; #endif } void MainWindow::updateMapEditButtonVisibility( const QString &mapTheme ) { Q_ASSERT( m_osmEditAction ); QStringList osmThemes = QStringList() << "earth/openstreetmap/openstreetmap.dgml" << "earth/hikebikemap/hikebikemap.dgml" << "earth/opencyclemap/opencyclemap.dgml" << "earth/public-transport/public-transport.dgml" << "earth/openseamap/openseamap.dgml" << "earth/vectorosm/vectorosm.dgml"; m_osmEditAction->setVisible(osmThemes.contains(mapTheme)); } void MainWindow::showMovieCaptureDialog() { if (m_movieCaptureDialog == 0) { m_movieCaptureDialog = new MovieCaptureDialog(m_controlView->marbleWidget(), m_controlView->marbleWidget()); connect( m_movieCaptureDialog, SIGNAL(started()), this, SLOT(changeRecordingState())); } m_movieCaptureDialog->show(); } void MainWindow::stopRecording() { if ( m_movieCaptureDialog ) { m_movieCaptureDialog->stopRecording(); changeRecordingState(); } } void MainWindow::changeRecordingState() { m_recordMovieAction->setEnabled( !m_recordMovieAction->isEnabled() ); m_stopRecordingAction->setEnabled( !m_stopRecordingAction->isEnabled() ); } void MainWindow::updateWindowTitle() { GeoSceneDocument *theme = m_controlView->marbleModel()->mapTheme(); setWindowTitle(theme ? theme->head()->name() : QString()); } void MainWindow::showMapWizard() { QPointer mapWizard = new MapWizard(); QSettings settings; settings.beginGroup( "MapWizard" ); mapWizard->setWmsServers( settings.value( "wmsServers" ).toStringList() ); mapWizard->setStaticUrlServers( settings.value( "staticUrlServers" ).toStringList() ); settings.endGroup(); mapWizard->exec(); settings.beginGroup( "MapWizard" ); settings.setValue( "wmsServers", mapWizard->wmsServers() ); settings.setValue( "staticUrlServers", mapWizard->staticUrlServers() ); settings.endGroup(); mapWizard->deleteLater(); } void MainWindow::showZoomLevel(bool show) { if ( show ) { m_zoomLabel->show(); statusBar()->insertPermanentWidget( 2, m_zoomLabel ); } else { statusBar()->removeWidget( m_zoomLabel ); } // update from last modification m_toggleTileLevelAction->setChecked( show ); } void MainWindow::changeAngleDisplayUnit( QAction *action ) { m_configDialog->setAngleUnit((Marble::AngleUnit)action->data().toInt()); } void MainWindow::fallBackToDefaultTheme() { m_controlView->marbleWidget()->setMapThemeId( m_controlView->defaultMapThemeId() ); } void MainWindow::changeViewSize( QAction* action ) { if ( action->data().type() == QVariant::Size ) { if ( m_savedSize.isEmpty() ) { m_savedSize = m_controlView->size(); } m_controlView->setFixedSize( action->data().toSize() ); adjustSize(); } else { m_controlView->setMinimumSize( QSize( 0, 0 ) ); m_controlView->setMaximumSize( QSize( QWIDGETSIZE_MAX, QWIDGETSIZE_MAX ) ); m_controlView->resize( m_savedSize ); m_controlView->setMinimumSize( m_savedSize ); adjustSize(); m_controlView->setMinimumSize( QSize( 0, 0 ) ); m_savedSize.setHeight( -1 ); } } #include "moc_QtMainWindow.cpp" diff --git a/src/apps/marble-ui/ControlView.cpp b/src/apps/marble-ui/ControlView.cpp index 9157a8922..06c69f837 100644 --- a/src/apps/marble-ui/ControlView.cpp +++ b/src/apps/marble-ui/ControlView.cpp @@ -1,982 +1,982 @@ // // This file is part of the Marble Virtual Globe. // // This program is free software licensed under the GNU LGPL. You can // find a copy of this license in LICENSE.txt in the top directory of // the source code. // // Copyright 2006-2007 Torsten Rahn // Copyright 2007 Inge Wallin // #include "ControlView.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef MARBLE_DBUS #include #include "MarbleDBusInterface.h" #endif #include "GeoDataLatLonAltBox.h" #include "GeoSceneDocument.h" #include "GeoSceneHead.h" #include "GeoUriParser.h" #include "MarbleWidget.h" #include "MarbleDebug.h" #include "MarbleDirs.h" #include "MarbleModel.h" #include "MarbleMap.h" #include "MapThemeManager.h" #include "PrintOptionsWidget.h" #include "ViewportParams.h" #include "ViewParams.h" #include "routing/Route.h" #include "routing/RoutingManager.h" #include "routing/RoutingModel.h" #include "routing/RouteRequest.h" #include "routing/RoutingWidget.h" #include "ExternalEditorDialog.h" #include "CurrentLocationWidget.h" #include "SearchWidget.h" #include "TourWidget.h" #include "MapViewWidget.h" #include "FileViewWidget.h" #include "LegendWidget.h" #include "BookmarkManager.h" #include "cloudsync/CloudSyncManager.h" #include "cloudsync/BookmarkSyncManager.h" #include "cloudsync/RouteSyncManager.h" #include "cloudsync/ConflictDialog.h" #include "cloudsync/MergeItem.h" #include "RenderPlugin.h" namespace Marble { ControlView::ControlView( QWidget *parent ) : QWidget( parent ), m_mapThemeManager( new MapThemeManager( this ) ), m_searchDock( 0 ), m_locationWidget( 0 ), m_conflictDialog( 0 ), m_togglePanelVisibilityAction( 0 ), m_isPanelVisible( true ), m_tourWidget( 0 ), m_annotationDock( 0 ), m_annotationPlugin( 0 ) { setWindowTitle( tr( "Marble - Virtual Globe" ) ); resize( 680, 640 ); m_marbleWidget = new MarbleWidget( this ); m_marbleWidget->setSizePolicy( QSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding ) ); #ifdef MARBLE_DBUS new MarbleDBusInterface( m_marbleWidget ); QDBusConnection::sessionBus().registerObject( "/Marble", m_marbleWidget ); if (!QDBusConnection::sessionBus().registerService( "org.kde.marble" )) { QString const urlWithPid = QString("org.kde.marble-%1").arg( QCoreApplication::applicationPid() ); if ( !QDBusConnection::sessionBus().registerService( urlWithPid ) ) { mDebug() << "Failed to register service org.kde.marble and " << urlWithPid << " with the DBus session bus."; } } #endif QVBoxLayout* layout = new QVBoxLayout; layout->addWidget( m_marbleWidget ); layout->setMargin( 0 ); setLayout( layout ); m_cloudSyncManager = new CloudSyncManager( this ); m_cloudSyncManager->routeSyncManager()->setRoutingManager( m_marbleWidget->model()->routingManager() ); BookmarkSyncManager* bookmarkSyncManager = m_cloudSyncManager->bookmarkSyncManager(); bookmarkSyncManager->setBookmarkManager( m_marbleWidget->model()->bookmarkManager() ); m_conflictDialog = new ConflictDialog( m_marbleWidget ); connect( bookmarkSyncManager, SIGNAL(mergeConflict(MergeItem*)), this, SLOT(showConflictDialog(MergeItem*)) ); connect( bookmarkSyncManager, SIGNAL(syncComplete()), m_conflictDialog, SLOT(stopAutoResolve()) ); connect( m_conflictDialog, SIGNAL(resolveConflict(MergeItem*)), bookmarkSyncManager, SLOT(resolveConflict(MergeItem*)) ); setAcceptDrops(true); } ControlView::~ControlView() { // nothing to do } QString ControlView::applicationVersion() { return "2.1.20 (2.2 development version)"; } MapThemeManager *ControlView::mapThemeManager() { return m_mapThemeManager; } void ControlView::zoomIn() { m_marbleWidget->zoomIn(); } void ControlView::zoomOut() { m_marbleWidget->zoomOut(); } void ControlView::moveLeft() { m_marbleWidget->moveLeft(); } void ControlView::moveRight() { m_marbleWidget->moveRight(); } void ControlView::moveUp() { m_marbleWidget->moveUp(); } void ControlView::moveDown() { m_marbleWidget->moveDown(); } QString ControlView::defaultMapThemeId() const { QStringList fallBackThemes; fallBackThemes << "earth/srtm/srtm.dgml"; fallBackThemes << "earth/bluemarble/bluemarble.dgml"; fallBackThemes << "earth/openstreetmap/openstreetmap.dgml"; const QStringList installedThemes = m_mapThemeManager->mapThemeIds(); - foreach(const QString &fallback, fallBackThemes) { + for(const QString &fallback: fallBackThemes) { if (installedThemes.contains(fallback)) { return fallback; } } if (installedThemes.size()) { return installedThemes.first(); } return QString(); } void ControlView::printMapScreenShot( QPointer printDialog) { #ifndef QT_NO_PRINTER PrintOptionsWidget* printOptions = new PrintOptionsWidget( this ); bool const mapCoversViewport = m_marbleWidget->viewport()->mapCoversViewport(); printOptions->setBackgroundControlsEnabled( !mapCoversViewport ); bool hasLegend = m_marbleWidget->model()->legend() != 0; printOptions->setLegendControlsEnabled( hasLegend ); bool hasRoute = marbleWidget()->model()->routingManager()->routingModel()->rowCount() > 0; printOptions->setPrintRouteSummary( hasRoute ); printOptions->setPrintDrivingInstructions( hasRoute ); printOptions->setPrintDrivingInstructionsAdvice( hasRoute ); printOptions->setRouteControlsEnabled( hasRoute ); printDialog->setOptionTabs( QList() << printOptions ); if ( printDialog->exec() == QDialog::Accepted ) { QTextDocument document; QString text = "Marble Printout"; QPalette const originalPalette = m_marbleWidget->palette(); bool const wasBackgroundVisible = m_marbleWidget->showBackground(); bool const hideBackground = !mapCoversViewport && !printOptions->printBackground(); if ( hideBackground ) { // Temporarily remove the black background and layers painting on it m_marbleWidget->setShowBackground( false ); m_marbleWidget->setPalette( QPalette ( Qt::white ) ); m_marbleWidget->update(); } if ( printOptions->printMap() ) { printMap( document, text, printDialog->printer() ); } if ( printOptions->printLegend() ) { printLegend( document, text ); } if ( printOptions->printRouteSummary() ) { printRouteSummary( document, text ); } if ( printOptions->printDrivingInstructions() ) { printDrivingInstructions( document, text ); } if ( printOptions->printDrivingInstructionsAdvice() ) { printDrivingInstructionsAdvice( document, text ); } text += QLatin1String(""); document.setHtml( text ); document.print( printDialog->printer() ); if ( hideBackground ) { m_marbleWidget->setShowBackground( wasBackgroundVisible ); m_marbleWidget->setPalette( originalPalette ); m_marbleWidget->update(); } } #endif } bool ControlView::openGeoUri( const QString& geoUriString ) { GeoUriParser uriParser( geoUriString ); const bool success = uriParser.parse(); if ( success ) { if ( uriParser.planet().id() != marbleModel()->planet()->id() ) { MapThemeManager *manager = mapThemeManager(); - foreach( const QString& planetName, manager->mapThemeIds()) { + for( const QString& planetName: manager->mapThemeIds()) { if ( planetName.startsWith(uriParser.planet().id(), Qt::CaseInsensitive)) { m_marbleWidget->setMapThemeId(planetName); break; } } } m_marbleWidget->centerOn( uriParser.coordinates() ); if ( uriParser.coordinates().altitude() > 0.0 ) { m_marbleWidget->setDistance( uriParser.coordinates().altitude() * METER2KM ); } } return success; } QActionGroup *ControlView::createViewSizeActionGroup( QObject* parent ) { QActionGroup* actionGroup = new QActionGroup( parent ); QAction *defaultAction = new QAction( tr( "Default (Resizable)" ), parent ); defaultAction->setCheckable( true ); defaultAction->setChecked( true ); actionGroup->addAction(defaultAction); QAction *separator = new QAction( parent ); separator->setSeparator( true ); actionGroup->addAction(separator); addViewSizeAction( actionGroup, tr("NTSC (%1x%2)"), 720, 486 ); addViewSizeAction( actionGroup, tr("PAL (%1x%2)"), 720, 576 ); addViewSizeAction( actionGroup, tr("NTSC 16:9 (%1x%2)"), 864, 486 ); addViewSizeAction( actionGroup, tr("PAL 16:9 (%1x%2)"), 1024, 576 ); // xgettext:no-c-format addViewSizeAction( actionGroup, tr("DVD (%1x%2p)"), 852, 480 ); // xgettext:no-c-format addViewSizeAction( actionGroup, tr("HD (%1x%2p)"), 1280, 720 ); // xgettext:no-c-format addViewSizeAction( actionGroup, tr("Full HD (%1x%2p)"), 1920, 1080 ); addViewSizeAction( actionGroup, tr("Digital Cinema (%1x%2)"), 2048, 1536 ); /** FIXME: Needs testing, worked with errors. addViewSizeAction(actionGroup, "4K UHD (%1x%2)", 3840, 2160); addViewSizeAction(actionGroup, "4K (%1x%2)", 4096, 3072); */ return actionGroup; } void ControlView::printPixmap( QPrinter * printer, const QPixmap& pixmap ) { #ifndef QT_NO_PRINTER QSize printSize = pixmap.size(); QRect mapPageRect = printer->pageRect(); printSize.scale( printer->pageRect().size(), Qt::KeepAspectRatio ); QPoint printTopLeft( ( mapPageRect.width() - printSize.width() ) / 2 , ( mapPageRect.height() - printSize.height() ) / 2 ); QRect mapPrintRect( printTopLeft, printSize ); QPainter painter; if (!painter.begin(printer)) return; painter.drawPixmap( mapPrintRect, pixmap, pixmap.rect() ); painter.end(); #endif } // QPointer is used because of issues described in http://www.kdedevelopers.org/node/3919 void ControlView::printPreview() { #ifndef QT_NO_PRINTER QPrinter printer( QPrinter::HighResolution ); QPointer preview = new QPrintPreviewDialog( &printer, this ); preview->setWindowFlags ( Qt::Window ); preview->resize(640, 480); connect( preview, SIGNAL(paintRequested(QPrinter*)), SLOT(paintPrintPreview(QPrinter*)) ); preview->exec(); delete preview; #endif } void ControlView::paintPrintPreview( QPrinter * printer ) { #ifndef QT_NO_PRINTER QPixmap mapPixmap = mapScreenShot(); printPixmap( printer, mapPixmap ); #endif } void ControlView::printMap( QTextDocument &document, QString &text, QPrinter *printer ) { #ifndef QT_NO_PRINTER QPixmap image = mapScreenShot(); if ( m_marbleWidget->viewport()->mapCoversViewport() ) { // Paint a black frame. Looks better. QPainter painter(&image); painter.setPen( Qt::black ); painter.drawRect( 0, 0, image.width() - 2, image.height() - 2 ); } QString uri = "marble://screenshot.png"; document.addResource( QTextDocument::ImageResource, QUrl( uri ), QVariant( image) ); QString img = ""; int width = qRound( printer->pageRect( QPrinter::Point ).width() ); text += img.arg( uri ).arg( width ); #endif } void ControlView::printLegend( QTextDocument &document, QString &text ) { #ifndef QT_NO_PRINTER QTextDocument *legend = m_marbleWidget->model()->legend(); if ( legend ) { legend->adjustSize(); QSize size = legend->size().toSize(); QSize imageSize = size + QSize( 4, 4 ); QImage image( imageSize, QImage::Format_ARGB32); QPainter painter( &image ); painter.setRenderHint( QPainter::Antialiasing, true ); painter.drawRoundedRect( QRect( QPoint( 0, 0 ), size ), 5, 5 ); legend->drawContents( &painter ); document.addResource( QTextDocument::ImageResource, QUrl( "marble://legend.png" ), QVariant(image) ); QString img = "

"; text += img.arg( "marble://legend.png" ); } #endif } void ControlView::printRouteSummary( QTextDocument &document, QString &text) { #ifndef QT_NO_PRINTER RoutingModel* routingModel = m_marbleWidget->model()->routingManager()->routingModel(); if ( !routingModel ) { return; } RouteRequest* routeRequest = m_marbleWidget->model()->routingManager()->routeRequest(); if ( routeRequest ) { QString summary = "

Route to %1: %2 %3

"; QString destination; if ( routeRequest->size() ) { destination = routeRequest->name( routeRequest->size()-1 ); } QString label = "

%1 %2

"; qreal distance = routingModel->route().distance(); QString unit = distance > 1000 ? "km" : "m"; int precision = distance > 1000 ? 1 : 0; if ( distance > 1000 ) { distance /= 1000; } summary = summary.arg(destination).arg( distance, 0, 'f', precision ).arg( unit ); text += summary; text += QLatin1String(""); QString pixmapTemplate = "marble://viaPoint-%1.png"; for ( int i=0; isize(); ++i ) { text += QLatin1String(""); } text += QLatin1String("
"); QPixmap pixmap = routeRequest->pixmap(i); QString pixmapResource = pixmapTemplate.arg( i ); document.addResource(QTextDocument::ImageResource, QUrl( pixmapResource ), QVariant( pixmap ) ); QString myimg = ""; text += myimg.arg(pixmapResource) + QLatin1String(""); routeRequest->name(i) + QLatin1String("
"); } #endif } void ControlView::printDrivingInstructions( QTextDocument &document, QString &text ) { #ifndef QT_NO_PRINTER RoutingModel* routingModel = m_marbleWidget->model()->routingManager()->routingModel(); if (!routingModel) { return; } GeoDataLineString total = routingModel->route().path(); text += QLatin1String("" ""); for ( int i=0; irowCount(); ++i ) { QModelIndex index = routingModel->index(i, 0); GeoDataCoordinates coordinates = index.data( RoutingModel::CoordinateRole ).value(); GeoDataLineString accumulator; for (int k=0; k"); } text += QLatin1String("
No.DistanceInstruction
"); } else { text += QLatin1String("
"); } text += QString::number(i+1) + QLatin1String(""); qreal planetRadius = marbleModel()->planet()->radius(); text += QString::number(accumulator.length(planetRadius) * METER2KM, 'f', 1) + /** @todo: support localization */ QLatin1String(" km"); QPixmap instructionIcon = index.data( Qt::DecorationRole ).value(); if ( !instructionIcon.isNull() ) { QString uri = QString("marble://turnIcon%1.png").arg(i); document.addResource( QTextDocument::ImageResource, QUrl( uri ), QVariant( instructionIcon ) ); text += QString("").arg(uri); } text += routingModel->data( index ).toString() + QLatin1String("
"); #endif } void ControlView::printDrivingInstructionsAdvice( QTextDocument &, QString &text ) { #ifndef QT_NO_PRINTER text += QLatin1String("

") + tr("The Marble development team wishes you a pleasant and safe journey.") + QLatin1String("

") + QLatin1String("

") + tr("Caution: Driving instructions may be incomplete or inaccurate.") + QLatin1Char(' ') + tr("Road construction, weather and other unforeseen variables can result in this suggested route not to be the most expedient or safest route to your destination.") + QLatin1Char(' ') + tr("Please use common sense while navigating.") + QLatin1String("

"); #endif } void ControlView::addViewSizeAction( QActionGroup* actionGroup, const QString &nameTemplate, int width, int height ) { QString const name = nameTemplate.arg( width ).arg( height ); QAction *action = new QAction( name, actionGroup->parent() ); action->setCheckable( true ); action->setData( QSize( width, height ) ); actionGroup->addAction( action ); } void ControlView::launchExternalMapEditor() { QString editor = m_externalEditor; if ( editor.isEmpty() ) { QPointer dialog = new ExternalEditorDialog( this ); if( dialog->exec() == QDialog::Accepted ) { editor = dialog->externalEditor(); if ( dialog->saveDefault() ) { m_externalEditor = editor; } } else { return; } } if (editor == QLatin1String("josm")) { // JOSM, the java based editor synchronizeWithExternalMapEditor( editor, "--download=%1,%4,%3,%2" ); } else if (editor == QLatin1String("merkaartor")) { // Merkaartor, a Qt based editor QString argument = "osm://download/load_and_zoom?top=%1&right=%2&bottom=%3&left=%4"; synchronizeWithExternalMapEditor( editor, argument ); } else { // Potlatch, the flash based editor running at the osm main website QString url = "http://www.openstreetmap.org/edit?lat=%1&lon=%2&zoom=%3"; qreal lat = m_marbleWidget->centerLatitude(); qreal lon = m_marbleWidget->centerLongitude(); int zoom = m_marbleWidget->tileZoomLevel(); url = url.arg( lat, 0, 'f', 8 ).arg( lon, 0, 'f', 8 ).arg( zoom ); QDesktopServices::openUrl( QUrl(url) ); } } void ControlView::synchronizeWithExternalMapEditor( const QString &application, const QString &argument ) { QTimer watchdog; // terminates network connection after a short timeout watchdog.setSingleShot( true ); QEventLoop localEventLoop; connect( &watchdog, SIGNAL(timeout()), &localEventLoop, SLOT(quit()) ); QNetworkAccessManager manager; connect( &manager, SIGNAL(finished(QNetworkReply*)), &localEventLoop, SLOT(quit()) ); // Wait at most two seconds for the local server to respond QNetworkReply *reply = manager.get( QNetworkRequest( QUrl( "http://localhost:8111/") ) ); watchdog.start( 2000 ); localEventLoop.exec(); GeoDataLatLonAltBox box = m_marbleWidget->viewport()->viewLatLonAltBox(); qreal north = box.north( GeoDataCoordinates::Degree ); qreal east = box.east( GeoDataCoordinates::Degree ); qreal south = box.south( GeoDataCoordinates::Degree ); qreal west = box.west( GeoDataCoordinates::Degree ); if( watchdog.isActive() && reply->bytesAvailable() > 0 ) { // The local server is alive. Tell it to download the current region watchdog.stop(); QString serverUrl = "http://localhost:8111/load_and_zoom?top=%1&right=%2&bottom=%3&left=%4"; serverUrl = serverUrl.arg( north, 0, 'f', 8 ).arg( east, 0, 'f', 8 ); serverUrl = serverUrl.arg( south, 0, 'f', 8 ).arg( west, 0, 'f', 8 ); mDebug() << "Connecting to local server URL " << serverUrl; manager.get( QNetworkRequest( QUrl( serverUrl ) ) ); // Give it five seconds to process the request watchdog.start( 5000 ); localEventLoop.exec(); } else { // The local server is not alive. Start the application QString applicationArgument = argument.arg( south, 0, 'f', 8 ).arg( east, 0, 'f', 8 ); applicationArgument = applicationArgument.arg( north, 0, 'f', 8 ).arg( west, 0, 'f', 8 ); mDebug() << "No local server found. Launching " << application << " with argument " << applicationArgument; if ( !QProcess::startDetached( application, QStringList() << applicationArgument ) ) { QString text = tr( "Unable to start the external editor. Check that %1 is installed or choose a different external editor in the settings dialog." ); text = text.arg( application ); QMessageBox::warning( this, tr( "Cannot start external editor" ), text ); } } } void ControlView::setExternalMapEditor( const QString &editor ) { m_externalEditor = editor; } QList ControlView::setupDockWidgets( QMainWindow *mainWindow ) { Q_ASSERT( !m_searchDock && "Please create dock widgets just once" ); mainWindow->setTabPosition( Qt::LeftDockWidgetArea, QTabWidget::North ); mainWindow->setTabPosition( Qt::RightDockWidgetArea, QTabWidget::North ); QDockWidget* legendDock = new QDockWidget( tr( "Legend" ), this ); legendDock->setObjectName( "legendDock" ); legendDock->setAllowedAreas( Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea ); LegendWidget* legendWidget = new LegendWidget( this ); legendWidget->setMarbleModel( m_marbleWidget->model() ); connect( legendWidget, SIGNAL(tourLinkClicked(QString)), this, SLOT(handleTourLinkClicked(QString)) ); connect( legendWidget, SIGNAL(propertyValueChanged(QString,bool)), marbleWidget(), SLOT(setPropertyValue(QString,bool)) ); legendDock->setWidget( legendWidget ); bool const smallScreen = MarbleGlobal::getInstance()->profiles() & MarbleGlobal::SmallScreen; if ( smallScreen ) { // Show only the legend as a dock widget on small screen, the others are dialogs mainWindow->addDockWidget( Qt::LeftDockWidgetArea, legendDock ); return QList() << legendDock->toggleViewAction(); } QDockWidget *routingDock = new QDockWidget( tr( "Routing" ), mainWindow ); routingDock->setObjectName( "routingDock" ); routingDock->setAllowedAreas( Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea ); RoutingWidget* routingWidget = new RoutingWidget( marbleWidget(), mainWindow ); routingWidget->setRouteSyncManager( cloudSyncManager()->routeSyncManager() ); routingDock->setWidget( routingWidget ); mainWindow->addDockWidget( Qt::LeftDockWidgetArea, routingDock ); QDockWidget *locationDock = new QDockWidget( tr( "Location" ), this ); locationDock->setObjectName( "locationDock" ); locationDock->setAllowedAreas( Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea ); m_locationWidget = new CurrentLocationWidget( this ); m_locationWidget->setMarbleWidget( marbleWidget() ); locationDock->setWidget( m_locationWidget ); mainWindow->addDockWidget( Qt::LeftDockWidgetArea, locationDock ); m_searchDock = new QDockWidget( tr( "Search" ), this ); m_searchDock->setObjectName( "searchDock" ); m_searchDock->setAllowedAreas( Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea ); SearchWidget* searchWidget = new SearchWidget( this ); searchWidget->setMarbleWidget( marbleWidget() ); m_searchDock->setWidget( searchWidget ); mainWindow->addDockWidget( Qt::LeftDockWidgetArea, m_searchDock ); mainWindow->tabifyDockWidget( m_searchDock, routingDock ); mainWindow->tabifyDockWidget( routingDock, locationDock ); m_searchDock->raise(); QKeySequence searchSequence( Qt::CTRL + Qt::Key_F ); searchWidget->setToolTip( tr( "Search for cities, addresses, points of interest and more (%1)" ).arg( searchSequence.toString() ) ); QShortcut* searchShortcut = new QShortcut( mainWindow ); connect( searchShortcut, SIGNAL(activated()), this, SLOT(showSearch()) ); QDockWidget *mapViewDock = new QDockWidget( tr( "Map View" ), this ); mapViewDock->setObjectName( "mapViewDock" ); mapViewDock->setAllowedAreas( Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea ); MapViewWidget* mapViewWidget = new MapViewWidget( this ); mapViewWidget->setMarbleWidget( marbleWidget(), m_mapThemeManager ); connect( mapViewWidget, SIGNAL(showMapWizard()), this, SIGNAL(showMapWizard()) ); connect( mapViewWidget, SIGNAL(showUploadDialog()), this, SIGNAL(showUploadDialog()) ); connect( mapViewWidget, SIGNAL(mapThemeDeleted()), this, SIGNAL(mapThemeDeleted()) ); mapViewDock->setWidget( mapViewWidget ); mainWindow->addDockWidget( Qt::LeftDockWidgetArea, mapViewDock ); QDockWidget *fileViewDock = new QDockWidget( tr( "Files" ), this ); fileViewDock->setObjectName( "fileViewDock" ); fileViewDock->setAllowedAreas( Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea ); FileViewWidget* fileViewWidget = new FileViewWidget( this ); fileViewWidget->setMarbleWidget( marbleWidget() ); fileViewDock->setWidget( fileViewWidget ); mainWindow->addDockWidget( Qt::LeftDockWidgetArea, fileViewDock ); fileViewDock->hide(); QDockWidget *tourDock = new QDockWidget( tr( "Tour" ), this ); tourDock->setObjectName( "tourDock" ); tourDock->setAllowedAreas( Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea ); m_tourWidget = new TourWidget( this ); m_tourWidget->setMarbleWidget( marbleWidget() ); tourDock->setWidget( m_tourWidget ); mainWindow->addDockWidget( Qt::LeftDockWidgetArea, tourDock ); tourDock->hide(); mainWindow->addDockWidget( Qt::LeftDockWidgetArea, legendDock ); mainWindow->tabifyDockWidget( mapViewDock, legendDock ); mapViewDock->raise(); m_annotationDock = new QDockWidget( QObject::tr( "Edit Maps" ) ); m_annotationDock->setObjectName( "annotateDock" ); m_annotationDock->hide(); m_annotationDock->toggleViewAction()->setVisible( false ); QList renderPluginList = marbleWidget()->renderPlugins(); QList::const_iterator i = renderPluginList.constBegin(); QList::const_iterator const end = renderPluginList.constEnd(); for (; i != end; ++i ) { if ((*i)->nameId() == QLatin1String("annotation")) { m_annotationPlugin = *i; QObject::connect(m_annotationPlugin, SIGNAL(enabledChanged(bool)), this, SLOT(updateAnnotationDockVisibility())); QObject::connect(m_annotationPlugin, SIGNAL(visibilityChanged(bool,QString)), this, SLOT(updateAnnotationDockVisibility())); QObject::connect(m_annotationPlugin, SIGNAL(actionGroupsChanged()), this, SLOT(updateAnnotationDock())); updateAnnotationDock(); updateAnnotationDockVisibility(); mainWindow->addDockWidget( Qt::LeftDockWidgetArea, m_annotationDock ); } } mainWindow->tabifyDockWidget( tourDock, m_annotationDock ); mainWindow->tabifyDockWidget( m_annotationDock, fileViewDock ); QList panelActions; panelActions << routingDock->toggleViewAction(); panelActions << locationDock->toggleViewAction(); panelActions << m_searchDock->toggleViewAction(); panelActions << mapViewDock->toggleViewAction(); panelActions << fileViewDock->toggleViewAction(); panelActions << m_annotationDock->toggleViewAction(); panelActions << legendDock->toggleViewAction(); panelActions << tourDock->toggleViewAction(); // Local list of panel view toggle actions m_panelActions << routingDock->toggleViewAction(); m_panelActions << locationDock->toggleViewAction(); m_panelActions << m_searchDock->toggleViewAction(); m_panelActions << mapViewDock->toggleViewAction(); m_panelActions << fileViewDock->toggleViewAction(); m_panelActions << m_annotationDock->toggleViewAction(); m_panelActions << legendDock->toggleViewAction(); m_panelActions << tourDock->toggleViewAction(); - foreach( QAction* action, m_panelActions ) { + for( QAction* action: m_panelActions ) { m_panelVisibility << action->isVisible(); } // Create Settings->Panels Menu // Toggle All Panels action m_togglePanelVisibilityAction = new QAction( tr("Hide &All Panels"), this); m_togglePanelVisibilityAction->setShortcut( Qt::Key_F9 ); m_togglePanelVisibilityAction->setStatusTip(tr("Show or hide all panels.")); connect(m_togglePanelVisibilityAction, SIGNAL(triggered()), this, SLOT(togglePanelVisibility())); // Include a Separator in the List QAction *panelSeparatorAct = new QAction( this ); panelSeparatorAct->setSeparator( true ); // Return a list of panel view actions for Marble Menu including show/hide all QList panelMenuActions; panelMenuActions << m_togglePanelVisibilityAction; panelMenuActions << panelSeparatorAct; - foreach( QAction* action, m_panelActions ) { + for( QAction* action: m_panelActions ) { panelMenuActions << action; } return panelMenuActions; } CurrentLocationWidget *ControlView::currentLocationWidget() { return m_locationWidget; } void ControlView::setWorkOffline( bool offline ) { marbleWidget()->model()->setWorkOffline( offline ); if ( !offline ) { marbleWidget()->clearVolatileTileCache(); } } CloudSyncManager *ControlView::cloudSyncManager() { return m_cloudSyncManager; } QString ControlView::externalMapEditor() const { return m_externalEditor; } void ControlView::addGeoDataFile( const QString &filename ) { QFileInfo const file( filename ); if ( file.exists() ) { m_marbleWidget->model()->addGeoDataFile( file.absoluteFilePath() ); } else { qWarning() << "File" << filename << "does not exist, cannot open it."; } } void ControlView::showSearch() { if ( !m_searchDock ) { return; } m_searchDock->show(); m_searchDock->raise(); m_searchDock->widget()->setFocus(); } void ControlView::showConflictDialog( MergeItem *item ) { Q_ASSERT( m_conflictDialog ); m_conflictDialog->setMergeItem( item ); m_conflictDialog->open(); } void ControlView::updateAnnotationDockVisibility() { if( m_annotationPlugin != 0 && m_annotationDock != 0 ) { if( m_annotationPlugin->visible() && m_annotationPlugin->enabled() ) { m_annotationDock->toggleViewAction()->setVisible( true ); } else { m_annotationDock->setVisible( false ); m_annotationDock->toggleViewAction()->setVisible( false ); } } } void ControlView::updateAnnotationDock() { const QList *tmp_actionGroups = m_annotationPlugin->actionGroups(); QWidget *widget = new QWidget( m_annotationDock ); QVBoxLayout *layout = new QVBoxLayout; QToolBar *firstToolbar = new QToolBar( widget ); QToolBar *secondToolbar = new QToolBar( widget ); QSpacerItem *spacer = new QSpacerItem( 0, 0, QSizePolicy::Expanding, QSizePolicy::Expanding); if( !tmp_actionGroups->isEmpty() ) { bool firstToolbarFilled = false; - foreach( QAction *action, tmp_actionGroups->first()->actions() ) { + for( QAction *action: tmp_actionGroups->first()->actions() ) { if (action->objectName() == QLatin1String("toolbarSeparator")) { firstToolbarFilled = true; } else { if( !firstToolbarFilled ) { firstToolbar->addAction( action ); } else { secondToolbar->addAction( action ); } } } } layout->addWidget( firstToolbar ); layout->addWidget( secondToolbar ); layout->addSpacerItem( spacer ); widget->setLayout( layout ); m_annotationDock->setWidget( widget ); } void ControlView::togglePanelVisibility() { Q_ASSERT( m_panelVisibility.size() == m_panelActions.size() ); if ( m_isPanelVisible ) { for( int p=0; pisChecked(); // hide panel if it is showing if ( m_panelActions.at(p)->isChecked() ) { m_panelActions.at(p)->activate( QAction::Trigger ); } } // Change Menu Item Text m_togglePanelVisibilityAction->setText( tr("Show &All Panels") ); m_isPanelVisible = false; } else { for( int p=0; p