Skip to content

Commit

Permalink
Parameter search support
Browse files Browse the repository at this point in the history
  • Loading branch information
DonLakeFlyer committed Sep 25, 2015
1 parent 3a66b7c commit 8786508
Show file tree
Hide file tree
Showing 8 changed files with 210 additions and 95 deletions.
4 changes: 2 additions & 2 deletions src/AutoPilotPlugins/AutoPilotPlugin.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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<int, QMap<QString, QStringList> >& AutoPilotPlugin::getGroupMap(void)
Expand Down
3 changes: 1 addition & 2 deletions src/AutoPilotPlugins/AutoPilotPlugin.h
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,7 @@ class AutoPilotPlugin : public QObject
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
Expand Down
4 changes: 2 additions & 2 deletions src/FactSystem/ParameterLoader.cc
Original file line number Diff line number Diff line change
Expand Up @@ -387,11 +387,11 @@ Fact* ParameterLoader::getFact(int componentId, const QString& name)
return _mapParameterName2Variant[componentId][name].value<Fact*>();
}

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;
}

Expand Down
3 changes: 1 addition & 2 deletions src/FactSystem/ParameterLoader.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,7 @@ class ParameterLoader : public QObject
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
Expand Down
261 changes: 176 additions & 85 deletions src/QmlControls/ParameterEditor.qml
Original file line number Diff line number Diff line change
Expand Up @@ -39,16 +39,16 @@ 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 { }

readonly property real __leftMargin: 10
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
Expand All @@ -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

Expand All @@ -84,7 +143,7 @@ QGCView {
}

Repeater {
model: controller.getFactsForGroup(componentId, group)
model: parameterNames

Column {
property Fact modelFact: controller.getParameterFact(componentId, modelData)
Expand Down Expand Up @@ -116,7 +175,6 @@ QGCView {
height: parent.height
anchors.left: valueLabel.right
verticalAlignment: Text.AlignVCenter
visible: fullMode
text: modelFact.shortDescription
}

Expand All @@ -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)
}
}
}
Expand All @@ -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
Expand All @@ -155,8 +313,8 @@ QGCView {
height: toolsButton.height

QGCLabel {
id: titleText
font.pixelSize: ScreenTools.largeFontPixelSize
visible: fullMode
text: "PARAMETER EDITOR"
}

Expand All @@ -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 { }
Expand All @@ -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
Loading

0 comments on commit 8786508

Please sign in to comment.