From 87865088ec065a2a01a1c904f4e6f4cfd4af4ce7 Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Fri, 25 Sep 2015 10:24:01 -0700 Subject: [PATCH] Parameter search support --- src/AutoPilotPlugins/AutoPilotPlugin.cc | 4 +- src/AutoPilotPlugins/AutoPilotPlugin.h | 3 +- src/FactSystem/ParameterLoader.cc | 4 +- src/FactSystem/ParameterLoader.h | 3 +- src/QmlControls/ParameterEditor.qml | 261 +++++++++++++------ src/QmlControls/ParameterEditorController.cc | 24 +- src/QmlControls/ParameterEditorController.h | 3 +- src/QmlControls/QGCView.qml | 3 + 8 files changed, 210 insertions(+), 95 deletions(-) diff --git a/src/AutoPilotPlugins/AutoPilotPlugin.cc b/src/AutoPilotPlugins/AutoPilotPlugin.cc index 22e5fadb7..c8dfa0cce 100644 --- a/src/AutoPilotPlugins/AutoPilotPlugin.cc +++ b/src/AutoPilotPlugins/AutoPilotPlugin.cc @@ -157,9 +157,9 @@ Fact* AutoPilotPlugin::getFact(FactSystem::Provider_t provider, int componentId, return NULL; } -QStringList AutoPilotPlugin::parameterNames(void) +QStringList AutoPilotPlugin::parameterNames(int componentId) { - return _getParameterLoader()->parameterNames(); + return _getParameterLoader()->parameterNames(componentId); } const QMap >& AutoPilotPlugin::getGroupMap(void) diff --git a/src/AutoPilotPlugins/AutoPilotPlugin.h b/src/AutoPilotPlugins/AutoPilotPlugin.h index 6a8b66172..47ac288a2 100644 --- a/src/AutoPilotPlugins/AutoPilotPlugin.h +++ b/src/AutoPilotPlugins/AutoPilotPlugin.h @@ -81,8 +81,7 @@ public: Q_INVOKABLE bool parameterExists(int componentId, const QString& name); /// Returns all parameter names - /// FIXME: component id missing, generic to fact - QStringList parameterNames(void); + QStringList parameterNames(int componentId); /// Returns the specified parameter Fact from the default component /// WARNING: Returns a default Fact if parameter does not exists. If that possibility exists, check for existince first with diff --git a/src/FactSystem/ParameterLoader.cc b/src/FactSystem/ParameterLoader.cc index 0c152ccbc..8a7bcbbe6 100644 --- a/src/FactSystem/ParameterLoader.cc +++ b/src/FactSystem/ParameterLoader.cc @@ -387,11 +387,11 @@ Fact* ParameterLoader::getFact(int componentId, const QString& name) return _mapParameterName2Variant[componentId][name].value(); } -QStringList ParameterLoader::parameterNames(void) +QStringList ParameterLoader::parameterNames(int componentId) { QStringList names; - foreach(QString paramName, _mapParameterName2Variant[_defaultComponentId].keys()) { + foreach(QString paramName, _mapParameterName2Variant[_actualComponentId(componentId)].keys()) { names << paramName; } diff --git a/src/FactSystem/ParameterLoader.h b/src/FactSystem/ParameterLoader.h index 9a4cb99f6..3580406d1 100644 --- a/src/FactSystem/ParameterLoader.h +++ b/src/FactSystem/ParameterLoader.h @@ -69,8 +69,7 @@ public: const QString& name); ///< fact name /// Returns all parameter names - /// FIXME: component id missing - QStringList parameterNames(void); + QStringList parameterNames(int componentId); /// Returns the specified Fact. /// WARNING: Will assert if parameter does not exists. If that possibily exists, check for existince first with diff --git a/src/QmlControls/ParameterEditor.qml b/src/QmlControls/ParameterEditor.qml index a518c3755..ab36a5f6c 100644 --- a/src/QmlControls/ParameterEditor.qml +++ b/src/QmlControls/ParameterEditor.qml @@ -39,9 +39,6 @@ import QGroundControl.FactControls 1.0 QGCView { viewPanel: panel - /// true: show full information, false: for use in smaller widgets - property bool fullMode: true - QGCPalette { id: __qgcPal; colorGroupEnabled: true } property Fact __editorDialogFact: Fact { } @@ -49,6 +46,9 @@ QGCView { readonly property real __rightMargin: 20 readonly property int __maxParamChars: 16 + property bool _searchFilter: false ///< true: showing results of search + property var _searchResults ///< List of parameter names from search results + ParameterEditorController { id: controller; factPanel: panel @@ -64,6 +64,65 @@ QGCView { ParameterEditorDialog { fact: __editorDialogFact } } // Component - Editor Dialog + Component { + id: searchDialogComponent + + QGCViewDialog { + + function accept() { + _searchResults = controller.searchParametersForComponent(-1, searchFor.text, searchInName.checked, searchInDescriptions.checked) + _searchFilter = true + hideDialog() + } + + function reject() { + _searchFilter = false + hideDialog() + } + + QGCLabel { + id: searchForLabel + text: "Search for:" + } + + QGCTextField { + id: searchFor + anchors.topMargin: defaultTextHeight / 3 + anchors.top: searchForLabel.bottom + width: defaultTextWidth * 20 + } + + QGCLabel { + id: searchInLabel + anchors.topMargin: defaultTextHeight + anchors.top: searchFor.bottom + text: "Search in:" + } + + QGCCheckBox { + id: searchInName + anchors.topMargin: defaultTextHeight / 3 + anchors.top: searchInLabel.bottom + text: "Name" + } + + QGCCheckBox { + id: searchInDescriptions + anchors.topMargin: defaultTextHeight / 3 + anchors.top: searchInName.bottom + text: "Descriptions" + } + + QGCLabel { + anchors.topMargin: defaultTextHeight + anchors.top: searchInDescriptions.bottom + width: parent.width + wrapMode: Text.WordWrap + text: "Hint: Leave 'Search For' blank and click Apply to list all parameters sorted by name." + } + } + } + Component { id: factRowsComponent @@ -84,7 +143,7 @@ QGCView { } Repeater { - model: controller.getFactsForGroup(componentId, group) + model: parameterNames Column { property Fact modelFact: controller.getParameterFact(componentId, modelData) @@ -116,7 +175,6 @@ QGCView { height: parent.height anchors.left: valueLabel.right verticalAlignment: Text.AlignVCenter - visible: fullMode text: modelFact.shortDescription } @@ -126,7 +184,7 @@ QGCView { onClicked: { __editorDialogFact = modelFact - showDialog(editorDialogComponent, "Parameter Editor", fullMode ? 50 : -1, StandardButton.Cancel | StandardButton.Save) + showDialog(editorDialogComponent, "Parameter Editor", 50, StandardButton.Cancel | StandardButton.Save) } } } @@ -142,6 +200,106 @@ QGCView { } // Column - Facts } // Component - factRowsComponent + Component { + id: groupedViewComponent + + Item { + ScrollView { + id : groupScroll + width: defaultTextWidth * 25 + height: parent.height + + Column { + Repeater { + model: controller.componentIds + + Column { + id: componentColumn + + readonly property int componentId: parseInt(modelData) + + QGCLabel { + height: contentHeight + (ScreenTools.defaultFontPixelHeight * 0.5) + text: "Component #: " + componentId.toString() + verticalAlignment: Text.AlignVCenter + font.pixelSize: ScreenTools.mediumFontPixelSize + } + + Repeater { + model: controller.getGroupsForComponent(componentColumn.componentId) + + Column { + QGCButton { + x: __leftMargin + width: groupScroll.width - __leftMargin - __rightMargin + text: modelData + + onClicked: { + factRowsLoader.sourceComponent = null + factRowsLoader.componentId = componentId + factRowsLoader.group = modelData + factRowsLoader.sourceComponent = factRowsComponent + } + } + + Item { + width: 1 + height: ScreenTools.defaultFontPixelSize * 0.25 + } + } // Column - Group + } // Repeater - Groups + + Item { + height: 10 + width: 10 + } + } // Column - Component + } // Repeater - Components + } // Column - Component + } // ScrollView - Groups + + ScrollView { + id: factScrollView + anchors.left: groupScroll.right + anchors.right: parent.right + height: parent.height + + Loader { + id: factRowsLoader + width: factScrollView.width + sourceComponent: factRowsComponent + + property int componentId: controller.componentIds[0] + property string group: controller.getGroupsForComponent(controller.componentIds[0])[0] + property var parameterNames: controller.getParametersForGroup(componentId, group) + } + } // ScrollView - Facts + } // Item + } // Component - groupedViewComponent + + Component { + id: searchResultsViewComponent + + Item { + ScrollView { + id: factScrollView + anchors.left: parent.left + anchors.right: parent.right + height: parent.height + + Loader { + id: factRowsLoader + width: factScrollView.width + sourceComponent: factRowsComponent + + property int componentId: -1 + property string group: "Search results" + property var parameterNames: _searchResults + } + } // ScrollView - Facts + } // Item + } // Component - sortedViewComponent + QGCViewPanel { id: panel anchors.fill: parent @@ -155,8 +313,8 @@ QGCView { height: toolsButton.height QGCLabel { + id: titleText font.pixelSize: ScreenTools.largeFontPixelSize - visible: fullMode text: "PARAMETER EDITOR" } @@ -174,15 +332,17 @@ QGCView { text: "Reset all to defaults" onTriggered: controller.resetAllToDefaults() } + MenuItem { + text: "Search..." + onTriggered: showDialog(searchDialogComponent, "Parameter Search", 50, StandardButton.Reset | StandardButton.Apply) + } MenuSeparator { } MenuItem { - text: "Load from file" - visible: fullMode + text: "Load from file..." onTriggered: controller.loadFromFile() } MenuItem { - text: "Save to file" - visible: fullMode + text: "Save to file..." onTriggered: controller.saveToFile() } MenuSeparator { } @@ -200,80 +360,11 @@ QGCView { width: 5 } - Item { - width: parent.width - height: parent.height - (lastSpacer.y + lastSpacer.height) - - ScrollView { - id : groupScroll - width: defaultTextWidth * 25 - height: parent.height - - Column { - Repeater { - model: controller.componentIds - - Column { - id: componentColumn - - readonly property int componentId: parseInt(modelData) - - QGCLabel { - height: contentHeight + (ScreenTools.defaultFontPixelHeight * 0.5) - text: "Component #: " + componentId.toString() - verticalAlignment: Text.AlignVCenter - font.pixelSize: ScreenTools.mediumFontPixelSize - } - - Repeater { - model: controller.getGroupsForComponent(componentColumn.componentId) - - Column { - QGCButton { - x: __leftMargin - width: groupScroll.width - __leftMargin - __rightMargin - text: modelData - - onClicked: { - factRowsLoader.sourceComponent = null - factRowsLoader.componentId = componentId - factRowsLoader.group = modelData - factRowsLoader.sourceComponent = factRowsComponent - } - } - - Item { - width: 1 - height: ScreenTools.defaultFontPixelSize * 0.25 - } - } // Column - Group - } // Repeater - Groups - - Item { - height: 10 - width: 10 - } - } // Column - Component - } // Repeater - Components - } // Column - Component - } // ScrollView - Groups - - ScrollView { - id: factScrollView - anchors.left: groupScroll.right - anchors.right: parent.right - height: parent.height - - Loader { - id: factRowsLoader - width: factScrollView.width - - property int componentId: controller.componentIds[0] - property string group: controller.getGroupsForComponent(controller.componentIds[0])[0] - sourceComponent: factRowsComponent - } - } // ScrollView - Facts - } // Item - Group ScrollView + Facts + Loader { + width: parent.width + height: parent.height - (lastSpacer.y + lastSpacer.height) + sourceComponent: _searchFilter ? searchResultsViewComponent: groupedViewComponent + } } // Column - Outer } // QGCViewPanel } // QGCView diff --git a/src/QmlControls/ParameterEditorController.cc b/src/QmlControls/ParameterEditorController.cc index 9762a2171..bf6eb4871 100644 --- a/src/QmlControls/ParameterEditorController.cc +++ b/src/QmlControls/ParameterEditorController.cc @@ -53,13 +53,35 @@ QStringList ParameterEditorController::getGroupsForComponent(int componentId) return groupMap[componentId].keys(); } -QStringList ParameterEditorController::getFactsForGroup(int componentId, QString group) +QStringList ParameterEditorController::getParametersForGroup(int componentId, QString group) { const QMap >& groupMap = _autopilot->getGroupMap(); return groupMap[componentId][group]; } +QStringList ParameterEditorController::searchParametersForComponent(int componentId, const QString& searchText, bool searchInName, bool searchInDescriptions) +{ + QStringList list; + + foreach(QString paramName, _autopilot->parameterNames(componentId)) { + if (searchText.isEmpty()) { + list += paramName; + } else { + Fact* fact = _autopilot->getParameterFact(componentId, paramName); + + if (searchInName && fact->name().contains(searchText, Qt::CaseInsensitive)) { + list += paramName; + } else if (searchInDescriptions && (fact->shortDescription().contains(searchText, Qt::CaseInsensitive) || fact->longDescription().contains(searchText, Qt::CaseInsensitive))) { + list += paramName; + } + } + } + list.sort(); + + return list; +} + void ParameterEditorController::clearRCToParam(void) { Q_ASSERT(_uas); diff --git a/src/QmlControls/ParameterEditorController.h b/src/QmlControls/ParameterEditorController.h index b0ecde670..a1db2225e 100644 --- a/src/QmlControls/ParameterEditorController.h +++ b/src/QmlControls/ParameterEditorController.h @@ -45,7 +45,8 @@ public: Q_PROPERTY(QStringList componentIds MEMBER _componentIds CONSTANT) Q_INVOKABLE QStringList getGroupsForComponent(int componentId); - Q_INVOKABLE QStringList getFactsForGroup(int componentId, QString group); + Q_INVOKABLE QStringList getParametersForGroup(int componentId, QString group); + Q_INVOKABLE QStringList searchParametersForComponent(int componentId, const QString& searchText, bool searchInName, bool searchInDescriptions); Q_INVOKABLE void clearRCToParam(void); Q_INVOKABLE void saveToFile(void); diff --git a/src/QmlControls/QGCView.qml b/src/QmlControls/QGCView.qml index c0ded49a5..d2e71ac79 100644 --- a/src/QmlControls/QGCView.qml +++ b/src/QmlControls/QGCView.qml @@ -106,6 +106,9 @@ FactPanel { } else if (buttons & StandardButton.Abort) { __rejectButton.text = "Abort" __rejectButton.visible = true + } else if (buttons & StandardButton.Reset) { + __rejectButton.text = "Reset" + __rejectButton.visible = true } } -- 2.22.0