diff --git a/sdrbase/mainwindow.cpp b/sdrbase/mainwindow.cpp deleted file mode 100644 index 6c5ecd10d..000000000 --- a/sdrbase/mainwindow.cpp +++ /dev/null @@ -1,1161 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////// -// Copyright (C) 2012 maintech GmbH, Otto-Hahn-Str. 15, 97204 Hoechberg, Germany // -// written by Christian Daniel // -// // -// 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 as version 3 of the License, or // -// // -// This program is distributed in the hope that it will be useful, // -// but WITHOUT ANY WARRANTY; without even the implied warranty of // -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // -// GNU General Public License V3 for more details. // -// // -// You should have received a copy of the GNU General Public License // -// along with this program. If not, see . // -/////////////////////////////////////////////////////////////////////////////////// - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "mainwindow.h" -#include "ui_mainwindow.h" -#include "device/devicesourceapi.h" -#include "device/devicesinkapi.h" -#include "audio/audiodeviceinfo.h" -#include "gui/indicator.h" -#include "gui/presetitem.h" -#include "gui/addpresetdialog.h" -#include "gui/pluginsdialog.h" -#include "gui/aboutdialog.h" -#include "gui/rollupwidget.h" -#include "gui/channelwindow.h" -#include "gui/audiodialog.h" -#include "gui/samplingdevicecontrol.h" -#include "gui/mypositiondialog.h" -#include "dsp/dspengine.h" -#include "dsp/spectrumvis.h" -#include "dsp/dspcommands.h" -#include "dsp/devicesamplesource.h" -#include "dsp/devicesamplesink.h" -#include "plugin/pluginapi.h" -#include "gui/glspectrum.h" -#include "gui/glspectrumgui.h" - -#include -#include - -MainWindow::MainWindow(QWidget* parent) : - QMainWindow(parent), - ui(new Ui::MainWindow), - m_settings(), - m_masterTabIndex(0), - m_dspEngine(DSPEngine::instance()), - m_lastEngineState((DSPDeviceSourceEngine::State)-1), - m_inputGUI(0), - m_sampleRate(0), - m_centerFrequency(0), - m_sampleFileName(std::string("./test.sdriq")) -{ - qDebug() << "MainWindow::MainWindow: start"; - - m_settings.setAudioDeviceInfo(&m_audioDeviceInfo); - - ui->setupUi(this); - createStatusBar(); - - setCorner(Qt::TopLeftCorner, Qt::LeftDockWidgetArea); - setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea); - setCorner(Qt::TopRightCorner, Qt::RightDockWidgetArea); - setCorner(Qt::BottomRightCorner, Qt::RightDockWidgetArea); - - // work around broken Qt dock widget ordering - removeDockWidget(ui->inputViewDock); - removeDockWidget(ui->inputSelectDock); - removeDockWidget(ui->spectraDisplayDock); - removeDockWidget(ui->presetDock); - removeDockWidget(ui->channelDock); - addDockWidget(Qt::LeftDockWidgetArea, ui->inputViewDock); - addDockWidget(Qt::LeftDockWidgetArea, ui->inputSelectDock); - addDockWidget(Qt::LeftDockWidgetArea, ui->spectraDisplayDock); - addDockWidget(Qt::LeftDockWidgetArea, ui->presetDock); - addDockWidget(Qt::RightDockWidgetArea, ui->channelDock); - - ui->inputViewDock->show(); - ui->inputSelectDock->show(); - ui->spectraDisplayDock->show(); - ui->presetDock->show(); - ui->channelDock->show(); - - ui->menu_Window->addAction(ui->inputViewDock->toggleViewAction()); - ui->menu_Window->addAction(ui->inputSelectDock->toggleViewAction()); - ui->menu_Window->addAction(ui->spectraDisplayDock->toggleViewAction()); - ui->menu_Window->addAction(ui->presetDock->toggleViewAction()); - ui->menu_Window->addAction(ui->channelDock->toggleViewAction()); - - ui->tabInputsView->setStyleSheet("QWidget { background: rgb(50,50,50); } " - "QToolButton::checked { background: rgb(128,70,0); } " - "QComboBox::item:selected { color: rgb(255,140,0); } " - "QTabWidget::pane { border: 1px solid #C06900; } " - "QTabBar::tab:selected { background: rgb(128,70,0); }"); - ui->tabInputsSelect->setStyleSheet("QWidget { background: rgb(50,50,50); } " - "QToolButton::checked { background: rgb(128,70,0); } " - "QComboBox::item:selected { color: rgb(255,140,0); } " - "QTabWidget::pane { border: 1px solid #808080; } " - "QTabBar::tab:selected { background: rgb(100,100,100); }"); - - m_pluginManager = new PluginManager(this); - m_pluginManager->loadPlugins(); - - connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleMessages()), Qt::QueuedConnection); - - connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus())); - m_statusTimer.start(1000); - - m_masterTimer.start(50); - - qDebug() << "MainWindow::MainWindow: add the first device..."; - - addSourceDevice(); // add the first device - - qDebug() << "MainWindow::MainWindow: load settings..."; - - loadSettings(); - - qDebug() << "MainWindow::MainWindow: select SampleSource from settings..."; - - int sampleSourceIndex = m_settings.getSourceIndex(); - sampleSourceIndex = m_pluginManager->selectSampleSourceByIndex(sampleSourceIndex, m_deviceUIs.back()->m_deviceSourceAPI); - - if (sampleSourceIndex < 0) - { - qCritical("MainWindow::MainWindow: no sample source. Exit"); - exit(0); - } - - DeviceSampleSource *source = m_deviceUIs.back()->m_deviceSourceAPI->getPluginInterface()->createSampleSourcePluginInstanceInput( - m_deviceUIs.back()->m_deviceSourceAPI->getSampleSourceId(), m_deviceUIs.back()->m_deviceSourceAPI); - m_deviceUIs.back()->m_deviceSourceAPI->setSampleSource(source); - QWidget *gui; - PluginInstanceGUI *pluginGUI = m_deviceUIs.back()->m_deviceSourceAPI->getPluginInterface()->createSampleSourcePluginInstanceGUI( - m_deviceUIs.back()->m_deviceSourceAPI->getSampleSourceId(), &gui, m_deviceUIs.back()->m_deviceSourceAPI); - m_deviceUIs.back()->m_deviceSourceAPI->getSampleSource()->setMessageQueueToGUI(pluginGUI->getInputMessageQueue()); - m_deviceUIs.back()->m_deviceSourceAPI->setSampleSourcePluginInstanceGUI(pluginGUI); - setDeviceGUI(0, gui, m_deviceUIs.back()->m_deviceSourceAPI->getSampleSourceDisplayName()); - - m_deviceUIs.back()->m_deviceSourceAPI->setBuddyLeader(true); // the first device is always the leader - - bool sampleSourceSignalsBlocked = m_deviceUIs.back()->m_samplingDeviceControl->getDeviceSelector()->blockSignals(true); - m_deviceUIs.back()->m_samplingDeviceControl->getDeviceSelector()->setCurrentIndex(sampleSourceIndex); - m_deviceUIs.back()->m_samplingDeviceControl->getDeviceSelector()->blockSignals(sampleSourceSignalsBlocked); - - qDebug() << "MainWindow::MainWindow: load current preset settings..."; - - loadPresetSettings(m_settings.getWorkingPreset(), 0); - - qDebug() << "MainWindow::MainWindow: apply settings..."; - - applySettings(); - - qDebug() << "MainWindow::MainWindow: update preset controls..."; - - updatePresetControls(); - - connect(ui->tabInputsView, SIGNAL(currentChanged(int)), this, SLOT(tabInputViewIndexChanged())); - - qDebug() << "MainWindow::MainWindow: end"; -} - -MainWindow::~MainWindow() -{ - delete m_pluginManager; - delete m_dateTimeWidget; - delete m_showSystemWidget; - - delete ui; -} - -void MainWindow::addSourceDevice() -{ - DSPDeviceSourceEngine *dspDeviceSourceEngine = m_dspEngine->addDeviceSourceEngine(); - dspDeviceSourceEngine->start(); - - uint dspDeviceSourceEngineUID = dspDeviceSourceEngine->getUID(); - char uidCStr[16]; - sprintf(uidCStr, "UID:%d", dspDeviceSourceEngineUID); - - m_deviceUIs.push_back(new DeviceUISet(m_masterTimer)); - m_deviceUIs.back()->m_deviceSourceEngine = dspDeviceSourceEngine; - - int deviceTabIndex = m_deviceUIs.size()-1; - char tabNameCStr[16]; - sprintf(tabNameCStr, "R%d", deviceTabIndex); - - DeviceSourceAPI *deviceSourceAPI = new DeviceSourceAPI(this, deviceTabIndex, dspDeviceSourceEngine, m_deviceUIs.back()->m_spectrum, m_deviceUIs.back()->m_channelWindow); - - m_deviceUIs.back()->m_deviceSourceAPI = deviceSourceAPI; - m_deviceUIs.back()->m_samplingDeviceControl->setDeviceAPI(deviceSourceAPI); - m_deviceUIs.back()->m_samplingDeviceControl->setPluginManager(m_pluginManager); - m_pluginManager->populateRxChannelComboBox(m_deviceUIs.back()->m_samplingDeviceControl->getChannelSelector()); - - connect(m_deviceUIs.back()->m_samplingDeviceControl->getAddChannelButton(), SIGNAL(clicked(bool)), this, SLOT(on_channel_addClicked(bool))); - - dspDeviceSourceEngine->addSink(m_deviceUIs.back()->m_spectrumVis); - ui->tabSpectra->addTab(m_deviceUIs.back()->m_spectrum, tabNameCStr); - ui->tabSpectraGUI->addTab(m_deviceUIs.back()->m_spectrumGUI, tabNameCStr); - ui->tabChannels->addTab(m_deviceUIs.back()->m_channelWindow, tabNameCStr); - - bool sampleSourceSignalsBlocked = m_deviceUIs.back()->m_samplingDeviceControl->getDeviceSelector()->blockSignals(true); - m_pluginManager->duplicateLocalSampleSourceDevices(dspDeviceSourceEngineUID); - m_pluginManager->fillSampleSourceSelector(m_deviceUIs.back()->m_samplingDeviceControl->getDeviceSelector(), dspDeviceSourceEngineUID); - - connect(m_deviceUIs.back()->m_samplingDeviceControl->getDeviceSelectionConfirm(), SIGNAL(clicked(bool)), this, SLOT(on_sampleSource_confirmClicked(bool))); - - m_deviceUIs.back()->m_samplingDeviceControl->getDeviceSelector()->blockSignals(sampleSourceSignalsBlocked); - ui->tabInputsSelect->addTab(m_deviceUIs.back()->m_samplingDeviceControl, tabNameCStr); - ui->tabInputsSelect->setTabToolTip(deviceTabIndex, QString(uidCStr)); - - // Create a file source instance by default - m_pluginManager->selectSampleSourceBySerialOrSequence("sdrangel.samplesource.filesource", "0", 0, m_deviceUIs.back()->m_deviceSourceAPI); - DeviceSampleSource *source = m_deviceUIs.back()->m_deviceSourceAPI->getPluginInterface()->createSampleSourcePluginInstanceInput( - m_deviceUIs.back()->m_deviceSourceAPI->getSampleSourceId(), m_deviceUIs.back()->m_deviceSourceAPI); - m_deviceUIs.back()->m_deviceSourceAPI->setSampleSource(source); - QWidget *gui; - PluginInstanceGUI *pluginGUI = m_deviceUIs.back()->m_deviceSourceAPI->getPluginInterface()->createSampleSourcePluginInstanceGUI( - m_deviceUIs.back()->m_deviceSourceAPI->getSampleSourceId(), &gui, m_deviceUIs.back()->m_deviceSourceAPI); - m_deviceUIs.back()->m_deviceSourceAPI->getSampleSource()->setMessageQueueToGUI(pluginGUI->getInputMessageQueue()); - m_deviceUIs.back()->m_deviceSourceAPI->setSampleSourcePluginInstanceGUI(pluginGUI); - setDeviceGUI(deviceTabIndex, gui, m_deviceUIs.back()->m_deviceSourceAPI->getSampleSourceDisplayName()); - -} - -void MainWindow::addSinkDevice() -{ - DSPDeviceSinkEngine *dspDeviceSinkEngine = m_dspEngine->addDeviceSinkEngine(); - dspDeviceSinkEngine->start(); - - uint dspDeviceSinkEngineUID = dspDeviceSinkEngine->getUID(); - char uidCStr[16]; - sprintf(uidCStr, "UID:%d", dspDeviceSinkEngineUID); - - m_deviceUIs.push_back(new DeviceUISet(m_masterTimer)); - m_deviceUIs.back()->m_deviceSourceEngine = 0; - m_deviceUIs.back()->m_deviceSinkEngine = dspDeviceSinkEngine; - - int deviceTabIndex = m_deviceUIs.size()-1; - char tabNameCStr[16]; - sprintf(tabNameCStr, "T%d", deviceTabIndex); - - DeviceSinkAPI *deviceSinkAPI = new DeviceSinkAPI(this, deviceTabIndex, dspDeviceSinkEngine, m_deviceUIs.back()->m_spectrum, m_deviceUIs.back()->m_channelWindow); - - m_deviceUIs.back()->m_deviceSourceAPI = 0; - m_deviceUIs.back()->m_deviceSinkAPI = deviceSinkAPI; - m_deviceUIs.back()->m_samplingDeviceControl->setDeviceAPI(deviceSinkAPI); - m_deviceUIs.back()->m_samplingDeviceControl->setPluginManager(m_pluginManager); - m_pluginManager->populateTxChannelComboBox(m_deviceUIs.back()->m_samplingDeviceControl->getChannelSelector()); - - connect(m_deviceUIs.back()->m_samplingDeviceControl->getAddChannelButton(), SIGNAL(clicked(bool)), this, SLOT(on_channel_addClicked(bool))); - - dspDeviceSinkEngine->addSpectrumSink(m_deviceUIs.back()->m_spectrumVis); - ui->tabSpectra->addTab(m_deviceUIs.back()->m_spectrum, tabNameCStr); - ui->tabSpectraGUI->addTab(m_deviceUIs.back()->m_spectrumGUI, tabNameCStr); - ui->tabChannels->addTab(m_deviceUIs.back()->m_channelWindow, tabNameCStr); - - bool sampleSourceSignalsBlocked = m_deviceUIs.back()->m_samplingDeviceControl->getDeviceSelector()->blockSignals(true); - m_pluginManager->duplicateLocalSampleSinkDevices(dspDeviceSinkEngineUID); - m_pluginManager->fillSampleSinkSelector(m_deviceUIs.back()->m_samplingDeviceControl->getDeviceSelector(), dspDeviceSinkEngineUID); - - connect(m_deviceUIs.back()->m_samplingDeviceControl->getDeviceSelectionConfirm(), SIGNAL(clicked(bool)), this, SLOT(on_sampleSink_confirmClicked(bool))); - - m_deviceUIs.back()->m_samplingDeviceControl->getDeviceSelector()->blockSignals(sampleSourceSignalsBlocked); - ui->tabInputsSelect->addTab(m_deviceUIs.back()->m_samplingDeviceControl, tabNameCStr); - ui->tabInputsSelect->setTabToolTip(deviceTabIndex, QString(uidCStr)); - - // create a file sink by default - m_pluginManager->selectSampleSinkBySerialOrSequence("sdrangel.samplesink.filesink", "0", 0, m_deviceUIs.back()->m_deviceSinkAPI); - DeviceSampleSink *sink = m_deviceUIs.back()->m_deviceSinkAPI->getPluginInterface()->createSampleSinkPluginInstanceOutput( - m_deviceUIs.back()->m_deviceSinkAPI->getSampleSinkId(), m_deviceUIs.back()->m_deviceSinkAPI); - m_deviceUIs.back()->m_deviceSinkAPI->setSampleSink(sink); - QWidget *gui; - PluginInstanceGUI *pluginUI = m_deviceUIs.back()->m_deviceSinkAPI->getPluginInterface()->createSampleSinkPluginInstanceGUI( - m_deviceUIs.back()->m_deviceSinkAPI->getSampleSinkId(), &gui, m_deviceUIs.back()->m_deviceSinkAPI); - m_deviceUIs.back()->m_deviceSinkAPI->getSampleSink()->setMessageQueueToGUI(pluginUI->getInputMessageQueue()); - m_deviceUIs.back()->m_deviceSinkAPI->setSampleSinkPluginInstanceUI(pluginUI); - setDeviceGUI(deviceTabIndex, gui, m_deviceUIs.back()->m_deviceSinkAPI->getSampleSinkDisplayName(), false); -} - -void MainWindow::removeLastDevice() -{ - if (m_deviceUIs.back()->m_deviceSourceEngine) // source tab - { - DSPDeviceSourceEngine *lastDeviceEngine = m_deviceUIs.back()->m_deviceSourceEngine; - lastDeviceEngine->stopAcquistion(); - lastDeviceEngine->removeSink(m_deviceUIs.back()->m_spectrumVis); - - ui->tabSpectraGUI->removeTab(ui->tabSpectraGUI->count() - 1); - ui->tabSpectra->removeTab(ui->tabSpectra->count() - 1); - - // deletes old UI and input object - m_deviceUIs.back()->m_deviceSourceAPI->freeChannels(); // destroys the channel instances - m_deviceUIs.back()->m_deviceSourceAPI->getSampleSource()->setMessageQueueToGUI(0); // have source stop sending messages to the GUI - m_deviceUIs.back()->m_deviceSourceAPI->getPluginInterface()->deleteSampleSourcePluginInstanceGUI( - m_deviceUIs.back()->m_deviceSourceAPI->getSampleSourcePluginInstanceGUI()); - m_deviceUIs.back()->m_deviceSourceAPI->resetSampleSourceId(); - m_deviceUIs.back()->m_deviceSourceAPI->getPluginInterface()->deleteSampleSourcePluginInstanceInput( - m_deviceUIs.back()->m_deviceSourceAPI->getSampleSource()); - m_deviceUIs.back()->m_deviceSourceAPI->clearBuddiesLists(); // clear old API buddies lists - - ui->tabChannels->removeTab(ui->tabChannels->count() - 1); - - ui->tabInputsSelect->removeTab(ui->tabInputsSelect->count() - 1); - - m_deviceWidgetTabs.removeLast(); - ui->tabInputsView->clear(); - - for (int i = 0; i < m_deviceWidgetTabs.size(); i++) - { - qDebug("MainWindow::removeLastDevice: adding back tab for %s", m_deviceWidgetTabs[i].displayName.toStdString().c_str()); - ui->tabInputsView->addTab(m_deviceWidgetTabs[i].gui, m_deviceWidgetTabs[i].tabName); - ui->tabInputsView->setTabToolTip(i, m_deviceWidgetTabs[i].displayName); - } - - delete m_deviceUIs.back(); - - lastDeviceEngine->stop(); - m_dspEngine->removeLastDeviceSourceEngine(); - } - else if (m_deviceUIs.back()->m_deviceSinkEngine) // sink tab - { - DSPDeviceSinkEngine *lastDeviceEngine = m_deviceUIs.back()->m_deviceSinkEngine; - lastDeviceEngine->stopGeneration(); - lastDeviceEngine->removeSpectrumSink(m_deviceUIs.back()->m_spectrumVis); - - ui->tabSpectraGUI->removeTab(ui->tabSpectraGUI->count() - 1); - ui->tabSpectra->removeTab(ui->tabSpectra->count() - 1); - - // deletes old UI and output object - m_deviceUIs.back()->m_deviceSinkAPI->freeChannels(); - m_deviceUIs.back()->m_deviceSinkAPI->getSampleSink()->setMessageQueueToGUI(0); // have sink stop sending messages to the GUI - m_deviceUIs.back()->m_deviceSinkAPI->getPluginInterface()->deleteSampleSourcePluginInstanceGUI( - m_deviceUIs.back()->m_deviceSinkAPI->getSampleSinkPluginInstanceGUI()); - m_deviceUIs.back()->m_deviceSinkAPI->resetSampleSinkId(); - m_deviceUIs.back()->m_deviceSinkAPI->getPluginInterface()->deleteSampleSinkPluginInstanceOutput( - m_deviceUIs.back()->m_deviceSinkAPI->getSampleSink()); - m_deviceUIs.back()->m_deviceSinkAPI->clearBuddiesLists(); // clear old API buddies lists - - ui->tabChannels->removeTab(ui->tabChannels->count() - 1); - - ui->tabInputsSelect->removeTab(ui->tabInputsSelect->count() - 1); - - m_deviceWidgetTabs.removeLast(); - ui->tabInputsView->clear(); - - for (int i = 0; i < m_deviceWidgetTabs.size(); i++) - { - qDebug("MainWindow::removeLastDevice: adding back tab for %s", m_deviceWidgetTabs[i].displayName.toStdString().c_str()); - ui->tabInputsView->addTab(m_deviceWidgetTabs[i].gui, m_deviceWidgetTabs[i].tabName); - ui->tabInputsView->setTabToolTip(i, m_deviceWidgetTabs[i].displayName); - } - - delete m_deviceUIs.back(); - - lastDeviceEngine->stop(); - m_dspEngine->removeLastDeviceSinkEngine(); - } - - m_deviceUIs.pop_back(); -} - -void MainWindow::addChannelRollup(int deviceTabIndex, QWidget* widget) -{ - if (deviceTabIndex < ui->tabInputsView->count()) - { - DeviceUISet *deviceUI = m_deviceUIs[deviceTabIndex]; - deviceUI->m_channelWindow->addRollupWidget(widget); - ui->channelDock->show(); - ui->channelDock->raise(); - } -} - -void MainWindow::addViewAction(QAction* action) -{ - ui->menu_Window->addAction(action); -} - -void MainWindow::setDeviceGUI(int deviceTabIndex, QWidget* gui, const QString& deviceDisplayName, bool sourceDevice) -{ - char tabNameCStr[16]; - - if (sourceDevice) - { - sprintf(tabNameCStr, "R%d", deviceTabIndex); - } - else - { - sprintf(tabNameCStr, "T%d", deviceTabIndex); - } - - qDebug("MainWindow::setDeviceGUI: insert %s tab at %d", sourceDevice ? "Rx" : "Tx", deviceTabIndex); - - if (deviceTabIndex < m_deviceWidgetTabs.size()) - { - m_deviceWidgetTabs[deviceTabIndex] = {gui, deviceDisplayName, QString(tabNameCStr)}; - } - else - { - m_deviceWidgetTabs.append({gui, deviceDisplayName, QString(tabNameCStr)}); - } - - ui->tabInputsView->clear(); - - for (int i = 0; i < m_deviceWidgetTabs.size(); i++) - { - qDebug("MainWindow::setDeviceGUI: adding tab for %s", m_deviceWidgetTabs[i].displayName.toStdString().c_str()); - ui->tabInputsView->addTab(m_deviceWidgetTabs[i].gui, m_deviceWidgetTabs[i].tabName); - ui->tabInputsView->setTabToolTip(i, m_deviceWidgetTabs[i].displayName); - } - - ui->tabInputsView->setCurrentIndex(deviceTabIndex); -} - -void MainWindow::loadSettings() -{ - qDebug() << "MainWindow::loadSettings"; - - m_settings.load(); - m_settings.sortPresets(); - - for(int i = 0; i < m_settings.getPresetCount(); ++i) - { - ui->presetTree->setCurrentItem(addPresetToTree(m_settings.getPreset(i))); - } -} - -void MainWindow::loadPresetSettings(const Preset* preset, int tabIndex) -{ - qDebug("MainWindow::loadPresetSettings: preset [%s | %s]", - qPrintable(preset->getGroup()), - qPrintable(preset->getDescription())); - - if (tabIndex >= 0) - { - DeviceUISet *deviceUI = m_deviceUIs[tabIndex]; - - if (deviceUI->m_deviceSourceEngine) // source device - { - deviceUI->m_spectrumGUI->deserialize(preset->getSpectrumConfig()); - deviceUI->m_deviceSourceAPI->loadSourceSettings(preset); - deviceUI->m_deviceSourceAPI->loadChannelSettings(preset, &(m_pluginManager->m_pluginAPI)); - } - else if (deviceUI->m_deviceSinkEngine) // sink device - { - deviceUI->m_spectrumGUI->deserialize(preset->getSpectrumConfig()); - deviceUI->m_deviceSinkAPI->loadSinkSettings(preset); - deviceUI->m_deviceSinkAPI->loadChannelSettings(preset, &(m_pluginManager->m_pluginAPI)); - } - } - - // has to be last step - restoreState(preset->getLayout()); -} - -void MainWindow::savePresetSettings(Preset* preset, int tabIndex) -{ - qDebug("MainWindow::savePresetSettings: preset [%s | %s]", - qPrintable(preset->getGroup()), - qPrintable(preset->getDescription())); - - // Save from currently selected source tab - //int currentSourceTabIndex = ui->tabInputsView->currentIndex(); - DeviceUISet *deviceUI = m_deviceUIs[tabIndex]; - - if (deviceUI->m_deviceSourceEngine) // source device - { - preset->setSpectrumConfig(deviceUI->m_spectrumGUI->serialize()); - preset->clearChannels(); - deviceUI->m_deviceSourceAPI->saveChannelSettings(preset); - deviceUI->m_deviceSourceAPI->saveSourceSettings(preset); - } - else if (deviceUI->m_deviceSinkEngine) // sink device - { - preset->setSpectrumConfig(deviceUI->m_spectrumGUI->serialize()); - preset->clearChannels(); - preset->setSourcePreset(false); - deviceUI->m_deviceSinkAPI->saveChannelSettings(preset); - deviceUI->m_deviceSinkAPI->saveSinkSettings(preset); - } - - preset->setLayout(saveState()); -} - -void MainWindow::createStatusBar() -{ - QString qtVersionStr = QString("Qt %1 ").arg(QT_VERSION_STR); -#if QT_VERSION >= 0x050400 - m_showSystemWidget = new QLabel("SDRangel v3.7.6 " + qtVersionStr + QSysInfo::prettyProductName(), this); -#else - m_showSystemWidget = new QLabel("SDRangel v3.7.6 " + qtVersionStr, this); -#endif - statusBar()->addPermanentWidget(m_showSystemWidget); - - m_dateTimeWidget = new QLabel(tr("Date"), this); - m_dateTimeWidget->setToolTip(tr("Current date/time")); - statusBar()->addPermanentWidget(m_dateTimeWidget); -} - -void MainWindow::closeEvent(QCloseEvent*) -{ -} - -void MainWindow::updatePresetControls() -{ - ui->presetTree->resizeColumnToContents(0); - - if(ui->presetTree->currentItem() != 0) - { - ui->presetDelete->setEnabled(true); - ui->presetLoad->setEnabled(true); - } - else - { - ui->presetDelete->setEnabled(false); - ui->presetLoad->setEnabled(false); - } -} - -QTreeWidgetItem* MainWindow::addPresetToTree(const Preset* preset) -{ - QTreeWidgetItem* group = 0; - - for(int i = 0; i < ui->presetTree->topLevelItemCount(); i++) - { - if(ui->presetTree->topLevelItem(i)->text(0) == preset->getGroup()) - { - group = ui->presetTree->topLevelItem(i); - break; - } - } - - if(group == 0) - { - QStringList sl; - sl.append(preset->getGroup()); - group = new QTreeWidgetItem(ui->presetTree, sl, PGroup); - group->setFirstColumnSpanned(true); - group->setExpanded(true); - ui->presetTree->sortByColumn(0, Qt::AscendingOrder); - } - - QStringList sl; - sl.append(QString("%1").arg(preset->getCenterFrequency() / 1e6f, 0, 'f', 3)); // frequency column - sl.append(QString("%1").arg(preset->isSourcePreset() ? 'R' : 'T')); // mode column - sl.append(preset->getDescription()); // description column - PresetItem* item = new PresetItem(group, sl, preset->getCenterFrequency(), PItem); - item->setTextAlignment(0, Qt::AlignRight); - item->setData(0, Qt::UserRole, qVariantFromValue(preset)); - ui->presetTree->resizeColumnToContents(0); // Resize frequency column to minimum - ui->presetTree->resizeColumnToContents(1); // Resize mode column to minimum - - updatePresetControls(); - return item; -} - -void MainWindow::applySettings() -{ -} - -void MainWindow::handleMessages() -{ - Message* message; - - while ((message = m_inputMessageQueue.pop()) != 0) - { - qDebug("MainWindow::handleMessages: message: %s", message->getIdentifier()); - delete message; - } -} - -void MainWindow::on_action_View_Fullscreen_toggled(bool checked) -{ - if(checked) - showFullScreen(); - else showNormal(); -} - -void MainWindow::on_presetSave_clicked() -{ - QStringList groups; - QString group; - QString description = ""; - for(int i = 0; i < ui->presetTree->topLevelItemCount(); i++) - groups.append(ui->presetTree->topLevelItem(i)->text(0)); - - QTreeWidgetItem* item = ui->presetTree->currentItem(); - if(item != 0) { - if(item->type() == PGroup) - group = item->text(0); - else if(item->type() == PItem) { - group = item->parent()->text(0); - description = item->text(0); - } - } - - AddPresetDialog dlg(groups, group, this); - - if (description.length() > 0) { - dlg.setDescription(description); - } - - if(dlg.exec() == QDialog::Accepted) { - Preset* preset = m_settings.newPreset(dlg.group(), dlg.description()); - savePresetSettings(preset, ui->tabInputsView->currentIndex()); - - ui->presetTree->setCurrentItem(addPresetToTree(preset)); - } -} - -void MainWindow::on_presetUpdate_clicked() -{ - QTreeWidgetItem* item = ui->presetTree->currentItem(); - - if(item != 0) { - if(item->type() == PItem) { - const Preset* preset = qvariant_cast(item->data(0, Qt::UserRole)); - if (preset != 0) { - Preset* preset_mod = const_cast(preset); - savePresetSettings(preset_mod, ui->tabInputsView->currentIndex()); - } - } - } -} - -void MainWindow::on_presetExport_clicked() -{ - QTreeWidgetItem* item = ui->presetTree->currentItem(); - - if(item != 0) { - if(item->type() == PItem) - { - const Preset* preset = qvariant_cast(item->data(0, Qt::UserRole)); - QString base64Str = preset->serialize().toBase64(); - QString fileName = QFileDialog::getSaveFileName(this, - tr("Open preset export file"), ".", tr("Preset export files (*.prex)")); - - if (fileName != "") - { - QFileInfo fileInfo(fileName); - - if (fileInfo.suffix() != "prex") { - fileName += ".prex"; - } - - QFile exportFile(fileName); - - if (exportFile.open(QIODevice::WriteOnly | QIODevice::Text)) - { - QTextStream outstream(&exportFile); - outstream << base64Str; - exportFile.close(); - } - else - { - QMessageBox::information(this, tr("Message"), tr("Cannot open file for writing")); - } - } - } - } -} - -void MainWindow::on_presetImport_clicked() -{ - QTreeWidgetItem* item = ui->presetTree->currentItem(); - - if(item != 0) - { - QString group; - - if (item->type() == PGroup) { - group = item->text(0); - } else if (item->type() == PItem) { - group = item->parent()->text(0); - } else { - return; - } - - QString fileName = QFileDialog::getOpenFileName(this, - tr("Open preset export file"), ".", tr("Preset export files (*.prex)")); - - if (fileName != "") - { - QFile exportFile(fileName); - - if (exportFile.open(QIODevice::ReadOnly | QIODevice::Text)) - { - QByteArray base64Str; - QTextStream instream(&exportFile); - instream >> base64Str; - exportFile.close(); - - Preset* preset = m_settings.newPreset("", ""); - preset->deserialize(QByteArray::fromBase64(base64Str)); - preset->setGroup(group); // override with current group - - ui->presetTree->setCurrentItem(addPresetToTree(preset)); - } - else - { - QMessageBox::information(this, tr("Message"), tr("Cannot open file for reading")); - } - } - } -} - -void MainWindow::on_settingsSave_clicked() -{ - savePresetSettings(m_settings.getWorkingPreset(), ui->tabInputsView->currentIndex()); - m_settings.save(); -} - -void MainWindow::on_presetLoad_clicked() -{ - qDebug() << "MainWindow::on_presetLoad_clicked"; - - QTreeWidgetItem* item = ui->presetTree->currentItem(); - - if(item == 0) - { - qDebug("MainWindow::on_presetLoad_clicked: item null"); - updatePresetControls(); - return; - } - - const Preset* preset = qvariant_cast(item->data(0, Qt::UserRole)); - - if(preset == 0) - { - qDebug("MainWindow::on_presetLoad_clicked: preset null"); - return; - } - - loadPresetSettings(preset, ui->tabInputsView->currentIndex()); - applySettings(); -} - -void MainWindow::on_presetDelete_clicked() -{ - QTreeWidgetItem* item = ui->presetTree->currentItem(); - if(item == 0) { - updatePresetControls(); - return; - } - const Preset* preset = qvariant_cast(item->data(0, Qt::UserRole)); - if(preset == 0) - return; - - if(QMessageBox::question(this, tr("Delete Preset"), tr("Do you want to delete preset '%1'?").arg(preset->getDescription()), QMessageBox::No | QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) { - delete item; - m_settings.deletePreset(preset); - } -} - -void MainWindow::on_presetTree_currentItemChanged(QTreeWidgetItem *current __attribute__((unused)), QTreeWidgetItem *previous __attribute__((unused))) -{ - updatePresetControls(); -} - -void MainWindow::on_presetTree_itemActivated(QTreeWidgetItem *item __attribute__((unused)), int column __attribute__((unused))) -{ - on_presetLoad_clicked(); -} - -void MainWindow::on_action_Loaded_Plugins_triggered() -{ - PluginsDialog pluginsDialog(m_pluginManager, this); - pluginsDialog.exec(); -} - -void MainWindow::on_action_Audio_triggered() -{ - AudioDialog audioDialog(&m_audioDeviceInfo, this); - audioDialog.exec(); - m_dspEngine->setAudioInputVolume(m_audioDeviceInfo.getInputVolume()); - m_dspEngine->setAudioInputDeviceIndex(m_audioDeviceInfo.getInputDeviceIndex()); - m_dspEngine->setAudioOutputDeviceIndex(m_audioDeviceInfo.getOutputDeviceIndex()); -} - -void MainWindow::on_action_My_Position_triggered() -{ - MyPositionDialog myPositionDialog(m_settings, this); - myPositionDialog.exec(); -} - -void MainWindow::on_action_DV_Serial_triggered(bool checked) -{ - m_dspEngine->setDVSerialSupport(checked); - - if (checked) - { - std::vector deviceNames; - m_dspEngine->getDVSerialNames(deviceNames); - - if (deviceNames.size() == 0) - { - QMessageBox::information(this, tr("Message"), tr("No DV serial devices found")); - } - else - { - std::vector::iterator it = deviceNames.begin(); - std::string deviceNamesStr = "DV Serial devices found: "; - - while (it != deviceNames.end()) - { - if (it != deviceNames.begin()) { - deviceNamesStr += ","; - } - - deviceNamesStr += *it; - ++it; - } - - QMessageBox::information(this, tr("Message"), tr(deviceNamesStr.c_str())); - } - } -} - -void MainWindow::on_sampleSource_confirmClicked(bool checked __attribute__((unused))) -{ - // Do it in the currently selected source tab - int currentSourceTabIndex = ui->tabInputsSelect->currentIndex(); - - if (currentSourceTabIndex >= 0) - { - qDebug("MainWindow::on_sampleSource_confirmClicked: tab at %d", currentSourceTabIndex); - DeviceUISet *deviceUI = m_deviceUIs[currentSourceTabIndex]; - deviceUI->m_deviceSourceAPI->saveSourceSettings(m_settings.getWorkingPreset()); // save old API settings - int selectedComboIndex = deviceUI->m_samplingDeviceControl->getDeviceSelector()->currentIndex(); - void *devicePtr = deviceUI->m_samplingDeviceControl->getDeviceSelector()->itemData(selectedComboIndex).value(); - deviceUI->m_deviceSourceAPI->stopAcquisition(); - - // deletes old UI and input object - deviceUI->m_deviceSourceAPI->getSampleSource()->setMessageQueueToGUI(0); // have source stop sending messages to the GUI - deviceUI->m_deviceSourceAPI->getPluginInterface()->deleteSampleSourcePluginInstanceGUI( - deviceUI->m_deviceSourceAPI->getSampleSourcePluginInstanceGUI()); - deviceUI->m_deviceSourceAPI->resetSampleSourceId(); - deviceUI->m_deviceSourceAPI->getPluginInterface()->deleteSampleSourcePluginInstanceInput( - deviceUI->m_deviceSourceAPI->getSampleSource()); - deviceUI->m_deviceSourceAPI->clearBuddiesLists(); // clear old API buddies lists - - m_pluginManager->selectSampleSourceByDevice(devicePtr, deviceUI->m_deviceSourceAPI); // sets the new API - - // add to buddies list - std::vector::iterator it = m_deviceUIs.begin(); - int nbOfBuddies = 0; - - for (; it != m_deviceUIs.end(); ++it) - { - if (*it != deviceUI) // do not add to itself - { - if ((*it)->m_deviceSourceEngine) // it is a source device - { - if ((deviceUI->m_deviceSourceAPI->getHardwareId() == (*it)->m_deviceSourceAPI->getHardwareId()) && - (deviceUI->m_deviceSourceAPI->getSampleSourceSerial() == (*it)->m_deviceSourceAPI->getSampleSourceSerial())) - { - (*it)->m_deviceSourceAPI->addSourceBuddy(deviceUI->m_deviceSourceAPI); - nbOfBuddies++; - } - } - - if ((*it)->m_deviceSinkEngine) // it is a sink device - { - if ((deviceUI->m_deviceSourceAPI->getHardwareId() == (*it)->m_deviceSinkAPI->getHardwareId()) && - (deviceUI->m_deviceSourceAPI->getSampleSourceSerial() == (*it)->m_deviceSinkAPI->getSampleSinkSerial())) - { - (*it)->m_deviceSinkAPI->addSourceBuddy(deviceUI->m_deviceSourceAPI); - nbOfBuddies++; - } - } - } - } - - if (nbOfBuddies == 0) { - deviceUI->m_deviceSourceAPI->setBuddyLeader(true); - } - - // constructs new GUI and input object - DeviceSampleSource *source = deviceUI->m_deviceSourceAPI->getPluginInterface()->createSampleSourcePluginInstanceInput( - deviceUI->m_deviceSourceAPI->getSampleSourceId(), deviceUI->m_deviceSourceAPI); - deviceUI->m_deviceSourceAPI->setSampleSource(source); - QWidget *gui; - PluginInstanceGUI *pluginUI = deviceUI->m_deviceSourceAPI->getPluginInterface()->createSampleSourcePluginInstanceGUI( - deviceUI->m_deviceSourceAPI->getSampleSourceId(), &gui, deviceUI->m_deviceSourceAPI); - deviceUI->m_deviceSourceAPI->getSampleSource()->setMessageQueueToGUI(pluginUI->getInputMessageQueue()); - deviceUI->m_deviceSourceAPI->setSampleSourcePluginInstanceGUI(pluginUI); - setDeviceGUI(currentSourceTabIndex, gui, deviceUI->m_deviceSourceAPI->getSampleSourceDisplayName()); - - deviceUI->m_deviceSourceAPI->loadSourceSettings(m_settings.getWorkingPreset()); // load new API settings - - if (currentSourceTabIndex == 0) - { - m_settings.setSourceIndex(deviceUI->m_samplingDeviceControl->getDeviceSelector()->currentIndex()); - } - } -} - -void MainWindow::on_sampleSink_confirmClicked(bool checked __attribute__((unused))) -{ - // Do it in the currently selected source tab - int currentSinkTabIndex = ui->tabInputsSelect->currentIndex(); - - if (currentSinkTabIndex >= 0) - { - qDebug("MainWindow::on_sampleSink_confirmClicked: tab at %d", currentSinkTabIndex); - DeviceUISet *deviceUI = m_deviceUIs[currentSinkTabIndex]; - deviceUI->m_deviceSinkAPI->saveSinkSettings(m_settings.getWorkingPreset()); // save old API settings - int selectedComboIndex = deviceUI->m_samplingDeviceControl->getDeviceSelector()->currentIndex(); - void *devicePtr = deviceUI->m_samplingDeviceControl->getDeviceSelector()->itemData(selectedComboIndex).value(); - deviceUI->m_deviceSinkAPI->stopGeneration(); - - // deletes old UI and output object - deviceUI->m_deviceSinkAPI->getSampleSink()->setMessageQueueToGUI(0); // have sink stop sending messages to the GUI - deviceUI->m_deviceSinkAPI->getPluginInterface()->deleteSampleSourcePluginInstanceGUI( - deviceUI->m_deviceSinkAPI->getSampleSinkPluginInstanceGUI()); - deviceUI->m_deviceSinkAPI->resetSampleSinkId(); - deviceUI->m_deviceSinkAPI->getPluginInterface()->deleteSampleSinkPluginInstanceOutput( - deviceUI->m_deviceSinkAPI->getSampleSink()); - deviceUI->m_deviceSinkAPI->clearBuddiesLists(); // clear old API buddies lists - - m_pluginManager->selectSampleSinkByDevice(devicePtr, deviceUI->m_deviceSinkAPI); // sets the new API - - // add to buddies list - std::vector::iterator it = m_deviceUIs.begin(); - int nbOfBuddies = 0; - - for (; it != m_deviceUIs.end(); ++it) - { - if (*it != deviceUI) // do not add to itself - { - if ((*it)->m_deviceSourceEngine) // it is a source device - { - if ((deviceUI->m_deviceSinkAPI->getHardwareId() == (*it)->m_deviceSourceAPI->getHardwareId()) && - (deviceUI->m_deviceSinkAPI->getSampleSinkSerial() == (*it)->m_deviceSourceAPI->getSampleSourceSerial())) - { - (*it)->m_deviceSourceAPI->addSinkBuddy(deviceUI->m_deviceSinkAPI); - nbOfBuddies++; - } - } - - if ((*it)->m_deviceSinkEngine) // it is a sink device - { - if ((deviceUI->m_deviceSinkAPI->getHardwareId() == (*it)->m_deviceSinkAPI->getHardwareId()) && - (deviceUI->m_deviceSinkAPI->getSampleSinkSerial() == (*it)->m_deviceSinkAPI->getSampleSinkSerial())) - { - (*it)->m_deviceSinkAPI->addSinkBuddy(deviceUI->m_deviceSinkAPI); - nbOfBuddies++; - } - } - } - } - - if (nbOfBuddies == 0) { - deviceUI->m_deviceSinkAPI->setBuddyLeader(true); - } - - // constructs new GUI and output object - DeviceSampleSink *sink = deviceUI->m_deviceSinkAPI->getPluginInterface()->createSampleSinkPluginInstanceOutput( - deviceUI->m_deviceSinkAPI->getSampleSinkId(), deviceUI->m_deviceSinkAPI); - deviceUI->m_deviceSinkAPI->setSampleSink(sink); - QWidget *gui; - PluginInstanceGUI *pluginUI = deviceUI->m_deviceSinkAPI->getPluginInterface()->createSampleSinkPluginInstanceGUI( - deviceUI->m_deviceSinkAPI->getSampleSinkId(), &gui, deviceUI->m_deviceSinkAPI); - deviceUI->m_deviceSinkAPI->getSampleSink()->setMessageQueueToGUI(pluginUI->getInputMessageQueue()); - deviceUI->m_deviceSinkAPI->setSampleSinkPluginInstanceUI(pluginUI); - setDeviceGUI(currentSinkTabIndex, gui, deviceUI->m_deviceSinkAPI->getSampleSinkDisplayName(), false); - - deviceUI->m_deviceSinkAPI->loadSinkSettings(m_settings.getWorkingPreset()); // load new API settings - } -} - -void MainWindow::on_channel_addClicked(bool checked __attribute__((unused))) -{ - // Do it in the currently selected source tab - int currentSourceTabIndex = ui->tabInputsSelect->currentIndex(); - - if (currentSourceTabIndex >= 0) - { - DeviceUISet *deviceUI = m_deviceUIs[currentSourceTabIndex]; - - if (deviceUI->m_deviceSourceEngine) // source device => Rx channels - { - m_pluginManager->createRxChannelInstance(deviceUI->m_samplingDeviceControl->getChannelSelector()->currentIndex(), deviceUI->m_deviceSourceAPI); - } - else if (deviceUI->m_deviceSinkEngine) // sink device => Tx channels - { - uint32_t nbSources = deviceUI->m_deviceSinkAPI->getNumberOfSources(); - - if (nbSources > 0) { - QMessageBox::information(this, tr("Message"), tr("%1 channel(s) already in use. Multiple transmission channels is experimental. You may experience performance problems").arg(nbSources)); - } - - m_pluginManager->createTxChannelInstance(deviceUI->m_samplingDeviceControl->getChannelSelector()->currentIndex(), deviceUI->m_deviceSinkAPI); - } - } - -} - -void MainWindow::on_action_About_triggered() -{ - AboutDialog dlg(this); - dlg.exec(); -} - -void MainWindow::on_action_addSourceDevice_triggered() -{ - addSourceDevice(); -} - -void MainWindow::on_action_addSinkDevice_triggered() -{ - addSinkDevice(); -} - -void MainWindow::on_action_removeLastDevice_triggered() -{ - if (m_deviceUIs.size() > 1) - { - removeLastDevice(); - } -} - -void MainWindow::on_action_reloadDevices_triggered() -{ - // all devices must be stopped - std::vector::iterator it = m_deviceUIs.begin(); - for (; it != m_deviceUIs.end(); ++it) - { - if ((*it)->m_deviceSourceEngine) // it is a source device - { - if ((*it)->m_deviceSourceEngine->state() == DSPDeviceSourceEngine::StRunning) - { - QMessageBox::information(this, tr("Message"), tr("Stop all devices for reload to take effect")); - return; - } - } - - if ((*it)->m_deviceSinkEngine) // it is a sink device - { - if ((*it)->m_deviceSinkEngine->state() == DSPDeviceSinkEngine::StRunning) - { - QMessageBox::information(this, tr("Message"), tr("Stop all devices for reload to take effect")); - return; - } - } - } - - // re-scan devices - m_pluginManager->updateSampleSourceDevices(); - m_pluginManager->updateSampleSinkDevices(); - - // re-populate device selectors keeping the same selection - it = m_deviceUIs.begin(); - for (; it != m_deviceUIs.end(); ++it) - { - if ((*it)->m_deviceSourceEngine) // it is a source device - { - QComboBox *deviceSelectorComboBox = (*it)->m_samplingDeviceControl->getDeviceSelector(); - bool sampleSourceSignalsBlocked = deviceSelectorComboBox->blockSignals(true); - uint dspDeviceSourceEngineUID = (*it)->m_deviceSourceEngine->getUID(); - m_pluginManager->duplicateLocalSampleSourceDevices(dspDeviceSourceEngineUID); - m_pluginManager->fillSampleSourceSelector(deviceSelectorComboBox, dspDeviceSourceEngineUID); - int newIndex = m_pluginManager->getSampleSourceSelectorIndex(deviceSelectorComboBox, (*it)->m_deviceSourceAPI); - deviceSelectorComboBox->setCurrentIndex(newIndex); - deviceSelectorComboBox->blockSignals(sampleSourceSignalsBlocked); - } - - if ((*it)->m_deviceSinkEngine) // it is a sink device - { - QComboBox *deviceSelectorComboBox = (*it)->m_samplingDeviceControl->getDeviceSelector(); - bool sampleSinkSignalsBlocked = deviceSelectorComboBox->blockSignals(true); - uint dspDeviceSinkEngineUID = (*it)->m_deviceSinkEngine->getUID(); - m_pluginManager->duplicateLocalSampleSinkDevices(dspDeviceSinkEngineUID); - m_pluginManager->fillSampleSinkSelector(deviceSelectorComboBox, dspDeviceSinkEngineUID); - int newIndex = m_pluginManager->getSampleSinkSelectorIndex(deviceSelectorComboBox, (*it)->m_deviceSinkAPI); - deviceSelectorComboBox->setCurrentIndex(newIndex); - deviceSelectorComboBox->blockSignals(sampleSinkSignalsBlocked); - } - } -} - -void MainWindow::on_action_Exit_triggered() -{ - savePresetSettings(m_settings.getWorkingPreset(), 0); - m_settings.save(); - - while (m_deviceUIs.size() > 0) - { - removeLastDevice(); - } -} - -void MainWindow::tabInputViewIndexChanged() -{ - int inputViewIndex = ui->tabInputsView->currentIndex(); - - if ((inputViewIndex >= 0) && (m_masterTabIndex >= 0) && (inputViewIndex != m_masterTabIndex)) - { - DeviceUISet *deviceUI = m_deviceUIs[inputViewIndex]; - DeviceUISet *lastdeviceUI = m_deviceUIs[m_masterTabIndex]; - lastdeviceUI->m_mainWindowState = saveState(); - restoreState(deviceUI->m_mainWindowState); - m_masterTabIndex = inputViewIndex; - } - - ui->tabSpectra->setCurrentIndex(inputViewIndex); - ui->tabChannels->setCurrentIndex(inputViewIndex); - ui->tabInputsSelect->setCurrentIndex(inputViewIndex); - ui->tabSpectraGUI->setCurrentIndex(inputViewIndex); -} - -void MainWindow::updateStatus() -{ - m_dateTimeWidget->setText(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss t")); -} - -MainWindow::DeviceUISet::DeviceUISet(QTimer& timer) -{ - m_spectrum = new GLSpectrum; - m_spectrumVis = new SpectrumVis(m_spectrum); - m_spectrum->connectTimer(timer); - m_spectrumGUI = new GLSpectrumGUI; - m_spectrumGUI->setBuddies(m_spectrumVis->getInputMessageQueue(), m_spectrumVis, m_spectrum); - m_channelWindow = new ChannelWindow; - m_samplingDeviceControl = new SamplingDeviceControl; - m_deviceSourceEngine = 0; - m_deviceSourceAPI = 0; - m_deviceSinkEngine = 0; - m_deviceSinkAPI = 0; - - // m_spectrum needs to have its font to be set since it cannot be inherited from the main window - QFont font; - font.setFamily(QStringLiteral("Sans Serif")); - font.setPointSize(9); - m_spectrum->setFont(font); - -} - -MainWindow::DeviceUISet::~DeviceUISet() -{ - delete m_samplingDeviceControl; - delete m_channelWindow; - delete m_spectrumGUI; - delete m_spectrumVis; - delete m_spectrum; -} diff --git a/sdrbase/mainwindow.h b/sdrbase/mainwindow.h deleted file mode 100644 index 3137730b2..000000000 --- a/sdrbase/mainwindow.h +++ /dev/null @@ -1,170 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////// -// Copyright (C) 2012 maintech GmbH, Otto-Hahn-Str. 15, 97204 Hoechberg, Germany // -// written by Christian Daniel // -// // -// 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 as version 3 of the License, or // -// // -// This program is distributed in the hope that it will be useful, // -// but WITHOUT ANY WARRANTY; without even the implied warranty of // -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // -// GNU General Public License V3 for more details. // -// // -// You should have received a copy of the GNU General Public License // -// along with this program. If not, see . // -/////////////////////////////////////////////////////////////////////////////////// - -#ifndef INCLUDE_MAINWINDOW_H -#define INCLUDE_MAINWINDOW_H - -#include -#include -#include - -#include "settings/mainsettings.h" -#include "util/messagequeue.h" -#include "util/export.h" - -class QLabel; -class QTreeWidgetItem; -class QDir; -class SamplingDeviceControl; - -class AudioDeviceInfo; -class DSPEngine; -class DSPDeviceSourceEngine; -class DSPDeviceSinkEngine; -class Indicator; -class SpectrumVis; -class GLSpectrum; -class GLSpectrumGUI; -class ChannelWindow; -class PluginAPI; -class PluginInstanceGUI; -class ChannelMarker; -class PluginManager; -class DeviceSourceAPI; -class DeviceSinkAPI; -class PluginInterface; -class QWidget; - -namespace Ui { - class MainWindow; -} - -class SDRANGEL_API MainWindow : public QMainWindow { - Q_OBJECT - -public: - struct DeviceUISet - { - SpectrumVis *m_spectrumVis; - GLSpectrum *m_spectrum; - GLSpectrumGUI *m_spectrumGUI; - ChannelWindow *m_channelWindow; - SamplingDeviceControl *m_samplingDeviceControl; - DSPDeviceSourceEngine *m_deviceSourceEngine; - DeviceSourceAPI *m_deviceSourceAPI; - DSPDeviceSinkEngine *m_deviceSinkEngine; - DeviceSinkAPI *m_deviceSinkAPI; - QByteArray m_mainWindowState; - - DeviceUISet(QTimer& timer); - ~DeviceUISet(); - }; - - explicit MainWindow(QWidget* parent = 0); - ~MainWindow(); - - MessageQueue* getInputMessageQueue() { return &m_inputMessageQueue; } - - void addViewAction(QAction* action); - - void addChannelRollup(int deviceTabIndex, QWidget* widget); - void setDeviceGUI(int deviceTabIndex, QWidget* gui, const QString& deviceDisplayName, bool sourceDevice = true); - - const QTimer& getMasterTimer() const { return m_masterTimer; } - const MainSettings& getMainSettings() const { return m_settings; } - -private: - enum { - PGroup, - PItem - }; - - struct DeviceWidgetTabData - { - QWidget *gui; - QString displayName; - QString tabName; - }; - - Ui::MainWindow* ui; - AudioDeviceInfo m_audioDeviceInfo; - MessageQueue m_inputMessageQueue; - MainSettings m_settings; - std::vector m_deviceUIs; - QList m_deviceWidgetTabs; - int m_masterTabIndex; - - DSPEngine* m_dspEngine; - PluginManager* m_pluginManager; - - QTimer m_masterTimer; - QTimer m_statusTimer; - int m_lastEngineState; - - QLabel* m_dateTimeWidget; - QLabel* m_showSystemWidget; - - QWidget* m_inputGUI; - - int m_sampleRate; - quint64 m_centerFrequency; - std::string m_sampleFileName; - - void loadSettings(); - void loadPresetSettings(const Preset* preset, int tabIndex); - void savePresetSettings(Preset* preset, int tabIndex); - - void createStatusBar(); - void closeEvent(QCloseEvent*); - void updatePresetControls(); - QTreeWidgetItem* addPresetToTree(const Preset* preset); - void applySettings(); - - void addSourceDevice(); - void addSinkDevice(); - void removeLastDevice(); - -private slots: - void handleMessages(); - void updateStatus(); - void on_action_View_Fullscreen_toggled(bool checked); - void on_presetSave_clicked(); - void on_presetUpdate_clicked(); - void on_presetExport_clicked(); - void on_presetImport_clicked(); - void on_settingsSave_clicked(); - void on_presetLoad_clicked(); - void on_presetDelete_clicked(); - void on_presetTree_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous); - void on_presetTree_itemActivated(QTreeWidgetItem *item, int column); - void on_action_Audio_triggered(); - void on_action_DV_Serial_triggered(bool checked); - void on_action_My_Position_triggered(); - void on_sampleSource_confirmClicked(bool checked); - void on_sampleSink_confirmClicked(bool checked); - void on_channel_addClicked(bool checked); - void on_action_Loaded_Plugins_triggered(); - void on_action_About_triggered(); - void on_action_addSourceDevice_triggered(); - void on_action_addSinkDevice_triggered(); - void on_action_removeLastDevice_triggered(); - void on_action_reloadDevices_triggered(); - void on_action_Exit_triggered(); - void tabInputViewIndexChanged(); -}; - -#endif // INCLUDE_MAINWINDOW_H diff --git a/sdrbase/mainwindow.ui b/sdrbase/mainwindow.ui deleted file mode 100644 index 316f1a48b..000000000 --- a/sdrbase/mainwindow.ui +++ /dev/null @@ -1,719 +0,0 @@ - - - MainWindow - - - - 0 - 0 - 1012 - 767 - - - - - Sans Serif - 9 - - - - SDRangel - - - - :/sdrangel_icon.png:/sdrangel_icon.png - - - true - - - - - Sans Serif - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - Sans Serif - 9 - - - - QTabWidget::East - - - QTabWidget::Rounded - - - -1 - - - Qt::ElideNone - - - - - - - - - 0 - 0 - 1012 - 19 - - - - - - Sans Serif - 9 - - - - &File - - - - - - - Sans Serif - 9 - - - - &Devices - - - - - - - - - - Sans Serif - 9 - - - - &View - - - - - - - Sans Serif - 9 - - - - &Help - - - - - - - - - Sans Serif - 9 - - - - &Window - - - - - &Preferences - - - - - - - - - - - - - - - - Sans Serif - 9 - - - - - - Sampling devices - - - 1 - - - - - 0 - 0 - - - - - 3 - - - 2 - - - 2 - - - 2 - - - 2 - - - - - - 0 - 200 - - - - - - - - - - Sampling devices control - - - 1 - - - - - 0 - 0 - - - - - 3 - - - 2 - - - 2 - - - 2 - - - 2 - - - - - - 0 - 110 - - - - -1 - - - - - - - - - Spectrum Display - - - 1 - - - - - 0 - 0 - - - - - 3 - - - 2 - - - 2 - - - 2 - - - 2 - - - - - -1 - - - - - - - - - Presets - - - 1 - - - - - 2 - - - 2 - - - 2 - - - 2 - - - 3 - - - - - Save current settings as new preset - - - ... - - - - :/preset-save.png:/preset-save.png - - - - 16 - 16 - - - - - - - - Load selected preset - - - ... - - - - :/preset-load.png:/preset-load.png - - - - 16 - 16 - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Delete selected preset - - - ... - - - - :/preset-delete.png:/preset-delete.png - - - - 16 - 16 - - - - - - - - 10 - - - true - - - 5 - - - - Freq (MHz) - - - Center frequency in MHz - - - - - M - - - Mode: R: Rx or source, T: Tx or sink - - - - - Description - - - - - - - - Update selected preset with current settings - - - ... - - - - :/preset-update.png:/preset-update.png - - - - 16 - 16 - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Save the current settings (inc. presets) - - - ... - - - - :/preset-last.png:/preset-last.png - - - - 16 - 16 - - - - - - - - Export current preset to file - - - - - - - :/export.png:/export.png - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Import preset from file into current group - - - - - - - :/import.png:/import.png - - - - - - - - - Channels - - - 2 - - - - - 3 - - - 2 - - - 2 - - - 2 - - - 2 - - - - - QTabWidget::East - - - -1 - - - - - - - - - E&xit - - - - - - Ctrl+Q - - - - - &Start - - - - - - F5 - - - - - &Stop - - - - - - F6 - - - - - true - - - &Fullscreen - - - - - - F11 - - - - - true - - - &Oscilloscope - - - F8 - - - - - &About SDRangel... - - - - - - - - &Preferences... - - - - - - - - Loaded &Plugins... - - - - - - - - Add source device - - - - - - - - Remove last device - - - - - - - - &Audio - - - - - true - - - DV Serial - - - - - My Position - - - - - Add sink device - - - - - Reload devices - - - presetDock - channelDock - - - - presetTree - presetSave - presetDelete - presetLoad - - - - - - - action_Exit - triggered() - MainWindow - close() - - - -1 - -1 - - - 462 - 332 - - - - -