[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [marble] src: satellites: manage its own actions and calculate trajectory when necessary
From:       Thibaut Gridel <tgridel () free ! fr>
Date:       2014-01-06 23:06:30
Message-ID: E1W0JFe-0001Ma-A6 () scm ! kde ! org
[Download RAW message or body]

Git commit 74f84848db2b1564751be37af896628971472a23 by Thibaut Gridel.
Committed on 06/01/2014 at 21:42.
Pushed by tgridel into branch 'master'.

satellites: manage its own actions and calculate trajectory when necessary

M  +0    -3    src/lib/marble/MarbleWidget.cpp
M  +25   -84   src/lib/marble/MarbleWidgetPopupMenu.cpp
M  +1    -5    src/lib/marble/MarbleWidgetPopupMenu.h
M  +6    -3    src/plugins/render/satellites/SatellitesMSCItem.cpp
M  +2    -2    src/plugins/render/satellites/SatellitesModel.cpp
M  +72   -1    src/plugins/render/satellites/SatellitesPlugin.cpp
M  +9    -0    src/plugins/render/satellites/SatellitesPlugin.h
M  +6    -3    src/plugins/render/satellites/SatellitesTLEItem.cpp
M  +13   -1    src/plugins/render/satellites/TrackerPluginItem.cpp
M  +11   -1    src/plugins/render/satellites/TrackerPluginItem.h

http://commits.kde.org/marble/74f84848db2b1564751be37af896628971472a23

diff --git a/src/lib/marble/MarbleWidget.cpp b/src/lib/marble/MarbleWidget.cpp
index ef0479e..b83ff34 100644
--- a/src/lib/marble/MarbleWidget.cpp
+++ b/src/lib/marble/MarbleWidget.cpp
@@ -246,9 +246,6 @@ void MarbleWidgetPrivate::construct()
 
     m_popupmenu = new MarbleWidgetPopupMenu( m_widget, &m_model );
 
-    m_widget->connect( m_popupmenu, SIGNAL(trackPlacemark(const GeoDataPlacemark*)),
-                       &m_model, SLOT(setTrackedPlacemark(const GeoDataPlacemark*)) \
                );
-
     m_routingLayer = new RoutingLayer( m_widget, m_widget );
     m_routingLayer->setPlacemarkModel( 0 );
     QObject::connect( m_routingLayer, SIGNAL(repaintNeeded(QRect)),
diff --git a/src/lib/marble/MarbleWidgetPopupMenu.cpp \
b/src/lib/marble/MarbleWidgetPopupMenu.cpp index 1ad6bd8..2b37d2b 100644
--- a/src/lib/marble/MarbleWidgetPopupMenu.cpp
+++ b/src/lib/marble/MarbleWidgetPopupMenu.cpp
@@ -60,8 +60,6 @@ public:
     QMenu    *const m_rmbMenu;
 
     QAction *m_infoDialogAction;
-    QAction *m_showOrbitAction;
-    QAction *m_trackPlacemarkAction;
     QAction *m_directionsToHereAction;
 
     QAction  *const m_copyCoordinateAction;
@@ -104,13 +102,6 @@ MarbleWidgetPopupMenu::Private::Private( MarbleWidget *widget, \
const MarbleModel  m_infoDialogAction = new QAction( parent );
     m_infoDialogAction->setData( 0 );
 
-    m_showOrbitAction = new QAction( tr( "Display orbit" ), parent );
-    m_showOrbitAction->setCheckable( true );
-    m_showOrbitAction->setData( 0 );
-
-    m_trackPlacemarkAction = new QAction( tr( "Keep centered" ), parent );
-    m_trackPlacemarkAction->setData( 0 );
-
     //	Tool actions (Right mouse button)
     QAction* fromHere = new QAction( tr( "Directions &from here" ), parent );
     m_directionsToHereAction = new QAction( tr( "Directions &to here" ), parent );
@@ -152,14 +143,13 @@ MarbleWidgetPopupMenu::Private::Private( MarbleWidget *widget, \
const MarbleModel  m_rmbMenu->addAction( fullscreenAction );
     }
 
+    parent->connect( m_lmbMenu, SIGNAL(aboutToHide()), SLOT(resetMenu()) );
     parent->connect( fromHere, SIGNAL(triggered()), SLOT(directionsFromHere()) );
     parent->connect( m_directionsToHereAction, SIGNAL(triggered()), \
                SLOT(directionsToHere()) );
     parent->connect( addBookmark, SIGNAL(triggered()), SLOT(addBookmark()) );
     parent->connect( aboutDialogAction, SIGNAL(triggered()), SLOT(slotAboutDialog()) \
                );
     parent->connect( m_copyCoordinateAction, SIGNAL(triggered()), \
                SLOT(slotCopyCoordinates()) );
     parent->connect( m_infoDialogAction, SIGNAL(triggered()), SLOT(slotInfoDialog()) \
                );
-    parent->connect( m_showOrbitAction, SIGNAL(triggered(bool)), \
                SLOT(slotShowOrbit(bool)) );
-    parent->connect( m_trackPlacemarkAction, SIGNAL(triggered(bool)), \
                SLOT(slotTrackPlacemark()) );
     parent->connect( fullscreenAction, SIGNAL(triggered(bool)), parent, \
SLOT(toggleFullscreen(bool)) );  
     parent->connect( m_runnerManager, \
SIGNAL(reverseGeocodingFinished(GeoDataCoordinates,GeoDataPlacemark)), @@ -201,14 \
+191,6 @@ void MarbleWidgetPopupMenu::showLmbMenu( int xpos, int ypos )  return;
     }
 
-    if (!d->m_lmbMenu->isEmpty()) {
-        d->m_lmbMenu->clear();
-        // just clear()-ing the menu won't delete the submenus
-        foreach( QObject *child, d->m_lmbMenu->children() ) {
-            child->deleteLater();
-        }
-    }
-
     d->m_mousePosition.setX(xpos);
     d->m_mousePosition.setY(ypos);
 
@@ -216,7 +198,6 @@ void MarbleWidgetPopupMenu::showLmbMenu( int xpos, int ypos )
     d->m_featurelist = d->m_widget->whichFeatureAt( curpos );
 
     int  actionidx = 1;
-    bool hasSatellites = false;
 
     QVector<const GeoDataPlacemark*>::const_iterator it = \
                d->m_featurelist.constBegin();
     QVector<const GeoDataPlacemark*>::const_iterator const itEnd = \
d->m_featurelist.constEnd(); @@ -225,30 +206,14 @@ void \
MarbleWidgetPopupMenu::showLmbMenu( int xpos, int ypos )  QString name = \
                (*it)->name();
         QPixmap icon = QPixmap::fromImage( ( *it)->style()->iconStyle().icon() );
         d->m_infoDialogAction->setData( actionidx );
-
-        //TODO: don't hardcode this check ?
-        if ( (*it)->visualCategory() != GeoDataFeature::Satellite ) {
-            d->m_infoDialogAction->setText( name );
-            d->m_infoDialogAction->setIcon( icon );
-
-            d->m_lmbMenu->addAction( d->m_infoDialogAction );
-        } else {
-	    hasSatellites = true;
-            QMenu *subMenu = new QMenu( name, d->m_lmbMenu );
-            subMenu->setIcon( icon );
-            d->m_infoDialogAction->setText( tr( "Satellite information" ) );
-            d->m_infoDialogAction->setIcon( QIcon() );
-            subMenu->addAction( d->m_infoDialogAction );
-
-            d->m_showOrbitAction->setChecked( (*it)->style()->lineStyle().penStyle() \
                != Qt::NoPen );
-            d->m_showOrbitAction->setData( actionidx );
-            subMenu->addAction( d->m_showOrbitAction );
-
-            d->m_trackPlacemarkAction->setData( actionidx );
-            subMenu->addAction( d->m_trackPlacemarkAction );
-
-            d->m_lmbMenu->addAction( subMenu->menuAction() );
+        d->m_infoDialogAction->setText( name );
+        d->m_infoDialogAction->setIcon( icon );
+        // Insert as first action in the menu
+        QAction *firstAction = 0;
+        if( !d->m_lmbMenu->actions().isEmpty() ) {
+            firstAction = d->m_lmbMenu->actions().first();
         }
+        d->m_lmbMenu->insertAction( firstAction, d->m_infoDialogAction );
         actionidx++;
     }
 
@@ -263,12 +228,16 @@ void MarbleWidgetPopupMenu::showLmbMenu( int xpos, int ypos )
     }
 
     switch ( d->m_lmbMenu->actions().size() ) {
-    case 0: break; // nothing to do, ignore
-    case 1: if ( ! hasSatellites ) {
-          d->m_lmbMenu->actions().first()->activate( QAction::Trigger );
-	      break; // one action? perform immediately
-	    }
-    default: d->m_lmbMenu->popup( d->m_widget->mapToGlobal( curpos ) );
+    case 0: // nothing to do, ignore
+        break;
+
+    case 1: // one action? perform immediately
+        d->m_lmbMenu->actions().first()->activate( QAction::Trigger );
+        d->m_lmbMenu->clear();
+        break;
+
+    default:
+        d->m_lmbMenu->popup( d->m_widget->mapToGlobal( curpos ) );
     }
 }
 
@@ -294,6 +263,11 @@ void MarbleWidgetPopupMenu::showRmbMenu( int xpos, int ypos )
     d->m_rmbMenu->popup( d->m_widget->mapToGlobal( curpos ) );
 }
 
+void MarbleWidgetPopupMenu::resetMenu()
+{
+    d->m_lmbMenu->clear();
+}
+
 void MarbleWidgetPopupMenu::slotInfoDialog()
 {
     QAction *action = qobject_cast<QAction *>( sender() );
@@ -485,41 +459,6 @@ void \
MarbleWidgetPopupMenu::Private::setupDialogSkyPlaces(PopupLayer *popup, con  \
popup->setContent(doc.finalText());  }
 
-void MarbleWidgetPopupMenu::slotShowOrbit( bool show )
-{
-    QAction *action = qobject_cast<QAction *>( sender() );
-    if ( action == 0 ) {
-        mDebug() << "Warning: slotShowOrbit should be called by a QAction signal";
-        return;
-    }
-
-    int actionidx = action->data().toInt();
-
-    if ( actionidx > 0 ) {
-        const GeoDataPlacemark *index = d->m_featurelist.at( actionidx -1 );
-
-        Qt::PenStyle penStyle = show ? Qt::SolidLine : Qt::NoPen;
-        index->style()->lineStyle().setPenStyle( penStyle );
-    }
-}
-
-void MarbleWidgetPopupMenu::slotTrackPlacemark()
-{
-    QAction *action = qobject_cast<QAction *>( sender() );
-    if ( action == 0 ) {
-        mDebug() << "Warning: slotTrackPlacemark should be called by a QAction \
                signal";
-        return;
-    }
-
-    int actionidx = action->data().toInt();
-
-    if ( actionidx > 0 ) {
-        mDebug() << actionidx;
-        const GeoDataPlacemark *index = d->m_featurelist.at( actionidx -1 );
-        emit trackPlacemark( index );
-    }
-}
-
 void MarbleWidgetPopupMenu::slotCopyCoordinates()
 {
     const GeoDataCoordinates coordinates = d->mouseCoordinates( \
d->m_copyCoordinateAction ); @@ -579,6 +518,8 @@ void \
MarbleWidgetPopupMenu::addAction( Qt::MouseButton button, QAction* action )  {
     if ( button == Qt::RightButton ) {
         d->m_rmbMenu->insertAction( d->m_rmbExtensionPoint, action );
+    } else {
+        d->m_lmbMenu->addAction( action );
     }
 }
 
diff --git a/src/lib/marble/MarbleWidgetPopupMenu.h \
b/src/lib/marble/MarbleWidgetPopupMenu.h index 8d9f591..5e13abc 100644
--- a/src/lib/marble/MarbleWidgetPopupMenu.h
+++ b/src/lib/marble/MarbleWidgetPopupMenu.h
@@ -51,17 +51,13 @@ class MARBLE_EXPORT MarbleWidgetPopupMenu  : public QObject
      */
     QPoint mousePosition() const;
 
-Q_SIGNALS:
-    void trackPlacemark( const GeoDataPlacemark *placemark );
-
  public Q_SLOTS:
     void  showLmbMenu( int, int );
     void  showRmbMenu( int, int );
 
 private Q_SLOTS:
+    void resetMenu();
     void slotInfoDialog();
-    void slotShowOrbit( bool show );
-    void slotTrackPlacemark();
     void slotCopyCoordinates();
     void slotAboutDialog();
 
diff --git a/src/plugins/render/satellites/SatellitesMSCItem.cpp \
b/src/plugins/render/satellites/SatellitesMSCItem.cpp index 153d272..4a18ee5 100644
--- a/src/plugins/render/satellites/SatellitesMSCItem.cpp
+++ b/src/plugins/render/satellites/SatellitesMSCItem.cpp
@@ -147,15 +147,18 @@ void SatellitesMSCItem::update()
     }
 
     double period = 24  * 3600 / m_n0;
-    QDateTime startTime = m_clock->dateTime().addSecs( - period / 2. );
-    QDateTime endTime = startTime.addSecs( period );
+    QDateTime startTime = m_clock->dateTime();
+    QDateTime endTime = startTime;
+    if( isTrackVisible() ) {
+        startTime = startTime.addSecs( - period / 2. );
+        endTime = startTime.addSecs( period );
+    }
 
     m_track->removeBefore( startTime );
     m_track->removeAfter( endTime );
 
     double step = period / 500.;
 
-    // FIXME update track only if orbit is visible
     for( double i = startTime.toTime_t(); i < endTime.toTime_t(); i += step ) {
 
         if ( i >= m_track->firstWhen().toTime_t() ) {
diff --git a/src/plugins/render/satellites/SatellitesModel.cpp \
b/src/plugins/render/satellites/SatellitesModel.cpp index ec695ca..b203ddf 100644
--- a/src/plugins/render/satellites/SatellitesModel.cpp
+++ b/src/plugins/render/satellites/SatellitesModel.cpp
@@ -190,7 +190,7 @@ void SatellitesModel::parseCatalog( const QString &id,
                                       missionStart, missionEnd,
                                       index++, planSat, m_clock );
         GeoDataStyle *style = new GeoDataStyle( *item->placemark()->style() );
-        style->lineStyle().setPenStyle( Qt::NoPen );
+        style->lineStyle().setPenStyle( Qt::SolidLine );
         style->lineStyle().setColor( nextColor() );
         style->labelStyle().setGlow( true );
 
@@ -247,7 +247,7 @@ void SatellitesModel::parseTLE( const QString &id,
 
         SatellitesTLEItem *item = new SatellitesTLEItem( satelliteName, satrec, \
                m_clock );
         GeoDataStyle *style = new GeoDataStyle( *item->placemark()->style() );
-        style->lineStyle().setPenStyle( Qt::NoPen );
+        style->lineStyle().setPenStyle( Qt::SolidLine );
         style->lineStyle().setColor( nextColor() );
         style->labelStyle().setGlow( true );
         item->placemark()->setStyle( style );
diff --git a/src/plugins/render/satellites/SatellitesPlugin.cpp \
b/src/plugins/render/satellites/SatellitesPlugin.cpp index b1ecc4a..312fde7 100644
--- a/src/plugins/render/satellites/SatellitesPlugin.cpp
+++ b/src/plugins/render/satellites/SatellitesPlugin.cpp
@@ -12,6 +12,8 @@
 #include "SatellitesPlugin.h"
 
 #include "MarbleDebug.h"
+#include "MarbleWidget.h"
+#include "MarbleWidgetPopupMenu.h"
 #include "MarbleModel.h"
 #include "GeoDataPlacemark.h"
 #include "SatellitesMSCItem.h"
@@ -24,7 +26,7 @@
 #include "ui_SatellitesConfigDialog.h"
 
 #include <QUrl>
-#include <QPushButton>
+#include <QMouseEvent>
 
 namespace Marble
 {
@@ -45,6 +47,15 @@ SatellitesPlugin::SatellitesPlugin( const MarbleModel *marbleModel \
)  
     setVisible( false );
     setSettings( QHash<QString, QVariant>() );
+
+    m_showOrbitAction = new QAction( tr( "Display orbit" ), this );
+    m_showOrbitAction->setCheckable( true );
+    m_showOrbitAction->setData( 0 );
+
+    m_trackPlacemarkAction = new QAction( tr( "Keep centered" ), this );
+    m_trackPlacemarkAction->setData( 0 );
+    connect( m_showOrbitAction, SIGNAL(triggered(bool)), SLOT(showOrbit(bool)) );
+    connect( m_trackPlacemarkAction, SIGNAL(triggered(bool)), SLOT(trackPlacemark()) \
);  }
 
 SatellitesPlugin::~SatellitesPlugin()
@@ -181,6 +192,66 @@ bool SatellitesPlugin::render( GeoPainter *painter, \
ViewportParams *viewport,  return true;
 }
 
+bool SatellitesPlugin::eventFilter( QObject *object, QEvent *event )
+{
+    // only if active plugin
+    if( !enabled() || !visible() ) {
+        return false;
+    }
+
+    if( event->type() != QEvent::MouseButtonPress )
+    {
+        return false;
+    }
+
+    MarbleWidget *widget = qobject_cast<MarbleWidget*> ( object );
+    Q_ASSERT ( widget );
+
+    QMouseEvent* mouseEvent = dynamic_cast<QMouseEvent*>(event);
+    Q_ASSERT( mouseEvent );
+
+    if( mouseEvent->button() == Qt::LeftButton ) {
+        m_trackerList.clear();
+        QVector<const GeoDataPlacemark*> vector = widget->whichFeatureAt( \
mouseEvent->pos() ); +        foreach (const GeoDataPlacemark *placemark, vector) {
+            foreach (TrackerPluginItem *obj, m_satModel->items() ) {
+                if( obj->placemark() == placemark ) {
+                    m_showOrbitAction->data() = m_trackerList.size();
+                    m_showOrbitAction->setChecked( obj->isTrackVisible() );
+                    widget->popupMenu()->addAction( Qt::LeftButton, \
m_showOrbitAction ); +
+                    m_trackPlacemarkAction->data() = m_trackerList.size();
+                    widget->popupMenu()->addAction( Qt::LeftButton, \
m_trackPlacemarkAction ); +
+                    m_trackerList.append( obj );
+                }
+            }
+        }
+    }
+    return false;
+}
+
+void SatellitesPlugin::showOrbit(bool show)
+{
+    QAction *action = qobject_cast<QAction *>( sender() );
+    Q_ASSERT( action );
+
+    int actionIndex = action->data().toInt();
+    TrackerPluginItem *item = m_trackerList.at( actionIndex );
+    item->setTrackVisible( show );
+    m_satModel->updateVisibility();
+}
+
+void SatellitesPlugin::trackPlacemark()
+{
+    QAction *action = qobject_cast<QAction *>( sender() );
+    Q_ASSERT( action );
+
+    int actionIndex = action->data().toInt();
+    TrackerPluginItem *item = m_trackerList.at( actionIndex );
+    const_cast<MarbleModel *>( marbleModel() )->setTrackedPlacemark( \
item->placemark() ); +}
+
 QHash<QString, QVariant> SatellitesPlugin::settings() const
 {
     QHash<QString, QVariant> result = RenderPlugin::settings();
diff --git a/src/plugins/render/satellites/SatellitesPlugin.h \
b/src/plugins/render/satellites/SatellitesPlugin.h index 1855fbc..7b822e5 100644
--- a/src/plugins/render/satellites/SatellitesPlugin.h
+++ b/src/plugins/render/satellites/SatellitesPlugin.h
@@ -62,6 +62,8 @@ public:
                  const QString &renderPos,
                  GeoSceneLayer *layer );
 
+    bool eventFilter( QObject *object, QEvent *event );
+
     QHash<QString, QVariant> settings() const;
     void setSettings( const QHash<QString, QVariant> &settings );
 
@@ -78,6 +80,9 @@ private Q_SLOTS:
     void dataSourceParsed( const QString &source );
     void userDataSourceAdded( const QString &source );
 
+    void showOrbit( bool show );
+    void trackPlacemark();
+
 protected:
     void activateDataSource( const QString &source );
     void addBuiltInDataSources();
@@ -91,6 +96,10 @@ private:
     QStringList m_newDataSources;
 
     SatellitesConfigDialog *m_configDialog;
+
+    QAction *m_showOrbitAction;
+    QAction *m_trackPlacemarkAction;
+    QVector<TrackerPluginItem*> m_trackerList;
 };
 
 } // namespace Marble
diff --git a/src/plugins/render/satellites/SatellitesTLEItem.cpp \
b/src/plugins/render/satellites/SatellitesTLEItem.cpp index 7fae7e2..af949bb 100644
--- a/src/plugins/render/satellites/SatellitesTLEItem.cpp
+++ b/src/plugins/render/satellites/SatellitesTLEItem.cpp
@@ -85,9 +85,12 @@ void SatellitesTLEItem::update()
         return;
     }
 
-    QDateTime startTime = m_clock->dateTime().addSecs( - 2 * 60 );
-
-    QDateTime endTime = startTime.addSecs( period() );
+    QDateTime startTime = m_clock->dateTime();
+    QDateTime endTime = startTime;
+    if( isTrackVisible() ) {
+        startTime = startTime.addSecs( -2 * 60 );
+        endTime = startTime.addSecs( period() );
+    }
 
     m_track->removeBefore( startTime );
     m_track->removeAfter( endTime );
diff --git a/src/plugins/render/satellites/TrackerPluginItem.cpp \
b/src/plugins/render/satellites/TrackerPluginItem.cpp index dcb77c3..12bb64c 100644
--- a/src/plugins/render/satellites/TrackerPluginItem.cpp
+++ b/src/plugins/render/satellites/TrackerPluginItem.cpp
@@ -20,13 +20,15 @@ public:
     TrackerPluginItemPrivate( const QString &name, GeoDataPlacemark *placemark )
         : m_name( name ),
           m_placemark( placemark ),
-          m_enabled( false )
+          m_enabled( false ),
+          m_trackVisible( false )
     {
     }
 
     QString m_name;
     GeoDataPlacemark *m_placemark;
     bool m_enabled;
+    bool m_trackVisible;
 };
 
 TrackerPluginItem::TrackerPluginItem( const QString &name )
@@ -69,4 +71,14 @@ void TrackerPluginItem::setVisible( bool visible )
     d->m_placemark->setVisible( visible );
 }
 
+bool TrackerPluginItem::isTrackVisible() const
+{
+    return d->m_trackVisible;
+}
+
+void TrackerPluginItem::setTrackVisible( bool visible )
+{
+    d->m_trackVisible = visible;
+}
+
 } // namespace Marble
diff --git a/src/plugins/render/satellites/TrackerPluginItem.h \
b/src/plugins/render/satellites/TrackerPluginItem.h index 77c996f..c74d838 100644
--- a/src/plugins/render/satellites/TrackerPluginItem.h
+++ b/src/plugins/render/satellites/TrackerPluginItem.h
@@ -55,7 +55,7 @@ public:
     virtual bool isEnabled() const;
 
     /**
-     * Enable/Disable the item according to @p enabled.
+     * Enable/Disable the item following the user checkbox action according to @p \
                enabled.
      */
     virtual void setEnabled( bool enabled );
 
@@ -70,6 +70,16 @@ public:
     virtual void setVisible( bool visible );
 
     /**
+     * Return whether the track is visible or invisible.
+     */
+    virtual bool isTrackVisible() const;
+
+    /**
+     * Set item track visible/invisible according to @p visible.
+     */
+    virtual void setTrackVisible( bool visible );
+
+    /**
      * Reimplement this method to update the placemark, for example to change its \
                coordinates.
      * If this item is in a TrackerPluginModel, this method will be called \
                regularly.
      */


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic