1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2025-01-17 02:52:12 +01:00

Added 'map modes' to the opmap plug-in. "Nomral map mode" and "Magic waypoint map mode". Not yet complete!

git-svn-id: svn://svn.openpilot.org/OpenPilot/trunk@1911 ebee16cc-31ac-478f-84a7-5cbb03baadba
This commit is contained in:
pip 2010-10-07 07:09:00 +00:00 committed by pip
parent 69d2e8828f
commit 1741825ee2
7 changed files with 694 additions and 114 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1006 B

After

Width:  |  Height:  |  Size: 1006 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -3,8 +3,6 @@
<file>images/ok.png</file>
<file>images/uav.png</file>
<file>images/gcs.png</file>
<file>images/plus.png</file>
<file>images/minus.png</file>
<file>images/waypoint.png</file>
<file>images/right_but.png</file>
<file>images/left_but.png</file>
@ -21,5 +19,8 @@
<file>images/uav_heading.png</file>
<file>images/uav_trail.png</file>
<file>images/uav_trail_clear.png</file>
<file>images/minus.png</file>
<file>images/plus.png</file>
<file>images/waypoint_marker3.png</file>
</qresource>
</RCC>

View File

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>548</width>
<height>565</height>
<width>514</width>
<height>412</height>
</rect>
</property>
<property name="sizePolicy">
@ -30,8 +30,253 @@
<number>0</number>
</property>
<property name="margin">
<number>0</number>
<number>1</number>
</property>
<item>
<widget class="QFrame" name="frameTopBar">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>32</height>
</size>
</property>
<property name="contextMenuPolicy">
<enum>Qt::NoContextMenu</enum>
</property>
<property name="styleSheet">
<string notr="true">QFrame{
background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 rgba(110, 110, 110, 255), stop:1 rgba(71, 71, 71, 255));
color: rgba(0, 0, 0, 128);
}
QLabel {
background-color: transparent;
/* background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 rgba(0, 0, 0, 80), stop:1 rgba(0, 0, 0, 80)); */
color: rgb(255, 255, 255);
/*border: 1px solid black;*/
border: none;
border-radius: 2px;
}
QToolButton { /* all types of tool button */
background-color: transparent;
color: rgb(255, 255, 255);
/*border-style: none;*/
/* border: 1px solid rgba(0, 0, 0, 64); */
/* border: 0px; */
border-radius: 3px;
}
QToolButton:hover {
background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 rgba(255, 255, 255, 200), stop:1 rgba(180, 180, 180, 200));
color: rgb(255, 255, 255);
border: 0px;
border-radius: 3px;
}
QToolButton:pressed {
background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 rgba(48, 48, 48, 255), stop:1 rgba(120, 120, 120, 255));
color: rgb(255, 255, 255);
border: 0px;
border-radius: 3px;
}
QToolButton:checked {
background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 rgba(48, 48, 48, 255), stop:1 rgba(120, 120, 120, 255));
color: rgb(255, 255, 255);
border: 0px;
border-radius: 3px;
}
QComboBox {
background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 rgba(48, 48, 48, 255), stop:1 rgba(120, 120, 120, 255));
color: rgba(255, 255, 255, 255);
border: 1px solid rgba(0, 0, 0, 128);
border-radius: 0px;
}
QComboBox::down-arrow:on {
background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 rgba(48, 48, 48, 255), stop:1 rgba(120, 120, 120, 255));
top: 1px; left: 1px; /* move the arrow when the popup is open */
}
QComboBox::down-arrow {
image: url(:/opmap/images/combobox_down_arrow.png);
}
QComboBox:drop-down {
background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 rgba(110, 110, 110, 255), stop:1 rgba(71, 71, 71, 255));
border-left: 1px solid rgba(0, 0, 0, 128);
/* subcontrol-origin: padding;
subcontrol-position: top right;
border-top-right-radius: 1px;
border-bottom-right-radius: 1px; */
}
QComboBox QAbstractItemView { /* the drop down list */
background-color: rgb(255, 255, 255);
color: rgb(0, 0, 0);
border: 1px solid rgba(0, 0, 0, 128);
selection-background-color: rgb(160, 160, 255);
border-radius: 2px;
}
</string>
</property>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>2</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>2</number>
</property>
<item>
<layout class="QHBoxLayout" name="layoutWidgetStatusBar_2">
<property name="spacing">
<number>5</number>
</property>
<property name="leftMargin">
<number>3</number>
</property>
<property name="rightMargin">
<number>8</number>
</property>
<item>
<spacer name="horizontalSpacer_5">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>10</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QToolButton" name="toolButtonMapModeLeft">
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="../coreplugin/core.qrc">
<normaloff>:/core/images/prev.png</normaloff>:/core/images/prev.png</iconset>
</property>
<property name="iconSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="checkable">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="labelMapMode">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>200</width>
<height>0</height>
</size>
</property>
<property name="font">
<font>
<family>MS Sans Serif</family>
<pointsize>12</pointsize>
<weight>75</weight>
<italic>false</italic>
<bold>true</bold>
<kerning>true</kerning>
</font>
</property>
<property name="toolTip">
<string>Mouse position</string>
</property>
<property name="styleSheet">
<string notr="true"/>
</property>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
<property name="text">
<string>labelMapMode</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="margin">
<number>5</number>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="toolButtonMapModeRight">
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../coreplugin/core.qrc">
<normaloff>:/core/images/next.png</normaloff>:/core/images/next.png</iconset>
</property>
<property name="iconSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>10</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QSplitter" name="splitter">
<property name="styleSheet">
@ -149,14 +394,14 @@ border-radius: 2px;
<item>
<widget class="QComboBox" name="comboBoxFindPlace">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<width>20</width>
<height>0</height>
</size>
</property>
@ -623,7 +868,7 @@ QTreeView::branch:open:has-children:!has-siblings, QTreeView::branch:open:has-ch
<bool>false</bool>
</property>
<property name="acceptDrops">
<bool>true</bool>
<bool>false</bool>
</property>
<property name="styleSheet">
<string notr="true">
@ -819,24 +1064,21 @@ border-radius: 3px;
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
<enum>QFrame::Plain</enum>
</property>
<property name="lineWidth">
<number>2</number>
</property>
<property name="midLineWidth">
<number>0</number>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<property name="spacing">
<number>3</number>
<number>5</number>
</property>
<property name="leftMargin">
<property name="margin">
<number>1</number>
</property>
<property name="topMargin">
<number>6</number>
</property>
<property name="rightMargin">
<number>1</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<spacer name="verticalSpacer_3">
<property name="orientation">
@ -899,7 +1141,7 @@ border-radius: 3px;
<property name="minimumSize">
<size>
<width>0</width>
<height>80</height>
<height>50</height>
</size>
</property>
<property name="maximumSize">
@ -1119,38 +1361,6 @@ border-radius: 3px;
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="toolButtonClearUAVtrail">
<property name="toolTip">
<string>Clear the UAV trail</string>
</property>
<property name="styleSheet">
<string notr="true"/>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="opmap.qrc">
<normaloff>:/opmap/images/uav_trail_clear.png</normaloff>:/opmap/images/uav_trail_clear.png</iconset>
</property>
<property name="iconSize">
<size>
<width>28</width>
<height>28</height>
</size>
</property>
<property name="checkable">
<bool>false</bool>
</property>
<property name="autoRepeat">
<bool>false</bool>
</property>
<property name="autoRaise">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
@ -1225,6 +1435,9 @@ color: rgb(255, 255, 255);
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
<property name="spacing">
<number>1</number>

View File

@ -66,6 +66,17 @@ OPMapGadgetWidget::OPMapGadgetWidget(QWidget *parent) : QWidget(parent)
min_zoom = max_zoom = 0;
m_map_mode = Normal_MapMode;
// default magic waypoint params
magic_waypoint.map_wp_item = NULL;
magic_waypoint.coord = internals::PointLatLng(0.0, 0.0);
magic_waypoint.altitude = 0.0;
magic_waypoint.description = "Magic waypoint";
magic_waypoint.locked = false;
magic_waypoint.time_seconds = 0;
magic_waypoint.hold_time_seconds = 0;
// **************
// fetch required UAVObjects
@ -147,6 +158,21 @@ OPMapGadgetWidget::OPMapGadgetWidget(QWidget *parent) : QWidget(parent)
// **************
// set the user control options
switch (m_map_mode)
{
case Normal_MapMode:
m_widget->labelMapMode->setText("Normal mode");
break;
case MagicWaypoint_MapMode:
m_widget->labelMapMode->setText("Magic Waypoint mode");
break;
default:
m_widget->labelMapMode->setText("Unknown mode");
break;
}
m_widget->labelUAVPos->setText("---");
m_widget->labelMapPos->setText("---");
m_widget->labelMousePos->setText("---");
@ -329,7 +355,19 @@ OPMapGadgetWidget::~OPMapGadgetWidget()
// #else
// #endif
onClearWayPointsAct_triggered();
m_waypoint_list_mutex.lock();
foreach (t_waypoint *wp, m_waypoint_list)
{
if (!wp) continue;
// todo:
delete wp->map_wp_item;
}
m_waypoint_list_mutex.unlock();
m_waypoint_list.clear();
if (m_zoom_slider_widget) delete m_zoom_slider_widget;
if (m_statusbar_widget) delete m_statusbar_widget;
@ -372,6 +410,8 @@ void OPMapGadgetWidget::mouseMoveEvent(QMouseEvent *event)
void OPMapGadgetWidget::contextMenuEvent(QContextMenuEvent *event)
{
QString s;
if (!m_widget || !m_map)
return;
@ -409,6 +449,26 @@ void OPMapGadgetWidget::contextMenuEvent(QContextMenuEvent *event)
menu.addSeparator();
switch (m_map_mode)
{
case Normal_MapMode: s = tr(" (Normal)"); break;
case MagicWaypoint_MapMode: s = tr(" (Magic Waypoint)"); break;
default: s = tr(" (Unknown)"); break;
}
for (int i = 0; i < mapModeAct.count(); i++)
{ // set the menu to checked (or not)
QAction *act = mapModeAct.at(i);
if (!act) continue;
if (act->data().toInt() == (int)m_map_mode)
act->setChecked(true);
}
QMenu mapModeSubMenu(tr("Map mode") + s, this);
for (int i = 0; i < mapModeAct.count(); i++)
mapModeSubMenu.addAction(mapModeAct.at(i));
menu.addMenu(&mapModeSubMenu);
menu.addSeparator();
QMenu copySubMenu(tr("Copy"), this);
copySubMenu.addAction(copyMouseLatLonToClipAct);
copySubMenu.addAction(copyMouseLatToClipAct);
@ -430,7 +490,7 @@ void OPMapGadgetWidget::contextMenuEvent(QContextMenuEvent *event)
QMenu zoomSubMenu(tr("&Zoom ") + "(" + QString::number(m_map->ZoomReal()) + ")", this);
for (int i = 0; i < zoomAct.count(); i++)
zoomSubMenu.addAction(zoomAct.at(i));
zoomSubMenu.addAction(zoomAct.at(i));
menu.addMenu(&zoomSubMenu);
menu.addSeparator();
@ -450,26 +510,36 @@ void OPMapGadgetWidget::contextMenuEvent(QContextMenuEvent *event)
menu.addAction(followUAVheadingAct);
menu.addAction(goUAVAct);
menu.addSeparator()->setText(tr("Waypoints"));
menu.addAction(clearUAVtrailAct);
menu.addAction(wayPointEditorAct);
menu.addAction(addWayPointAct);
// *********
if (m_mouse_waypoint)
{ // we have a waypoint under the mouse
menu.addAction(editWayPointAct);
if (m_map_mode == Normal_MapMode)
{ // only show the waypoint stuff if not in 'magic waypoint' mode
lockWayPointAct->setChecked(waypoint_locked);
menu.addAction(lockWayPointAct);
menu.addSeparator()->setText(tr("Waypoints"));
if (!waypoint_locked)
menu.addAction(deleteWayPointAct);
menu.addAction(wayPointEditorAct);
menu.addAction(addWayPointAct);
if (m_mouse_waypoint)
{ // we have a waypoint under the mouse
menu.addAction(editWayPointAct);
lockWayPointAct->setChecked(waypoint_locked);
menu.addAction(lockWayPointAct);
if (!waypoint_locked)
menu.addAction(deleteWayPointAct);
}
m_waypoint_list_mutex.lock();
if (m_waypoint_list.count() > 0)
menu.addAction(clearWayPointsAct); // we have waypoints
m_waypoint_list_mutex.unlock();
}
m_waypoint_list_mutex.lock();
if (m_waypoint_list.count() > 0)
menu.addAction(clearWayPointsAct); // we have waypoints
m_waypoint_list_mutex.unlock();
// *********
// menu.addSeparator();
@ -529,6 +599,8 @@ void OPMapGadgetWidget::updatePosition()
if (!m_widget || !m_map)
return;
QMutexLocker locker(&m_map_mutex);
QPointF pos = getLatLon();
internals::PointLatLng uav_pos = internals::PointLatLng(pos.x(), pos.y()); // current UAV position
@ -553,6 +625,8 @@ void OPMapGadgetWidget::updateMousePos()
if (!m_widget || !m_map)
return;
QMutexLocker locker(&m_map_mutex);
internals::PointLatLng lat_lon = m_map->currentMousePosition(); // fetch the current lat/lon mouse position
if (mouse_lat_lon == lat_lon)
@ -666,8 +740,37 @@ void OPMapGadgetWidget::WPNumberChanged(int const &oldnumber, int const &newnumb
void OPMapGadgetWidget::WPValuesChanged(WayPointItem *waypoint)
{
Q_UNUSED(waypoint);
// to do
qDebug("WPValuesChanged");
switch (m_map_mode)
{
case Normal_MapMode:
m_waypoint_list_mutex.lock();
foreach (t_waypoint *wp, m_waypoint_list)
{ // search for the waypoint in our own waypoint list and update it
if (!wp) continue;
if (!wp->map_wp_item) continue;
if (wp->map_wp_item != waypoint) continue;
// found the waypoint in our list
wp->coord = waypoint->Coord();
wp->altitude = waypoint->Altitude();
wp->description = waypoint->Description();
break;
}
m_waypoint_list_mutex.unlock();
break;
case MagicWaypoint_MapMode:
// update our copy of the magic waypoint
if (magic_waypoint.map_wp_item && magic_waypoint.map_wp_item == waypoint)
{
magic_waypoint.coord = waypoint->Coord();
magic_waypoint.altitude = waypoint->Altitude();
magic_waypoint.description = waypoint->Description();
}
break;
}
}
void OPMapGadgetWidget::WPInserted(int const &number, WayPointItem *waypoint)
@ -732,16 +835,19 @@ void OPMapGadgetWidget::on_toolButtonFindPlace_clicked()
void OPMapGadgetWidget::on_toolButtonZoomP_clicked()
{
QMutexLocker locker(&m_map_mutex);
zoomIn();
}
void OPMapGadgetWidget::on_toolButtonZoomM_clicked()
{
QMutexLocker locker(&m_map_mutex);
zoomOut();
}
void OPMapGadgetWidget::on_toolButtonMapHome_clicked()
{
QMutexLocker locker(&m_map_mutex);
goHome();
}
@ -750,6 +856,8 @@ void OPMapGadgetWidget::on_toolButtonMapUAV_clicked()
if (!m_widget || !m_map)
return;
QMutexLocker locker(&m_map_mutex);
followUAVpositionAct->toggle();
}
@ -758,6 +866,8 @@ void OPMapGadgetWidget::on_toolButtonMapUAVheading_clicked()
if (!m_widget || !m_map)
return;
// QMutexLocker locker(&m_map_mutex);
followUAVheadingAct->toggle();
}
@ -766,22 +876,18 @@ void OPMapGadgetWidget::on_toolButtonShowUAVtrail_clicked()
if (!m_widget || !m_map)
return;
// QMutexLocker locker(&m_map_mutex);
showUAVtrailAct->toggle();
}
void OPMapGadgetWidget::on_toolButtonClearUAVtrail_clicked()
{
if (!m_widget || !m_map)
return;
clearUAVtrailAct->trigger();
}
void OPMapGadgetWidget::on_horizontalSliderZoom_sliderMoved(int position)
{
if (!m_widget || !m_map)
return;
QMutexLocker locker(&m_map_mutex);
setZoom(position);
}
@ -790,6 +896,8 @@ void OPMapGadgetWidget::on_toolButtonHome_clicked()
if (!m_widget || !m_map)
return;
QMutexLocker locker(&m_map_mutex);
// to do
}
@ -799,6 +907,8 @@ void OPMapGadgetWidget::on_toolButtonPrevWaypoint_clicked()
if (!m_widget || !m_map)
return;
// QMutexLocker locker(&m_map_mutex);
// to do
}
@ -807,6 +917,8 @@ void OPMapGadgetWidget::on_toolButtonNextWaypoint_clicked()
if (!m_widget || !m_map)
return;
// QMutexLocker locker(&m_map_mutex);
// to do
}
@ -815,6 +927,8 @@ void OPMapGadgetWidget::on_toolButtonHoldPosition_clicked()
if (!m_widget || !m_map)
return;
// QMutexLocker locker(&m_map_mutex);
// to do
}
@ -823,6 +937,8 @@ void OPMapGadgetWidget::on_toolButtonGo_clicked()
if (!m_widget || !m_map)
return;
// QMutexLocker locker(&m_map_mutex);
// to do
}
@ -831,18 +947,38 @@ void OPMapGadgetWidget::on_toolButtonAddWaypoint_clicked()
if (!m_widget || !m_map)
return;
m_waypoint_list_mutex.lock();
if (m_map_mode != Normal_MapMode)
return;
QMutexLocker locker(&m_waypoint_list_mutex);
// m_waypoint_list_mutex.lock();
// create a waypoint at the center of the map
t_waypoint waypoint;
waypoint.item = m_map->WPCreate(m_map->CurrentPosition(), 0);
waypoint.time_seconds = 0;
waypoint.hold_time_seconds = 0;
t_waypoint *wp = new t_waypoint;
wp->map_wp_item = NULL;
wp->coord = m_map->CurrentPosition();
wp->altitude = 0;
wp->description = "";
wp->locked = false;
wp->time_seconds = 0;
wp->hold_time_seconds = 0;
wp->map_wp_item = m_map->WPCreate(wp->coord, wp->altitude, wp->description);
wp->map_wp_item->setFlag(QGraphicsItem::ItemIsMovable, !wp->locked);
if (wp->map_wp_item)
{
if (!wp->locked)
wp->map_wp_item->picture.load(QString::fromUtf8(":/opmap/images/waypoint_marker1.png"));
else
wp->map_wp_item->picture.load(QString::fromUtf8(":/opmap/images/waypoint_marker2.png"));
wp->map_wp_item->update();
}
// and remember it in our own local waypoint list
m_waypoint_list.append(waypoint);
m_waypoint_list.append(wp);
m_waypoint_list_mutex.unlock();
// m_waypoint_list_mutex.unlock();
}
void OPMapGadgetWidget::on_treeViewWaypoints_clicked(QModelIndex index)
@ -850,12 +986,50 @@ void OPMapGadgetWidget::on_treeViewWaypoints_clicked(QModelIndex index)
if (!m_widget || !m_map)
return;
// QMutexLocker locker(&m_map_mutex);
QStandardItem *item = wayPoint_treeView_model.itemFromIndex(index);
if (!item) return;
// to do
}
void OPMapGadgetWidget::on_toolButtonMapModeLeft_clicked()
{
switch (m_map_mode)
{
case Normal_MapMode:
setMapMode(MagicWaypoint_MapMode);
break;
case MagicWaypoint_MapMode:
setMapMode(Normal_MapMode);
break;
default:
setMapMode(Normal_MapMode);
break;
}
}
void OPMapGadgetWidget::on_toolButtonMapModeRight_clicked()
{
switch (m_map_mode)
{
case Normal_MapMode:
setMapMode(MagicWaypoint_MapMode);
break;
case MagicWaypoint_MapMode:
setMapMode(Normal_MapMode);
break;
default:
setMapMode(Normal_MapMode);
break;
}
}
// *************************************************************************************
// public functions
@ -991,6 +1165,81 @@ void OPMapGadgetWidget::setCacheLocation(QString cacheLocation)
m_map->configuration->SetCacheLocation(cacheLocation);
}
void OPMapGadgetWidget::setMapMode(opMapModeType mode)
{
if (!m_widget || !m_map)
return;
if (mode != Normal_MapMode && mode != MagicWaypoint_MapMode)
mode = Normal_MapMode; // fix error
if (m_map_mode == mode)
return; // no change in map mode
switch (mode)
{
case Normal_MapMode:
m_map_mode = Normal_MapMode;
m_widget->labelMapMode->setText("Normal mode");
// delete the magic waypoint from the map
if (magic_waypoint.map_wp_item)
{
magic_waypoint.coord = magic_waypoint.map_wp_item->Coord();
magic_waypoint.altitude = magic_waypoint.map_wp_item->Altitude();
magic_waypoint.description = magic_waypoint.map_wp_item->Description();
magic_waypoint.map_wp_item = NULL;
}
m_map->WPDeleteAll();
// restore the normal waypoints on the map
m_waypoint_list_mutex.lock();
foreach (t_waypoint *wp, m_waypoint_list)
{
if (!wp) continue;
wp->map_wp_item = m_map->WPCreate(wp->coord, wp->altitude, wp->description);
if (!wp->map_wp_item) continue;
wp->map_wp_item->setFlag(QGraphicsItem::ItemIsMovable, !wp->locked);
if (!wp->locked)
wp->map_wp_item->picture.load(QString::fromUtf8(":/opmap/images/waypoint_marker1.png"));
else
wp->map_wp_item->picture.load(QString::fromUtf8(":/opmap/images/waypoint_marker2.png"));
wp->map_wp_item->update();
}
m_waypoint_list_mutex.unlock();
break;
case MagicWaypoint_MapMode:
m_map_mode = MagicWaypoint_MapMode;
m_widget->labelMapMode->setText("Magic Waypoint mode");
// delete the normal waypoints from the map
m_waypoint_list_mutex.lock();
foreach (t_waypoint *wp, m_waypoint_list)
{
if (!wp) continue;
if (!wp->map_wp_item) continue;
wp->coord = wp->map_wp_item->Coord();
wp->altitude = wp->map_wp_item->Altitude();
wp->description = wp->map_wp_item->Description();
wp->locked = (wp->map_wp_item->flags() & QGraphicsItem::ItemIsMovable) == 0;
wp->map_wp_item = NULL;
}
m_map->WPDeleteAll();
m_waypoint_list_mutex.unlock();
// restore the magic waypoint on the map
magic_waypoint.map_wp_item = m_map->WPCreate(magic_waypoint.coord, magic_waypoint.altitude, magic_waypoint.description);
magic_waypoint.map_wp_item->SetShowNumber(false);
magic_waypoint.map_wp_item->picture.load(QString::fromUtf8(":/opmap/images/waypoint_marker3.png"));
break;
}
}
// *************************************************************************************
// Context menu stuff
@ -1126,6 +1375,25 @@ void OPMapGadgetWidget::createActions()
clearWayPointsAct->setStatusTip(tr("Clear waypoints"));
connect(clearWayPointsAct, SIGNAL(triggered()), this, SLOT(onClearWayPointsAct_triggered()));
mapModeActGroup = new QActionGroup(this);
connect(mapModeActGroup, SIGNAL(triggered(QAction *)), this, SLOT(onMapModeActGroup_triggered(QAction *)));
mapModeAct.clear();
{
QAction *map_mode_act;
map_mode_act = new QAction(tr("Normal"), mapModeActGroup);
map_mode_act->setCheckable(true);
map_mode_act->setChecked(m_map_mode == Normal_MapMode);
map_mode_act->setData((int)Normal_MapMode);
mapModeAct.append(map_mode_act);
map_mode_act = new QAction(tr("Magic Waypoint"), mapModeActGroup);
map_mode_act->setCheckable(true);
map_mode_act->setChecked(m_map_mode == MagicWaypoint_MapMode);
map_mode_act->setData((int)MagicWaypoint_MapMode);
mapModeAct.append(map_mode_act);
}
zoomActGroup = new QActionGroup(this);
connect(zoomActGroup, SIGNAL(triggered(QAction *)), this, SLOT(onZoomActGroup_triggered(QAction *)));
zoomAct.clear();
@ -1209,7 +1477,6 @@ void OPMapGadgetWidget::onShowHomeAct_toggled(bool show)
if (!m_widget || !m_map)
return;
// m_map->SetShowHome(show); // this can cause a rather big crash
m_map->Home->setVisible(show);
}
@ -1218,10 +1485,19 @@ void OPMapGadgetWidget::onShowUAVAct_toggled(bool show)
if (!m_widget || !m_map)
return;
// m_map->SetShowUAV(show); // this can cause a rather big crash
m_map->UAV->setVisible(show);
}
void OPMapGadgetWidget::onMapModeActGroup_triggered(QAction *action)
{
if (!m_widget || !m_map || !action)
return;
opMapModeType mode = (opMapModeType)action->data().toInt();
setMapMode(mode);
}
void OPMapGadgetWidget::onGoZoomInAct_triggered()
{
zoomIn();
@ -1322,16 +1598,35 @@ void OPMapGadgetWidget::onAddWayPointAct_triggered()
if (!m_widget || !m_map)
return;
if (m_map_mode != Normal_MapMode)
return;
m_waypoint_list_mutex.lock();
// create a waypoint on the map at the last known mouse position
t_waypoint waypoint;
waypoint.item = m_map->WPCreate(mouse_lat_lon, 0);
waypoint.time_seconds = 0;
waypoint.hold_time_seconds = 0;
t_waypoint *wp = new t_waypoint;
wp->map_wp_item = NULL;
wp->coord = mouse_lat_lon;
wp->altitude = 0;
wp->description = "";
wp->locked = false;
wp->time_seconds = 0;
wp->hold_time_seconds = 0;
wp->map_wp_item = m_map->WPCreate(wp->coord, wp->altitude, wp->description);
// and remember it in our own local waypoint list
m_waypoint_list.append(waypoint);
wp->map_wp_item->setFlag(QGraphicsItem::ItemIsMovable, !wp->locked);
if (wp->map_wp_item)
{
if (!wp->locked)
wp->map_wp_item->picture.load(QString::fromUtf8(":/opmap/images/waypoint_marker1.png"));
else
wp->map_wp_item->picture.load(QString::fromUtf8(":/opmap/images/waypoint_marker2.png"));
wp->map_wp_item->update();
}
// and remember it in our own local waypoint list
m_waypoint_list.append(wp);
m_waypoint_list_mutex.unlock();
}
@ -1341,7 +1636,11 @@ void OPMapGadgetWidget::onEditWayPointAct_triggered()
if (!m_widget || !m_map)
return;
if (!m_mouse_waypoint) return;
if (m_map_mode != Normal_MapMode)
return;
if (!m_mouse_waypoint)
return;
waypoint_edit_dialog.editWaypoint(m_mouse_waypoint);
@ -1350,14 +1649,21 @@ void OPMapGadgetWidget::onEditWayPointAct_triggered()
void OPMapGadgetWidget::onLockWayPointAct_triggered()
{
if (!m_widget || !m_map)
if (!m_widget || !m_map || !m_mouse_waypoint)
return;
if (!m_mouse_waypoint) return;
if (m_map_mode != Normal_MapMode)
return;
bool locked = (m_mouse_waypoint->flags() & QGraphicsItem::ItemIsMovable) == 0;
m_mouse_waypoint->setFlag(QGraphicsItem::ItemIsMovable, locked);
if (!locked)
m_mouse_waypoint->picture.load(QString::fromUtf8(":/opmap/images/waypoint_marker2.png"));
else
m_mouse_waypoint->picture.load(QString::fromUtf8(":/opmap/images/waypoint_marker1.png"));
m_mouse_waypoint->update();
m_mouse_waypoint = NULL;
}
@ -1366,30 +1672,51 @@ void OPMapGadgetWidget::onDeleteWayPointAct_triggered()
if (!m_widget || !m_map)
return;
if (!m_mouse_waypoint) return;
if (m_map_mode != Normal_MapMode)
return;
if (!m_mouse_waypoint)
return;
bool locked = (m_mouse_waypoint->flags() & QGraphicsItem::ItemIsMovable) == 0;
if (locked) return; // waypoint is locked
m_waypoint_list_mutex.lock();
QMutexLocker locker(&m_waypoint_list_mutex);
for (int i = 0; i < m_waypoint_list.count(); i++)
{
t_waypoint waypoint = m_waypoint_list.at(i);
if (waypoint.item != m_mouse_waypoint) continue;
for (int i = 0; i < m_waypoint_list.count(); i++)
{
t_waypoint *wp = m_waypoint_list.at(i);
if (!wp) continue;
if (!wp->map_wp_item || wp->map_wp_item != m_mouse_waypoint) continue;
// delete the waypoint from the map
m_map->WPDelete(wp->map_wp_item);
// delete the waypoint from our local waypoint list
m_waypoint_list.removeAt(i);
delete wp;
break;
}
/*
foreach (t_waypoint *wp, m_waypoint_list)
{
if (!wp) continue;
if (!wp->map_wp_item || wp->map_wp_item != m_mouse_waypoint) continue;
// delete the waypoint from the map
m_map->WPDelete(waypoint.item);
m_map->WPDelete(wp->map_wp_item);
// delete the waypoint from our local waypoint list
m_waypoint_list.removeAt(i);
m_waypoint_list.removeOne(wp);
delete wp;
break;
}
m_waypoint_list_mutex.unlock();
*/
m_mouse_waypoint = NULL;
}
@ -1398,10 +1725,23 @@ void OPMapGadgetWidget::onClearWayPointsAct_triggered()
if (!m_widget || !m_map)
return;
m_waypoint_list_mutex.lock();
if (m_map_mode != Normal_MapMode)
return;
QMutexLocker locker(&m_waypoint_list_mutex);
m_map->WPDeleteAll();
m_waypoint_list.clear();
m_waypoint_list_mutex.unlock();
foreach (t_waypoint *wp, m_waypoint_list)
{
if (wp)
{
delete wp;
wp = NULL;
}
}
m_waypoint_list.clear();
}
// *************************************************************************************

View File

@ -28,12 +28,15 @@
#ifndef OPMAP_GADGETWIDGET_H_
#define OPMAP_GADGETWIDGET_H_
// ******************************************************
#include <QtGui/QWidget>
#include <QtGui/QMenu>
#include <QStringList>
#include <QStandardItemModel>
#include <QList>
#include <QMutex>
#include <QMutexLocker>
#include <QPointF>
#include "opmapcontrol/opmapcontrol.h"
@ -51,6 +54,8 @@
#include "utils/coordinateconversions.h"
// ******************************************************
namespace Ui
{
class OPMap_Widget;
@ -63,13 +68,22 @@ using namespace mapcontrol;
// local waypoint list item structure
typedef struct t_waypoint
{
mapcontrol::WayPointItem *item;
mapcontrol::WayPointItem *map_wp_item;
internals::PointLatLng coord;
double altitude;
QString description;
bool locked;
int time_seconds;
int hold_time_seconds;
} t_waypoint;
// ******************************************************
enum opMapModeType { Normal_MapMode = 0,
MagicWaypoint_MapMode = 1};
// ******************************************************
class OPMapGadgetWidget : public QWidget
{
Q_OBJECT
@ -92,6 +106,7 @@ public:
void setAccessMode(QString accessMode);
void setUseMemoryCache(bool useMemoryCache);
void setCacheLocation(QString cacheLocation);
void setMapMode(opMapModeType mode);
public slots:
@ -122,7 +137,6 @@ private slots:
void on_toolButtonMapUAV_clicked();
void on_toolButtonMapUAVheading_clicked();
void on_toolButtonShowUAVtrail_clicked();
void on_toolButtonClearUAVtrail_clicked();
void on_horizontalSliderZoom_sliderMoved(int position);
void on_toolButtonAddWaypoint_clicked();
void on_treeViewWaypoints_clicked(QModelIndex index);
@ -131,6 +145,8 @@ private slots:
void on_toolButtonPrevWaypoint_clicked();
void on_toolButtonHoldPosition_clicked();
void on_toolButtonGo_clicked();
void on_toolButtonMapModeLeft_clicked();
void on_toolButtonMapModeRight_clicked();
/**
* @brief signals received from the map object
@ -179,6 +195,7 @@ private slots:
void onLockWayPointAct_triggered();
void onDeleteWayPointAct_triggered();
void onClearWayPointsAct_triggered();
void onMapModeActGroup_triggered(QAction *action);
void onZoomActGroup_triggered(QAction *action);
private:
@ -191,6 +208,8 @@ private:
int prev_tile_number;
opMapModeType m_map_mode;
QStringList findPlaceWordList;
QCompleter *findPlaceCompleter;
@ -219,9 +238,13 @@ private:
mapcontrol::WayPointItem *m_mouse_waypoint;
QList<t_waypoint> m_waypoint_list;
QList<t_waypoint *> m_waypoint_list;
QMutex m_waypoint_list_mutex;
t_waypoint magic_waypoint;
QMutex m_map_mutex;
void createActions();
QAction *closeAct;
@ -249,6 +272,9 @@ private:
QAction *deleteWayPointAct;
QAction *clearWayPointsAct;
QActionGroup *mapModeActGroup;
QList<QAction *> mapModeAct;
QActionGroup *zoomActGroup;
QList<QAction *> zoomAct;