Skip to content

Commit f27258a

Browse files
committed
LP-567 rewrite uavobjecttreemodel to better handle dynamic changes
don't rebuild the model when toggling options (categories, meta, scientific notation) fixes a number of issues when adding/removing/removing items dynamically for example, new object instances would not appear if added dynamically selection and expansion states are not lost when toogling options note that toggling categories is not really well behaved concerning expansion state...
1 parent a02bea9 commit f27258a

10 files changed

Lines changed: 602 additions & 454 deletions

ground/gcs/src/plugins/uavobjectbrowser/fieldtreeitem.cpp

Lines changed: 0 additions & 28 deletions
This file was deleted.

ground/gcs/src/plugins/uavobjectbrowser/fieldtreeitem.h

Lines changed: 35 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
#include "treeitem.h"
3232

3333
#include <QStringList>
34+
#include <QSettings>
3435
#include <QWidget>
3536
#include <QSpinBox>
3637
#include <QDoubleSpinBox>
@@ -53,11 +54,11 @@
5354
class FieldTreeItem : public TreeItem {
5455
public:
5556

56-
FieldTreeItem(int index, const QList<QVariant> &data, UAVObjectField *field, TreeItem *parentItem) :
57-
TreeItem(data, parentItem), m_index(index), m_field(field)
57+
FieldTreeItem(int index, const QList<QVariant> &data, UAVObjectField *field) :
58+
TreeItem(data), m_index(index), m_field(field)
5859
{}
59-
FieldTreeItem(int index, const QVariant &data, UAVObjectField *field, TreeItem *parentItem) :
60-
TreeItem(data, parentItem), m_index(index), m_field(field)
60+
FieldTreeItem(int index, const QVariant &data, UAVObjectField *field) :
61+
TreeItem(data), m_index(index), m_field(field)
6162
{}
6263

6364
bool isEditable() const
@@ -109,12 +110,12 @@ class FieldTreeItem : public TreeItem {
109110

110111
class EnumFieldTreeItem : public FieldTreeItem {
111112
public:
112-
EnumFieldTreeItem(UAVObjectField *field, int index, const QList<QVariant> &data, TreeItem *parentItem) :
113-
FieldTreeItem(index, data, field, parentItem), m_enumOptions(field->getOptions())
113+
EnumFieldTreeItem(UAVObjectField *field, int index, const QList<QVariant> &data) :
114+
FieldTreeItem(index, data, field), m_enumOptions(field->getOptions())
114115
{}
115116

116-
EnumFieldTreeItem(UAVObjectField *field, int index, const QVariant &data, TreeItem *parentItem) :
117-
FieldTreeItem(index, data, field, parentItem), m_enumOptions(field->getOptions())
117+
EnumFieldTreeItem(UAVObjectField *field, int index, const QVariant &data) :
118+
FieldTreeItem(index, data, field), m_enumOptions(field->getOptions())
118119
{}
119120

120121
QString enumOptions(int index)
@@ -174,13 +175,13 @@ class EnumFieldTreeItem : public FieldTreeItem {
174175

175176
class IntFieldTreeItem : public FieldTreeItem {
176177
public:
177-
IntFieldTreeItem(UAVObjectField *field, int index, const QList<QVariant> &data, TreeItem *parentItem) :
178-
FieldTreeItem(index, data, field, parentItem)
178+
IntFieldTreeItem(UAVObjectField *field, int index, const QList<QVariant> &data) :
179+
FieldTreeItem(index, data, field)
179180
{
180181
setMinMaxValues();
181182
}
182-
IntFieldTreeItem(UAVObjectField *field, int index, const QVariant &data, TreeItem *parentItem) :
183-
FieldTreeItem(index, data, field, parentItem)
183+
IntFieldTreeItem(UAVObjectField *field, int index, const QVariant &data) :
184+
FieldTreeItem(index, data, field)
184185
{
185186
setMinMaxValues();
186187
}
@@ -259,11 +260,11 @@ class IntFieldTreeItem : public FieldTreeItem {
259260

260261
class FloatFieldTreeItem : public FieldTreeItem {
261262
public:
262-
FloatFieldTreeItem(UAVObjectField *field, int index, const QList<QVariant> &data, bool scientific, TreeItem *parentItem) :
263-
FieldTreeItem(index, data, field, parentItem), m_useScientificNotation(scientific) {}
263+
FloatFieldTreeItem(UAVObjectField *field, int index, const QList<QVariant> &data, const QSettings &settings) :
264+
FieldTreeItem(index, data, field), m_settings(settings) {}
264265

265-
FloatFieldTreeItem(UAVObjectField *field, int index, const QVariant &data, bool scientific, TreeItem *parentItem) :
266-
FieldTreeItem(index, data, field, parentItem), m_useScientificNotation(scientific) {}
266+
FloatFieldTreeItem(UAVObjectField *field, int index, const QVariant &data, const QSettings &settings) :
267+
FieldTreeItem(index, data, field), m_settings(settings) {}
267268

268269
QVariant fieldToData() const
269270
{
@@ -277,7 +278,9 @@ class FloatFieldTreeItem : public FieldTreeItem {
277278

278279
QWidget *createEditor(QWidget *parent) const
279280
{
280-
if (m_useScientificNotation) {
281+
bool useScientificNotation = m_settings.value("useScientificNotation", false).toBool();
282+
283+
if (useScientificNotation) {
281284
QScienceSpinBox *editor = new QScienceSpinBox(parent);
282285
editor->setDecimals(6);
283286
editor->setMinimum(-std::numeric_limits<float>::max());
@@ -294,7 +297,9 @@ class FloatFieldTreeItem : public FieldTreeItem {
294297

295298
QVariant getEditorValue(QWidget *editor) const
296299
{
297-
if (m_useScientificNotation) {
300+
bool useScientificNotation = m_settings.value("useScientificNotation", false).toBool();
301+
302+
if (useScientificNotation) {
298303
QScienceSpinBox *spinBox = static_cast<QScienceSpinBox *>(editor);
299304
spinBox->interpretText();
300305
return spinBox->value();
@@ -307,7 +312,9 @@ class FloatFieldTreeItem : public FieldTreeItem {
307312

308313
void setEditorValue(QWidget *editor, QVariant value) const
309314
{
310-
if (m_useScientificNotation) {
315+
bool useScientificNotation = m_settings.value("useScientificNotation", false).toBool();
316+
317+
if (useScientificNotation) {
311318
QScienceSpinBox *spinBox = static_cast<QScienceSpinBox *>(editor);
312319
spinBox->setValue(value.toDouble());
313320
} else {
@@ -317,17 +324,17 @@ class FloatFieldTreeItem : public FieldTreeItem {
317324
}
318325

319326
private:
320-
bool m_useScientificNotation;
327+
const QSettings &m_settings;
321328
};
322329

323330
class HexFieldTreeItem : public FieldTreeItem {
324331
public:
325-
HexFieldTreeItem(UAVObjectField *field, int index, const QList<QVariant> &data, TreeItem *parentItem) :
326-
FieldTreeItem(index, data, field, parentItem)
332+
HexFieldTreeItem(UAVObjectField *field, int index, const QList<QVariant> &data) :
333+
FieldTreeItem(index, data, field)
327334
{}
328335

329-
HexFieldTreeItem(UAVObjectField *field, int index, const QVariant &data, TreeItem *parentItem) :
330-
FieldTreeItem(index, data, field, parentItem)
336+
HexFieldTreeItem(UAVObjectField *field, int index, const QVariant &data) :
337+
FieldTreeItem(index, data, field)
331338
{}
332339

333340
QVariant fieldToData() const
@@ -382,12 +389,12 @@ class HexFieldTreeItem : public FieldTreeItem {
382389

383390
class CharFieldTreeItem : public FieldTreeItem {
384391
public:
385-
CharFieldTreeItem(UAVObjectField *field, int index, const QList<QVariant> &data, TreeItem *parentItem) :
386-
FieldTreeItem(index, data, field, parentItem)
392+
CharFieldTreeItem(UAVObjectField *field, int index, const QList<QVariant> &data) :
393+
FieldTreeItem(index, data, field)
387394
{}
388395

389-
CharFieldTreeItem(UAVObjectField *field, int index, const QVariant &data, TreeItem *parentItem) :
390-
FieldTreeItem(index, data, field, parentItem)
396+
CharFieldTreeItem(UAVObjectField *field, int index, const QVariant &data) :
397+
FieldTreeItem(index, data, field)
391398
{}
392399

393400
QVariant fieldToData() const

ground/gcs/src/plugins/uavobjectbrowser/treeitem.cpp

Lines changed: 91 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -144,16 +144,16 @@ void HighlightManager::checkItemsExpired()
144144

145145
int TreeItem::m_highlightTimeMs = 300;
146146

147-
TreeItem::TreeItem(const QList<QVariant> &data, TreeItem *parentItem) :
147+
TreeItem::TreeItem(const QList<QVariant> &data) :
148148
m_itemData(data),
149-
m_parentItem(parentItem),
149+
m_parentItem(0),
150150
m_changed(false),
151151
m_highlighted(false),
152152
m_highlightManager(0)
153153
{}
154154

155-
TreeItem::TreeItem(const QVariant &data, TreeItem *parentItem) :
156-
m_parentItem(parentItem),
155+
TreeItem::TreeItem(const QVariant &data) :
156+
m_parentItem(0),
157157
m_changed(false),
158158
m_highlighted(false),
159159
m_highlightManager(0)
@@ -166,16 +166,32 @@ TreeItem::~TreeItem()
166166
qDeleteAll(m_childItems);
167167
}
168168

169-
void TreeItem::appendChild(TreeItem *child)
169+
void TreeItem::setParentItem(TreeItem *parentItem)
170170
{
171-
m_childItems.append(child);
171+
if (m_parentItem) {
172+
m_parentItem->removeChild(this, false);
173+
}
174+
m_parentItem = parentItem;
175+
}
176+
177+
void TreeItem::appendChild(TreeItem *childItem)
178+
{
179+
m_childItems.append(childItem);
180+
childItem->setParentItem(this);
172181
}
173182

174-
void TreeItem::insertChild(TreeItem *child)
183+
void TreeItem::insertChild(TreeItem *childItem, int index)
175184
{
176-
int index = nameIndex(child->data(0).toString());
185+
m_childItems.insert(index, childItem);
186+
childItem->setParentItem(this);
187+
}
177188

178-
m_childItems.insert(index, child);
189+
void TreeItem::removeChild(TreeItem *childItem, bool reparent)
190+
{
191+
m_childItems.removeOne(childItem);
192+
if (reparent) {
193+
childItem->setParentItem(0);
194+
}
179195
}
180196

181197
TreeItem *TreeItem::child(int index) const
@@ -202,6 +218,16 @@ int TreeItem::columnCount() const
202218
return m_itemData.count();
203219
}
204220

221+
void TreeItem::setDescription(QString desc)
222+
{
223+
// Split around 40 characters
224+
int idx = desc.indexOf(" ", 40);
225+
226+
desc.insert(idx, QString("<br>"));
227+
desc.remove("@Ref", Qt::CaseInsensitive);
228+
m_description = desc;
229+
}
230+
205231
QVariant TreeItem::data(int column) const
206232
{
207233
return m_itemData.value(column);
@@ -270,6 +296,62 @@ QTime TreeItem::getHighlightExpires() const
270296
return m_highlightExpires;
271297
}
272298

299+
int TreeItem::childIndex(QString name) const
300+
{
301+
for (int i = 0; i < childCount(); ++i) {
302+
if (name == child(i)->data(0).toString()) {
303+
return i;
304+
}
305+
}
306+
return -1;
307+
}
308+
309+
TreeItem *TreeItem::childByName(QString name) const
310+
{
311+
int index = childIndex(name);
312+
313+
return (index >= 0) ? m_childItems[index] : 0;
314+
}
315+
316+
int TreeItem::insertionIndex(TreeItem *item) const
317+
{
318+
QString name = item->data(0).toString();
319+
320+
for (int i = 0; i < childCount(); ++i) {
321+
if (name < child(i)->data(0).toString()) {
322+
return i;
323+
}
324+
}
325+
return childCount();
326+
}
327+
328+
int TreeItem::maxHexStringLength(UAVObjectField::FieldType type)
329+
{
330+
switch (type) {
331+
case UAVObjectField::INT8:
332+
return 2;
333+
334+
case UAVObjectField::INT16:
335+
return 4;
336+
337+
case UAVObjectField::INT32:
338+
return 8;
339+
340+
case UAVObjectField::UINT8:
341+
return 2;
342+
343+
case UAVObjectField::UINT16:
344+
return 4;
345+
346+
case UAVObjectField::UINT32:
347+
return 8;
348+
349+
default:
350+
Q_ASSERT(false);
351+
}
352+
return 0;
353+
}
354+
273355
QVariant ArrayFieldTreeItem::data(int column) const
274356
{
275357
if (column == 1) {

0 commit comments

Comments
 (0)