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
fc550843
Commit
fc550843
authored
Dec 20, 2020
by
Valentin Platzgummer
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
resizing issue: measurement item editor solved
parent
ab5abb37
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
546 additions
and
837 deletions
+546
-837
AreaDataEditor.qml
src/MeasurementComplexItem/qml/AreaDataEditor.qml
+166
-154
MeasurementAreaEditor.qml
src/MeasurementComplexItem/qml/MeasurementAreaEditor.qml
+49
-37
MeasurementItemEditor.qml
src/MeasurementComplexItem/qml/MeasurementItemEditor.qml
+25
-26
NemoEditor.qml
src/MeasurementComplexItem/qml/NemoEditor.qml
+121
-111
ParameterEditor.qml
src/MeasurementComplexItem/qml/ParameterEditor.qml
+164
-157
SafeAreaEditor.qml
src/MeasurementComplexItem/qml/SafeAreaEditor.qml
+21
-14
QmlObjectVectorModel.cc
src/QmlControls/QmlObjectVectorModel.cc
+0
-261
QmlObjectVectorModel.h
src/QmlControls/QmlObjectVectorModel.h
+0
-77
No files found.
src/MeasurementComplexItem/qml/AreaDataEditor.qml
View file @
fc550843
...
...
@@ -7,9 +7,15 @@ import QGroundControl.Controls 1.0
import
QGroundControl
.
FactControls
1.0
import
QGroundControl
.
ScreenTools
1.0
GridLayout
{
import
QGroundControl
.
Palette
1.0
Rectangle
{
id
:
_root
width
:
mainGrid
.
width
height
:
mainGrid
.
height
color
:
qgcPal
.
windowShadeDark
property
bool
checked
:
true
property
var
missionItem
:
undefined
property
int
availableWidth
:
300
...
...
@@ -21,10 +27,6 @@ GridLayout {
property
var
_areaData
:
missionItem
.
areaData
property
real
_margin
:
ScreenTools
.
defaultFontPixelWidth
/
2
columnSpacing
:
_margin
rowSpacing
:
_margin
columns
:
2
Component.onCompleted
:
{
console
.
assert
(
missionItem
!==
undefined
,
"
please set the missionItem property
"
)
...
...
@@ -41,186 +43,196 @@ GridLayout {
}
}
QGCLabel
{
text
:
_root
.
errorString
wrapMode
:
Text
.
WordWrap
horizontalAlignment
:
Text
.
AlignLeft
color
:
"
orange
"
Layout.columnSpan
:
parent
.
columns
Layout.fillWidth
:
true
visible
:
!
_root
.
areasCorrect
}
GridLayout
{
id
:
mainGrid
ExclusiveGroup
{
id
:
areaGroup
}
width
:
availableWidth
columnSpacing
:
_margin
rowSpacing
:
_margin
columns
:
2
Repeater
{
id
:
areaSelector
QGCLabel
{
text
:
_root
.
errorString
wrapMode
:
Text
.
WordWrap
horizontalAlignment
:
Text
.
AlignLeft
color
:
"
orange
"
Layout.columnSpan
:
parent
.
columns
Layout.fillWidth
:
true
visible
:
!
_root
.
areasCorrect
}
property
int
selectedIndex
:
-
1
ExclusiveGroup
{
id
:
areaGroup
}
model
:
_missionItem
.
areaData
.
areaList
delegate
:
QGCRadioButton
{
text
:
object
.
objectName
checkable
:
_root
.
checked
Layout.fillWidth
:
true
Layout.columnSpan
:
2
Repeater
{
id
:
areaSelector
onCheckedChanged
:
{
if
(
checked
)
{
areaSelector
.
selectedIndex
=
index
property
int
selectedIndex
:
-
1
model
:
_missionItem
.
areaData
.
areaList
delegate
:
QGCRadioButton
{
text
:
object
.
objectName
checkable
:
_root
.
checked
Layout.fillWidth
:
true
Layout.columnSpan
:
2
onCheckedChanged
:
{
if
(
checked
)
{
areaSelector
.
selectedIndex
=
index
}
}
}
Component
.
onCompleted
:
{
if
(
index
===
0
)
{
checked
=
true
Component
.
onCompleted
:
{
if
(
index
===
0
)
{
checked
=
true
}
object
.
interactive
=
Qt
.
binding
(
function
()
{
return
checked
&&
_root
.
checked
})
}
object
.
interactive
=
Qt
.
binding
(
function
()
{
return
checked
&&
_root
.
checked
})
}
}
}
// area Repeater
}
// area Repeater
ColumnLayout
{
id
:
editorParent
Layout.fillWidth
:
true
Layout.maximumWidth
:
parent
.
width
Layout.columnSpan
:
2
}
ColumnLayout
{
id
:
editorParent
Layout.fillWidth
:
true
Layout.maximumWidth
:
parent
.
width
Layout.columnSpan
:
2
}
Repeater
{
id
:
areaEditorRepeater
Layout.maximumWidth
:
parent
.
width
model
:
_missionItem
.
areaData
.
areaList
delegate
:
Item
{
id
:
editor
visible
:
index
==
areaSelector
.
selectedIndex
property
var
_visualItem
:
undefined
property
var
geoArea
:
object
Component.onCompleted
:
{
if
(
geoArea
.
editorQML
&&
!
_visualItem
)
{
var
component
=
Qt
.
createComponent
(
geoArea
.
editorQML
)
if
(
component
.
status
===
Component
.
Error
)
{
console
.
log
(
"
Error loading Qml:
"
,
geoArea
.
editorQML
,
component
.
errorString
())
}
else
{
_visualItem
=
component
.
createObject
(
editorParent
,
{
"
geoArea
"
:
editor
.
geoArea
,
"
visible
"
:
Qt
.
binding
(
function
()
{
return
editor
.
visible
}),
"
availableWidth
"
:
Qt
.
binding
(
function
()
{
return
editorParent
.
width
})
})
Repeater
{
id
:
areaEditorRepeater
Layout.maximumWidth
:
parent
.
width
model
:
_missionItem
.
areaData
.
areaList
delegate
:
Item
{
id
:
editor
visible
:
index
==
areaSelector
.
selectedIndex
property
var
_visualItem
:
undefined
property
var
geoArea
:
object
Component.onCompleted
:
{
if
(
geoArea
.
editorQML
&&
!
_visualItem
)
{
var
component
=
Qt
.
createComponent
(
geoArea
.
editorQML
)
if
(
component
.
status
===
Component
.
Error
)
{
console
.
log
(
"
Error loading Qml:
"
,
geoArea
.
editorQML
,
component
.
errorString
())
}
else
{
_visualItem
=
component
.
createObject
(
editorParent
,
{
"
geoArea
"
:
editor
.
geoArea
,
"
visible
"
:
Qt
.
binding
(
function
()
{
return
editor
.
visible
}),
"
availableWidth
"
:
Qt
.
binding
(
function
()
{
return
editorParent
.
width
})
})
}
}
}
}
Component
.
onDestruction
:
{
if
(
_visualItem
)
{
_visualItem
.
destroy
()
Component
.
onDestruction
:
{
if
(
_visualItem
)
{
_visualItem
.
destroy
()
}
}
}
}
// editor
}
// areaEditorRepeater
SectionHeader
{
id
:
commandsHeader
Layout.fillWidth
:
true
Layout.columnSpan
:
parent
.
columns
text
:
qsTr
(
"
Commands
"
)
}
GridLayout
{
columnSpacing
:
_margin
rowSpacing
:
_margin
columns
:
2
Layout.columnSpan
:
2
Layout.fillWidth
:
true
visible
:
commandsHeader
.
checked
}
// editor
}
// areaEditorRepeater
QGCButton
{
text
:
"
Intersection
"
enabled
:
_root
.
checked
SectionHeader
{
id
:
commandsHeader
Layout.fillWidth
:
true
Layout.columnSpan
:
parent
.
columns
onClicked
:
{
_areaData
.
intersection
()
}
text
:
qsTr
(
"
Commands
"
)
}
QGCButton
{
text
:
"
Reset
"
onClicked
:
{
_root
.
reset
()
}
GridLayout
{
columnSpacing
:
_margin
rowSpacing
:
_margin
columns
:
2
Layout.columnSpan
:
2
Layout.fillWidth
:
true
}
visible
:
commandsHeader
.
checked
QGCButton
{
text
:
"
Intersection
"
enabled
:
_root
.
checked
Layout.fillWidth
:
true
Layout.columnSpan
:
parent
.
columns
onClicked
:
{
_areaData
.
intersection
()
}
}
QGCButton
{
text
:
"
Reset
"
onClicked
:
{
_root
.
reset
()
}
Layout.fillWidth
:
true
}
QGCButton
{
text
:
"
Abort
"
onClicked
:
{
_root
.
abort
()
QGCButton
{
text
:
"
Abort
"
onClicked
:
{
_root
.
abort
()
}
Layout.fillWidth
:
true
}
Layout.fillWidth
:
true
}
}
SectionHeader
{
id
:
hintHeader
Layout.fillWidth
:
true
Layout.columnSpan
:
parent
.
columns
text
:
qsTr
(
"
Hints
"
)
}
SectionHeader
{
id
:
hintHeader
Layout.fillWidth
:
true
Layout.columnSpan
:
parent
.
columns
text
:
qsTr
(
"
Hints
"
)
}
GridLayout
{
columnSpacing
:
_margin
rowSpacing
:
_margin
columns
:
2
Layout.columnSpan
:
2
Layout.fillWidth
:
true
visible
:
hintHeader
.
checked
GridLayout
{
columnSpacing
:
_margin
rowSpacing
:
_margin
columns
:
2
Layout.columnSpan
:
2
Layout.fillWidth
:
true
visible
:
hintHeader
.
checked
QGCLabel
{
id
:
hintLabel
wrapMode
:
Text
.
WordWrap
horizontalAlignment
:
Text
.
AlignLeft
text
:
qsTr
(
"
Use the Intersection button to clip the Measurement Area(s).
QGCLabel
{
id
:
hintLabel
wrapMode
:
Text
.
WordWrap
horizontalAlignment
:
Text
.
AlignLeft
text
:
qsTr
(
"
Use the Intersection button to clip the Measurement Area(s).
Use the Reset button to restore the areas to the state before entering this tab.
Use the Abort button to reset the areas and leave the tab.
"
)
Layout.fillWidth
:
true
Layout.columnSpan
:
parent
.
columns
Layout.fillWidth
:
true
Layout.columnSpan
:
parent
.
columns
}
}
}
Timer
{
id
:
areasCorrectTimer
running
:
false
interval
:
100
repeat
:
true
onTriggered
:
{
_root
.
areasCorrect
=
_missionItem
.
areaData
.
isCorrect
(
false
/*show gui message*/
)
if
(
!
_root
.
areasCorrect
)
{
_root
.
errorString
=
_missionItem
.
areaData
.
errorString
}
else
{
_root
.
errorString
=
""
Timer
{
id
:
areasCorrectTimer
running
:
false
interval
:
100
repeat
:
true
onTriggered
:
{
_root
.
areasCorrect
=
_missionItem
.
areaData
.
isCorrect
(
false
/*show gui message*/
)
if
(
!
_root
.
areasCorrect
)
{
_root
.
errorString
=
_missionItem
.
areaData
.
errorString
}
else
{
_root
.
errorString
=
""
}
}
}
}
Settings
{
property
alias
showHint
:
hintHeader
.
checked
}
}
Settings
{
property
alias
showHint
:
hintHeader
.
checked
}
}
// GridLayout
}
// Rectangle
src/MeasurementComplexItem/qml/MeasurementAreaEditor.qml
View file @
fc550843
import
QtQuick
2.3
import
QtQuick
2.3
import
QtQuick
.
Controls
1.2
import
QtQuick
.
Layouts
1.2
import
QtQuick
.
Layouts
1.2
import
QGroundControl
1.0
import
QGroundControl
.
ScreenTools
1.0
import
QGroundControl
.
Vehicle
1.0
import
QGroundControl
.
Controls
1.0
import
QGroundControl
.
FactControls
1.0
import
QGroundControl
.
Palette
1.0
import
QGroundControl
.
FlightMap
1.0
import
QGroundControl
1.0
import
QGroundControl
.
ScreenTools
1.0
import
QGroundControl
.
Vehicle
1.0
import
QGroundControl
.
Controls
1.0
import
QGroundControl
.
FactControls
1.0
import
QGroundControl
.
Palette
1.0
import
QGroundControl
.
FlightMap
1.0
GridLayout
{
id
:
editorColumn
id
:
editorColumn
columns
:
2
columnSpacing
:
_margin
rowSpacing
:
_margin
width
:
availableWidth
width
:
availableWidth
property
var
geoArea
:
undefined
property
int
availableWidth
...
...
@@ -23,17 +23,18 @@ GridLayout {
property
real
_margin
:
ScreenTools
.
defaultFontPixelWidth
/
2
Component.onCompleted
:
{
console
.
assert
(
geoArea
!==
undefined
,
"
please set the areaItem property
"
)
console
.
assert
(
geoArea
!==
undefined
,
"
please set the areaItem property
"
)
}
SectionHeader
{
id
:
tilesHeader
text
:
qsTr
(
"
Tiles
"
)
id
:
tilesHeader
text
:
qsTr
(
"
Tiles
"
)
Layout.columnSpan
:
2
Layout.fillWidth
:
true
}
GridLayout
{
GridLayout
{
visible
:
tilesHeader
.
checked
Layout.fillWidth
:
true
Layout.columnSpan
:
2
...
...
@@ -43,12 +44,12 @@ GridLayout {
QGCLabel
{
text
:
qsTr
(
"
Height
"
)
Layout.fillWidth
:
true
Layout.fillWidth
:
true
}
FactTextField
{
fact
:
geoArea
.
tileHeight
Layout.fillWidth
:
true
fact
:
geoArea
.
tileHeight
Layout.fillWidth
:
true
}
QGCLabel
{
...
...
@@ -57,36 +58,34 @@ GridLayout {
}
FactTextField
{
fact
:
geoArea
.
tileWidth
Layout.fillWidth
:
true
fact
:
geoArea
.
tileWidth
Layout.fillWidth
:
true
}
QGCLabel
{
text
:
qsTr
(
"
Min. Area
"
)
Layout.fillWidth
:
true
Layout.fillWidth
:
true
}
FactTextField
{
fact
:
geoArea
.
minTileArea
Layout.fillWidth
:
true
fact
:
geoArea
.
minTileArea
Layout.fillWidth
:
true
}
FactCheckBox
{
text
:
qsTr
(
"
Show Tiles
"
)
fact
:
geoArea
.
showTiles
text
:
qsTr
(
"
Show Tiles
"
)
fact
:
geoArea
.
showTiles
}
}
SectionHeader
{
id
:
statsHeader
text
:
qsTr
(
"
Statistics
"
)
id
:
statsHeader
text
:
qsTr
(
"
Statistics
"
)
Layout.fillWidth
:
true
Layout.columnSpan
:
2
}
GridLayout
{
GridLayout
{
visible
:
statsHeader
.
checked
Layout.fillWidth
:
true
Layout.columnSpan
:
2
...
...
@@ -94,14 +93,27 @@ GridLayout {
rowSpacing
:
_margin
columns
:
2
QGCLabel
{
text
:
qsTr
(
"
Area
"
)
}
// QGCLabel { text: QGroundControl.squareMetersToAppSettingsAreaUnits(geoArea.area).toFixed(2) + " " + QGroundControl.appSettingsAreaUnitsString }
QGCLabel
{
text
:
qsTr
(
"
Area
"
)
}
QGCLabel
{
text
:
QGroundControl
.
unitsConversion
.
squareMetersToAppSettingsAreaUnits
(
geoArea
.
area
).
toFixed
(
2
)
+
"
"
+
QGroundControl
.
unitsConversion
.
appSettingsAreaUnitsString
}
QGCLabel
{
text
:
qsTr
(
"
Tiles
"
)
}
QGCLabel
{
text
:
geoArea
.
tiles
.
count
}
QGCLabel
{
text
:
qsTr
(
"
Tiles
"
)
}
QGCLabel
{
text
:
geoArea
.
tiles
.
count
}
QGCLabel
{
text
:
qsTr
(
"
Max. Tiles
"
)
}
QGCLabel
{
text
:
geoArea
.
maxTiles
}
QGCLabel
{
text
:
qsTr
(
"
Max. Tiles
"
)
}
QGCLabel
{
text
:
geoArea
.
maxTiles
}
}
}
// Column
src/MeasurementComplexItem/qml/MeasurementItemEditor.qml
View file @
fc550843
...
...
@@ -53,7 +53,7 @@ Rectangle {
readonly
property
int
areaEditorIndex
:
0
readonly
property
int
parameterEditorIndex
:
1
readonly
property
int
nemo
Controls
Index
:
2
readonly
property
int
nemo
Editor
Index
:
2
property
bool
editing
:
_missionItem
.
editing
property
bool
correct
:
false
...
...
@@ -102,36 +102,35 @@ Rectangle {
}
}
StackLayout
{
width
:
parent
.
width
currentIndex
:
tabBar
.
currentIndex
MCI.AreaDataEditor
{
id
:
areaEditor
checked
:
visible
missionItem
:
_root
.
_missionItem
availableWidth
:
parent
.
width
onAbort
:
{
missionItem
.
abortEditing
()
tabBar
.
currentIndex
=
tabBar
.
parameterEditorIndex
}
MCI.AreaDataEditor
{
id
:
areaEditor
visible
:
tabBar
.
currentIndex
===
tabBar
.
areaEditorIndex
checked
:
visible
missionItem
:
_root
.
_missionItem
availableWidth
:
mainColumn
.
width
onAbort
:
{
missionItem
.
abortEditing
()
tabBar
.
currentIndex
=
tabBar
.
parameterEditorIndex
}
}
MCI.ParameterEditor
{
id
:
parameterEditor
MCI.ParameterEditor
{
id
:
parameterEditor
checked
:
visible
missionItem
:
_root
.
_missionItem
availableWidth
:
mainColumn
.
width
}
visible
:
tabBar
.
currentIndex
===
tabBar
.
parameterEditorIndex
checked
:
visible
missionItem
:
_root
.
_missionItem
availableWidth
:
mainColumn
.
width
}
MCI.NemoEditor
{
id
:
nemoEditor
MCI.NemoEditor
{
id
:
nemoEditor
checked
:
visible
missionItem
:
_root
.
_missionItem
availableWidth
:
mainColumn
.
width
}
visible
:
tabBar
.
currentIndex
===
tabBar
.
nemoEditorIndex
checked
:
visible
missionItem
:
_root
.
_missionItem
availableWidth
:
mainColumn
.
width
}
}
// main Column
}
// Rectangle
src/MeasurementComplexItem/qml/NemoEditor.qml
View file @
fc550843
import
QtQuick
2.0
import
Qt
.
labs
.
settings
1.0
import
QtQuick
.
Layouts
1.11
import
QtQuick
.
Controls
1.4
import
QGroundControl
.
Controls
1.0
import
QGroundControl
.
FactControls
1.0
import
QGroundControl
.
ScreenTools
1.0
import
QGroundControl
.
Palette
1.0
import
MeasurementComplexItem
1.0
as
MCI
GridLayout
{
Rectangle
{
id
:
_root
width
:
mainGrid
.
width
height
:
mainGrid
.
height
color
:
qgcPal
.
windowShadeDark
property
bool
checked
:
true
property
var
missionItem
:
undefined
property
int
availableWidth
:
300
...
...
@@ -26,10 +31,6 @@ GridLayout {
property
var
_nemoInterface
:
MCI
.
NemoInterface
property
bool
_holding
columnSpacing
:
_margin
rowSpacing
:
_margin
columns
:
2
Component.onCompleted
:
{
console
.
assert
(
missionItem
!==
undefined
,
"
please set the missionItem property
"
)
...
...
@@ -37,145 +38,154 @@ GridLayout {
_stopHolding
()
}
QGCLabel
{
text
:
_root
.
errorString
wrapMode
:
Text
.
WordWrap
horizontalAlignment
:
Text
.
AlignLeft
color
:
"
orange
"
Layout.columnSpan
:
parent
.
columns
Layout.fillWidth
:
true
visible
:
!
_root
.
areasCorrect
}
QGCButton
{
text
:
running
?
qsTr
(
"
Stop
"
)
:
qsTr
(
"
Start
"
)
Layout.columnSpan
:
parent
.
columns
Layout.fillWidth
:
true
onPressed
:
{
if
(
running
)
{
_nemoInterface
.
stop
()
}
else
{
_nemoInterface
.
start
()
}
}
}
QGCLabel
{
text
:
qsTr
(
"
Status:
"
)
+
_nemoInterface
.
statusString
wrapMode
:
Text
.
WordWrap
horizontalAlignment
:
Text
.
AlignVCenter
Layout.columnSpan
:
parent
.
columns
Layout.fillWidth
:
true
}
SectionHeader
{
id
:
progressHeader
Layout.fillWidth
:
true
Layout.columnSpan
:
parent
.
columns
text
:
qsTr
(
"
Progress
"
)
}
GridLayout
{
id
:
mainGrid
width
:
availableWidth
columnSpacing
:
_margin
rowSpacing
:
_margin
columns
:
2
Layout.columnSpan
:
parent
.
columns
Layout.fillWidth
:
true
visible
:
progressHeader
.
checked
QGCButton
{
text
:
!
_holding
?
qsTr
(
"
Hold
"
)
:
qsTr
(
"
Stop Holding
"
)
QGCLabel
{
text
:
_root
.
errorString
wrapMode
:
Text
.
WordWrap
horizontalAlignment
:
Text
.
AlignLeft
color
:
"
orange
"
Layout.columnSpan
:
parent
.
columns
Layout.fillWidth
:
true
visible
:
!
_root
.
areasCorrect
}
QGCButton
{
text
:
running
?
qsTr
(
"
Stop
"
)
:
qsTr
(
"
Start
"
)
Layout.columnSpan
:
parent
.
columns
Layout.fillWidth
:
true
onPressed
:
{
if
(
_holding
)
{
_stopHolding
()
_holding
=
false
if
(
running
)
{
_nemoInterface
.
stop
()
}
else
{
_holdProgress
()
_holding
=
true
_nemoInterface
.
start
()
}
}
}
QGCButton
{
text
:
qsTr
(
"
Random
"
)
QGCLabel
{
text
:
qsTr
(
"
Status:
"
)
+
_nemoInterface
.
statusString
wrapMode
:
Text
.
WordWrap
horizontalAlignment
:
Text
.
AlignVCenter
Layout.columnSpan
:
parent
.
columns
Layout.fillWidth
:
true
onPressed
:
{
_randomProgress
()
}
}
QGCButton
{
text
:
qsTr
(
"
Reset
"
)
SectionHeader
{
id
:
progressHeader
Layout.fillWidth
:
true
Layout.columnSpan
:
parent
.
columns
text
:
qsTr
(
"
Progress
"
)
}
GridLayout
{
columnSpacing
:
_margin
rowSpacing
:
_margin
columns
:
2
Layout.columnSpan
:
parent
.
columns
Layout.fillWidth
:
true
onPressed
:
{
_resetProgress
()
visible
:
progressHeader
.
checked
QGCButton
{
text
:
!
_holding
?
qsTr
(
"
Hold
"
)
:
qsTr
(
"
Stop Holding
"
)
Layout.fillWidth
:
true
Layout.columnSpan
:
parent
.
columns
onPressed
:
{
if
(
_holding
)
{
_stopHolding
()
_holding
=
false
}
else
{
_holdProgress
()
_holding
=
true
}
}
}
QGCButton
{
text
:
qsTr
(
"
Random
"
)
Layout.columnSpan
:
parent
.
columns
Layout.fillWidth
:
true
onPressed
:
{
_randomProgress
()
}
}
QGCButton
{
text
:
qsTr
(
"
Reset
"
)
Layout.columnSpan
:
parent
.
columns
Layout.fillWidth
:
true
onPressed
:
{
_resetProgress
()
}
}
}
}
// bussy indicator
ColumnLayout
{
Layout.fillWidth
:
true
spacing
:
_margin
Layout.maximumWidth
:
parent
.
width
// bussy indicator
ColumnLayout
{
Layout.fillWidth
:
true
spacing
:
_margin
Layout.maximumWidth
:
parent
.
width
BusyIndicator
{
id
:
indicator
BusyIndicator
{
id
:
indicator
property
bool
calculating
:
missionItem
.
calculating
property
bool
calculating
:
missionItem
.
calculating
running
:
calculating
visible
:
calculating
||
timer
.
running
running
:
calculating
visible
:
calculating
||
timer
.
running
onCalculatingChanged
:
{
if
(
!
calculating
)
{
// defer hiding
timer
.
restart
()
onCalculatingChanged
:
{
if
(
!
calculating
)
{
// defer hiding
timer
.
restart
()
}
}
}
Timer
{
id
:
timer
interval
:
1000
repeat
:
false
running
:
false
Timer
{
id
:
timer
interval
:
1000
repeat
:
false
running
:
false
}
}
}
}
// indicator column
}
// indicator column
SectionHeader
{
id
:
hintHeader
Layout.fillWidth
:
true
Layout.columnSpan
:
parent
.
columns
text
:
qsTr
(
"
Hints
"
)
}
SectionHeader
{
id
:
hintHeader
Layout.fillWidth
:
true
Layout.columnSpan
:
parent
.
columns
text
:
qsTr
(
"
Hints
"
)
}
GridLayout
{
columnSpacing
:
_margin
rowSpacing
:
_margin
columns
:
2
Layout.columnSpan
:
2
Layout.fillWidth
:
true
visible
:
hintHeader
.
checked
GridLayout
{
columnSpacing
:
_margin
rowSpacing
:
_margin
columns
:
2
Layout.columnSpan
:
2
Layout.fillWidth
:
true
visible
:
hintHeader
.
checked
QGCLabel
{
id
:
hintLabel
wrapMode
:
Text
.
WordWrap
horizontalAlignment
:
Text
.
AlignLeft
text
:
qsTr
(
"
Use this tab to connect to a device implementing the Nemo Interface.
QGCLabel
{
id
:
hintLabel
wrapMode
:
Text
.
WordWrap
horizontalAlignment
:
Text
.
AlignLeft
text
:
qsTr
(
"
Use this tab to connect to a device implementing the Nemo Interface.
Use the Random button to simulate measurement progress.
"
)
Layout.fillWidth
:
true
Layout.columnSpan
:
parent
.
columns
Layout.fillWidth
:
true
Layout.columnSpan
:
parent
.
columns
}
}
}
Settings
{
property
alias
showHint
:
hintHeader
.
checked
}
Settings
{
property
alias
showHint
:
hintHeader
.
checked
}
}
// GridLayout
function
_holdProgress
()
{
var
areaArray
=
_areaData
.
measurementAreaList
...
...
@@ -224,4 +234,4 @@ Use the Random button to simulate measurement progress.")
}
}
}
}
}
// Rectangle
src/MeasurementComplexItem/qml/ParameterEditor.qml
View file @
fc550843
import
QtQuick
2.3
import
QtQuick
2.3
import
QtQuick
.
Controls
1.2
import
QtQuick
.
Controls
.
Styles
1.4
import
QtQuick
.
Dialogs
1.2
import
QtQuick
.
Extras
1.4
import
QtQuick
.
Layouts
1.2
import
QGroundControl
1.0
import
QGroundControl
.
ScreenTools
1.0
import
QGroundControl
.
Vehicle
1.0
import
QGroundControl
.
Controls
1.0
import
QGroundControl
.
FactSystem
1.0
import
QGroundControl
.
FactControls
1.0
import
QGroundControl
.
Palette
1.0
import
QGroundControl
.
FlightMap
1.0
GridLayout
{
id
:
_root
import
QtQuick
.
Dialogs
1.2
import
QtQuick
.
Extras
1.4
import
QtQuick
.
Layouts
1.2
import
QGroundControl
1.0
import
QGroundControl
.
ScreenTools
1.0
import
QGroundControl
.
Vehicle
1.0
import
QGroundControl
.
Controls
1.0
import
QGroundControl
.
FactSystem
1.0
import
QGroundControl
.
FactControls
1.0
import
QGroundControl
.
Palette
1.0
import
QGroundControl
.
FlightMap
1.0
Rectangle
{
id
:
_root
width
:
mainGrid
.
width
height
:
mainGrid
.
height
color
:
qgcPal
.
windowShadeDark
property
bool
checked
:
true
property
var
missionItem
:
undefined
property
int
availableWidth
:
300
property
real
_margin
:
ScreenTools
.
defaultFontPixelWidth
/
2
property
var
_generator
:
missionItem
.
generator
property
var
_generatorEditor
:
undefined
width
:
availableWidth
columnSpacing
:
_margin
rowSpacing
:
_margin
columns
:
2
property
real
_margin
:
ScreenTools
.
defaultFontPixelWidth
/
2
property
var
_generator
:
missionItem
.
generator
property
var
_generatorEditor
:
undefined
Component.onCompleted
:
{
console
.
assert
(
missionItem
!==
undefined
,
"
please set the missionItem property
"
)
console
.
assert
(
missionItem
!==
undefined
,
"
please set the missionItem property
"
)
_addGeneratorEditor
()
}
...
...
@@ -44,183 +44,190 @@ GridLayout {
_addGeneratorEditor
()
}
GridLayout
{
id
:
mainGrid
columnSpacing
:
_margin
rowSpacing
:
_margin
columns
:
2
width
:
availableWidth
SectionHeader
{
id
:
generalHeader
Layout.fillWidth
:
true
Layout.columnSpan
:
parent
.
columns
Layout.maximumWidth
:
parent
.
width
text
:
qsTr
(
"
General
"
)
}
GridLayout
{
id
:
generalGrid
Layout.fillWidth
:
true
Layout.columnSpan
:
parent
.
columns
Layout.maximumWidth
:
parent
.
width
columnSpacing
:
_margin
rowSpacing
:
_margin
columns
:
2
visible
:
generalHeader
.
checked
QGCLabel
{
text
:
qsTr
(
"
Altitude
"
)
SectionHeader
{
id
:
generalHeader
Layout.fillWidth
:
true
}
FactTextField
{
fact
:
missionItem
.
altitude
Layout.fillWidth
:
true
}
QGCLabel
{
text
:
qsTr
(
"
Variant
"
)
Layout.columnSpan
:
parent
.
columns
visible
:
variantRepeater
.
len
>
0
Layout.maximumWidth
:
parent
.
width
text
:
qsTr
(
"
General
"
)
}
ExclusiveGroup
{
id
:
variantGroup
}
GridLayout
{
GridLayout
{
id
:
generalGrid
Layout.fillWidth
:
true
Layout.columnSpan
:
parent
.
columns
Layout.maximumWidth
:
parent
.
width
columns
:
3
columnSpacing
:
_margin
rowSpacing
:
_margin
columns
:
2
visible
:
generalHeader
.
checked
QGCLabel
{
text
:
qsTr
(
"
Altitude
"
)
Layout.fillWidth
:
true
}
FactTextField
{
fact
:
missionItem
.
altitude
Layout.fillWidth
:
true
}
QGCLabel
{
text
:
qsTr
(
"
Variant
"
)
Layout.columnSpan
:
parent
.
columns
visible
:
variantRepeater
.
len
>
0
}
ExclusiveGroup
{
id
:
variantGroup
}
columnSpacing
:
_margin
rowSpacing
:
_margin
GridLayout
{
Layout.columnSpan
:
parent
.
columns
Layout.maximumWidth
:
parent
.
width
columns
:
3
Repeater
{
id
:
variantRepeater
columnSpacing
:
_margin
rowSpacing
:
_margin
property
var
names
:
missionItem
.
variantNames
property
int
len
:
missionItem
.
variantNames
.
length
Repeater
{
id
:
variantRepeater
model
:
len
delegate
:
QGCRadioButton
{
checked
:
index
===
variantIndex
text
:
variantRepeater
.
names
[
index
]
?
variantRepeater
.
names
[
index
]:
""
Layout.fillWidth
:
true
property
var
names
:
missionItem
.
variantNames
property
int
len
:
missionItem
.
variantNames
.
length
property
int
variantIndex
:
missionItem
.
variantIndex
.
value
model
:
len
delegate
:
QGCRadioButton
{
checked
:
index
===
variantIndex
text
:
variantRepeater
.
names
[
index
]
?
variantRepeater
.
names
[
index
]
:
""
Layout.fillWidth
:
true
onVariantIndexChanged
:
{
if
(
variantIndex
===
index
){
checked
=
true
property
int
variantIndex
:
missionItem
.
variantIndex
.
value
onVariantIndexChanged
:
{
if
(
variantIndex
===
index
)
{
checked
=
true
}
}
}
onCheckedChanged
:
{
if
(
checked
&&
variantIndex
!==
index
){
missionItem
.
variantIndex
.
value
=
index
onCheckedChanged
:
{
if
(
checked
&&
variantIndex
!==
index
)
{
missionItem
.
variantIndex
.
value
=
index
}
}
}
}
}
// variant repeater
}
// variant grid
}
// general grid
// Generator Editor
SectionHeader
{
id
:
generatorHeader
Layout.fillWidth
:
true
Layout.columnSpan
:
parent
.
columns
text
:
qsTr
(
"
Generator
"
)
}
}
// variant repeater
}
// variant grid
}
// general grid
GridLayout
{
Layout.fillWidth
:
true
columnSpacing
:
_margin
Layout.maximumWidth
:
parent
.
width
Layout.columnSpan
:
parent
.
columns
rowSpacing
:
_margin
columns
:
2
visible
:
generatorHeader
.
checked
QGCComboBox
{
property
var
names
:
missionItem
.
generatorNameList
property
int
length
:
names
.
length
enabled
:
_root
.
checked
anchors.margins
:
ScreenTools
.
defaultFontPixelWidth
currentIndex
:
missionItem
.
generatorIndex
Layout.columnSpan
:
2
model
:
missionItem
.
generatorNameList
onActivated
:
{
if
(
index
!=
-
1
){
missionItem
.
switchToGenerator
(
index
)
// Generator Editor
SectionHeader
{
id
:
generatorHeader
Layout.fillWidth
:
true
Layout.columnSpan
:
parent
.
columns
text
:
qsTr
(
"
Generator
"
)
}
GridLayout
{
Layout.fillWidth
:
true
columnSpacing
:
_margin
Layout.maximumWidth
:
parent
.
width
Layout.columnSpan
:
parent
.
columns
rowSpacing
:
_margin
columns
:
2
visible
:
generatorHeader
.
checked
QGCComboBox
{
property
var
names
:
missionItem
.
generatorNameList
property
int
length
:
names
.
length
enabled
:
_root
.
checked
anchors.margins
:
ScreenTools
.
defaultFontPixelWidth
currentIndex
:
missionItem
.
generatorIndex
Layout.columnSpan
:
2
model
:
missionItem
.
generatorNameList
onActivated
:
{
if
(
index
!=
-
1
)
{
missionItem
.
switchToGenerator
(
index
)
}
}
}
}
}
ColumnLayout
{
id
:
generatorEditorParent
Layout.fillWidth
:
true
Layout.columnSpan
:
parent
.
columns
Layout.maximumWidth
:
parent
.
width
visible
:
generatorHeader
.
checked
}
ColumnLayout
{
id
:
generatorEditorParent
Layout.fillWidth
:
true
Layout.columnSpan
:
parent
.
columns
Layout.maximumWidth
:
parent
.
width
visible
:
generatorHeader
.
checked
}
QGCButton
{
text
:
qsTr
(
"
Reverse
"
)
onClicked
:
missionItem
.
reverseRoute
()
Layout.columnSpan
:
2
Layout.fillWidth
:
true
}
QGCButton
{
text
:
qsTr
(
"
Reverse
"
)
onClicked
:
missionItem
.
reverseRoute
()
Layout.columnSpan
:
2
Layout.fillWidth
:
true
}
// bussy indicator
ColumnLayout
{
Layout.fillWidth
:
true
spacing
:
_margin
Layout.maximumWidth
:
parent
.
width
// bussy indicator
ColumnLayout
{
Layout.fillWidth
:
true
spacing
:
_margin
Layout.maximumWidth
:
parent
.
width
BusyIndicator
{
id
:
indicator
BusyIndicator
{
id
:
indicator
property
bool
calculating
:
missionItem
.
calculating
property
bool
calculating
:
missionItem
.
calculating
running
:
calculating
visible
:
calculating
||
timer
.
running
running
:
calculating
visible
:
calculating
||
timer
.
running
onCalculatingChanged
:
{
if
(
!
calculating
){
// defer hiding
timer
.
restart
()
onCalculatingChanged
:
{
if
(
!
calculating
)
{
// defer hiding
timer
.
restart
()
}
}
}
Timer
{
id
:
timer
interval
:
1000
repeat
:
false
running
:
false
Timer
{
id
:
timer
interval
:
1000
repeat
:
false
running
:
false
}
}
}
}
//
indicator column
}
// indicator column
}
//
GridLayout
function
_addGeneratorEditor
(){
function
_addGeneratorEditor
()
{
if
(
_generator
&&
_generator
.
editorQml
&&
!
_generatorEditor
)
{
var
component
=
Qt
.
createComponent
(
_generator
.
editorQml
)
if
(
component
.
status
===
Component
.
Error
)
{
console
.
log
(
"
Error loading Qml:
"
,
_generator
.
editorQml
,
component
.
errorString
())
console
.
log
(
"
Error loading Qml:
"
,
_generator
.
editorQml
,
component
.
errorString
())
}
else
{
_generatorEditor
=
component
.
createObject
(
_generatorEditor
=
component
.
createObject
(
generatorEditorParent
,
{
"
generator
"
:
_root
.
_generator
,
"
availableWidth
"
:
generatorEditorParent
.
width
,
"
availableWidth
"
:
generatorEditorParent
.
width
})
}
}
}
function
_destroyGeneratorEditor
(){
if
(
_generatorEditor
){
function
_destroyGeneratorEditor
()
{
if
(
_generatorEditor
)
{
_generatorEditor
.
destroy
()
_generatorEditor
=
undefined
}
}
}
}
// Rectangle
src/MeasurementComplexItem/qml/SafeAreaEditor.qml
View file @
fc550843
import
QtQuick
2.3
import
QtQuick
2.3
import
QtQuick
.
Controls
1.2
import
QtQuick
.
Layouts
1.2
import
QtQuick
.
Layouts
1.2
import
QGroundControl
1.0
import
QGroundControl
.
ScreenTools
1.0
import
QGroundControl
.
Controls
1.0
import
QGroundControl
.
FactControls
1.0
import
QGroundControl
1.0
import
QGroundControl
.
ScreenTools
1.0
import
QGroundControl
.
Controls
1.0
import
QGroundControl
.
FactControls
1.0
GridLayout
{
id
:
editorColumn
id
:
editorColumn
columns
:
2
columnSpacing
:
_margin
rowSpacing
:
_margin
width
:
availableWidth
width
:
availableWidth
property
var
geoArea
:
undefined
property
int
availableWidth
...
...
@@ -20,12 +20,13 @@ GridLayout {
property
real
_margin
:
ScreenTools
.
defaultFontPixelWidth
/
2
Component.onCompleted
:
{
console
.
assert
(
geoArea
!==
undefined
,
"
please set the areaItem property
"
)
console
.
assert
(
geoArea
!==
undefined
,
"
please set the areaItem property
"
)
}
SectionHeader
{
id
:
statsHeader
text
:
qsTr
(
"
Statistics
"
)
id
:
statsHeader
text
:
qsTr
(
"
Statistics
"
)
Layout.fillWidth
:
true
Layout.columnSpan
:
2
}
...
...
@@ -34,11 +35,17 @@ GridLayout {
columns
:
2
columnSpacing
:
_margin
rowSpacing
:
_margin
visible
:
statsHeader
.
checked
visible
:
statsHeader
.
checked
Layout.fillWidth
:
true
Layout.columnSpan
:
2
QGCLabel
{
text
:
qsTr
(
"
Area
"
)
}
//QGCLabel { text: QGroundControl.squareMetersToAppSettingsAreaUnits(geoArea.area).toFixed(2) + " " + QGroundControl.appSettingsAreaUnitsString }
QGCLabel
{
text
:
qsTr
(
"
Area
"
)
}
QGCLabel
{
text
:
QGroundControl
.
unitsConversion
.
squareMetersToAppSettingsAreaUnits
(
geoArea
.
area
).
toFixed
(
2
)
+
"
"
+
QGroundControl
.
unitsConversion
.
appSettingsAreaUnitsString
}
}
}
src/QmlControls/QmlObjectVectorModel.cc
deleted
100644 → 0
View file @
ab5abb37
#include "QmlObjectVectorModel.h"
#include <QDebug>
#include <QQmlEngine>
const
int
QmlObjectVectorModel
::
ObjectRole
=
Qt
::
UserRole
;
const
int
QmlObjectVectorModel
::
TextRole
=
Qt
::
UserRole
+
1
;
QmlObjectVectorModel
::
QmlObjectVectorModel
(
QObject
*
parent
)
:
QAbstractListModel
(
parent
)
,
_dirty
(
false
)
,
_skipDirtyFirstItem
(
false
)
{
}
int
QmlObjectVectorModel
::
rowCount
(
const
QModelIndex
&
parent
)
const
{
Q_UNUSED
(
parent
);
return
_objectList
.
count
();
}
QVariant
QmlObjectVectorModel
::
data
(
const
QModelIndex
&
index
,
int
role
)
const
{
if
(
!
index
.
isValid
())
{
return
QVariant
();
}
if
(
index
.
row
()
<
0
||
index
.
row
()
>=
_objectList
.
count
())
{
return
QVariant
();
}
if
(
role
==
ObjectRole
)
{
return
QVariant
::
fromValue
(
_objectList
[
index
.
row
()]);
}
else
if
(
role
==
TextRole
)
{
return
QVariant
::
fromValue
(
_objectList
[
index
.
row
()]
->
objectName
());
}
else
{
return
QVariant
();
}
}
QHash
<
int
,
QByteArray
>
QmlObjectVectorModel
::
roleNames
(
void
)
const
{
QHash
<
int
,
QByteArray
>
hash
;
hash
[
ObjectRole
]
=
"object"
;
hash
[
TextRole
]
=
"text"
;
return
hash
;
}
bool
QmlObjectVectorModel
::
setData
(
const
QModelIndex
&
index
,
const
QVariant
&
value
,
int
role
)
{
if
(
index
.
isValid
()
&&
role
==
ObjectRole
)
{
_objectList
.
replace
(
index
.
row
(),
value
.
value
<
QObject
*>
());
emit
dataChanged
(
index
,
index
);
return
true
;
}
return
false
;
}
bool
QmlObjectVectorModel
::
insertRows
(
int
position
,
int
rows
,
const
QModelIndex
&
parent
)
{
Q_UNUSED
(
parent
);
if
(
position
<
0
||
position
>
_objectList
.
count
()
+
1
)
{
qWarning
()
<<
"Invalid position position:count"
<<
position
<<
_objectList
.
count
();
}
beginInsertRows
(
QModelIndex
(),
position
,
position
+
rows
-
1
);
endInsertRows
();
emit
countChanged
(
count
());
return
true
;
}
bool
QmlObjectVectorModel
::
removeRows
(
int
position
,
int
rows
,
const
QModelIndex
&
parent
)
{
Q_UNUSED
(
parent
);
if
(
position
<
0
||
position
>=
_objectList
.
count
())
{
qWarning
()
<<
"Invalid position position:count"
<<
position
<<
_objectList
.
count
();
}
else
if
(
position
+
rows
>
_objectList
.
count
())
{
qWarning
()
<<
"Invalid rows position:rows:count"
<<
position
<<
rows
<<
_objectList
.
count
();
}
beginRemoveRows
(
QModelIndex
(),
position
,
position
+
rows
-
1
);
for
(
int
row
=
0
;
row
<
rows
;
row
++
)
{
_objectList
.
removeAt
(
position
);
}
endRemoveRows
();
emit
countChanged
(
count
());
return
true
;
}
QObject
*
QmlObjectVectorModel
::
operator
[](
int
index
)
{
if
(
index
<
0
||
index
>=
_objectList
.
count
())
{
return
NULL
;
}
return
_objectList
[
index
];
}
const
QObject
*
QmlObjectVectorModel
::
operator
[](
int
index
)
const
{
if
(
index
<
0
||
index
>=
_objectList
.
count
())
{
return
NULL
;
}
return
_objectList
[
index
];
}
void
QmlObjectVectorModel
::
clear
()
{
while
(
rowCount
())
{
removeAt
(
0
);
}
}
QObject
*
QmlObjectVectorModel
::
removeAt
(
int
i
)
{
QObject
*
removedObject
=
_objectList
[
i
];
if
(
removedObject
)
{
// Look for a dirtyChanged signal on the object
if
(
_objectList
[
i
]
->
metaObject
()
->
indexOfSignal
(
QMetaObject
::
normalizedSignature
(
"dirtyChanged(bool)"
))
!=
-
1
)
{
if
(
!
_skipDirtyFirstItem
||
i
!=
0
)
{
QObject
::
disconnect
(
_objectList
[
i
],
SIGNAL
(
dirtyChanged
(
bool
)),
this
,
SLOT
(
_childDirtyChanged
(
bool
)));
}
}
}
removeRows
(
i
,
1
);
setDirty
(
true
);
return
removedObject
;
}
void
QmlObjectVectorModel
::
insert
(
int
i
,
QObject
*
object
)
{
if
(
i
<
0
||
i
>
_objectList
.
count
())
{
qWarning
()
<<
"Invalid index index:count"
<<
i
<<
_objectList
.
count
();
}
QQmlEngine
::
setObjectOwnership
(
object
,
QQmlEngine
::
CppOwnership
);
// Look for a dirtyChanged signal on the object
if
(
object
->
metaObject
()
->
indexOfSignal
(
QMetaObject
::
normalizedSignature
(
"dirtyChanged(bool)"
))
!=
-
1
)
{
if
(
!
_skipDirtyFirstItem
||
i
!=
0
)
{
QObject
::
connect
(
object
,
SIGNAL
(
dirtyChanged
(
bool
)),
this
,
SLOT
(
_childDirtyChanged
(
bool
)));
}
}
_objectList
.
insert
(
i
,
object
);
insertRows
(
i
,
1
);
setDirty
(
true
);
}
void
QmlObjectVectorModel
::
insert
(
int
i
,
QVector
<
QObject
*>
objects
)
{
if
(
i
<
0
||
i
>
_objectList
.
count
())
{
qWarning
()
<<
"Invalid index index:count"
<<
i
<<
_objectList
.
count
();
}
int
j
=
i
;
for
(
QObject
*
object
:
objects
)
{
QQmlEngine
::
setObjectOwnership
(
object
,
QQmlEngine
::
CppOwnership
);
// Look for a dirtyChanged signal on the object
if
(
object
->
metaObject
()
->
indexOfSignal
(
QMetaObject
::
normalizedSignature
(
"dirtyChanged(bool)"
))
!=
-
1
)
{
if
(
!
_skipDirtyFirstItem
||
j
!=
0
)
{
QObject
::
connect
(
object
,
SIGNAL
(
dirtyChanged
(
bool
)),
this
,
SLOT
(
_childDirtyChanged
(
bool
)));
}
}
j
++
;
_objectList
.
insert
(
j
,
object
);
}
insertRows
(
i
,
objects
.
count
());
setDirty
(
true
);
}
void
QmlObjectVectorModel
::
append
(
QObject
*
object
)
{
insert
(
_objectList
.
count
(),
object
);
}
void
QmlObjectVectorModel
::
append
(
QVector
<
QObject
*>
objects
)
{
insert
(
_objectList
.
count
(),
objects
);
}
QVector
<
QObject
*>
QmlObjectVectorModel
::
swapObjectList
(
const
QVector
<
QObject
*>&
newlist
)
{
QVector
<
QObject
*>
oldlist
(
_objectList
);
beginResetModel
();
_objectList
=
newlist
;
endResetModel
();
emit
countChanged
(
count
());
return
oldlist
;
}
int
QmlObjectVectorModel
::
count
()
const
{
return
rowCount
();
}
void
QmlObjectVectorModel
::
setDirty
(
bool
dirty
)
{
if
(
_dirty
!=
dirty
)
{
_dirty
=
dirty
;
if
(
!
dirty
)
{
// Need to clear dirty from all children
for
(
QObject
*
object
:
_objectList
)
{
if
(
object
->
property
(
"dirty"
).
isValid
())
{
object
->
setProperty
(
"dirty"
,
false
);
}
}
}
emit
dirtyChanged
(
_dirty
);
}
}
void
QmlObjectVectorModel
::
_childDirtyChanged
(
bool
dirty
)
{
_dirty
|=
dirty
;
// We want to emit dirtyChanged even if the actual value of _dirty didn't change. It can be a useful
// signal to know when a child has changed dirty state
emit
dirtyChanged
(
_dirty
);
}
void
QmlObjectVectorModel
::
deleteListAndContents
()
{
for
(
int
i
=
0
;
i
<
_objectList
.
count
();
i
++
)
{
_objectList
[
i
]
->
deleteLater
();
}
deleteLater
();
}
void
QmlObjectVectorModel
::
clearAndDeleteContents
()
{
beginResetModel
();
for
(
int
i
=
0
;
i
<
_objectList
.
count
();
i
++
)
{
_objectList
[
i
]
->
deleteLater
();
}
clear
();
endResetModel
();
}
void
swap
(
QmlObjectVectorModel
&
list1
,
QmlObjectVectorModel
&
list2
)
{
using
std
::
swap
;
swap
(
list1
.
_objectList
,
list2
.
_objectList
);
swap
(
list1
.
_dirty
,
list2
.
_dirty
);
swap
(
list1
.
_skipDirtyFirstItem
,
list2
.
_skipDirtyFirstItem
);
}
src/QmlControls/QmlObjectVectorModel.h
deleted
100644 → 0
View file @
ab5abb37
#pragma once
#include <QAbstractListModel>
class
QmlObjectVectorModel
:
public
QAbstractListModel
{
Q_OBJECT
public:
QmlObjectVectorModel
(
QObject
*
parent
=
nullptr
);
Q_PROPERTY
(
int
count
READ
count
NOTIFY
countChanged
)
/// Returns true if any of the items in the list are dirty. Requires each object to have
/// a dirty property and dirtyChanged signal.
Q_PROPERTY
(
bool
dirty
READ
dirty
WRITE
setDirty
NOTIFY
dirtyChanged
)
Q_INVOKABLE
QObject
*
get
(
int
index
)
{
return
_objectList
[
index
];
}
// Property accessors
int
count
()
const
;
bool
dirty
()
const
{
return
_dirty
;
}
void
setDirty
(
bool
dirty
);
void
append
(
QObject
*
object
);
void
append
(
QVector
<
QObject
*>
objects
);
QVector
<
QObject
*>
swapObjectList
(
const
QVector
<
QObject
*>&
newlist
);
void
clear
();
QObject
*
removeAt
(
int
i
);
QObject
*
removeOne
(
QObject
*
object
)
{
return
removeAt
(
indexOf
(
object
));
}
void
insert
(
int
i
,
QObject
*
object
);
void
insert
(
int
i
,
QVector
<
QObject
*>
objects
);
bool
contains
(
QObject
*
object
)
{
return
_objectList
.
indexOf
(
object
)
!=
-
1
;
}
int
indexOf
(
QObject
*
object
)
{
return
_objectList
.
indexOf
(
object
);
}
QObject
*
operator
[]
(
int
i
);
const
QObject
*
operator
[]
(
int
i
)
const
;
template
<
class
T
>
T
value
(
int
index
)
{
return
qobject_cast
<
T
>
(
_objectList
[
index
]);
}
QVector
<
QObject
*>*
objectList
()
{
return
&
_objectList
;
}
/// Calls deleteLater on all items and this itself.
void
deleteListAndContents
();
/// Clears the list and calls deleteLater on each entry
void
clearAndDeleteContents
();
void
beginReset
()
{
beginResetModel
();
}
void
endReset
()
{
endResetModel
();
}
// Friends
friend
void
swap
(
QmlObjectVectorModel
&
list1
,
QmlObjectVectorModel
&
list2
);
signals:
void
countChanged
(
int
count
);
void
dirtyChanged
(
bool
dirtyChanged
);
private
slots
:
void
_childDirtyChanged
(
bool
dirty
);
private:
// Overrides from QAbstractListModel
int
rowCount
(
const
QModelIndex
&
parent
=
QModelIndex
())
const
override
;
QVariant
data
(
const
QModelIndex
&
index
,
int
role
=
Qt
::
DisplayRole
)
const
override
;
bool
insertRows
(
int
position
,
int
rows
,
const
QModelIndex
&
index
=
QModelIndex
())
override
;
bool
removeRows
(
int
position
,
int
rows
,
const
QModelIndex
&
index
=
QModelIndex
())
override
;
bool
setData
(
const
QModelIndex
&
index
,
const
QVariant
&
value
,
int
role
=
Qt
::
EditRole
)
override
;
QHash
<
int
,
QByteArray
>
roleNames
(
void
)
const
override
;
private:
QVector
<
QObject
*>
_objectList
;
bool
_dirty
;
bool
_skipDirtyFirstItem
;
static
const
int
ObjectRole
;
static
const
int
TextRole
;
};
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