From a85e363153af8006224f2d3b2ed5c23a29e96e93 Mon Sep 17 00:00:00 2001 From: Thomas Gubler Date: Tue, 24 Dec 2013 16:47:02 +0100 Subject: [PATCH 1/4] display parameters in alphabetical order --- src/ui/QGCParamWidget.cc | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/ui/QGCParamWidget.cc b/src/ui/QGCParamWidget.cc index a817822..12a7fb6 100644 --- a/src/ui/QGCParamWidget.cc +++ b/src/ui/QGCParamWidget.cc @@ -343,8 +343,22 @@ QTreeWidgetItem* QGCParamWidget::updateParameterDisplay(int compId, QString para } paramItem->setFlags(paramItem->flags() | Qt::ItemIsEditable); - //TODO insert alphabetically - parentItem->addChild(paramItem); + //Insert alphabetically + bool inserted = false; + for(int i = 0; i < parentItem->childCount(); i++) { + if (strcoll(parameterName.toStdString().c_str(), parentItem->child(i)->text(0).toStdString().c_str()) < 0) + { + parentItem->insertChild(i, paramItem); + inserted = true; + break; + } + } + + if (!inserted) + { + //Insert at the end + parentItem->addChild(paramItem); + } //only add the tooltip when the parameter item is first added QString paramDesc = paramMgr->dataModel()->getParamDescription(parameterName); From defcc1709333780f4834dde4c0106bb4e4f21f2f Mon Sep 17 00:00:00 2001 From: Thomas Gubler Date: Tue, 24 Dec 2013 17:57:14 +0100 Subject: [PATCH 2/4] alphabetical parameters: use strcmp which gives better results with underscores --- src/ui/QGCParamWidget.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/QGCParamWidget.cc b/src/ui/QGCParamWidget.cc index 12a7fb6..53f5327 100644 --- a/src/ui/QGCParamWidget.cc +++ b/src/ui/QGCParamWidget.cc @@ -346,7 +346,7 @@ QTreeWidgetItem* QGCParamWidget::updateParameterDisplay(int compId, QString para //Insert alphabetically bool inserted = false; for(int i = 0; i < parentItem->childCount(); i++) { - if (strcoll(parameterName.toStdString().c_str(), parentItem->child(i)->text(0).toStdString().c_str()) < 0) + if (strcmp(parameterName.toStdString().c_str(), parentItem->child(i)->text(0).toStdString().c_str()) < 0) { parentItem->insertChild(i, paramItem); inserted = true; From 61d4bc1c70a5aa8d992072e52978c00018df1f97 Mon Sep 17 00:00:00 2001 From: Thomas Gubler Date: Fri, 27 Dec 2013 11:49:29 +0100 Subject: [PATCH 3/4] sorted parameters: use QString::compare instead of strcmp --- src/ui/QGCParamWidget.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/QGCParamWidget.cc b/src/ui/QGCParamWidget.cc index 53f5327..d9c8c2a 100644 --- a/src/ui/QGCParamWidget.cc +++ b/src/ui/QGCParamWidget.cc @@ -346,7 +346,7 @@ QTreeWidgetItem* QGCParamWidget::updateParameterDisplay(int compId, QString para //Insert alphabetically bool inserted = false; for(int i = 0; i < parentItem->childCount(); i++) { - if (strcmp(parameterName.toStdString().c_str(), parentItem->child(i)->text(0).toStdString().c_str()) < 0) + if (parameterName.compare(parentItem->child(i)->text(0)) < 0 ) { parentItem->insertChild(i, paramItem); inserted = true; From 7af96b27241f86e5c74b2850bd85b9a3c39f28ef Mon Sep 17 00:00:00 2001 From: Thomas Gubler Date: Fri, 27 Dec 2013 12:51:30 +0100 Subject: [PATCH 4/4] sorted parameters: make search more efficient --- src/ui/QGCParamWidget.cc | 48 ++++++++++++++++++++++++++++++++++++------------ src/ui/QGCParamWidget.h | 4 +++- 2 files changed, 39 insertions(+), 13 deletions(-) diff --git a/src/ui/QGCParamWidget.cc b/src/ui/QGCParamWidget.cc index d9c8c2a..f241196 100644 --- a/src/ui/QGCParamWidget.cc +++ b/src/ui/QGCParamWidget.cc @@ -311,6 +311,39 @@ QTreeWidgetItem* QGCParamWidget::getParentWidgetItemForParam(int compId, const Q return parentItem; } +void QGCParamWidget::insertParamAlphabetical(int indexLowerBound, int indexUpperBound, QTreeWidgetItem* parentItem, QTreeWidgetItem* paramItem) +{ + if (indexLowerBound >= indexUpperBound) + { + if (paramItem->text(0).compare(parentItem->child(indexLowerBound)->text(0)) < 0) { + parentItem->insertChild(indexLowerBound, paramItem); + } + else + { + if (indexLowerBound < parentItem->childCount() - 1) { + parentItem->insertChild(indexLowerBound + 1, paramItem); + } + else + { + parentItem->addChild(paramItem); + } + } + } + else + { + int midpoint = indexLowerBound + floor(indexUpperBound - indexLowerBound)/2; + + if (paramItem->text(0).compare(parentItem->child(midpoint)->text(0)) < 0) + { + insertParamAlphabetical(indexLowerBound, midpoint - 1, parentItem, paramItem); + } else + { + insertParamAlphabetical(midpoint + 1, indexUpperBound, parentItem, paramItem); + } + + } +} + QTreeWidgetItem* QGCParamWidget::updateParameterDisplay(int compId, QString parameterName, QVariant value) { //qDebug() << "QGCParamWidget::updateParameterDisplay" << parameterName; @@ -344,19 +377,10 @@ QTreeWidgetItem* QGCParamWidget::updateParameterDisplay(int compId, QString para paramItem->setFlags(paramItem->flags() | Qt::ItemIsEditable); //Insert alphabetically - bool inserted = false; - for(int i = 0; i < parentItem->childCount(); i++) { - if (parameterName.compare(parentItem->child(i)->text(0)) < 0 ) - { - parentItem->insertChild(i, paramItem); - inserted = true; - break; - } - } - - if (!inserted) + if (parentItem->childCount() > 0) { + insertParamAlphabetical(0, parentItem->childCount() - 1, parentItem, paramItem); + } else { - //Insert at the end parentItem->addChild(paramItem); } diff --git a/src/ui/QGCParamWidget.h b/src/ui/QGCParamWidget.h index 83787de..98b5d04 100644 --- a/src/ui/QGCParamWidget.h +++ b/src/ui/QGCParamWidget.h @@ -83,10 +83,12 @@ public slots: virtual void clearOnboardParamDisplay(); virtual void clearPendingParamDisplay(); + /** @brief Adds parameter at the correct location by a alphapetical comparison of the parameter names */ + void insertParamAlphabetical(int indexLowerBound, int indexUpperBound, QTreeWidgetItem* parentItem, QTreeWidgetItem* paramItem); + /** @brief Ensure that view of parameter matches data in the model */ QTreeWidgetItem* updateParameterDisplay(int component, QString parameterName, QVariant value); - /** @brief Update when user changes parameters */ void parameterItemChanged(QTreeWidgetItem* prev, int column);