1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2025-01-17 02:52:12 +01:00

PathAction editor: make easy selection of actions per waypoint

This commit is contained in:
Corvus Corax 2012-05-31 04:11:13 +02:00
parent df67a3e631
commit a2d6cb8314
5 changed files with 124 additions and 28 deletions

View File

@ -270,4 +270,58 @@ private:
UAVObjectField *m_field;
};
class ActionFieldTreeItem : public FieldTreeItem
{
Q_OBJECT
public:
ActionFieldTreeItem(UAVObjectField *field, int index, const QList<QVariant> &data, QStringList *actions,
TreeItem *parent = 0) :
FieldTreeItem(index, data, parent), m_field(field) { m_enumOptions=actions; }
ActionFieldTreeItem(UAVObjectField *field, int index, const QVariant &data, QStringList *actions,
TreeItem *parent = 0) :
FieldTreeItem(index, data, parent), m_field(field) { m_enumOptions=actions; }
void setData(QVariant value, int column) {
int tmpValIndex = m_field->getValue(m_index).toInt();
TreeItem::setData(value, column);
setChanged(tmpValIndex != value);
}
QString enumOptions(int index) {
if((index < 0) || (index >= m_enumOptions->length())) {
return QString("Invalid Value (") + QString().setNum(index) + QString(")");
}
return m_enumOptions->at(index);
}
void apply() {
int value = data(dataColumn).toInt();
m_field->setValue(value, m_index);
setChanged(false);
}
void update() {
int valIndex = m_field->getValue(m_index).toInt();
if (data() != valIndex || changed()) {
TreeItem::setData(valIndex);
setHighlight(true);
}
}
QWidget *createEditor(QWidget *parent) {
QComboBox *editor = new QComboBox(parent);
foreach (QString option, *m_enumOptions)
editor->addItem(option);
return editor;
}
QVariant getEditorValue(QWidget *editor) {
QComboBox *comboBox = static_cast<QComboBox*>(editor);
return comboBox->currentIndex();
}
void setEditorValue(QWidget *editor, QVariant value) {
QComboBox *comboBox = static_cast<QComboBox*>(editor);
comboBox->setCurrentIndex(value.toInt());
}
private:
QStringList *m_enumOptions;
UAVObjectField *m_field;
};
#endif // FIELDTREEITEM_H

View File

@ -23,6 +23,7 @@ SOURCES += treeitem.cpp
SOURCES += fieldtreeitem.cpp
SOURCES += browseritemdelegate.cpp
OTHER_FILES += pathactioneditor.pluginspec
FORMS += pathactioneditor.ui

View File

@ -45,6 +45,7 @@ PathActionEditorGadgetWidget::PathActionEditorGadgetWidget(QWidget *parent) : QL
m_model = new PathActionEditorTreeModel();
m_pathactioneditor->pathactions->setModel(m_model);
m_pathactioneditor->pathactions->setColumnWidth(0, 300);
m_pathactioneditor->pathactions->setColumnWidth(1, 500);
m_pathactioneditor->pathactions->expandAll();
BrowserItemDelegate *m_delegate = new BrowserItemDelegate();
m_pathactioneditor->pathactions->setItemDelegate(m_delegate);

View File

@ -48,12 +48,14 @@ PathActionEditorTreeModel::PathActionEditorTreeModel(QObject *parent) :
m_manuallyChangedColor(QColor(230, 230, 255))
{
ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
UAVObjectManager *objManager = pm->getObject<UAVObjectManager>();
m_objManager = pm->getObject<UAVObjectManager>();
connect(objManager, SIGNAL(newInstance(UAVObject*)), this, SLOT(newInstance(UAVObject*)));
connect(objManager->getObject("WaypointActive"),SIGNAL(objectUpdated(UAVObject*)), this, SLOT(objUpdated(UAVObject*)));
connect(m_objManager, SIGNAL(newInstance(UAVObject*)), this, SLOT(newInstance(UAVObject*)));
connect(m_objManager->getObject("WaypointActive"),SIGNAL(objectUpdated(UAVObject*)), this, SLOT(objUpdated(UAVObject*)));
connect(m_objManager->getObject("PathAction"),SIGNAL(objectUpdated(UAVObject*)), this, SLOT(objUpdated(UAVObject*)));
connect(m_objManager->getObject("Waypoint"),SIGNAL(objectUpdated(UAVObject*)), this, SLOT(objUpdated(UAVObject*)));
setupModelData(objManager);
setupModelData();
}
PathActionEditorTreeModel::~PathActionEditorTreeModel()
@ -61,8 +63,12 @@ PathActionEditorTreeModel::~PathActionEditorTreeModel()
delete m_rootItem;
}
void PathActionEditorTreeModel::setupModelData(UAVObjectManager *objManager)
void PathActionEditorTreeModel::setupModelData()
{
m_actions = new QStringList();
updateActions();
// root
QList<QVariant> rootData;
rootData << tr("Property") << tr("Value") << tr("Unit");
@ -77,19 +83,36 @@ void PathActionEditorTreeModel::setupModelData(UAVObjectManager *objManager)
connect(m_waypointsTree, SIGNAL(updateHighlight(TreeItem*)), this, SLOT(updateHighlight(TreeItem*)));
{
QList<UAVObject*> list = objManager->getObjectInstances("PathAction");
QList<UAVObject*> list = m_objManager->getObjectInstances("PathAction");
foreach (UAVObject* obj, list) {
addInstance(obj,m_pathactionsTree);
}
}
{
QList<UAVObject*> list = objManager->getObjectInstances("Waypoint");
QList<UAVObject*> list = m_objManager->getObjectInstances("Waypoint");
foreach (UAVObject* obj, list) {
addInstance(obj,m_waypointsTree);
}
}
}
void PathActionEditorTreeModel::updateActions() {
m_actions->clear();
QList<UAVObject*> list = m_objManager->getObjectInstances("PathAction");
foreach (UAVObject* obj, list) {
QString title;
title.append((QVariant(obj->getInstID()).toString()));
title.append(" ");
title.append((obj->getField("Mode")->getValue().toString()));
title.append(" ");
title.append((obj->getField("Command")->getValue().toString()));
title.append(":");
title.append((obj->getField("EndCondition")->getValue().toString()));
title.append(" ");
m_actions->append(title);
}
}
void PathActionEditorTreeModel::addInstance(UAVObject *obj, TreeItem *parent)
{
connect(obj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(highlightUpdatedObject(UAVObject*)));
@ -128,6 +151,12 @@ void PathActionEditorTreeModel::addSingleField(int index, UAVObjectField *field,
FieldTreeItem *item;
UAVObjectField::FieldType type = field->getType();
// hack: list available actions in an enum
if (field->getName().compare("Action")==0 && type==UAVObjectField::UINT8) {
data.append( field->getValue(index).toInt());
data.append( field->getUnits());
item = new ActionFieldTreeItem(field, index, data, m_actions);
} else {
switch (type) {
case UAVObjectField::ENUM: {
QStringList options = field->getOptions();
@ -155,6 +184,7 @@ void PathActionEditorTreeModel::addSingleField(int index, UAVObjectField *field,
default:
Q_ASSERT(false);
}
}
connect(item, SIGNAL(updateHighlight(TreeItem*)), this, SLOT(updateHighlight(TreeItem*)));
parent->appendChild(item);
}
@ -272,7 +302,13 @@ QVariant PathActionEditorTreeModel::data(const QModelIndex &index, int role) con
if (fieldItem) {
int enumIndex = fieldItem->data(index.column()).toInt();
return fieldItem->enumOptions(enumIndex);
}
} else {
ActionFieldTreeItem *afieldItem = dynamic_cast<ActionFieldTreeItem*>(item);
if (afieldItem) {
int enumIndex = afieldItem->data(index.column()).toInt();
return afieldItem->enumOptions(enumIndex);
}
}
}
return item->data(index.column());
@ -356,32 +392,32 @@ void PathActionEditorTreeModel::newInstance(UAVObject *obj)
addInstance(obj,m_pathactionsTree);
m_pathactionsTree->update();
}
updateActions();
emit layoutChanged();
}
void PathActionEditorTreeModel::objUpdated(UAVObject *obj)
{
if (obj->getName().compare("WaypointActive")==0) {
qint16 index = obj->getField("Index")->getValue().toInt();
qint16 action;
foreach (TreeItem *child,m_waypointsTree->treeChildren()) {
ObjectTreeItem *objItem = dynamic_cast<ObjectTreeItem*>(child);
if (index == objItem->object()->getInstID()) {
child->setActive(true);
action = objItem->object()->getField("Action")->getValue().toInt();
} else {
child->setActive(false);
}
}
foreach (TreeItem *child,m_pathactionsTree->treeChildren()) {
ObjectTreeItem *objItem = dynamic_cast<ObjectTreeItem*>(child);
if (action == objItem->object()->getInstID()) {
child->setActive(true);
} else {
child->setActive(false);
}
quint16 index = m_objManager->getObject("WaypointActive")->getField("Index")->getValue().toInt();
quint16 action;
foreach (TreeItem *child,m_waypointsTree->treeChildren()) {
ObjectTreeItem *objItem = dynamic_cast<ObjectTreeItem*>(child);
if (index == objItem->object()->getInstID()) {
child->setActive(true);
action = objItem->object()->getField("Action")->getValue().toInt();
} else {
child->setActive(false);
}
}
foreach (TreeItem *child,m_pathactionsTree->treeChildren()) {
ObjectTreeItem *objItem = dynamic_cast<ObjectTreeItem*>(child);
if (action == objItem->object()->getInstID()) {
child->setActive(true);
} else {
child->setActive(false);
}
}
updateActions();
emit layoutChanged();
}

View File

@ -82,7 +82,11 @@ private:
void addSingleField(int index, UAVObjectField *field, TreeItem *parent);
void addInstance(UAVObject *obj, TreeItem *parent);
//QString updateMode(quint8 updateMode);
void setupModelData(UAVObjectManager *objManager);
void setupModelData();
void updateActions();
UAVObjectManager *m_objManager;
QStringList *m_actions;
TreeItem *m_rootItem;
TopTreeItem *m_pathactionsTree;