diff widgets/PluginParameterDialog.cpp @ 0:fc9323a41f5a

start base : Sonic Visualiser sv1-1.0rc1
author lbajardsilogic
date Fri, 11 May 2007 09:08:14 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/widgets/PluginParameterDialog.cpp	Fri May 11 09:08:14 2007 +0000
@@ -0,0 +1,524 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */
+
+/*
+    Sonic Visualiser
+    An audio file viewer and annotation editor.
+    Centre for Digital Music, Queen Mary, University of London.
+    This file copyright 2006 Chris Cannam and QMUL.
+    
+    This program is free software; you can redistribute it and/or
+    modify it under the terms of the GNU General Public License as
+    published by the Free Software Foundation; either version 2 of the
+    License, or (at your option) any later version.  See the file
+    COPYING included with this distribution for more information.
+*/
+
+#include "PluginParameterDialog.h"
+
+#include "PluginParameterBox.h"
+#include "WindowTypeSelector.h"
+
+#include "vamp-sdk/Plugin.h"
+#include "vamp-sdk/PluginHostAdapter.h"
+
+#include <QGridLayout>
+#include <QLabel>
+#include <QGroupBox>
+#include <QHBoxLayout>
+#include <QVBoxLayout>
+#include <QScrollArea>
+#include <QPushButton>
+#include <QMessageBox>
+#include <QComboBox>
+#include <QSettings>
+
+PluginParameterDialog::PluginParameterDialog(Vamp::PluginBase *plugin,
+					     QWidget *parent) :
+    QDialog(parent),
+    m_plugin(plugin),
+    m_channel(-1),
+    m_stepSize(0),
+    m_blockSize(0),
+    m_windowType(HanningWindow),
+    m_parameterBox(0)
+{
+    setWindowTitle(tr("Plugin Parameters"));
+
+    QGridLayout *grid = new QGridLayout;
+    setLayout(grid);
+
+    QGroupBox *pluginBox = new QGroupBox;
+    pluginBox->setTitle(plugin->getType().c_str());
+    grid->addWidget(pluginBox, 0, 0);
+
+    QGridLayout *subgrid = new QGridLayout;
+    pluginBox->setLayout(subgrid);
+
+    subgrid->setSpacing(0);
+    subgrid->setMargin(10);
+
+    QFont boldFont(pluginBox->font());
+    boldFont.setBold(true);
+
+    QFont italicFont(pluginBox->font());
+    italicFont.setItalic(true);
+
+    QLabel *nameLabel = new QLabel(plugin->getName().c_str());
+    nameLabel->setWordWrap(true);
+    nameLabel->setFont(boldFont);
+
+    QLabel *makerLabel = new QLabel(plugin->getMaker().c_str());
+    makerLabel->setWordWrap(true);
+
+    QLabel *versionLabel = new QLabel(QString("%1")
+                                      .arg(plugin->getPluginVersion()));
+    versionLabel->setWordWrap(true);
+
+    QLabel *copyrightLabel = new QLabel(plugin->getCopyright().c_str());
+    copyrightLabel->setWordWrap(true);
+
+//    QLabel *typeLabel = new QLabel(plugin->getType().c_str());
+//    typeLabel->setWordWrap(true);
+//    typeLabel->setFont(boldFont);
+
+    QLabel *descriptionLabel = 0;
+    if (plugin->getDescription() != "") {
+        descriptionLabel = new QLabel(plugin->getDescription().c_str());
+        descriptionLabel->setWordWrap(true);
+        descriptionLabel->setFont(italicFont);
+    }
+
+    int row = 0;
+
+    QLabel *label = new QLabel(tr("Name:"));
+    label->setAlignment(Qt::AlignTop | Qt::AlignLeft);
+    subgrid->addWidget(label, row, 0);
+    subgrid->addWidget(nameLabel, row, 1);
+    row++;
+
+    if (descriptionLabel) {
+//        label = new QLabel(tr("Description:"));
+//        label->setAlignment(Qt::AlignTop | Qt::AlignLeft);
+//        subgrid->addWidget(label, row, 0);
+        subgrid->addWidget(descriptionLabel, row, 1);
+        row++;
+    }
+
+    Vamp::PluginHostAdapter *fePlugin =
+        dynamic_cast<Vamp::PluginHostAdapter *>(m_plugin);
+
+    if (fePlugin) {
+        label = new QLabel(tr("Version:"));
+        label->setAlignment(Qt::AlignTop | Qt::AlignLeft);
+        subgrid->addWidget(label, row, 0);
+        subgrid->addWidget(versionLabel, row, 1);
+        row++;
+    }
+
+//    label = new QLabel(tr("Type:"));
+//    label->setAlignment(Qt::AlignTop | Qt::AlignLeft);
+//    subgrid->addWidget(label, row, 0);
+//    subgrid->addWidget(typeLabel, row, 1);
+//    row++;
+
+    label = new QLabel(tr("Maker:"));
+    label->setAlignment(Qt::AlignTop | Qt::AlignLeft);
+    subgrid->addWidget(label, row, 0);
+    subgrid->addWidget(makerLabel, row, 1);
+    row++;
+
+    label = new QLabel(tr("Copyright:  "));
+    label->setAlignment(Qt::AlignTop | Qt::AlignLeft);
+    subgrid->addWidget(label, row, 0);
+    subgrid->addWidget(copyrightLabel, row, 1);
+    row++;
+    
+    m_outputSpacer = new QLabel;
+    subgrid->addWidget(m_outputSpacer, row, 0);
+    m_outputSpacer->setFixedHeight(7);
+    m_outputSpacer->hide();
+    row++;
+
+    m_outputLabel = new QLabel(tr("Output:"));
+    m_outputLabel->setAlignment(Qt::AlignTop | Qt::AlignLeft);
+    subgrid->addWidget(m_outputLabel, row, 0);
+    m_outputValue = new QLabel;
+    m_outputValue->setFont(boldFont);
+    subgrid->addWidget(m_outputValue, row, 1);
+    m_outputLabel->hide();
+    m_outputValue->hide();
+    row++;
+
+    m_outputDescription = new QLabel;
+    m_outputDescription->setFont(italicFont);
+    subgrid->addWidget(m_outputDescription, row, 1);
+    m_outputDescription->hide();
+    row++;
+
+    subgrid->setColumnStretch(1, 2);
+
+    m_inputModelBox = new QGroupBox;
+    m_inputModelBox->setTitle(tr("Input Source"));
+    grid->addWidget(m_inputModelBox, 1, 0);
+    
+    m_inputModels = new QComboBox;
+    QHBoxLayout *inputLayout = new QHBoxLayout;
+    m_inputModelBox->setLayout(inputLayout);
+    inputLayout->addWidget(m_inputModels);
+    m_inputModelBox->hide();
+
+    QGroupBox *paramBox = new QGroupBox;
+    paramBox->setTitle(tr("Plugin Parameters"));
+    grid->addWidget(paramBox, 2, 0);
+    grid->setRowStretch(2, 10);
+
+    QHBoxLayout *paramLayout = new QHBoxLayout;
+    paramLayout->setMargin(0);
+    paramBox->setLayout(paramLayout);
+
+    QScrollArea *scroll = new QScrollArea;
+    scroll->setWidgetResizable(true);
+    scroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+    scroll->setFrameShape(QFrame::NoFrame);
+    paramLayout->addWidget(scroll);
+
+    m_parameterBox = new PluginParameterBox(m_plugin);
+    connect(m_parameterBox, SIGNAL(pluginConfigurationChanged(QString)),
+            this,  SIGNAL(pluginConfigurationChanged(QString)));
+    scroll->setWidget(m_parameterBox);
+
+    m_advanced = new QFrame;
+    QVBoxLayout *advancedLayout = new QVBoxLayout;
+    advancedLayout->setMargin(0);
+    m_advanced->setLayout(advancedLayout);
+    grid->addWidget(m_advanced, 3, 0);
+
+    m_channelBox = new QGroupBox;
+    m_channelBox->setTitle(tr("Channels"));
+    advancedLayout->addWidget(m_channelBox);
+    m_channelBox->setVisible(false);
+    m_haveChannelBoxData = false;
+
+    m_windowBox = new QGroupBox;
+    m_windowBox->setTitle(tr("Processing"));
+    advancedLayout->addWidget(m_windowBox);
+    m_windowBox->setVisible(false);
+    m_haveWindowBoxData = false;
+
+    QHBoxLayout *hbox = new QHBoxLayout;
+    grid->addLayout(hbox, 4, 0);
+
+    m_advancedVisible = false;
+
+    m_advancedButton = new QPushButton(tr("Advanced >>"));
+    m_advancedButton->setCheckable(true);
+    connect(m_advancedButton, SIGNAL(clicked()), this, SLOT(advancedToggled()));
+        
+    QSettings settings;
+    settings.beginGroup("PluginParameterDialog");
+    m_advancedVisible = settings.value("advancedvisible", false).toBool();
+    settings.endGroup();
+    
+    m_advanced->setVisible(false);
+
+    hbox->addWidget(m_advancedButton);
+    m_advancedButton->hide();
+
+    QPushButton *ok = new QPushButton(tr("OK"));
+    QPushButton *cancel = new QPushButton(tr("Cancel"));
+    hbox->addStretch(10);
+    hbox->addWidget(ok);
+    hbox->addWidget(cancel);
+    connect(ok, SIGNAL(clicked()), this, SLOT(accept()));
+    connect(cancel, SIGNAL(clicked()), this, SLOT(reject()));
+
+    setAdvancedVisible(m_advancedVisible);
+}
+
+PluginParameterDialog::~PluginParameterDialog()
+{
+}
+
+
+void
+PluginParameterDialog::setOutputLabel(QString text,
+                                      QString description)
+{
+    if (text == "") {
+        m_outputSpacer->hide();
+        m_outputLabel->hide();
+        m_outputValue->hide();
+        m_outputDescription->hide();
+    } else {
+        m_outputSpacer->show();
+        m_outputValue->setText(text);
+        m_outputValue->setWordWrap(true);
+        m_outputDescription->setText(description);
+        m_outputLabel->show();
+        m_outputValue->show();
+        if (description != "") {
+            m_outputDescription->show();
+        } else {
+            m_outputDescription->hide();
+        }
+    }
+}
+
+void
+PluginParameterDialog::setChannelArrangement(int sourceChannels,
+                                             int targetChannels,
+                                             int defaultChannel)
+{
+    m_channel = defaultChannel;
+
+    if (sourceChannels != targetChannels) {
+
+        // At the moment we can only cope with the case where
+        // sourceChannels > targetChannels and targetChannels == 1
+
+        if (sourceChannels < targetChannels) {
+
+            QMessageBox::warning
+                (parentWidget(),
+                 tr("Channel mismatch"),
+                 tr("This plugin requires at least %1 input channels, but only %2 %3 available.  The plugin probably will not work correctly.").arg(targetChannels).arg(sourceChannels).arg(sourceChannels != 1 ? tr("are") : tr("is")),
+                 QMessageBox::Ok,
+                 QMessageBox::NoButton);
+
+        } else {
+
+            if (m_haveChannelBoxData) {
+                std::cerr << "WARNING: PluginParameterDialog::setChannelArrangement: Calling more than once on same dialog is not currently implemented" << std::endl;
+                return;
+            }
+            
+            QVBoxLayout *channelLayout = new QVBoxLayout;
+            m_channelBox->setLayout(channelLayout);
+
+            if (targetChannels != 1) {
+
+                channelLayout->addWidget
+                    (new QLabel(tr("This plugin accepts no more than %1 input channels,\nbut %2 are available.  Only the first %3 will be used.\n")
+                                .arg(targetChannels)
+                                .arg(sourceChannels)
+                                .arg(targetChannels)));
+
+            } else {
+
+                channelLayout->addWidget(new QLabel(tr("This plugin only has a single channel input,\nbut the source has %1 channels.").arg(sourceChannels)));
+
+                QComboBox *channelCombo = new QComboBox;
+                channelCombo->addItem(tr("Use mean of source channels"));
+                for (int i = 0; i < sourceChannels; ++i) {
+                    channelCombo->addItem(tr("Use channel %1 only").arg(i + 1));
+                }
+
+                connect(channelCombo, SIGNAL(activated(int)),
+                        this, SLOT(channelComboChanged(int)));
+
+                channelLayout->addWidget(channelCombo);
+            }
+
+            m_channelBox->setVisible(true);
+            m_haveChannelBoxData = true;
+            m_advancedButton->show();
+        }
+    }
+
+    setAdvancedVisible(m_advancedVisible);
+}
+
+void
+PluginParameterDialog::setShowProcessingOptions(bool showWindowSize,
+                                                bool showFrequencyDomainOptions)
+{
+    if (m_haveWindowBoxData) {
+        std::cerr << "WARNING: PluginParameterDialog::setShowProcessingOptions: Calling more than once on same dialog is not currently implemented" << std::endl;
+        return;
+    }
+
+    if (showWindowSize) {
+
+        Vamp::PluginHostAdapter *fePlugin = dynamic_cast<Vamp::PluginHostAdapter *>(m_plugin);
+        int size = 1024;
+        int increment = 1024;
+        if (fePlugin) {
+            size = fePlugin->getPreferredBlockSize();
+            std::cerr << "Feature extraction plugin \"" << fePlugin->getName() << "\" reports preferred block size as " << size << std::endl;
+            if (size == 0) size = 1024;
+            increment = fePlugin->getPreferredStepSize();
+            if (increment == 0) {
+                if (fePlugin->getInputDomain() == Vamp::Plugin::TimeDomain) {
+                    increment = size;
+                } else {
+                    increment = size/2;
+                }
+            }
+        }
+
+        QGridLayout *windowLayout = new QGridLayout;
+        m_windowBox->setLayout(windowLayout);
+
+        if (showFrequencyDomainOptions) {
+            windowLayout->addWidget(new QLabel(tr("Window size:")), 0, 0);
+        } else {
+            windowLayout->addWidget(new QLabel(tr("Audio frames per block:")), 0, 0);
+        }
+
+        std::cerr << "size: " << size << ", increment: " << increment << std::endl;
+
+        QComboBox *blockSizeCombo = new QComboBox;
+        blockSizeCombo->setEditable(true);
+        bool found = false;
+        for (int i = 0; i < 14; ++i) {
+            int val = 1 << (i + 3);
+            blockSizeCombo->addItem(QString("%1").arg(val));
+            if (val == size) {
+                blockSizeCombo->setCurrentIndex(i);
+                found = true;
+            }
+        }
+        if (!found) {
+            blockSizeCombo->addItem(QString("%1").arg(size));
+            blockSizeCombo->setCurrentIndex(blockSizeCombo->count() - 1);
+        }
+        blockSizeCombo->setValidator(new QIntValidator(1, pow(2.0, 18), this));
+        connect(blockSizeCombo, SIGNAL(editTextChanged(const QString &)),
+                this, SLOT(blockSizeComboChanged(const QString &)));
+        windowLayout->addWidget(blockSizeCombo, 0, 1);
+
+        windowLayout->addWidget(new QLabel(tr("Window increment:")), 1, 0);
+        
+        QComboBox *incrementCombo = new QComboBox;
+        incrementCombo->setEditable(true);
+        found = false;
+        for (int i = 0; i < 14; ++i) {
+            int val = 1 << (i + 3);
+            incrementCombo->addItem(QString("%1").arg(val));
+            if (val == increment) {
+                incrementCombo->setCurrentIndex(i);
+                found = true;
+            }
+        }
+        if (!found) {
+            incrementCombo->addItem(QString("%1").arg(increment));
+            incrementCombo->setCurrentIndex(incrementCombo->count() - 1);
+        }
+        incrementCombo->setValidator(new QIntValidator(1, pow(2.0, 18), this));
+        connect(incrementCombo, SIGNAL(editTextChanged(const QString &)),
+                this, SLOT(incrementComboChanged(const QString &)));
+        windowLayout->addWidget(incrementCombo, 1, 1);
+        
+        if (showFrequencyDomainOptions) {
+            
+            windowLayout->addWidget(new QLabel(tr("Window shape:")), 2, 0);
+            WindowTypeSelector *windowTypeSelector = new WindowTypeSelector;
+            connect(windowTypeSelector, SIGNAL(windowTypeChanged(WindowType)),
+                    this, SLOT(windowTypeChanged(WindowType)));
+            windowLayout->addWidget(windowTypeSelector, 2, 1);
+        }
+
+        m_windowBox->setVisible(true);
+        m_haveWindowBoxData = true;
+        m_advancedButton->show();
+    }
+
+    setAdvancedVisible(m_advancedVisible);
+}
+
+void
+PluginParameterDialog::setCandidateInputModels(const QStringList &models)
+{
+    m_inputModels->clear();
+    m_inputModels->insertItems(0, models);
+    connect(m_inputModels, SIGNAL(activated(const QString &)),
+            this, SIGNAL(inputModelChanged(QString)));
+    m_inputModelBox->show();
+}
+
+QString
+PluginParameterDialog::getInputModel() const
+{
+    return m_inputModels->currentText();
+}
+
+void
+PluginParameterDialog::getProcessingParameters(size_t &blockSize) const
+{
+    blockSize = m_blockSize;
+    return;
+}
+
+void
+PluginParameterDialog::getProcessingParameters(size_t &stepSize,
+                                               size_t &blockSize,
+                                               WindowType &windowType) const
+{
+    stepSize = m_stepSize;
+    blockSize = m_blockSize;
+    windowType = m_windowType;
+    return;
+}
+
+void
+PluginParameterDialog::blockSizeComboChanged(const QString &text)
+{
+    m_blockSize = text.toInt();
+    std::cerr << "Block size changed to " << m_blockSize << std::endl;
+}
+
+void
+PluginParameterDialog::incrementComboChanged(const QString &text)
+{
+    m_stepSize = text.toInt();
+    //!!! rename increment to step size throughout
+    std::cerr << "Increment changed to " << m_stepSize << std::endl;
+}
+
+void
+PluginParameterDialog::windowTypeChanged(WindowType type)
+{
+    m_windowType = type;
+}
+
+void
+PluginParameterDialog::advancedToggled()
+{
+    setAdvancedVisible(!m_advancedVisible);
+}
+
+void
+PluginParameterDialog::setAdvancedVisible(bool visible)
+{
+    m_advanced->setVisible(visible);
+
+    if (visible) {
+        m_advancedButton->setText(tr("Advanced <<"));
+        m_advancedButton->setChecked(true);
+    } else {
+        m_advancedButton->setText(tr("Advanced >>"));
+        m_advancedButton->setChecked(false);
+    }
+
+    QSettings settings;
+    settings.beginGroup("PluginParameterDialog");
+    settings.setValue("advancedvisible", visible);
+    settings.endGroup();
+
+//    std::cerr << "resize to " << sizeHint().width() << " x " << sizeHint().height() << std::endl;
+
+    setMinimumHeight(sizeHint().height());
+    adjustSize();
+
+    m_advancedVisible = visible;
+
+//    if (visible) setMaximumHeight(sizeHint().height());
+//    adjustSize();
+}
+
+void
+PluginParameterDialog::channelComboChanged(int index)
+{
+    m_channel = index - 1;
+}
+