From 2e3c20e9e82e052a084155b1f963dfb07649f5c9 Mon Sep 17 00:00:00 2001 From: Bryant <bwmairs@ucsc.edu> Date: Thu, 6 Jun 2013 11:18:03 -0700 Subject: [PATCH] Added groupboxes around UASes in the ListWidget to indicate primary communication channel. --- src/ui/uas/UASListWidget.cc | 78 ++++++++++++++++++++++++++++++++----- src/ui/uas/UASListWidget.h | 6 ++- 2 files changed, 73 insertions(+), 11 deletions(-) diff --git a/src/ui/uas/UASListWidget.cc b/src/ui/uas/UASListWidget.cc index 4b1c7f380a..913955f4c4 100644 --- a/src/ui/uas/UASListWidget.cc +++ b/src/ui/uas/UASListWidget.cc @@ -45,7 +45,8 @@ This file is part of the PIXHAWK project #include "MAVLinkSimulationLink.h" #include "LinkManager.h" -UASListWidget::UASListWidget(QWidget *parent) : QWidget(parent), m_ui(new Ui::UASList) +UASListWidget::UASListWidget(QWidget *parent) : QWidget(parent), + m_ui(new Ui::UASList) { m_ui->setupUi(this); m_ui->verticalLayout->setAlignment(Qt::AlignTop); @@ -54,11 +55,13 @@ UASListWidget::UASListWidget(QWidget *parent) : QWidget(parent), m_ui(new Ui::UA uWidget = new QGCUnconnectedInfoWidget(this); m_ui->verticalLayout->addWidget(uWidget); + linkToBoxMapping = QMap<LinkInterface*, QGroupBox*>(); uasViews = QMap<UASInterface*, UASView*>(); this->setVisible(false); - connect(UASManager::instance(),SIGNAL(UASCreated(UASInterface*)),this,SLOT(addUAS(UASInterface*))); + connect(UASManager::instance(), SIGNAL(UASCreated(UASInterface*)), + this, SLOT(addUAS(UASInterface*))); // Get a list of all existing UAS foreach (UASInterface* uas, UASManager::instance()->getUASList()) { @@ -97,9 +100,38 @@ void UASListWidget::addUAS(UASInterface* uas) if (!uasViews.contains(uas)) { - uasViews.insert(uas, new UASView(uas, this)); - m_ui->verticalLayout->addWidget(uasViews.value(uas)); - //connect(uas, SIGNAL(destroyed(QObject*)), this, SLOT(removeUAS(QObject*))); + // Only display the UAS in a single link. + QList<LinkInterface*>* x = uas->getLinks(); + if (x->size()) + { + LinkInterface* li = x->at(0); + + // Find an existing QGroupBox for this LinkInterface or create a + // new one. + QGroupBox* newBox; + if (linkToBoxMapping.contains(li)) + { + newBox = linkToBoxMapping[li]; + } + else + { + newBox = new QGroupBox(li->getName(), this); + QVBoxLayout* boxLayout = new QVBoxLayout(newBox); + newBox->setLayout(boxLayout); + m_ui->verticalLayout->addWidget(newBox); + linkToBoxMapping[li] = newBox; + } + + // And add the new UAS to the UASList + UASView* newView = new UASView(uas, newBox); + uasViews.insert(uas, newView); + newBox->layout()->addWidget(newView); + + // Watch for when this widget is destroyed so that we can clean up the + // groupbox if necessary. + connect(newView, SIGNAL(destroyed(QObject*)), + this, SLOT(removeUASView(QObject*))); + } } } @@ -111,10 +143,36 @@ void UASListWidget::activeUAS(UASInterface* uas) } } -void UASListWidget::removeUAS(UASInterface* uas) +/** + * If the UAS was removed, check to see if it was the last one in the QGroupBox and delete + * the QGroupBox if so. + */ +void UASListWidget::removeUASView(QObject* widget) { - Q_UNUSED(uas); -// uasViews.remove(uas); -// listLayout->removeWidget(uasViews.value(uas)); -// uasViews.value(uas)->deleteLater(); + UASView* view = (UASView*)widget; + if (view) { + int views = view->parentWidget()->findChildren<UASView*>().size(); + if (views == 0) { + // Delete the groupbox + view->parentWidget()->deleteLater(); + + // Remove the associated UAS from our list. + UASInterface* uas = uasViews.key(view, NULL); + if (uas) + { + uasViews.remove(uas); + } + + // And remove this GroupBox from our mapping. + LinkInterface* link = linkToBoxMapping.key((QGroupBox*)view->parentWidget(), NULL); + if (link) + { + linkToBoxMapping.remove(link); + } + + // And put the initial widget back. + uWidget = new QGCUnconnectedInfoWidget(this); + m_ui->verticalLayout->addWidget(uWidget); + } + } } diff --git a/src/ui/uas/UASListWidget.h b/src/ui/uas/UASListWidget.h index 37aa77a666..b78a181136 100644 --- a/src/ui/uas/UASListWidget.h +++ b/src/ui/uas/UASListWidget.h @@ -34,6 +34,7 @@ This file is part of the QGROUNDCONTROL project #include <QWidget> #include <QMap> #include <QVBoxLayout> +#include <QGroupBox> #include "UASInterface.h" #include "UASView.h" #include "QGCUnconnectedInfoWidget.h" @@ -50,9 +51,12 @@ public: public slots: void addUAS(UASInterface* uas); void activeUAS(UASInterface* uas); - void removeUAS(UASInterface* uas); + void removeUASView(QObject* widget); protected: + // Keep a mapping from Links to GroupBoxes for adding new links. + QMap<LinkInterface*, QGroupBox*> linkToBoxMapping; + // Tie each view to their UAS object. QMap<UASInterface*, UASView*> uasViews; QGCUnconnectedInfoWidget* uWidget; void changeEvent(QEvent *e); -- GitLab