[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