1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2025-02-20 10:54:14 +01:00

OP-9 GCS/uavobjectbrowser: Support updates.

git-svn-id: svn://svn.openpilot.org/OpenPilot/trunk@502 ebee16cc-31ac-478f-84a7-5cbb03baadba
This commit is contained in:
ephy 2010-04-15 10:42:01 +00:00 committed by ephy
parent bd853085c8
commit 412fb3abc3
7 changed files with 266 additions and 87 deletions

View File

@ -30,13 +30,15 @@
TreeItem::TreeItem(const QList<QVariant> &data, TreeItem *parent) :
m_data(data),
m_parent(parent),
m_highlight(false)
m_highlight(false),
m_changed(false)
{
}
TreeItem::TreeItem(const QVariant &data, TreeItem *parent) :
m_parent(parent),
m_highlight(false)
m_highlight(false),
m_changed(false)
{
m_data << data << "" << "";
}

View File

@ -60,13 +60,13 @@ class TreeItem
public:
TreeItem(const QList<QVariant> &data, TreeItem *parent = 0);
TreeItem(const QVariant &data, TreeItem *parent = 0);
~TreeItem();
virtual ~TreeItem();
void appendChild(TreeItem *child);
void insert(int index, TreeItem *child);
TreeItem *child(int row);
QList<TreeItem*> children() const { return m_children; }
inline QList<TreeItem*> children() const { return m_children; }
int childCount() const;
int columnCount() const;
QVariant data(int column = 1) const;
@ -78,11 +78,17 @@ class TreeItem
void setParent(TreeItem *parent) { m_parent = parent; }
inline virtual bool isEditable() { return false; }
virtual void update() {
foreach(TreeItem *child, m_children)
foreach(TreeItem *child, children())
child->update();
}
virtual void setHighlight(bool highlight) { m_highlight = highlight; }
inline virtual bool highlight() { return m_highlight; }
virtual void apply() {
foreach(TreeItem *child, children())
child->apply();
}
inline bool highlighted() { return m_highlight; }
inline void setHighlight(bool highlight) { m_highlight = highlight; m_changed = false; }
inline bool changed() { return m_changed; }
inline void setChanged(bool changed) { m_changed = changed; }
private:
QList<TreeItem*> m_children;
@ -90,6 +96,9 @@ class TreeItem
QList<QVariant> m_data;
TreeItem *m_parent;
bool m_highlight;
bool m_changed;
public:
static const int dataColumn = 1;
};
class TopTreeItem : public TreeItem
@ -113,12 +122,12 @@ private:
QList<quint32> m_objIds;
};
class DataObjectTreeItem : public TreeItem
class ObjectTreeItem : public TreeItem
{
public:
DataObjectTreeItem(const QList<QVariant> &data, TreeItem *parent = 0) :
ObjectTreeItem(const QList<QVariant> &data, TreeItem *parent = 0) :
TreeItem(data, parent), m_obj(0) { }
DataObjectTreeItem(const QVariant &data, TreeItem *parent = 0) :
ObjectTreeItem(const QVariant &data, TreeItem *parent = 0) :
TreeItem(data, parent), m_obj(0) { }
void setObject(UAVObject *obj) { m_obj = obj; }
inline UAVObject *object() { return m_obj; }
@ -126,12 +135,36 @@ private:
UAVObject *m_obj;
};
class MetaObjectTreeItem : public TreeItem
class MetaObjectTreeItem : public ObjectTreeItem
{
public:
MetaObjectTreeItem(const QList<QVariant> &data, TreeItem *parent = 0) : TreeItem(data, parent) { }
MetaObjectTreeItem(const QVariant &data, TreeItem *parent = 0) : TreeItem(data, parent) { }
void update() { }
MetaObjectTreeItem(UAVObject *obj, const QList<QVariant> &data, TreeItem *parent = 0) :
ObjectTreeItem(data, parent) { setObject(obj); }
MetaObjectTreeItem(UAVObject *obj, const QVariant &data, TreeItem *parent = 0) :
ObjectTreeItem(data, parent) { setObject(obj); }
};
class DataObjectTreeItem : public ObjectTreeItem
{
public:
DataObjectTreeItem(const QList<QVariant> &data, TreeItem *parent = 0) :
ObjectTreeItem(data, parent) { }
DataObjectTreeItem(const QVariant &data, TreeItem *parent = 0) :
ObjectTreeItem(data, parent) { }
virtual void apply() {
foreach(TreeItem *child, children()) {
MetaObjectTreeItem *metaChild = dynamic_cast<MetaObjectTreeItem*>(child);
if (!metaChild)
child->apply();
}
}
virtual void update() {
foreach(TreeItem *child, children()) {
MetaObjectTreeItem *metaChild = dynamic_cast<MetaObjectTreeItem*>(child);
if (!metaChild)
child->update();
}
}
};
class InstanceTreeItem : public DataObjectTreeItem
@ -141,6 +174,8 @@ public:
DataObjectTreeItem(data, parent) { setObject(obj); }
InstanceTreeItem(UAVObject *obj, const QVariant &data, TreeItem *parent = 0) :
DataObjectTreeItem(data, parent) { setObject(obj); }
virtual void apply() { TreeItem::apply(); }
virtual void update() { TreeItem::update(); }
};
class ArrayFieldTreeItem : public TreeItem
@ -154,20 +189,16 @@ class FieldTreeItem : public TreeItem
{
public:
FieldTreeItem(int index, const QList<QVariant> &data, TreeItem *parent = 0) :
TreeItem(data, parent), m_index(index), m_changed(false) { }
TreeItem(data, parent), m_index(index) { }
FieldTreeItem(int index, const QVariant &data, TreeItem *parent = 0) :
TreeItem(data, parent), m_index(index), m_changed(false) { }
TreeItem(data, parent), m_index(index) { }
bool isEditable() { return true; }
bool isChanged() { return m_changed; }
void setChanged(bool changed) { m_changed = changed; }
virtual bool isIntType() { return false; }
virtual bool isEnum() { return false; }
virtual bool isFloatType() { return false; }
virtual void apply(int column) { }
virtual void apply() { }
protected:
int m_index;
private:
bool m_changed;
};
class EnumFieldTreeItem : public FieldTreeItem
@ -182,16 +213,15 @@ public:
void setData(QVariant value, int column) {
setChanged(m_field->getSelectedIndex(m_index) != value);
TreeItem::setData(value, column);
apply(column);
}
void apply(int column) {
int value = data(column).toInt();
void apply() {
int value = data(dataColumn).toInt();
m_field->setSelectedIndex(value, m_index);
setChanged(false);
}
void update() {
int value = m_field->getSelectedIndex(m_index);
if (data() != value) {
if (data() != value || changed()) {
setHighlight(true);
TreeItem::setData(value);
} else {
@ -228,8 +258,18 @@ public:
setChanged(m_field->getValue(m_index) != value);
TreeItem::setData(value, column);
}
void apply(int column) {
m_field->setValue(data(column).toInt());
void apply() {
m_field->setValue(data(dataColumn).toInt());
setChanged(false);
}
void update() {
int value = m_field->getValue(m_index);
if (data() != value || changed()) {
setHighlight(true);
TreeItem::setData(value);
} else {
setHighlight(false);
}
}
private:
UAVObjectFieldInt8 *m_field;
@ -246,8 +286,18 @@ public:
setChanged(m_field->getValue(m_index) != value);
TreeItem::setData(value, column);
}
void apply(int column) {
m_field->setValue(data(column).toInt());
void apply() {
m_field->setValue(data(dataColumn).toInt());
setChanged(false);
}
void update() {
int value = m_field->getValue(m_index);
if (data() != value || changed()) {
setHighlight(true);
TreeItem::setData(value);
} else {
setHighlight(false);
}
}
private:
UAVObjectFieldInt16 *m_field;
@ -264,9 +314,18 @@ public:
setChanged(m_field->getValue(m_index) != value);
TreeItem::setData(value, column);
}
void apply(int column) {
int value = data(column).toInt();
m_field->setValue(value);
void apply() {
m_field->setValue(data(dataColumn).toInt());
setChanged(false);
}
void update() {
int value = m_field->getValue(m_index);
if (data() != value || changed()) {
setHighlight(true);
TreeItem::setData(value);
} else {
setHighlight(false);
}
}
private:
UAVObjectFieldInt32 *m_field;
@ -283,8 +342,18 @@ public:
setChanged(m_field->getValue(m_index) != value);
TreeItem::setData(value, column);
}
void apply(int column) {
m_field->setValue(data(column).toInt());
void apply() {
m_field->setValue(data(dataColumn).toInt());
setChanged(false);
}
void update() {
int value = m_field->getValue(m_index);
if (data() != value || changed()) {
setHighlight(true);
TreeItem::setData(value);
} else {
setHighlight(false);
}
}
private:
UAVObjectFieldUInt8 *m_field;
@ -301,8 +370,18 @@ public:
setChanged(m_field->getValue(m_index) != value);
TreeItem::setData(value, column);
}
void apply(int column) {
m_field->setValue(data(column).toInt());
void apply() {
m_field->setValue(data(dataColumn).toInt());
setChanged(false);
}
void update() {
int value = m_field->getValue(m_index);
if (data() != value || changed()) {
setHighlight(true);
TreeItem::setData(value);
} else {
setHighlight(false);
}
}
private:
UAVObjectFieldUInt16 *m_field;
@ -319,8 +398,18 @@ public:
setChanged(m_field->getValue(m_index) != value);
TreeItem::setData(value, column);
}
void apply(int column) {
m_field->setValue(data(column).toInt());
void apply() {
m_field->setValue(data(dataColumn).toInt());
setChanged(false);
}
void update() {
int value = m_field->getValue(m_index);
if (data() != value || changed()) {
setHighlight(true);
TreeItem::setData(value);
} else {
setHighlight(false);
}
}
private:
UAVObjectFieldUInt32 *m_field;
@ -339,8 +428,18 @@ public:
setChanged(m_field->getValue(m_index) != value);
TreeItem::setData(value, column);
}
void apply(int column) {
m_field->setValue(data(column).toDouble(), m_index);
void apply() {
m_field->setValue(data(dataColumn).toDouble(), m_index);
setChanged(false);
}
void update() {
double value = m_field->getValue(m_index);
if (data() != value || changed()) {
setHighlight(true);
TreeItem::setData(value);
} else {
setHighlight(false);
}
}
private:
UAVObjectFieldFloat *m_field;

View File

@ -27,6 +27,7 @@
#include "uavobjectbrowserwidget.h"
#include "uavobjecttreemodel.h"
#include "browseritemdelegate.h"
#include "treeitem.h"
#include "ui_uavobjectbrowser.h"
#include "uavobjects/uavobjectmanager.h"
#include <QStringList>
@ -51,9 +52,13 @@ UAVObjectBrowserWidget::UAVObjectBrowserWidget(QWidget *parent) : QWidget(parent
m_browser->treeView->setEditTriggers(QAbstractItemView::AllEditTriggers);
m_browser->treeView->setSelectionBehavior(QAbstractItemView::SelectItems);
showMetaData(m_browser->metaCheckBox->isChecked());
connect(m_browser->treeView->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), this, SLOT(currentChanged(QModelIndex,QModelIndex)));
connect(m_browser->metaCheckBox, SIGNAL(toggled(bool)), this, SLOT(showMetaData(bool)));
connect(m_browser->saveSDButton, SIGNAL(clicked()), this, SLOT(saveSettings()));
connect(m_browser->readSDButton, SIGNAL(clicked()), this, SLOT(readSettings()));
connect(m_browser->sendButton, SIGNAL(clicked()), this, SLOT(sendUpdate()));
connect(m_browser->requestButton, SIGNAL(clicked()), this, SLOT(requestUpdate()));
enableSendRequest(false);
}
UAVObjectBrowserWidget::~UAVObjectBrowserWidget()
@ -75,12 +80,35 @@ void UAVObjectBrowserWidget::showMetaData(bool show)
void UAVObjectBrowserWidget::sendUpdate()
{
ObjectTreeItem *objItem = findCurrentObjectTreeItem();
Q_ASSERT(objItem);
objItem->apply();
UAVObject *obj = objItem->object();
Q_ASSERT(obj);
obj->updated();
}
void UAVObjectBrowserWidget::requestUpdate()
{
ObjectTreeItem *objItem = findCurrentObjectTreeItem();
Q_ASSERT(objItem);
UAVObject *obj = objItem->object();
Q_ASSERT(obj);
obj->requestUpdate();
}
ObjectTreeItem *UAVObjectBrowserWidget::findCurrentObjectTreeItem()
{
QModelIndex current = m_browser->treeView->currentIndex();
TreeItem *item = static_cast<TreeItem*>(current.internalPointer());
ObjectTreeItem *objItem = 0;
while (item) {
objItem = dynamic_cast<ObjectTreeItem*>(item);
if (objItem)
break;
item = item->parent();
}
return objItem;
}
void UAVObjectBrowserWidget::saveSettings()
@ -107,3 +135,23 @@ void UAVObjectBrowserWidget::updateSettings(SettingsPersistence::OperationEnum o
}
}
void UAVObjectBrowserWidget::currentChanged(const QModelIndex &current, const QModelIndex &previous)
{
TreeItem *item = static_cast<TreeItem*>(current.internalPointer());
bool enable = true;
if (current == QModelIndex())
enable = false;
TopTreeItem *top = dynamic_cast<TopTreeItem*>(item);
ObjectTreeItem *data = dynamic_cast<ObjectTreeItem*>(item);
if (top || (data && !data->object()))
enable = false;
enableSendRequest(enable);
}
void UAVObjectBrowserWidget::enableSendRequest(bool enable)
{
m_browser->sendButton->setEnabled(enable);
m_browser->requestButton->setEnabled(enable);
}

View File

@ -33,6 +33,7 @@
#include "uavobjects/settingspersistence.h"
class QPushButton;
class ObjectTreeItem;
class Ui_UAVObjectBrowser;
@ -42,23 +43,26 @@ class UAVObjectBrowserWidget : public QWidget
public:
UAVObjectBrowserWidget(QWidget *parent = 0);
~UAVObjectBrowserWidget();
~UAVObjectBrowserWidget();
private slots:
void sendUpdate();
void requestUpdate();
void showMetaData(bool show);
void saveSettings();
void readSettings();
void sendUpdate();
void requestUpdate();
void showMetaData(bool show);
void saveSettings();
void readSettings();
void currentChanged(const QModelIndex &current, const QModelIndex &previous);
private:
QPushButton *m_requestUpdate;
QPushButton *m_sendUpdate;
Ui_UAVObjectBrowser *m_browser;
QAbstractItemModel *m_model;
QPushButton *m_requestUpdate;
QPushButton *m_sendUpdate;
Ui_UAVObjectBrowser *m_browser;
QAbstractItemModel *m_model;
void updateSettings(SettingsPersistence::OperationEnum op);
void updateSettings(SettingsPersistence::OperationEnum op);
void enableSendRequest(bool enable);
ObjectTreeItem *findCurrentObjectTreeItem();
};
#endif /* UAVOBJECTBROWSERWIDGET_H_ */

View File

@ -33,6 +33,7 @@
#include "uavobjects/uavobjectfields.h"
#include "extensionsystem/pluginmanager.h"
#include <QtGui/QColor>
//#include <QtGui/QIcon>
#include <QtCore/QTimer>
#include <QtCore/QSignalMapper>
#include <QtCore/QDebug>
@ -100,7 +101,8 @@ void UAVObjectTreeModel::addDataObject(UAVDataObject *obj)
void UAVObjectTreeModel::addMetaObject(UAVMetaObject *obj, TreeItem *parent)
{
MetaObjectTreeItem *meta = new MetaObjectTreeItem(tr("Meta Data"));
connect(obj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(highlightUpdatedObject(UAVObject*)));
MetaObjectTreeItem *meta = new MetaObjectTreeItem(obj, tr("Meta Data"));
foreach (UAVObjectField *field, obj->getFields()) {
if (field->getNumElements() > 1) {
addArrayField(field, meta);
@ -265,19 +267,21 @@ QVariant UAVObjectTreeModel::data(const QModelIndex &index, int role) const
TreeItem *item = static_cast<TreeItem*>(index.internalPointer());
return item->data(index.column());
}
// if (role == Qt::DecorationRole)
// return QIcon(":/core/images/openpilot_logo_128.png");
TreeItem *item = static_cast<TreeItem*>(index.internalPointer());
if (index.column() == 0 && role == Qt::BackgroundRole) {
DataObjectTreeItem *dataItem = dynamic_cast<DataObjectTreeItem*>(item);
if (dataItem && dataItem->highlight())
ObjectTreeItem *objItem = dynamic_cast<ObjectTreeItem*>(item);
if (objItem && objItem->highlighted())
return QVariant(m_recentlyUpdatedColor);
}
if (index.column() == 1 && role == Qt::BackgroundRole) {
FieldTreeItem *fieldItem = dynamic_cast<FieldTreeItem*>(item);
if (fieldItem && fieldItem->highlight())
if (fieldItem && fieldItem->highlighted())
return QVariant(m_recentlyUpdatedColor);
if (fieldItem && fieldItem->isChanged())
if (fieldItem && fieldItem->changed())
return QVariant(m_manuallyChangedColor);
}
@ -326,17 +330,14 @@ QVariant UAVObjectTreeModel::headerData(int section, Qt::Orientation orientation
return QVariant();
}
void UAVObjectTreeModel::highlightUpdatedObject(UAVObject *object)
void UAVObjectTreeModel::highlightUpdatedObject(UAVObject *obj)
{
UAVDataObject *obj = qobject_cast<UAVDataObject*>(object);
if (!obj)
return;
DataObjectTreeItem * dobj = findDataObjectTreeItem(obj);
if (dobj) {
dobj->setHighlight(true);
dobj->update();
emit dataChanged(QModelIndex(), QModelIndex());
}
Q_ASSERT(obj);
ObjectTreeItem *item = findObjectTreeItem(obj);
Q_ASSERT(item);
item->setHighlight(true);
item->update();
emit dataChanged(QModelIndex(), QModelIndex());
// any updates while highlighted will not reset timer
if (m_timerMap.contains(obj))
@ -353,35 +354,58 @@ void UAVObjectTreeModel::highlightUpdatedObject(UAVObject *object)
void UAVObjectTreeModel::resetHighlightObject(QObject *object)
{
UAVDataObject *obj = qobject_cast<UAVDataObject*>(object);
if (!obj)
return;
UAVObject *obj = qobject_cast<UAVObject*>(object);
Q_ASSERT(obj);
QTimer *timer = m_timerMap.value(obj);
Q_ASSERT(timer);
delete timer;
m_timerMap.remove(obj);
DataObjectTreeItem * dobj = findDataObjectTreeItem(obj);
if (dobj) {
dobj->setHighlight(false);
dobj->update();
emit dataChanged(QModelIndex(), QModelIndex());
}
ObjectTreeItem *item = findObjectTreeItem(obj);
Q_ASSERT(item);
item->setHighlight(false);
item->update();
emit dataChanged(QModelIndex(), QModelIndex());
}
DataObjectTreeItem *UAVObjectTreeModel::findDataObjectTreeItem(UAVDataObject *obj)
ObjectTreeItem *UAVObjectTreeModel::findObjectTreeItem(UAVObject *object)
{
TopTreeItem *root = obj->isSettings() ? m_settingsTree : m_nonSettingsTree;
UAVDataObject *dobj = qobject_cast<UAVDataObject*>(object);
UAVMetaObject *mobj = qobject_cast<UAVMetaObject*>(object);
Q_ASSERT(dobj || mobj);
if (dobj) {
return findDataObjectTreeItem(dobj);
} else {
dobj = qobject_cast<UAVDataObject*>(mobj->getParentObject());
Q_ASSERT(dobj);
DataObjectTreeItem *dItem = findDataObjectTreeItem(dobj);
foreach (TreeItem *child, dItem->children()) {
MetaObjectTreeItem *mItem = dynamic_cast<MetaObjectTreeItem*>(child);
if (mItem && mItem->object()) {
Q_ASSERT(mItem->object() == mobj);
return mItem;
}
}
}
return 0;
}
DataObjectTreeItem *UAVObjectTreeModel::findDataObjectTreeItem(UAVDataObject *object)
{
Q_ASSERT(object);
TopTreeItem *root = object->isSettings() ? m_settingsTree : m_nonSettingsTree;
foreach (TreeItem *child, root->children()) {
DataObjectTreeItem *dobj = dynamic_cast<DataObjectTreeItem*>(child);
if (dobj && dobj->object() && dobj->object()->isSingleInstance()) {
if(dobj->object() == obj) {
return dobj;
DataObjectTreeItem *dItem = dynamic_cast<DataObjectTreeItem*>(child);
if (dItem && dItem->object() && dItem->object()->isSingleInstance()) {
if(dItem->object() == object) {
return dItem;
}
} else {
foreach (TreeItem *c, dobj->children()) {
foreach (TreeItem *c, dItem->children()) {
DataObjectTreeItem *d = dynamic_cast<DataObjectTreeItem*>(c);
if (d && d->object() == obj)
return dobj;
if (d && d->object() == object)
return dItem;
}
}
}

View File

@ -34,6 +34,7 @@
class TreeItem;
class TopTreeItem;
class ObjectTreeItem;
class DataObjectTreeItem;
class UAVObject;
class UAVDataObject;
@ -80,6 +81,7 @@ private:
void addInstance(UAVObject *obj, TreeItem *parent);
QString updateMode(quint8 updateMode);
void setupModelData(UAVObjectManager *objManager);
ObjectTreeItem *findObjectTreeItem(UAVObject *obj);
DataObjectTreeItem *findDataObjectTreeItem(UAVDataObject *obj);
TreeItem *m_rootItem;

View File

@ -79,8 +79,8 @@ void UAVObject::initializeFields(QList<UAVObjectField*>& fields, quint8* data, q
*/
void UAVObject::fieldUpdated(UAVObjectField* field)
{
emit objectUpdatedAuto(this); // trigger object updated event
emit objectUpdated(this);
// emit objectUpdatedAuto(this); // trigger object updated event
// emit objectUpdated(this);
}
/**