diff --git a/ground/src/plugins/opmap/opmap_widget.ui b/ground/src/plugins/opmap/opmap_widget.ui
index 08fe2a479..8f617ffa7 100644
--- a/ground/src/plugins/opmap/opmap_widget.ui
+++ b/ground/src/plugins/opmap/opmap_widget.ui
@@ -553,44 +553,6 @@ border-radius: 2px;
- -
-
-
-
- 0
- 0
-
-
-
- Show/Hide the UAV trail
-
-
- Trail
-
-
-
- :/opmap/images/uav_trail.png:/opmap/images/uav_trail.png
-
-
-
- 28
- 28
-
-
-
- true
-
-
- false
-
-
- Qt::ToolButtonIconOnly
-
-
- false
-
-
-
diff --git a/ground/src/plugins/opmap/opmapgadgetwidget.cpp b/ground/src/plugins/opmap/opmapgadgetwidget.cpp
index c4582c094..60bc85a01 100644
--- a/ground/src/plugins/opmap/opmapgadgetwidget.cpp
+++ b/ground/src/plugins/opmap/opmapgadgetwidget.cpp
@@ -40,7 +40,11 @@
#define max_digital_zoom 3 // maximum allowed digital zoom level
-const int safe_area_radius_list[] = {5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000};
+const int safe_area_radius_list[] = {5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000}; // meters
+
+const int uav_trail_time_list[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // seconds
+
+const int uav_trail_distance_list[] = {1, 2, 5, 10, 20, 50, 100, 200, 500}; // meters
// *************************************************************************************
@@ -131,14 +135,14 @@ OPMapGadgetWidget::OPMapGadgetWidget(QWidget *parent) : QWidget(parent)
m_map->SetShowHome(true); // display the HOME position on the map
m_map->SetShowUAV(true); // display the UAV position on the map
- m_map->Home->SetSafeArea(safe_area_radius_list[3]); // set radius (meters)
- m_map->Home->SetShowSafeArea(true); // show the safe area
+ m_map->Home->SetSafeArea(safe_area_radius_list[3]); // set radius (meters)
+ m_map->Home->SetShowSafeArea(true); // show the safe area
- m_map->UAV->SetTrailTime(0.5); // seconds
- m_map->UAV->SetTrailDistance(0.01); // kilometers
+ m_map->UAV->SetTrailTime(uav_trail_time_list[0]); // seconds
+ m_map->UAV->SetTrailDistance(uav_trail_distance_list[1]); // meters
-// m_map->UAV->SetTrailType(UAVTrailType::ByTimeElapsed);
- m_map->UAV->SetTrailType(UAVTrailType::ByDistance);
+ m_map->UAV->SetTrailType(UAVTrailType::ByTimeElapsed);
+// m_map->UAV->SetTrailType(UAVTrailType::ByDistance);
// **************
@@ -218,8 +222,6 @@ OPMapGadgetWidget::OPMapGadgetWidget(QWidget *parent) : QWidget(parent)
m_widget->progressBarMap->setMaximum(1);
- m_widget->toolButtonShowUAVtrail->setChecked(true);
-
/*
#if defined(Q_OS_MAC)
#elif defined(Q_OS_WIN)
@@ -540,16 +542,37 @@ void OPMapGadgetWidget::contextMenuEvent(QContextMenuEvent *event)
menu.addAction(showHomeAct);
menu.addAction(goHomeAct);
+ // ****
+ // uav trails
+
+ menu.addSeparator()->setText(tr("UAV Trail"));
+
+ QMenu uavTrailTypeSubMenu(tr("UAV trail type") + " (" + mapcontrol::Helper::StrFromUAVTrailType(m_map->UAV->GetTrailType()) + ")", this);
+ for (int i = 0; i < uavTrailTypeAct.count(); i++)
+ uavTrailTypeSubMenu.addAction(uavTrailTypeAct.at(i));
+ menu.addMenu(&uavTrailTypeSubMenu);
+
+ QMenu uavTrailTimeSubMenu(tr("UAV trail time") + " (" + QString::number(m_map->UAV->TrailTime()) + " sec)", this);
+ for (int i = 0; i < uavTrailTimeAct.count(); i++)
+ uavTrailTimeSubMenu.addAction(uavTrailTimeAct.at(i));
+ menu.addMenu(&uavTrailTimeSubMenu);
+
+ QMenu uavTrailDistanceSubMenu(tr("UAV trail distance") + " (" + QString::number(m_map->UAV->TrailDistance()) + " meters)", this);
+ for (int i = 0; i < uavTrailDistanceAct.count(); i++)
+ uavTrailDistanceSubMenu.addAction(uavTrailDistanceAct.at(i));
+ menu.addMenu(&uavTrailDistanceSubMenu);
+
+ menu.addAction(clearUAVtrailAct);
+
+ // ****
+
menu.addSeparator()->setText(tr("UAV"));
menu.addAction(showUAVAct);
- menu.addAction(showUAVtrailAct);
menu.addAction(followUAVpositionAct);
menu.addAction(followUAVheadingAct);
menu.addAction(goUAVAct);
- menu.addAction(clearUAVtrailAct);
-
// *********
switch (m_map_mode)
@@ -913,16 +936,6 @@ void OPMapGadgetWidget::on_toolButtonMapUAVheading_clicked()
followUAVheadingAct->toggle();
}
-void OPMapGadgetWidget::on_toolButtonShowUAVtrail_clicked()
-{
- if (!m_widget || !m_map)
- return;
-
-// QMutexLocker locker(&m_map_mutex);
-
- showUAVtrailAct->toggle();
-}
-
void OPMapGadgetWidget::on_horizontalSliderZoom_sliderMoved(int position)
{
if (!m_widget || !m_map)
@@ -1390,16 +1403,6 @@ void OPMapGadgetWidget::createActions()
followUAVheadingAct->setChecked(false);
connect(followUAVheadingAct, SIGNAL(toggled(bool)), this, SLOT(onFollowUAVheadingAct_toggled(bool)));
- showUAVtrailAct = new QAction(tr("Show UAV trail"), this);
- showUAVtrailAct->setStatusTip(tr("Show/Hide the UAV trail"));
- showUAVtrailAct->setCheckable(true);
- showUAVtrailAct->setChecked(true);
- connect(showUAVtrailAct, SIGNAL(toggled(bool)), this, SLOT(onShowUAVtrailAct_toggled(bool)));
-
- clearUAVtrailAct = new QAction(tr("Clear UAV trail"), this);
- clearUAVtrailAct->setStatusTip(tr("Clear the UAV trail"));
- connect(clearUAVtrailAct, SIGNAL(triggered()), this, SLOT(onClearUAVtrailAct_triggered()));
-
wayPointEditorAct = new QAction(tr("&Waypoint editor"), this);
wayPointEditorAct->setShortcut(tr("Ctrl+W"));
wayPointEditorAct->setStatusTip(tr("Open the waypoint editor"));
@@ -1492,6 +1495,53 @@ void OPMapGadgetWidget::createActions()
safeAreaAct.append(safeArea_act);
}
+ // *****
+ // UAV trail
+
+ uavTrailTypeActGroup = new QActionGroup(this);
+ connect(uavTrailTypeActGroup, SIGNAL(triggered(QAction *)), this, SLOT(onUAVTrailTypeActGroup_triggered(QAction *)));
+ uavTrailTypeAct.clear();
+ QStringList uav_trail_type_list = mapcontrol::Helper::UAVTrailTypes();
+ for (int i = 0; i < uav_trail_type_list.count(); i++)
+ {
+ mapcontrol::UAVTrailType::Types uav_trail_type = mapcontrol::Helper::UAVTrailTypeFromString(uav_trail_type_list[i]);
+ QAction *uavTrailType_act = new QAction(mapcontrol::Helper::StrFromUAVTrailType(uav_trail_type), uavTrailTypeActGroup);
+ uavTrailType_act->setCheckable(true);
+ uavTrailType_act->setChecked(uav_trail_type == m_map->UAV->GetTrailType());
+ uavTrailType_act->setData(i);
+ uavTrailTypeAct.append(uavTrailType_act);
+ }
+
+ clearUAVtrailAct = new QAction(tr("Clear UAV trail"), this);
+ clearUAVtrailAct->setStatusTip(tr("Clear the UAV trail"));
+ connect(clearUAVtrailAct, SIGNAL(triggered()), this, SLOT(onClearUAVtrailAct_triggered()));
+
+ uavTrailTimeActGroup = new QActionGroup(this);
+ connect(uavTrailTimeActGroup, SIGNAL(triggered(QAction *)), this, SLOT(onUAVTrailTimeActGroup_triggered(QAction *)));
+ uavTrailTimeAct.clear();
+ for (int i = 0; i < sizeof(uav_trail_time_list) / sizeof(uav_trail_time_list[0]); i++)
+ {
+ int uav_trail_time = uav_trail_time_list[i];
+ QAction *uavTrailTime_act = new QAction(QString::number(uav_trail_time) + " sec", uavTrailTimeActGroup);
+ uavTrailTime_act->setCheckable(true);
+ uavTrailTime_act->setChecked(uav_trail_time == m_map->UAV->TrailTime());
+ uavTrailTime_act->setData(uav_trail_time);
+ uavTrailTimeAct.append(uavTrailTime_act);
+ }
+
+ uavTrailDistanceActGroup = new QActionGroup(this);
+ connect(uavTrailDistanceActGroup, SIGNAL(triggered(QAction *)), this, SLOT(onUAVTrailDistanceActGroup_triggered(QAction *)));
+ uavTrailDistanceAct.clear();
+ for (int i = 0; i < sizeof(uav_trail_distance_list) / sizeof(uav_trail_distance_list[0]); i++)
+ {
+ int uav_trail_distance = uav_trail_distance_list[i];
+ QAction *uavTrailDistance_act = new QAction(QString::number(uav_trail_distance) + " meters", uavTrailDistanceActGroup);
+ uavTrailDistance_act->setCheckable(true);
+ uavTrailDistance_act->setChecked(uav_trail_distance == m_map->UAV->TrailDistance());
+ uavTrailDistance_act->setData(uav_trail_distance);
+ uavTrailDistanceAct.append(uavTrailDistance_act);
+ }
+
// *****
// ***********************
@@ -1663,15 +1713,17 @@ void OPMapGadgetWidget::onFollowUAVheadingAct_toggled(bool checked)
setMapFollowingMode();
}
-void OPMapGadgetWidget::onShowUAVtrailAct_toggled(bool checked)
+void OPMapGadgetWidget::onUAVTrailTypeActGroup_triggered(QAction *action)
{
if (!m_widget || !m_map)
return;
- if (m_widget->toolButtonShowUAVtrail->isChecked() != checked)
- m_widget->toolButtonShowUAVtrail->setChecked(checked);
+ int trail_type_idx = action->data().toInt();
- m_map->UAV->SetShowTrail(checked);
+ QStringList uav_trail_type_list = mapcontrol::Helper::UAVTrailTypes();
+ mapcontrol::UAVTrailType::Types uav_trail_type = mapcontrol::Helper::UAVTrailTypeFromString(uav_trail_type_list[trail_type_idx]);
+
+ m_map->UAV->SetTrailType(uav_trail_type);
}
void OPMapGadgetWidget::onClearUAVtrailAct_triggered()
@@ -1682,6 +1734,26 @@ void OPMapGadgetWidget::onClearUAVtrailAct_triggered()
m_map->UAV->DeleteTrail();
}
+void OPMapGadgetWidget::onUAVTrailTimeActGroup_triggered(QAction *action)
+{
+ if (!m_widget || !m_map)
+ return;
+
+ int trail_time = (double)action->data().toInt();
+
+ m_map->UAV->SetTrailTime(trail_time);
+}
+
+void OPMapGadgetWidget::onUAVTrailDistanceActGroup_triggered(QAction *action)
+{
+ if (!m_widget || !m_map)
+ return;
+
+ int trail_distance = action->data().toInt();
+
+ m_map->UAV->SetTrailDistance(trail_distance);
+}
+
void OPMapGadgetWidget::onOpenWayPointEditorAct_triggered()
{
if (!m_widget || !m_map)
diff --git a/ground/src/plugins/opmap/opmapgadgetwidget.h b/ground/src/plugins/opmap/opmapgadgetwidget.h
index 9ef81a9cf..a32944239 100644
--- a/ground/src/plugins/opmap/opmapgadgetwidget.h
+++ b/ground/src/plugins/opmap/opmapgadgetwidget.h
@@ -145,7 +145,6 @@ private slots:
void on_toolButtonMapHome_clicked();
void on_toolButtonMapUAV_clicked();
void on_toolButtonMapUAVheading_clicked();
- void on_toolButtonShowUAVtrail_clicked();
void on_horizontalSliderZoom_sliderMoved(int position);
void on_toolButtonAddWaypoint_clicked();
void on_treeViewWaypoints_clicked(QModelIndex index);
@@ -199,8 +198,6 @@ private slots:
void onGoUAVAct_triggered();
void onFollowUAVpositionAct_toggled(bool checked);
void onFollowUAVheadingAct_toggled(bool checked);
- void onShowUAVtrailAct_toggled(bool checked);
- void onClearUAVtrailAct_triggered();
void onOpenWayPointEditorAct_triggered();
void onAddWayPointAct_triggered();
void onEditWayPointAct_triggered();
@@ -213,6 +210,10 @@ private slots:
void onCenterMagicWaypointAct_triggered();
void onShowSafeAreaAct_toggled(bool show);
void onSafeAreaActGroup_triggered(QAction *action);
+ void onUAVTrailTypeActGroup_triggered(QAction *action);
+ void onClearUAVtrailAct_triggered();
+ void onUAVTrailTimeActGroup_triggered(QAction *action);
+ void onUAVTrailDistanceActGroup_triggered(QAction *action);
private:
int min_zoom;
@@ -283,8 +284,6 @@ private:
QAction *goUAVAct;
QAction *followUAVpositionAct;
QAction *followUAVheadingAct;
- QAction *showUAVtrailAct;
- QAction *clearUAVtrailAct;
QAction *wayPointEditorAct;
QAction *addWayPointAct;
QAction *editWayPointAct;
@@ -298,6 +297,14 @@ private:
QActionGroup *safeAreaActGroup;
QList safeAreaAct;
+ QActionGroup *uavTrailTypeActGroup;
+ QList uavTrailTypeAct;
+ QAction *clearUAVtrailAct;
+ QActionGroup *uavTrailTimeActGroup;
+ QList uavTrailTimeAct;
+ QActionGroup *uavTrailDistanceActGroup;
+ QList uavTrailDistanceAct;
+
QActionGroup *mapModeActGroup;
QList mapModeAct;