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
Expand all
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
This diff is collapsed.
Click to expand it.
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
This diff is collapsed.
Click to expand it.
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