UASQuickView.cc 9.85 KB
Newer Older
1
#include "UASQuickView.h"
2
#include "UASQuickViewItemSelect.h"
3
#include "UASQuickViewTextItem.h"
4 5
#include "MultiVehicleManager.h"
#include "UAS.h"
6
#include "QGCApplication.h"
7 8 9

#include <QMetaMethod>
#include <QDebug>
10
#include <QSettings>
11
#include <QInputDialog>
12

13 14
UASQuickView::UASQuickView(QWidget *parent) : QWidget(parent),
    uas(NULL)
15
{
16
    quickViewSelectDialog=0;
17 18
    m_columnCount=2;
    m_currentColumn=0;
19
    ui.setupUi(this);
20

21
    ui.horizontalLayout->setMargin(0);
22 23 24
    m_verticalLayoutList.append(new QVBoxLayout());
    ui.horizontalLayout->addItem(m_verticalLayoutList[0]);

25 26
    connect(qgcApp()->toolbox()->multiVehicleManager(), &MultiVehicleManager::activeVehicleChanged, this, &UASQuickView::_activeVehicleChanged);
    _activeVehicleChanged(qgcApp()->toolbox()->multiVehicleManager()->activeVehicle());
27 28
    this->setContextMenuPolicy(Qt::ActionsContextMenu);

29
    loadSettings();
30

31 32 33
    //If we don't have any predefined settings, set some defaults.
    if (uasPropertyValueMap.size() == 0)
    {
34
        valueEnabled("altitudeAMSL");
35 36
        valueEnabled("altitudeAMSLFT");
        valueEnabled("altitudeWGS84");
37
        valueEnabled("altitudeRelative");
38
        valueEnabled("groundSpeed");
39
        valueEnabled("distToWaypoint");
40
    }
41

42
    QAction *action = new QAction("Add/Remove Items",this);
43
    action->setCheckable(false);
44
    connect(action,&QAction::triggered,this, static_cast<void (UASQuickView::*)(bool)>(&UASQuickView::actionTriggered));
45
    this->addAction(action);
46

47 48
    QAction *columnaction = new QAction("Set Column Count",this);
    columnaction->setCheckable(false);
49
    connect(columnaction,&QAction::triggered,this,&UASQuickView::columnActionTriggered);
50 51
    this->addAction(columnaction);

52
    updateTimer = new QTimer(this);
53
    connect(updateTimer,&QTimer::timeout,this,&UASQuickView::updateTimerTick);
54
    updateTimer->start(1000);
55

56
}
57 58 59 60 61 62 63
UASQuickView::~UASQuickView()
{
    if (quickViewSelectDialog)
    {
        delete quickViewSelectDialog;
    }
}
64 65 66
void UASQuickView::columnActionTriggered()
{
    bool ok = false;
67 68
    int newcolumns = QInputDialog::getInt(
        this,"Columns","Enter number of columns", m_columnCount, 1, 10, 1, &ok);
69 70 71 72 73 74 75 76
    if (!ok)
    {
        return;
    }
    m_columnCount = newcolumns;
    sortItems(newcolumns);
    saveSettings();
}
77

78 79 80 81 82 83 84 85
void UASQuickView::actionTriggered()
{
    if (quickViewSelectDialog)
    {
        quickViewSelectDialog->show();
        return;
    }
    quickViewSelectDialog = new UASQuickViewItemSelect();
86 87 88 89
    connect(quickViewSelectDialog,&UASQuickViewItemSelect::destroyed,this,&UASQuickView::selectDialogClosed);
    connect(quickViewSelectDialog,&UASQuickViewItemSelect::valueDisabled,this,&UASQuickView::valueDisabled);
    connect(quickViewSelectDialog,&UASQuickViewItemSelect::valueEnabled,this,&UASQuickView::valueEnabled);

90 91 92 93 94 95 96
    quickViewSelectDialog->setAttribute(Qt::WA_DeleteOnClose,true);
    for (QMap<QString,double>::const_iterator i = uasPropertyValueMap.constBegin();i!=uasPropertyValueMap.constEnd();i++)
    {
        quickViewSelectDialog->addItem(i.key(),uasEnabledPropertyList.contains(i.key()));
    }
    quickViewSelectDialog->show();
}
97
void UASQuickView::saveSettings()
98
{
99 100 101 102 103 104 105 106 107 108
    QSettings settings;
    settings.beginWriteArray("UAS_QUICK_VIEW_ITEMS");
    int count = 0;
    for (QMap<QString,UASQuickViewItem*>::const_iterator i = uasPropertyToLabelMap.constBegin();i!=uasPropertyToLabelMap.constEnd();i++)
    {
        settings.setArrayIndex(count++);
        settings.setValue("name",i.key());
        settings.setValue("type","text");
    }
    settings.endArray();
109
    settings.setValue("UAS_QUICK_VIEW_COLUMNS",m_columnCount);
110
}
111 112 113
void UASQuickView::loadSettings()
{
    QSettings settings;
114
    m_columnCount = settings.value("UAS_QUICK_VIEW_COLUMNS",1).toInt();
115
    int size = settings.beginReadArray("UAS_QUICK_VIEW_ITEMS");
116
    for (int i = 0; i < size; i++)
117 118 119 120 121 122 123 124 125
    {
        settings.setArrayIndex(i);
        QString nameval = settings.value("name").toString();
        QString typeval = settings.value("type").toString();
        if (typeval == "text" && !uasPropertyToLabelMap.contains(nameval))
        {
            valueEnabled(nameval);
        }
    }
126 127
    settings.endArray();
    sortItems(m_columnCount);
128 129 130 131
}

void UASQuickView::valueEnabled(QString value)
{
132
    UASQuickViewItem *item = new UASQuickViewTextItem(this);
133
    item->setTitle(value);
134 135 136 137 138 139 140 141 142
    //ui.verticalLayout->addWidget(item);
    //m_currentColumn
    m_verticalLayoutList[m_currentColumn]->addWidget(item);
    m_PropertyToLayoutIndexMap[value] = m_currentColumn;
    m_currentColumn++;
    if (m_currentColumn >= m_columnCount-1)
    {
        m_currentColumn = 0;
    }
143 144
    uasPropertyToLabelMap[value] = item;
    uasEnabledPropertyList.append(value);
145

146 147 148 149 150
    if (!uasPropertyValueMap.contains(value))
    {
        uasPropertyValueMap[value] = 0;
    }
    saveSettings();
151 152
    item->show();
    sortItems(m_columnCount);
153 154

}
155 156 157 158 159 160 161 162 163
void UASQuickView::sortItems(int columncount)
{
    QList<QWidget*> itemlist;
    for (QMap<QString,UASQuickViewItem*>::const_iterator i = uasPropertyToLabelMap.constBegin();i!=uasPropertyToLabelMap.constEnd();i++)
    {
        m_verticalLayoutList[m_PropertyToLayoutIndexMap[i.key()]]->removeWidget(i.value());
        m_PropertyToLayoutIndexMap.remove(i.key());
        itemlist.append(i.value());
    }
164 165
    // Item list has all the widgets availble, now re-add them to the layouts.
    for (int i = 0; i < m_verticalLayoutList.size(); i++)
166 167 168 169 170 171
    {
        ui.horizontalLayout->removeItem(m_verticalLayoutList[i]);
        m_verticalLayoutList[i]->deleteLater(); //removeItem de-parents the item.
    }
    m_verticalLayoutList.clear();

172 173
    // Create a vertical layout for every intended column
    for (int i = 0; i < columncount; i++)
174
    {
175
        QVBoxLayout *layout = new QVBoxLayout();
176 177
        ui.horizontalLayout->addItem(layout);
        m_verticalLayoutList.append(layout);
178
        layout->setMargin(0);
179 180 181 182
    }

    //Cycle through all items and add them to the layout
    int currcol = 0;
183
    for (int i = 0; i < itemlist.size(); i++)
184 185 186 187 188 189 190 191 192
    {
        m_verticalLayoutList[currcol]->addWidget(itemlist[i]);
        currcol++;
        if (currcol >= columncount)
        {
            currcol = 0;
        }
    }
    m_currentColumn = currcol;
193 194 195 196 197
    QApplication::processEvents();
    recalculateItemTextSizing();
}
void UASQuickView::resizeEvent(QResizeEvent *evt)
{
198
    Q_UNUSED(evt);
199 200 201 202 203 204 205 206 207 208 209 210 211
    recalculateItemTextSizing();
}
void UASQuickView::recalculateItemTextSizing()
{
    int minpixelsize = 65535;
    for (QMap<QString,UASQuickViewItem*>::const_iterator i = uasPropertyToLabelMap.constBegin();i!=uasPropertyToLabelMap.constEnd();i++)
    {
        int tempmin = i.value()->minValuePixelSize();
        if (tempmin < minpixelsize)
        {
            minpixelsize = tempmin;
        }
    }
212 213
    if(minpixelsize < 6)
        minpixelsize = 6;
214 215 216 217
    for (QMap<QString,UASQuickViewItem*>::const_iterator i = uasPropertyToLabelMap.constBegin();i!=uasPropertyToLabelMap.constEnd();i++)
    {
        i.value()->setValuePixelSize(minpixelsize);
    }
218
}
219 220 221 222 223 224 225 226

void UASQuickView::valueDisabled(QString value)
{
    if (uasPropertyToLabelMap.contains(value))
    {
        UASQuickViewItem *item = uasPropertyToLabelMap[value];
        uasPropertyToLabelMap.remove(value);
        item->hide();
227 228 229 230
        //ui.verticalLayout->removeWidget(item);
        //layout->removeWidget(item);
        m_verticalLayoutList[m_PropertyToLayoutIndexMap[value]]->removeWidget(item);
        sortItems(m_columnCount);
231 232
        item->deleteLater();
        uasEnabledPropertyList.removeOne(value);
233
        saveSettings();
234 235 236 237 238 239 240 241
    }
}

void UASQuickView::selectDialogClosed()
{
    quickViewSelectDialog = 0;
}

242 243
void UASQuickView::updateTimerTick()
{
244 245
    //uasPropertyValueMap
    for (QMap<QString,UASQuickViewItem*>::const_iterator i = uasPropertyToLabelMap.constBegin(); i != uasPropertyToLabelMap.constEnd();i++)
246
    {
247
        if (uasPropertyValueMap.contains(i.key()))
248
        {
249
            i.value()->setValue(uasPropertyValueMap[i.key()]);
250 251 252 253
        }
    }
}

254
void UASQuickView::_activeVehicleChanged(Vehicle* vehicle)
255
{
Don Gagne's avatar
Don Gagne committed
256
    if (uas || !vehicle) {
257 258
        return;
    }
259
    this->uas = vehicle->uas();
Don Gagne's avatar
Don Gagne committed
260
    connect(uas, SIGNAL(valueChanged(int,QString,QString,QVariant,quint64)),this,SLOT(valueChanged(int,QString,QString,QVariant,quint64)));
261 262 263
}
void UASQuickView::addSource(MAVLinkDecoder *decoder)
{
264
    connect(decoder,SIGNAL(valueChanged(int,QString,QString,QVariant,quint64)),this,SLOT(valueChanged(int,QString,QString,QVariant,quint64)));
265
}
266

267
void UASQuickView::valueChanged(const int uasId, const QString& name, const QString& unit, const QVariant &variant, const quint64 msec)
268
{
269 270
    Q_UNUSED(uasId);
    Q_UNUSED(unit);
271 272
    Q_UNUSED(msec);
    
273 274
    bool ok;
    double value = variant.toDouble(&ok);
Don Gagne's avatar
Don Gagne committed
275
    QMetaType::Type metaType = static_cast<QMetaType::Type>(variant.type());
Don Gagne's avatar
Don Gagne committed
276
    if(!ok || metaType == QMetaType::QString || metaType == QMetaType::QByteArray)
277 278
        return;

279 280 281 282 283 284 285 286 287 288
    if (!uasPropertyValueMap.contains(name))
    {
        if (quickViewSelectDialog)
        {
            quickViewSelectDialog->addItem(name);
        }
    }
    uasPropertyValueMap[name] = value;
}

289 290 291 292 293 294 295 296 297
void UASQuickView::actionTriggered(bool checked)
{
    QAction *senderlabel = qobject_cast<QAction*>(sender());
    if (!senderlabel)
    {
        return;
    }
    if (checked)
    {
298 299
        valueEnabled(senderlabel->text());
        /*UASQuickViewItem *item = new UASQuickViewTextItem(this);
300
        item->setTitle(senderlabel->text());
301 302 303 304 305 306 307 308 309 310
        layout->addWidget(item);
        //ui.verticalLayout->addWidget(item);
        m_currentColumn++;
        if (m_currentColumn >= m_verticalLayoutList.size())
        {
            m_currentColumn = 0;
        }
        uasPropertyToLabelMap[senderlabel->text()] = item;*/


311 312 313
    }
    else
    {
314 315
        valueDisabled(senderlabel->text());
        /*layout->removeWidget(uasPropertyToLabelMap[senderlabel->text()]);
316
        uasPropertyToLabelMap[senderlabel->text()]->deleteLater();
317
        uasPropertyToLabelMap.remove(senderlabel->text());*/
318

319 320
    }
}