diff --git a/src/apps/marble-ui/ControlView.cpp b/src/apps/marble-ui/ControlView.cpp index d154fe13b81a2c7cd7560390400e0178dce9e14d..e5878341a2771e8957558c049946f80843f728c1 100644 --- a/src/apps/marble-ui/ControlView.cpp +++ b/src/apps/marble-ui/ControlView.cpp @@ -37,6 +37,11 @@ #include #include +#ifdef MARBLE_DBUS +#include +#include "MarbleDBusInterface.h" +#endif + #include "GeoSceneDocument.h" #include "GeoSceneHead.h" #include "GeoUriParser.h" @@ -91,6 +96,17 @@ ControlView::ControlView( QWidget *parent ) 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 ); diff --git a/src/lib/marble/CMakeLists.txt b/src/lib/marble/CMakeLists.txt index 3f6e08b1750fd10aa05264c901fd11972fc43c10..61bb1d3411e8aab1980157e0dbad060f84906af8 100644 --- a/src/lib/marble/CMakeLists.txt +++ b/src/lib/marble/CMakeLists.txt @@ -69,6 +69,7 @@ set(marblewidget_SRCS MarbleMap.cpp MarbleControlBox.cpp MarbleColors.cpp + MarbleDBusInterface.cpp NavigationWidget.cpp MapViewWidget.cpp FileViewWidget.cpp diff --git a/src/lib/marble/MarbleDBusInterface.cpp b/src/lib/marble/MarbleDBusInterface.cpp new file mode 100644 index 0000000000000000000000000000000000000000..19fdbc3f83ef1168062f77dfdf0f41ef75445f81 --- /dev/null +++ b/src/lib/marble/MarbleDBusInterface.cpp @@ -0,0 +1,124 @@ +#include "MarbleDBusInterface.h" + +#include "MarbleWidget.h" +#include "MarbleModel.h" +#include "MapThemeManager.h" +#include +#include +#include + +namespace Marble +{ + +class MarbleDBusInterface::Private +{ +public: + Private( MarbleWidget* widget ); + + MarbleWidget* m_marbleWidget; + QPointF m_currentCenter; +}; + +MarbleDBusInterface::Private::Private( MarbleWidget *widget ) : + m_marbleWidget( widget ) +{ + // nothing to do +} + +MarbleDBusInterface::MarbleDBusInterface( MarbleWidget* widget ) : + QDBusAbstractAdaptor( widget ), + d( new Private( widget ) ) +{ + connect( widget, SIGNAL(themeChanged(QString)), this, SIGNAL(mapThemeChanged(QString)) ); + connect( widget, SIGNAL(tileLevelChanged(int)), this, SIGNAL(tileLevelChanged(int)) ); + connect( widget, SIGNAL(zoomChanged(int)), this, SIGNAL(zoomChanged(int)) ); + connect( widget, SIGNAL(visibleLatLonAltBoxChanged(GeoDataLatLonAltBox)), + this, SLOT(handleVisibleLatLonAltBoxChange()) ); +} + +MarbleDBusInterface::~MarbleDBusInterface() +{ + // nothing to do + // (an explicit destructor is required by QScopePointer) +} + +QString MarbleDBusInterface::mapTheme() const +{ + return d->m_marbleWidget->mapThemeId(); +} + +QStringList MarbleDBusInterface::mapThemes() const +{ + MapThemeManager mapThemeManager; + return mapThemeManager.mapThemeIds(); +} + +int MarbleDBusInterface::tileLevel() const +{ + return d->m_marbleWidget->tileZoomLevel(); +} + +int MarbleDBusInterface::zoom() const +{ + return d->m_marbleWidget->zoom(); +} + +QPointF MarbleDBusInterface::center() const +{ + return d->m_currentCenter; +} + +void MarbleDBusInterface::setMapTheme( const QString &mapTheme ) +{ + d->m_marbleWidget->setMapThemeId( mapTheme ); +} + +void MarbleDBusInterface::setZoom(int zoom) +{ + d->m_marbleWidget->setZoom(zoom); +} + +void MarbleDBusInterface::setPropertyEnabled(const QString &key, bool enabled ) +{ + d->m_marbleWidget->setPropertyValue( key, enabled ); +} + +bool MarbleDBusInterface::isPropertyEnabled( const QString &key ) const +{ + bool value = false; + GeoSceneDocument const * const mapTheme = d->m_marbleWidget->model()->mapTheme(); + if ( mapTheme ) { + mapTheme->settings()->propertyValue( key, value ); + } + + return value; +} + +QStringList MarbleDBusInterface::properties() const +{ + QStringList properties; + GeoSceneDocument const * const mapTheme = d->m_marbleWidget->model()->mapTheme(); + if ( mapTheme ) { + foreach( const GeoSceneProperty* property, mapTheme->settings()->allProperties() ) { + properties << property->name(); + } + } + return properties; +} + +void MarbleDBusInterface::setCenter( const QPointF ¢er ) const +{ + d->m_marbleWidget->centerOn( center.x(), center.y() ); +} + +void MarbleDBusInterface::handleVisibleLatLonAltBoxChange() +{ + QPointF const newCenter = QPointF( d->m_marbleWidget->centerLongitude(), + d->m_marbleWidget->centerLatitude() ); + if ( newCenter != d->m_currentCenter ) { + d->m_currentCenter = newCenter; + emit centerChanged( d->m_currentCenter ); + } +} + +} diff --git a/src/lib/marble/MarbleDBusInterface.h b/src/lib/marble/MarbleDBusInterface.h new file mode 100644 index 0000000000000000000000000000000000000000..9834cbe9f93e514f2c9df865ed108e844091da82 --- /dev/null +++ b/src/lib/marble/MarbleDBusInterface.h @@ -0,0 +1,71 @@ +// +// 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 2015 Dennis Nienhüser +// + +namespace Marble +{ + class MarbleWidget; +} + +#include +#include +#include +#include + +namespace Marble { + +class MarbleDBusInterface : public QDBusAbstractAdaptor +{ + Q_OBJECT + Q_CLASSINFO("D-Bus Interface", "org.kde.marble") + + Q_PROPERTY(QString mapTheme READ mapTheme WRITE setMapTheme NOTIFY mapThemeChanged) + Q_PROPERTY(QStringList mapThemes READ mapThemes) + Q_PROPERTY(int tileLevel READ tileLevel NOTIFY tileLevelChanged) + Q_PROPERTY(int zoom READ zoom WRITE setZoom NOTIFY zoomChanged) + Q_PROPERTY(QStringList properties READ properties) + Q_PROPERTY(QPointF center READ center WRITE setCenter NOTIFY centerChanged) + +public: + explicit MarbleDBusInterface(MarbleWidget* widget); + ~MarbleDBusInterface(); + + QString mapTheme() const; + QStringList mapThemes() const; + int tileLevel() const; + int zoom() const; + QPointF center() const; + +public Q_SLOTS: + void setMapTheme( const QString & mapTheme ); + void setZoom( int zoom ); + QStringList properties() const; + void setCenter( const QPointF ¢er ) const; + +public Q_SLOTS: + Q_INVOKABLE void setPropertyEnabled( const QString &key, bool enabled ); + Q_INVOKABLE bool isPropertyEnabled( const QString &key ) const; + +Q_SIGNALS: + void mapThemeChanged( const QString &mapTheme ); + void tileLevelChanged( int tileLevel ); + void zoomChanged( int zoom ); + void centerChanged( const QPointF ¢er ); + +private Q_SLOTS: + void handleVisibleLatLonAltBoxChange(); + +private: + Q_DISABLE_COPY(MarbleDBusInterface) + class Private; + friend class Private; + QScopedPointer const d; +}; + +} diff --git a/src/lib/marble/MarbleMap.cpp b/src/lib/marble/MarbleMap.cpp index 13becfc8ea25e5f77c0b3dc44d9194a4f59e4e05..bd4049f59cf1fa7e0011f735fa08a0abde22d103 100644 --- a/src/lib/marble/MarbleMap.cpp +++ b/src/lib/marble/MarbleMap.cpp @@ -27,10 +27,6 @@ #include #include -#ifdef MARBLE_DBUS -#include -#endif - // Marble #include "layers/FogLayer.h" #include "layers/FpsLayer.h" @@ -260,24 +256,12 @@ void MarbleMapPrivate::updateProperty( const QString &name, bool show ) MarbleMap::MarbleMap() : d( new MarbleMapPrivate( this, new MarbleModel( this ) ) ) { -#ifdef MARBLE_DBUS - QDBusConnection::sessionBus().registerObject( "/MarbleMap", this, - QDBusConnection::ExportAllSlots - | QDBusConnection::ExportAllSignals - | QDBusConnection::ExportAllProperties ); -#endif + // nothing to do } MarbleMap::MarbleMap(MarbleModel *model) : d( new MarbleMapPrivate( this, model ) ) { -#ifdef MARBLE_DBUS - QDBusConnection::sessionBus().registerObject( "/MarbleMap", this, - QDBusConnection::ExportAllSlots - | QDBusConnection::ExportAllSignals - | QDBusConnection::ExportAllProperties ); -#endif - d->m_modelIsOwned = false; } diff --git a/src/lib/marble/MarbleWidget.cpp b/src/lib/marble/MarbleWidget.cpp index f83fcb8a339a72fed9279e27b10bf682857065c3..673239de502c17002cc8c63c60721cd41b30c048 100644 --- a/src/lib/marble/MarbleWidget.cpp +++ b/src/lib/marble/MarbleWidget.cpp @@ -24,11 +24,6 @@ #include #include #include - -#ifdef MARBLE_DBUS -#include -#endif - #include "DataMigration.h" #include "FpsLayer.h" #include "FileManager.h" @@ -167,13 +162,6 @@ void MarbleWidgetPrivate::construct() dataMigration->exec(); delete dataMigration; -#ifdef MARBLE_DBUS - QDBusConnection::sessionBus().registerObject( "/MarbleWidget", m_widget, - QDBusConnection::ExportAllSlots - | QDBusConnection::ExportAllSignals - | QDBusConnection::ExportAllProperties ); -#endif - // Widget settings m_widget->setMinimumSize( 200, 300 ); m_widget->setFocusPolicy( Qt::WheelFocus );