Commit fc550843 authored by Valentin Platzgummer's avatar Valentin Platzgummer

resizing issue: measurement item editor solved

parent ab5abb37
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
......@@ -53,7 +53,7 @@ Rectangle {
readonly property int areaEditorIndex: 0
readonly property int parameterEditorIndex: 1
readonly property int nemoControlsIndex: 2
readonly property int nemoEditorIndex: 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
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
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
}
}
}
#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) {