1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2025-03-15 07:29:15 +01:00

OP-984 Adding support for multiple bindings per widget.

This commit is contained in:
Fredrik Arvidsson 2014-01-06 11:54:34 +01:00
parent b97c410e37
commit c24753603a
2 changed files with 105 additions and 91 deletions

View File

@ -58,13 +58,13 @@ void ConfigTaskWidget::addUAVObject(UAVObject *objectName, QList<int> *reloadGro
addUAVObject(objectName ? objectName->getName() : QString(""), reloadGroups);
}
int ConfigTaskWidget::fieldIndexFromElementName(QString objectName, QString fieldName, QString elementName) {
if(elementName.isEmpty()) {
int ConfigTaskWidget::fieldIndexFromElementName(QString objectName, QString fieldName, QString elementName)
{
if (elementName.isEmpty()) {
return 0;
}
UAVObject *object = getObject(objectName);
UAVObject *object = getObject(objectName);
Q_ASSERT(object);
UAVObjectField *field = object->getField(fieldName);
@ -84,34 +84,34 @@ void ConfigTaskWidget::addWidgetBinding(UAVObject *object, UAVObjectField *field
}
void ConfigTaskWidget::addWidgetBinding(QString objectName, QString fieldName, QWidget *widget, QString elementName, double scale,
bool isLimited, QList<int> *reloadGroups, quint32 instID)
bool isLimited, QList<int> *reloadGroupIDs, quint32 instID)
{
addWidgetBinding(objectName, fieldName, widget, fieldIndexFromElementName(objectName, fieldName, elementName),
scale, isLimited, reloadGroups, instID);
scale, isLimited, reloadGroupIDs, instID);
}
void ConfigTaskWidget::addWidgetBinding(UAVObject *object, UAVObjectField *field, QWidget *widget, QString elementName, double scale,
bool isLimited, QList<int> *reloadGroups, quint32 instID)
bool isLimited, QList<int> *reloadGroupIDs, quint32 instID)
{
addWidgetBinding(object ? object->getName() : QString(""), field ? field->getName() : QString(""), widget, elementName, scale,
isLimited, reloadGroups, instID);
isLimited, reloadGroupIDs, instID);
}
void ConfigTaskWidget::addWidgetBinding(UAVObject *object, UAVObjectField *field, QWidget *widget, int index, double scale,
bool isLimited, QList<int> *reloadGroups, quint32 instID)
bool isLimited, QList<int> *reloadGroupIDs, quint32 instID)
{
addWidgetBinding(object ? object->getName() : QString(""), field ? field->getName() : QString(""), widget, index, scale,
isLimited, reloadGroups, instID);
isLimited, reloadGroupIDs, instID);
}
void ConfigTaskWidget::addWidgetBinding(QString objectName, QString fieldName, QWidget *widget, int index, double scale,
bool isLimited, QList<int> *reloadGroups, quint32 instID)
bool isLimited, QList<int> *reloadGroupIDs, quint32 instID)
{
if (addShadowWidgetBinding(objectName, fieldName, widget, index, scale, isLimited, reloadGroups, instID)) {
if (addShadowWidgetBinding(objectName, fieldName, widget, index, scale, isLimited, reloadGroupIDs, instID)) {
return;
}
UAVObject *object = NULL;
UAVObject *object = NULL;
UAVObjectField *field = NULL;
if (!objectName.isEmpty()) {
object = getObject(QString(objectName), instID);
@ -126,29 +126,27 @@ void ConfigTaskWidget::addWidgetBinding(QString objectName, QString fieldName, Q
}
WidgetBinding *binding = new WidgetBinding(widget, object, field, index, scale, isLimited);
m_widgetBindings.append(binding);
m_widgetBindingsPerWidget.insert(widget, binding);
if (object && m_saveButton) {
m_saveButton->addObject((UAVDataObject *)object);
if (object) {
m_widgetBindingsPerObject.insert(object, binding);
if(m_saveButton) {
m_saveButton->addObject((UAVDataObject *)object);
}
}
if (!widget) {
if (reloadGroups && object) {
foreach(int i, *reloadGroups) {
if (this->m_reloadGroups.contains(i)) {
this->m_reloadGroups.value(i)->append(binding);
} else {
this->m_reloadGroups.insert(i, new QList<WidgetBinding *>());
this->m_reloadGroups.value(i)->append(binding);
}
if (reloadGroupIDs && object) {
foreach(int groupId, *reloadGroupIDs) {
m_reloadGroups.insert(groupId, binding);
}
}
} else {
connectWidgetUpdatesToSlot(widget, SLOT(widgetsContentsChanged()));
if (reloadGroups) {
addWidgetToReloadGroups(widget, reloadGroups);
if (reloadGroupIDs) {
addWidgetToReloadGroups(widget, reloadGroupIDs);
}
m_shadowBindings.insert(widget, binding);
loadWidgetLimits(widget, field, index, isLimited, scale);
}
}
@ -158,12 +156,7 @@ ConfigTaskWidget::~ConfigTaskWidget()
if (m_saveButton) {
delete m_saveButton;
}
foreach(QList<WidgetBinding *> *reloadGroup, m_reloadGroups.values()) {
if (reloadGroup) {
delete reloadGroup;
}
}
foreach(WidgetBinding * binding, m_widgetBindings) {
foreach(WidgetBinding * binding, m_widgetBindingsPerWidget) {
if (binding) {
delete binding;
}
@ -242,7 +235,10 @@ void ConfigTaskWidget::onAutopilotConnect()
}
invalidateObjects();
m_isConnected = true;
foreach(WidgetBinding * binding, m_widgetBindings) {
foreach(WidgetBinding * binding, m_widgetBindingsPerWidget) {
if(!binding->isEnabled()) {
continue;
}
loadWidgetLimits(binding->widget(), binding->field(), binding->index(), binding->isLimited(), binding->scale());
}
setDirty(false);
@ -255,8 +251,8 @@ void ConfigTaskWidget::populateWidgets()
bool dirtyBack = m_isDirty;
emit populateWidgetsRequested();
foreach(WidgetBinding * binding, m_widgetBindings) {
if (binding->object() != NULL && binding->field() != NULL && binding->widget() != NULL) {
foreach(WidgetBinding * binding, m_widgetBindingsPerWidget) {
if (binding->isEnabled() && binding->object() != NULL && binding->field() != NULL && binding->widget() != NULL) {
setWidgetFromField(binding->widget(), binding->field(), binding->index(), binding->scale(), binding->isLimited());
}
}
@ -271,8 +267,8 @@ void ConfigTaskWidget::refreshWidgetsValues(UAVObject *obj)
bool dirtyBack = m_isDirty;
emit refreshWidgetsValuesRequested();
foreach(WidgetBinding * binding, m_widgetBindings) {
if (binding->object() == obj && binding->field() != NULL && binding->widget() != NULL) {
foreach(WidgetBinding * binding, m_widgetBindingsPerWidget) {
if (binding->isEnabled() && binding->object() == obj && binding->field() != NULL && binding->widget() != NULL) {
setWidgetFromField(binding->widget(), binding->field(), binding->index(), binding->scale(), binding->isLimited());
}
}
@ -283,8 +279,8 @@ void ConfigTaskWidget::updateObjectsFromWidgets()
{
emit updateObjectsFromWidgetsRequested();
foreach(WidgetBinding * binding, m_widgetBindings) {
if (binding->object() != NULL && binding->field() != NULL) {
foreach(WidgetBinding * binding, m_widgetBindingsPerWidget) {
if (binding->isEnabled() && binding->object() != NULL && binding->field() != NULL) {
setFieldFromWidget(binding->widget(), binding->field(), binding->index(), binding->scale());
}
}
@ -315,10 +311,8 @@ void ConfigTaskWidget::addApplySaveButtons(QPushButton *update, QPushButton *sav
} else if (save) {
m_saveButton->addSaveButton(save);
}
if (m_widgetBindings.count() > 0) {
foreach(WidgetBinding * binding, m_widgetBindings) {
m_saveButton->addObject((UAVDataObject *)binding->object());
}
foreach(WidgetBinding * binding, m_widgetBindingsPerWidget) {
m_saveButton->addObject((UAVDataObject *)binding->object());
}
updateEnableControls();
}
@ -333,8 +327,8 @@ void ConfigTaskWidget::enableControls(bool enable)
button->setEnabled(enable);
}
foreach(WidgetBinding * binding, m_widgetBindings) {
if (binding->widget()) {
foreach(WidgetBinding * binding, m_widgetBindingsPerWidget) {
if (binding->isEnabled() && binding->widget()) {
binding->widget()->setEnabled(enable);
foreach(ShadowWidgetBinding * shadow, binding->shadows()) {
shadow->widget()->setEnabled(enable);
@ -351,7 +345,7 @@ bool ConfigTaskWidget::shouldObjectBeSaved(UAVObject *object)
void ConfigTaskWidget::forceShadowUpdates()
{
foreach(WidgetBinding * binding, m_widgetBindings) {
foreach(WidgetBinding * binding, m_widgetBindingsPerWidget) {
QVariant widgetValue = getVariantFromWidget(binding->widget(), binding->scale(), binding->units());
foreach(ShadowWidgetBinding * shadow, binding->shadows()) {
@ -372,7 +366,7 @@ void ConfigTaskWidget::widgetsContentsChanged()
QWidget *emitter = ((QWidget *)sender());
emit widgetContentsChanged(emitter);
double scale;
WidgetBinding *binding = m_shadowBindings.value(emitter, NULL);
WidgetBinding *binding = m_widgetBindingsPerWidget.value(emitter, NULL);
if (binding) {
if (binding->widget() == emitter) {
@ -439,7 +433,7 @@ bool ConfigTaskWidget::isDirty()
void ConfigTaskWidget::disableObjectUpdates()
{
m_isWidgetUpdatesAllowed = false;
foreach(WidgetBinding * binding, m_widgetBindings) {
foreach(WidgetBinding * binding, m_widgetBindingsPerWidget) {
if (binding->object()) {
disconnect(binding->object(), SIGNAL(objectUpdated(UAVObject *)), this, SLOT(refreshWidgetsValues(UAVObject *)));
}
@ -449,7 +443,7 @@ void ConfigTaskWidget::disableObjectUpdates()
void ConfigTaskWidget::enableObjectUpdates()
{
m_isWidgetUpdatesAllowed = true;
foreach(WidgetBinding * binding, m_widgetBindings) {
foreach(WidgetBinding * binding, m_widgetBindingsPerWidget) {
if (binding->object()) {
connect(binding->object(), SIGNAL(objectUpdated(UAVObject *)), this, SLOT(refreshWidgetsValues(UAVObject *)), Qt::UniqueConnection);
}
@ -501,17 +495,14 @@ void ConfigTaskWidget::save()
bool ConfigTaskWidget::addShadowWidgetBinding(QString objectName, QString fieldName, QWidget *widget, int index, double scale, bool isLimited,
QList<int> *defaultReloadGroups, quint32 instID)
{
foreach(WidgetBinding * binding, m_widgetBindings) {
if (!binding->object() || !binding->widget() || !binding->field()) {
foreach(WidgetBinding * binding, m_widgetBindingsPerWidget) {
if (!binding->isEnabled() || !binding->object() || !binding->widget() || !binding->field()) {
continue;
}
if (binding->object()->getName() == objectName &&
binding->field()->getName() == fieldName &&
binding->index() == index &&
binding->object()->getInstID() == instID) {
if (binding->matches(objectName, fieldName, index, instID)) {
binding->addShadow(widget, scale, isLimited);
m_shadowBindings.insert(widget, binding);
m_widgetBindingsPerWidget.insert(widget, binding);
connectWidgetUpdatesToSlot(widget, SLOT(widgetsContentsChanged()));
if (defaultReloadGroups) {
addWidgetToReloadGroups(widget, defaultReloadGroups);
@ -626,12 +617,13 @@ void ConfigTaskWidget::autoLoadWidgets()
}
refreshWidgetsValues();
forceShadowUpdates();
foreach(WidgetBinding * binding, m_widgetBindings) {
foreach(WidgetBinding * binding, m_widgetBindingsPerWidget) {
if (binding->widget()) {
qDebug() << "Binding :" << binding->widget()->objectName();
qDebug() << " Object:" << binding->object()->getName();
qDebug() << " Field :" << binding->field()->getName();
qDebug() << " Scale :" << binding->scale();
qDebug() << "Binding :" << binding->widget()->objectName();
qDebug() << " Object :" << binding->object()->getName();
qDebug() << " Field :" << binding->field()->getName();
qDebug() << " Scale :" << binding->scale();
qDebug() << " Enabled:" << binding->isEnabled();
}
foreach(ShadowWidgetBinding * shadow, binding->shadows()) {
if (shadow->widget()) {
@ -642,9 +634,9 @@ void ConfigTaskWidget::autoLoadWidgets()
}
}
void ConfigTaskWidget::addWidgetToReloadGroups(QWidget *widget, QList<int> *groups)
void ConfigTaskWidget::addWidgetToReloadGroups(QWidget *widget, QList<int> *reloadGroupIDs)
{
foreach(WidgetBinding * binding, m_widgetBindings) {
foreach(WidgetBinding * binding, m_widgetBindingsPerWidget) {
bool addBinding = false;
if (binding->widget() == widget) {
@ -657,13 +649,8 @@ void ConfigTaskWidget::addWidgetToReloadGroups(QWidget *widget, QList<int> *grou
}
}
if (addBinding) {
foreach(int i, *groups) {
if (m_reloadGroups.contains(i)) {
m_reloadGroups.value(i)->append(binding);
} else {
m_reloadGroups.insert(i, new QList<WidgetBinding *>());
m_reloadGroups.value(i)->append(binding);
}
foreach(int groupID, *reloadGroupIDs) {
m_reloadGroups.insert(groupID, binding);
}
}
}
@ -684,11 +671,11 @@ void ConfigTaskWidget::addReloadButton(QPushButton *button, int buttonGroup)
void ConfigTaskWidget::defaultButtonClicked()
{
int group = sender()->property("group").toInt();
emit defaultRequested(group);
int groupID = sender()->property("group").toInt();
emit defaultRequested(groupID);
QList<WidgetBinding *> *bindings = m_reloadGroups.value(group);
foreach(WidgetBinding * binding, *bindings) {
QList<WidgetBinding *> bindings = m_reloadGroups.values(groupID);
foreach(WidgetBinding * binding, bindings) {
if (!binding->object() || !binding->field()) {
continue;
}
@ -702,9 +689,9 @@ void ConfigTaskWidget::reloadButtonClicked()
if (m_realtimeUpdateTimer) {
return;
}
int group = sender()->property("group").toInt();
QList<WidgetBinding *> *bindings = m_reloadGroups.value(group, NULL);
if (!bindings) {
int groupID = sender()->property("group").toInt();
QList<WidgetBinding *> bindings = m_reloadGroups.values(groupID);
if (!bindings.isEmpty()) {
return;
}
ObjectPersistence *objper = dynamic_cast<ObjectPersistence *>(getObjectManager()->getObject(ObjectPersistence::NAME));
@ -714,7 +701,7 @@ void ConfigTaskWidget::reloadButtonClicked()
connect(objper, SIGNAL(objectUpdated(UAVObject *)), eventLoop, SLOT(quit()));
QList<objectComparator> temp;
foreach(WidgetBinding * binding, *bindings) {
foreach(WidgetBinding * binding, bindings) {
if (binding->object() != NULL) {
objectComparator value;
value.objid = binding->object()->getObjID();
@ -905,7 +892,7 @@ bool ConfigTaskWidget::setWidgetFromField(QWidget *widget, UAVObjectField *field
qDebug() << field->getName() << ":" << index;
QVariant value = field->getValue(index);
checkWidgetsLimits(widget, field, index, hasLimits, value, scale);
bool result = setWidgetFromVariant(widget, value, scale, field->getUnits());
bool result = setWidgetFromVariant(widget, value, scale, field->getUnits());
if (result) {
return true;
} else {
@ -1048,7 +1035,7 @@ bool ConfigTaskWidget::eventFilter(QObject *obj, QEvent *evt)
}
WidgetBinding::WidgetBinding(QWidget *widget, UAVObject *object, UAVObjectField *field, int index, double scale, bool isLimited) :
ShadowWidgetBinding(widget, scale, isLimited)
ShadowWidgetBinding(widget, scale, isLimited), m_isEnabled(true)
{
m_object = object;
m_field = field;
@ -1103,6 +1090,26 @@ void WidgetBinding::addShadow(QWidget *widget, double scale, bool isLimited)
m_shadows.append(shadow);
}
bool WidgetBinding::matches(QString objectName, QString fieldName, int index, quint32 instanceId)
{
if (m_object && m_field) {
return m_object->getName() == objectName && m_object->getInstID() == instanceId &&
m_field->getName() == fieldName && m_index == index;
} else {
return false;
}
}
bool WidgetBinding::isEnabled() const
{
return m_isEnabled;
}
void WidgetBinding::setIsEnabled(bool isEnabled)
{
m_isEnabled = isEnabled;
}
ShadowWidgetBinding::ShadowWidgetBinding(QWidget *widget, double scale, bool isLimited)
{
m_widget = widget;

View File

@ -75,11 +75,16 @@ public:
QList<ShadowWidgetBinding *> shadows() const;
void addShadow(QWidget *widget, double scale, bool isLimited);
bool matches(QString objectName, QString fieldName, int index, quint32 instanceId);
bool isEnabled() const;
void setIsEnabled(bool isEnabled);
private:
UAVObject *m_object;
UAVObjectField *m_field;
int m_index;
bool m_isEnabled;
QList<ShadowWidgetBinding *> m_shadows;
};
@ -104,14 +109,14 @@ public:
void addWidget(QWidget *widget);
void addWidgetBinding(QString objectName, QString fieldName, QWidget *widget, int index = 0, double scale = 1,
bool isLimited = false, QList<int> *reloadGroups = 0, quint32 instID = 0);
bool isLimited = false, QList<int> *reloadGroupIDs = 0, quint32 instID = 0);
void addWidgetBinding(UAVObject *object, UAVObjectField *field, QWidget *widget, int index = 0, double scale = 1,
bool isLimited = false, QList<int> *reloadGroups = 0, quint32 instID = 0);
bool isLimited = false, QList<int> *reloadGroupIDs = 0, quint32 instID = 0);
void addWidgetBinding(QString objectName, QString fieldName, QWidget *widget, QString elementName, double scale,
bool isLimited = false, QList<int> *reloadGroups = 0, quint32 instID = 0);
bool isLimited = false, QList<int> *reloadGroupIDs = 0, quint32 instID = 0);
void addWidgetBinding(UAVObject *object, UAVObjectField *field, QWidget *widget, QString elementName, double scale,
bool isLimited = false, QList<int> *reloadGroups = 0, quint32 instID = 0);
bool isLimited = false, QList<int> *reloadGroupIDs = 0, quint32 instID = 0);
void addWidgetBinding(QString objectName, QString fieldName, QWidget *widget, QString elementName);
void addWidgetBinding(UAVObject *object, UAVObjectField *field, QWidget *widget, QString elementName);
@ -120,7 +125,7 @@ public:
void addReloadButton(QPushButton *button, int buttonGroup);
void addDefaultButton(QPushButton *button, int buttonGroup);
void addWidgetToReloadGroups(QWidget *widget, QList<int> *groups);
void addWidgetToReloadGroups(QWidget *widget, QList<int> *reloadGroupIDs);
bool addShadowWidgetBinding(QString objectName, QString fieldName, QWidget *widget, int index = 0, double scale = 1,
bool isLimited = false, QList<int> *m_reloadGroups = NULL, quint32 instID = 0);
@ -193,14 +198,16 @@ private:
bool m_isConnected;
bool m_isWidgetUpdatesAllowed;
QStringList m_objects;
QList <WidgetBinding *> m_widgetBindings;
QMultiHash<int, WidgetBinding *> m_reloadGroups;
QMultiHash<QWidget *, WidgetBinding *> m_widgetBindingsPerWidget;
QMultiHash<UAVObject *, WidgetBinding *> m_widgetBindingsPerObject;
ExtensionSystem::PluginManager *m_pluginManager;
UAVObjectUtilManager *m_objectUtilManager;
SmartSaveButton *m_saveButton;
QMap<UAVObject *, bool> m_updatedObjects;
QMap<int, QList<WidgetBinding *> *> m_reloadGroups;
QMap<QWidget *, WidgetBinding *> m_shadowBindings;
QMap<QPushButton *, QString> m_helpButtons;
QHash<UAVObject *, bool> m_updatedObjects;
QHash<QPushButton *, QString> m_helpButtons;
QList<QPushButton *> m_reloadButtons;
bool m_isDirty;
QString m_outOfLimitsStyle;