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;