Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Q
qgroundcontrol
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Valentin Platzgummer
qgroundcontrol
Commits
611b3330
Commit
611b3330
authored
Jun 19, 2018
by
Gus Grubba
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Turn "Sync" menu into a proper "File" menu
parent
e4dc651d
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
102 additions
and
43 deletions
+102
-43
PlanMasterController.cc
src/MissionManager/PlanMasterController.cc
+36
-5
PlanMasterController.h
src/MissionManager/PlanMasterController.h
+5
-0
PlanView.qml
src/PlanView/PlanView.qml
+55
-34
ToolStrip.qml
src/QmlControls/ToolStrip.qml
+6
-4
No files found.
src/MissionManager/PlanMasterController.cc
View file @
611b3330
...
...
@@ -280,6 +280,7 @@ void PlanMasterController::loadFromFile(const QString& filename)
return
;
}
QFileInfo
fileInfo
(
filename
);
QFile
file
(
filename
);
if
(
!
file
.
open
(
QIODevice
::
ReadOnly
|
QIODevice
::
Text
))
{
...
...
@@ -288,8 +289,8 @@ void PlanMasterController::loadFromFile(const QString& filename)
return
;
}
QString
fileExtension
(
".%1"
)
;
if
(
filename
.
endsWith
(
fileExtension
.
arg
(
AppSettings
::
planFileExtension
))
)
{
bool
success
=
false
;
if
(
fileInfo
.
suffix
()
==
AppSettings
::
planFileExtension
)
{
QJsonDocument
jsonDoc
;
QByteArray
bytes
=
file
.
readAll
();
...
...
@@ -319,17 +320,31 @@ void PlanMasterController::loadFromFile(const QString& filename)
!
_geoFenceController
.
load
(
json
[
_jsonGeoFenceObjectKey
].
toObject
(),
errorString
)
||
!
_rallyPointController
.
load
(
json
[
_jsonRallyPointsObjectKey
].
toObject
(),
errorString
))
{
qgcApp
()
->
showMessage
(
errorMessage
.
arg
(
errorString
));
}
else
{
success
=
true
;
}
}
else
if
(
file
name
.
endsWith
(
fileExtension
.
arg
(
AppSettings
::
missionFileExtension
))
)
{
}
else
if
(
file
Info
.
suffix
()
==
AppSettings
::
missionFileExtension
)
{
if
(
!
_missionController
.
loadJsonFile
(
file
,
errorString
))
{
qgcApp
()
->
showMessage
(
errorMessage
.
arg
(
errorString
));
}
else
{
success
=
true
;
}
}
else
if
(
filename
.
endsWith
(
fileExtension
.
arg
(
AppSettings
::
waypointsFileExtension
))
||
filename
.
endsWith
(
fileExtension
.
arg
(
QStringLiteral
(
"txt"
))))
{
}
else
if
(
fileInfo
.
suffix
()
==
AppSettings
::
waypointsFileExtension
||
fileInfo
.
suffix
()
==
QStringLiteral
(
"txt"
))
{
if
(
!
_missionController
.
loadTextFile
(
file
,
errorString
))
{
qgcApp
()
->
showMessage
(
errorMessage
.
arg
(
errorString
));
}
else
{
success
=
true
;
}
}
else
{
//-- TODO: What then?
}
if
(
success
){
_currentPlanFile
.
sprintf
(
"%s/%s.%s"
,
fileInfo
.
path
().
toLocal8Bit
().
data
(),
fileInfo
.
completeBaseName
().
toLocal8Bit
().
data
(),
AppSettings
::
planFileExtension
);
}
else
{
_currentPlanFile
.
clear
();
}
emit
currentPlanFileChanged
();
if
(
!
offline
())
{
setDirty
(
true
);
...
...
@@ -352,6 +367,14 @@ QJsonDocument PlanMasterController::saveToJson()
return
QJsonDocument
(
planJson
);
}
void
PlanMasterController
::
saveToCurrent
()
{
if
(
!
_currentPlanFile
.
isEmpty
())
{
saveToFile
(
_currentPlanFile
);
}
}
void
PlanMasterController
::
saveToFile
(
const
QString
&
filename
)
{
if
(
filename
.
isEmpty
())
{
...
...
@@ -367,9 +390,15 @@ void PlanMasterController::saveToFile(const QString& filename)
if
(
!
file
.
open
(
QIODevice
::
WriteOnly
|
QIODevice
::
Text
))
{
qgcApp
()
->
showMessage
(
tr
(
"Plan save error %1 : %2"
).
arg
(
filename
).
arg
(
file
.
errorString
()));
_currentPlanFile
.
clear
();
emit
currentPlanFileChanged
();
}
else
{
QJsonDocument
saveDoc
=
saveToJson
();
file
.
write
(
saveDoc
.
toJson
());
if
(
_currentPlanFile
!=
planFilename
)
{
_currentPlanFile
=
planFilename
;
emit
currentPlanFileChanged
();
}
}
// Only clear dirty bit if we are offline
...
...
@@ -411,6 +440,8 @@ void PlanMasterController::removeAll(void)
_missionController
.
setDirty
(
false
);
_geoFenceController
.
setDirty
(
false
);
_rallyPointController
.
setDirty
(
false
);
_currentPlanFile
.
clear
();
emit
currentPlanFileChanged
();
}
}
...
...
src/MissionManager/PlanMasterController.h
View file @
611b3330
...
...
@@ -40,6 +40,7 @@ public:
Q_PROPERTY
(
bool
dirty
READ
dirty
WRITE
setDirty
NOTIFY
dirtyChanged
)
///< true: Unsaved/sent changes are present, false: no changes since last save/send
Q_PROPERTY
(
QString
fileExtension
READ
fileExtension
CONSTANT
)
///< File extension for missions
Q_PROPERTY
(
QString
kmlFileExtension
READ
kmlFileExtension
CONSTANT
)
Q_PROPERTY
(
QString
currentPlanFile
READ
currentPlanFile
NOTIFY
currentPlanFileChanged
)
///< kml file extension for missions
Q_PROPERTY
(
QStringList
loadNameFilters
READ
loadNameFilters
CONSTANT
)
///< File filter list loading plan files
Q_PROPERTY
(
QStringList
saveNameFilters
READ
saveNameFilters
CONSTANT
)
///< File filter list saving plan files
...
...
@@ -63,6 +64,7 @@ public:
Q_INVOKABLE
void
loadFromVehicle
(
void
);
Q_INVOKABLE
void
sendToVehicle
(
void
);
Q_INVOKABLE
void
loadFromFile
(
const
QString
&
filename
);
Q_INVOKABLE
void
saveToCurrent
();
Q_INVOKABLE
void
saveToFile
(
const
QString
&
filename
);
Q_INVOKABLE
void
saveToKml
(
const
QString
&
filename
);
Q_INVOKABLE
void
removeAll
(
void
);
///< Removes all from controller only, synce required to remove from vehicle
...
...
@@ -79,6 +81,7 @@ public:
void
setDirty
(
bool
dirty
);
QString
fileExtension
(
void
)
const
;
QString
kmlFileExtension
(
void
)
const
;
QString
currentPlanFile
(
void
)
const
{
return
_currentPlanFile
;
}
QStringList
loadNameFilters
(
void
)
const
;
QStringList
saveNameFilters
(
void
)
const
;
QStringList
fileKmlFilters
(
void
)
const
;
...
...
@@ -93,6 +96,7 @@ signals:
void
syncInProgressChanged
(
void
);
void
dirtyChanged
(
bool
dirty
);
void
offlineChanged
(
bool
offlineEditing
);
void
currentPlanFileChanged
();
private
slots
:
void
_activeVehicleChanged
(
Vehicle
*
activeVehicle
);
...
...
@@ -118,6 +122,7 @@ private:
bool
_loadRallyPoints
;
bool
_sendGeoFence
;
bool
_sendRallyPoints
;
QString
_currentPlanFile
;
static
const
int
_planFileVersion
;
static
const
char
*
_planFileType
;
...
...
src/PlanView/PlanView.qml
View file @
611b3330
...
...
@@ -524,37 +524,37 @@ QGCView {
color
:
qgcPal
.
window
title
:
qsTr
(
"
Plan
"
)
z
:
QGroundControl
.
zOrderWidgets
showAlternateIcon
:
[
false
,
false
,
false
,
masterController
.
dirty
,
false
,
false
,
false
]
rotateImage
:
[
false
,
false
,
false
,
masterController
.
syncInProgress
,
false
,
false
,
false
]
animateImage
:
[
false
,
false
,
false
,
masterController
.
dirty
,
false
,
false
,
false
]
buttonEnabled
:
[
true
,
true
,
true
,
!
masterController
.
syncInProgress
,
true
,
true
,
true
]
buttonVisible
:
[
true
,
_waypointsOnlyMode
,
tru
e
,
true
,
true
,
_showZoom
,
_showZoom
]
showAlternateIcon
:
[
masterController
.
dirty
,
false
,
false
,
false
,
false
,
false
,
false
]
rotateImage
:
[
masterController
.
syncInProgress
,
false
,
false
,
false
,
false
,
false
,
false
]
animateImage
:
[
masterController
.
dirty
,
false
,
false
,
false
,
false
,
false
,
false
]
buttonEnabled
:
[
!
masterController
.
syncInProgress
,
true
,
true
,
true
,
true
,
true
,
true
]
buttonVisible
:
[
true
,
true
,
_waypointsOnlyMod
e
,
true
,
true
,
_showZoom
,
_showZoom
]
maxHeight
:
mapScale
.
y
-
toolStrip
.
y
property
bool
_showZoom
:
!
ScreenTools
.
isMobile
model
:
[
{
name
:
"
Waypoint
"
,
iconSource
:
"
/qmlimages/MapAddMission.svg
"
,
toggle
:
true
name
:
"
File
"
,
iconSource
:
"
/qmlimages/MapSync.svg
"
,
alternateIconSource
:
"
/qmlimages/MapSyncChanged.svg
"
,
dropPanelComponent
:
syncDropPanel
},
{
name
:
"
Waypoint
"
,
iconSource
:
"
/qmlimages/MapAddMission.svg
"
,
toggle
:
true
},
{
name
:
"
ROI
"
,
iconSource
:
"
/qmlimages/MapAddMission.svg
"
,
toggle
:
true
name
:
"
ROI
"
,
iconSource
:
"
/qmlimages/MapAddMission.svg
"
,
toggle
:
true
},
{
name
:
_singleComplexItem
?
_missionController
.
complexMissionItemNames
[
0
]
:
"
Pattern
"
,
iconSource
:
"
/qmlimages/MapDrawShape.svg
"
,
dropPanelComponent
:
_singleComplexItem
?
undefined
:
patternDropPanel
},
{
name
:
"
Sync
"
,
iconSource
:
"
/qmlimages/MapSync.svg
"
,
alternateIconSource
:
"
/qmlimages/MapSyncChanged.svg
"
,
dropPanelComponent
:
syncDropPanel
},
{
name
:
"
Center
"
,
iconSource
:
"
/qmlimages/MapCenter.svg
"
,
...
...
@@ -802,7 +802,7 @@ QGCView {
Component
{
id
:
removeAllPromptDialog
QGCViewMessage
{
message
:
qsTr
(
"
Are you sure you want to remove all items?
"
)
+
message
:
qsTr
(
"
Are you sure you want to remove all items
and create a new plan
?
"
)
+
(
_planMasterController
.
offline
?
""
:
qsTr
(
"
This will also remove all items from the vehicle.
"
))
function
accept
()
{
if
(
_planMasterController
.
offline
)
{
...
...
@@ -863,8 +863,11 @@ QGCView {
width
:
sendSaveGrid
.
width
wrapMode
:
Text
.
WordWrap
text
:
masterController
.
dirty
?
qsTr
(
"
You have unsaved changes. You should upload to your vehicle, or save to a file:
"
)
:
qsTr
(
"
Sync:
"
)
(
_activeVehicle
?
qsTr
(
"
You have unsaved changes. You should upload to your vehicle, or save to a file:
"
)
:
qsTr
(
"
You have unsaved changes.
"
)
)
:
qsTr
(
"
Plan File:
"
)
}
GridLayout
{
...
...
@@ -878,6 +881,7 @@ QGCView {
text
:
qsTr
(
"
Upload
"
)
Layout.fillWidth
:
true
enabled
:
!
masterController
.
offline
&&
!
masterController
.
syncInProgress
visible
:
_activeVehicle
onClicked
:
{
dropPanel
.
hide
()
masterController
.
upload
()
...
...
@@ -888,6 +892,7 @@ QGCView {
text
:
qsTr
(
"
Download
"
)
Layout.fillWidth
:
true
enabled
:
!
masterController
.
offline
&&
!
masterController
.
syncInProgress
visible
:
_activeVehicle
onClicked
:
{
dropPanel
.
hide
()
if
(
masterController
.
dirty
)
{
...
...
@@ -899,17 +904,17 @@ QGCView {
}
QGCButton
{
text
:
qsTr
(
"
Save Plan
...
"
)
text
:
qsTr
(
"
New
...
"
)
Layout.fillWidth
:
true
enabled
:
!
masterController
.
syncInProgress
onClicked
:
{
enabled
:
_visualItems
.
count
>
1
onClicked
:
{
dropPanel
.
hide
()
masterController
.
saveToSelectedFile
(
)
_qgcView
.
showDialog
(
removeAllPromptDialog
,
qsTr
(
"
New Plan
"
),
_qgcView
.
showDialogDefaultWidth
,
StandardButton
.
Yes
|
StandardButton
.
No
)
}
}
QGCButton
{
text
:
qsTr
(
"
Load Pla
n...
"
)
text
:
qsTr
(
"
Ope
n...
"
)
Layout.fillWidth
:
true
enabled
:
!
masterController
.
syncInProgress
onClicked
:
{
...
...
@@ -922,6 +927,30 @@ QGCView {
}
}
QGCButton
{
text
:
qsTr
(
"
Save
"
)
Layout.fillWidth
:
true
enabled
:
!
masterController
.
syncInProgress
onClicked
:
{
dropPanel
.
hide
()
if
(
masterController
.
currentPlanFile
!==
""
)
{
masterController
.
saveToCurrent
()
}
else
{
masterController
.
saveToSelectedFile
()
}
}
}
QGCButton
{
text
:
qsTr
(
"
Save As...
"
)
Layout.fillWidth
:
true
enabled
:
!
masterController
.
syncInProgress
onClicked
:
{
dropPanel
.
hide
()
masterController
.
saveToSelectedFile
()
}
}
QGCButton
{
text
:
qsTr
(
"
Load KML...
"
)
Layout.fillWidth
:
true
...
...
@@ -938,7 +967,7 @@ QGCView {
Layout.fillWidth
:
true
enabled
:
!
masterController
.
syncInProgress
onClicked
:
{
// First point do not count
// First point do
es
not count
if
(
_visualItems
.
count
<
2
)
{
_qgcView
.
showDialog
(
noItemForKML
,
qsTr
(
"
KML
"
),
_qgcView
.
showDialogDefaultWidth
,
StandardButton
.
Cancel
)
return
...
...
@@ -948,14 +977,6 @@ QGCView {
}
}
QGCButton
{
text
:
qsTr
(
"
Remove All
"
)
Layout.fillWidth
:
true
onClicked
:
{
dropPanel
.
hide
()
_qgcView
.
showDialog
(
removeAllPromptDialog
,
qsTr
(
"
Remove all
"
),
_qgcView
.
showDialogDefaultWidth
,
StandardButton
.
Yes
|
StandardButton
.
No
)
}
}
}
}
}
...
...
src/QmlControls/ToolStrip.qml
View file @
611b3330
...
...
@@ -16,7 +16,7 @@ import QGroundControl.Palette 1.0
Rectangle
{
id
:
_root
color
:
qgcPal
.
window
width
:
ScreenTools
.
isMobile
?
ScreenTools
.
minTouchPixels
:
ScreenTools
.
defaultFontPixelWidth
*
6
width
:
ScreenTools
.
isMobile
?
ScreenTools
.
minTouchPixels
:
ScreenTools
.
defaultFontPixelWidth
*
7
height
:
buttonStripColumn
.
height
+
(
buttonStripColumn
.
anchors
.
margins
*
2
)
radius
:
_radius
border.width
:
1
...
...
@@ -133,7 +133,7 @@ Rectangle {
id
:
scope
anchors.left
:
parent
.
left
anchors.right
:
parent
.
right
height
:
width
height
:
width
*
0.8
Rectangle
{
anchors.fill
:
parent
...
...
@@ -141,9 +141,11 @@ Rectangle {
QGCColoredImage
{
id
:
button
anchors.fill
:
parent
height
:
parent
.
height
width
:
height
anchors.centerIn
:
parent
source
:
_source
sourceSize.height
:
parent
.
height
sourceSize.height
:
height
fillMode
:
Image
.
PreserveAspectFit
mipmap
:
true
smooth
:
true
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment