Skip to content
Snippets Groups Projects
QGCToolWidget.cc 10.4 KiB
Newer Older
  • Learn to ignore specific revisions
  • #include "QGCToolWidget.h"
    #include "ui_QGCToolWidget.h"
    
    #include <QMenu>
    #include <QList>
    #include <QInputDialog>
    #include <QDockWidget>
    #include <QContextMenuEvent>
    
    lm's avatar
    lm committed
    #include <QSettings>
    
    
    #include "QGCParamSlider.h"
    #include "QGCActionButton.h"
    
    lm's avatar
    lm committed
    #include "QGCCommandButton.h"
    
    lm's avatar
    lm committed
    QGCToolWidget::QGCToolWidget(const QString& title, QWidget *parent) :
    
        QWidget(parent),
        mav(NULL),
        mainMenuAction(NULL),
        ui(new Ui::QGCToolWidget)
    
    lm's avatar
    lm committed
        setObjectName(title);
    
    lm's avatar
    lm committed
        toolLayout = ui->toolLayout;
    
    lm's avatar
    lm committed
        QDockWidget* dock = dynamic_cast<QDockWidget*>(this->parentWidget());
    
        if (dock) {
    
    lm's avatar
    lm committed
            dock->setWindowTitle(title);
    
            dock->setObjectName(title+"DOCK");
    
    lm's avatar
    lm committed
        }
    
        dock = dynamic_cast<QDockWidget*>(parent);
    
        if (dock) {
    
            dock->setWindowTitle(title);
            dock->setObjectName(title+"DOCK");
        }
    
    
    lm's avatar
    lm committed
        this->setWindowTitle(title);
    
    
        QList<UASInterface*> systems = UASManager::instance()->getUASList();
    
        foreach (UASInterface* uas, systems) {
    
            if (newMav) {
    
                addUAS(uas);
            }
        }
        connect(UASManager::instance(), SIGNAL(UASCreated(UASInterface*)), this, SLOT(addUAS(UASInterface*)));
    
    lm's avatar
    lm committed
        if (!instances()->contains(title)) instances()->insert(title, this);
    
    lm's avatar
    lm committed
    /**
     * @param parent Object later holding these widgets, usually the main window
     * @return List of all widgets
     */
    QList<QGCToolWidget*> QGCToolWidget::createWidgetsFromSettings(QWidget* parent)
    {
        // Store list of widgets
        QSettings settings;
        QList<QGCToolWidget*> newWidgets;
        int size = settings.beginReadArray("QGC_TOOL_WIDGET_NAMES");
    
        for (int i = 0; i < size; i++) {
    
    lm's avatar
    lm committed
            settings.setArrayIndex(i);
            QString name = settings.value("TITLE", tr("UNKNOWN WIDGET %1").arg(i)).toString();
    
    
            if (!instances()->contains(name)) {
    
    lm's avatar
    lm committed
                QGCToolWidget* tool = new QGCToolWidget(name, parent);
                instances()->insert(name, tool);
                newWidgets.append(tool);
            }
        }
        settings.endArray();
    
        qDebug() << "NEW WIDGETS: " << newWidgets.size();
    
        // Load individual widget items
    
        for (int i = 0; i < newWidgets.size(); i++) {
    
    lm's avatar
    lm committed
            QString widgetName = newWidgets.at(i)->getTitle();
            qDebug() << "READING: " << widgetName;
            settings.beginGroup(widgetName);
            int size = settings.beginReadArray("QGC_TOOL_WIDGET_ITEMS");
            qDebug() << "CHILDREN SIZE:" << size;
    
            for (int j = 0; j < size; j++) {
    
    lm's avatar
    lm committed
                settings.setArrayIndex(j);
                QString type = settings.value("TYPE", "UNKNOWN").toString();
    
                if (type != "UNKNOWN") {
    
    lm's avatar
    lm committed
                    QGCToolWidgetItem* item = NULL;
    
                    if (type == "BUTTON") {
    
    lm's avatar
    lm committed
                        item = new QGCActionButton(newWidgets.at(i));
                        qDebug() << "CREATED BUTTON";
    
                    } else if (type == "COMMANDBUTTON") {
    
    lm's avatar
    lm committed
                        item = new QGCCommandButton(newWidgets.at(i));
                        qDebug() << "CREATED COMMANDBUTTON";
    
                    } else if (type == "SLIDER") {
    
                        item = new QGCParamSlider(newWidgets.at(i));
                        qDebug() << "CREATED PARAM SLIDER";
                    }
    
    lm's avatar
    lm committed
    
    
                    if (item) {
    
    lm's avatar
    lm committed
                        // Configure and add to layout
                        newWidgets.at(i)->addToolWidget(item);
                        item->readSettings(settings);
    
                        qDebug() << "Created tool widget";
                    }
    
    lm's avatar
    lm committed
                    qDebug() << "UNKNOWN TOOL WIDGET TYPE";
                }
            }
            settings.endArray();
            settings.endGroup();
        }
    
        return instances()->values();
    }
    
    void QGCToolWidget::storeWidgetsToSettings()
    {
        // Store list of widgets
        QSettings settings;
        settings.beginWriteArray("QGC_TOOL_WIDGET_NAMES");
    
        for (int i = 0; i < instances()->size(); ++i) {
    
    lm's avatar
    lm committed
            settings.setArrayIndex(i);
            settings.setValue("TITLE", instances()->values().at(i)->getTitle());
        }
        settings.endArray();
    
        // Store individual widget items
    
        for (int i = 0; i < instances()->size(); ++i) {
    
    lm's avatar
    lm committed
            QString widgetName = instances()->values().at(i)->getTitle();
            settings.beginGroup(widgetName);
            settings.beginWriteArray("QGC_TOOL_WIDGET_ITEMS");
            int k = 0; // QGCToolItem counter
    
            for (int j = 0; j  < instances()->values().at(i)->children().size(); ++j) {
    
    lm's avatar
    lm committed
                // Store only QGCToolWidgetItems
                QGCToolWidgetItem* item = dynamic_cast<QGCToolWidgetItem*>(instances()->values().at(i)->children().at(j));
    
                if (item) {
    
    lm's avatar
    lm committed
                    settings.setArrayIndex(k++);
                    // Store the ToolWidgetItem
                    item->writeSettings(settings);
                }
            }
            settings.endArray();
            settings.endGroup();
        }
    }
    
    
    void QGCToolWidget::addUAS(UASInterface* uas)
    {
        UAS* newMav = dynamic_cast<UAS*>(uas);
    
        if (newMav) {
    
            // FIXME Convert to list
            if (mav == NULL) mav = newMav;
        }
    }
    
    void QGCToolWidget::contextMenuEvent (QContextMenuEvent* event)
    {
        QMenu menu(this);
    
        menu.addAction(addParamAction);
    
    lm's avatar
    lm committed
        menu.addAction(addCommandAction);
    
    lm's avatar
    lm committed
        menu.addAction(deleteAction);
    
    lm's avatar
    lm committed
        menu.addSeparator();
        menu.addAction(addButtonAction);
    
    void QGCToolWidget::hideEvent(QHideEvent* event)
    {
        // Store settings
        storeWidgetsToSettings();
        QWidget::hideEvent(event);
    }
    
    /**
     * The widgets current view and the applied dock widget area.
     * Both values are only stored internally and allow an external
     * widget to configure it accordingly
     */
    void QGCToolWidget::setViewVisibilityAndDockWidgetArea(int view, bool visible, Qt::DockWidgetArea area)
    {
        viewVisible.insert(view, visible);
        dockWidgetArea.insert(view, area);
    }
    
    
    void QGCToolWidget::createActions()
    {
        addParamAction = new QAction(tr("New &Parameter Slider"), this);
        addParamAction->setStatusTip(tr("Add a parameter setting slider widget to the tool"));
        connect(addParamAction, SIGNAL(triggered()), this, SLOT(addParam()));
    
    
    lm's avatar
    lm committed
        addCommandAction = new QAction(tr("New MAV &Command Button"), this);
        addCommandAction->setStatusTip(tr("Add a new action button to the tool"));
        connect(addCommandAction, SIGNAL(triggered()), this, SLOT(addCommand()));
    
    
        setTitleAction = new QAction(tr("Set Widget Title"), this);
        setTitleAction->setStatusTip(tr("Set the title caption of this tool widget"));
        connect(setTitleAction, SIGNAL(triggered()), this, SLOT(setTitle()));
    
    lm's avatar
    lm committed
    
        deleteAction = new QAction(tr("Delete this widget"), this);
        deleteAction->setStatusTip(tr("Delete this widget permanently"));
        connect(deleteAction, SIGNAL(triggered()), this, SLOT(deleteWidget()));
    
    
        exportAction = new QAction(tr("Export this widget"), this);
        exportAction->setStatusTip(tr("Export this widget to be reused by others"));
        connect(exportAction, SIGNAL(triggered()), this, SLOT(exportWidget()));
    
        importAction = new QAction(tr("Import widget"), this);
        importAction->setStatusTip(tr("Import this widget from a file (current content will be removed)"));
        connect(exportAction, SIGNAL(triggered()), this, SLOT(importWidget()));
    
    lm's avatar
    lm committed
    
        addButtonAction = new QAction(tr("New MAV Action Button (Deprecated)"), this);
        addButtonAction->setStatusTip(tr("Add a new action button to the tool"));
        connect(addButtonAction, SIGNAL(triggered()), this, SLOT(addAction()));
    
    lm's avatar
    lm committed
    }
    
    QMap<QString, QGCToolWidget*>* QGCToolWidget::instances()
    {
        static QMap<QString, QGCToolWidget*>* instances;
        if (!instances) instances = new QMap<QString, QGCToolWidget*>();
        return instances;
    }
    
    QList<QGCToolWidgetItem*>* QGCToolWidget::itemList()
    {
        static QList<QGCToolWidgetItem*>* instances;
        if (!instances) instances = new QList<QGCToolWidgetItem*>();
        return instances;
    
    }
    
    void QGCToolWidget::addParam()
    {
        QGCParamSlider* slider = new QGCParamSlider(this);
    
        if (ui->hintLabel) {
    
    lm's avatar
    lm committed
            ui->hintLabel->deleteLater();
    
    lm's avatar
    lm committed
        }
    
        toolLayout->addWidget(slider);
        slider->startEditMode();
    }
    
    void QGCToolWidget::addAction()
    {
        QGCActionButton* button = new QGCActionButton(this);
    
        if (ui->hintLabel) {
    
    lm's avatar
    lm committed
            ui->hintLabel->deleteLater();
    
    lm's avatar
    lm committed
        }
    
        toolLayout->addWidget(button);
        button->startEditMode();
    }
    
    
    lm's avatar
    lm committed
    void QGCToolWidget::addCommand()
    {
        QGCCommandButton* button = new QGCCommandButton(this);
    
        if (ui->hintLabel) {
    
    lm's avatar
    lm committed
            ui->hintLabel->deleteLater();
            ui->hintLabel = NULL;
        }
        toolLayout->addWidget(button);
        button->startEditMode();
    }
    
    
    lm's avatar
    lm committed
    void QGCToolWidget::addToolWidget(QGCToolWidgetItem* widget)
    {
    
        if (ui->hintLabel) {
    
    lm's avatar
    lm committed
            ui->hintLabel->deleteLater();
    
    lm's avatar
    lm committed
        }
    
    lm's avatar
    lm committed
        toolLayout->addWidget(widget);
    }
    
    
    void QGCToolWidget::exportWidget()
    {
    
    }
    
    void QGCToolWidget::importWidget(const QString& fileName)
    {
    
    }
    
    
    lm's avatar
    lm committed
    const QString QGCToolWidget::getTitle()
    {
        QDockWidget* parent = dynamic_cast<QDockWidget*>(this->parentWidget());
    
        if (parent) {
    
    lm's avatar
    lm committed
            return parent->windowTitle();
    
    lm's avatar
    lm committed
            return this->windowTitle();
        }
    }
    
    
    
    void QGCToolWidget::setTitle()
    {
        QDockWidget* parent = dynamic_cast<QDockWidget*>(this->parentWidget());
    
        if (parent) {
    
    lm's avatar
    lm committed
            bool ok;
    
            QString text = QInputDialog::getText(this, tr("QInputDialog::getText()"),
                                                 tr("Widget title:"), QLineEdit::Normal,
                                                 parent->windowTitle(), &ok);
    
            if (ok && !text.isEmpty()) {
    
    lm's avatar
    lm committed
                QSettings settings;
                settings.beginGroup(parent->windowTitle());
                settings.remove("");
                settings.endGroup();
                parent->setWindowTitle(text);
    
                storeWidgetsToSettings();
                emit titleChanged(text);
                if (mainMenuAction) mainMenuAction->setText(text);
            }
    
    lm's avatar
    lm committed
    
    void QGCToolWidget::setMainMenuAction(QAction* action)
    {
        this->mainMenuAction = action;
    }
    
    void QGCToolWidget::deleteWidget()
    {
        // Remove from settings
    
        // Hide
        this->hide();
        instances()->remove(getTitle());
        QSettings settings;
        settings.beginGroup(getTitle());
        settings.remove("");
        settings.endGroup();
        storeWidgetsToSettings();
    
        // Delete
        mainMenuAction->deleteLater();
        this->deleteLater();
    }