diff --git a/plugins/channelrx/demodam/amdemod.cpp b/plugins/channelrx/demodam/amdemod.cpp index 5333a03f5..33dd1e750 100644 --- a/plugins/channelrx/demodam/amdemod.cpp +++ b/plugins/channelrx/demodam/amdemod.cpp @@ -218,9 +218,6 @@ bool AMDemod::handleMessage(const Message& cmd) applyAudioSampleRate(sampleRate); } - AMDemodSettings settings = m_settings; - applyAudioSampleRate(cfg.getSampleRate()); - return true; } else @@ -283,6 +280,7 @@ void AMDemod::applySettings(const AMDemodSettings& settings, bool force) << " m_copyAudioUseRTP: " << settings.m_copyAudioUseRTP << " m_udpAddress: " << settings.m_udpAddress << " m_udpPort: " << settings.m_udpPort + << " m_audioDeviceName: " << settings.m_audioDeviceName << " force: " << force; if((m_settings.m_rfBandwidth != settings.m_rfBandwidth) || @@ -312,21 +310,34 @@ void AMDemod::applySettings(const AMDemodSettings& settings, bool force) if (settings.m_copyAudioUseRTP) { if (m_audioNetSink->selectType(AudioNetSink::SinkRTP)) { - qDebug("NFMDemod::applySettings: set audio sink to RTP mode"); + qDebug("AMDemod::applySettings: set audio sink to RTP mode"); } else { - qWarning("NFMDemod::applySettings: RTP support for audio sink not available. Fall back too UDP"); + qWarning("AMDemod::applySettings: RTP support for audio sink not available. Fall back too UDP"); } } else { if (m_audioNetSink->selectType(AudioNetSink::SinkUDP)) { - qDebug("NFMDemod::applySettings: set audio sink to UDP mode"); + qDebug("AMDemod::applySettings: set audio sink to UDP mode"); } else { - qWarning("NFMDemod::applySettings: failed to set audio sink to UDP mode"); + qWarning("AMDemod::applySettings: failed to set audio sink to UDP mode"); } } } + if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) + { + AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); + int audioDeviceIndex = audioDeviceManager->getOutputDeviceIndex(settings.m_audioDeviceName); + //qDebug("AMDemod::applySettings: audioDeviceName: %s audioDeviceIndex: %d", qPrintable(settings.m_audioDeviceName), audioDeviceIndex); + audioDeviceManager->addAudioSink(&m_audioFifo, getInputMessageQueue(), audioDeviceIndex); + uint32_t audioSampleRate = audioDeviceManager->getOutputSampleRate(audioDeviceIndex); + + if (m_audioSampleRate != audioSampleRate) { + applyAudioSampleRate(audioSampleRate); + } + } + m_settings = settings; } diff --git a/plugins/channelrx/demodam/amdemodgui.cpp b/plugins/channelrx/demodam/amdemodgui.cpp index 3a26230c7..9fed72589 100644 --- a/plugins/channelrx/demodam/amdemodgui.cpp +++ b/plugins/channelrx/demodam/amdemodgui.cpp @@ -22,7 +22,7 @@ #include "device/devicesourceapi.h" #include "device/deviceuiset.h" #include "dsp/downchannelizer.h" - +#include "dsp/dspengine.h" #include "dsp/threadedbasebandsamplesink.h" #include "ui_amdemodgui.h" #include "plugin/pluginapi.h" @@ -31,6 +31,8 @@ #include "gui/basicchannelsettingsdialog.h" #include "dsp/dspengine.h" #include "mainwindow.h" +#include "gui/crightclickenabler.h" +#include "gui/audioselectdialog.h" #include "amdemod.h" @@ -230,6 +232,9 @@ AMDemodGUI::AMDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandS connect(&MainWindow::getInstance()->getMasterTimer(), SIGNAL(timeout()), this, SLOT(tick())); // 50 ms + CRightClickEnabler *audioMuteRightClickEnabler = new CRightClickEnabler(ui->audioMute); + connect(audioMuteRightClickEnabler, SIGNAL(rightClick()), this, SLOT(audioSelect())); + ui->deltaFrequencyLabel->setText(QString("%1f").arg(QChar(0x94, 0x03))); ui->deltaFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); ui->deltaFrequency->setValueRange(false, 7, -9999999, 9999999); @@ -343,6 +348,19 @@ void AMDemodGUI::enterEvent(QEvent*) m_channelMarker.setHighlighted(true); } +void AMDemodGUI::audioSelect() +{ + qDebug("AMDemodGUI::audioSelect"); + AudioSelectDialog audioSelect(DSPEngine::instance()->getAudioDeviceManager(), m_settings.m_audioDeviceName); + audioSelect.exec(); + + if (audioSelect.m_selected) + { + m_settings.m_audioDeviceName = audioSelect.m_audioDeviceName; + applySettings(); + } +} + void AMDemodGUI::tick() { double magsqAvg, magsqPeak; diff --git a/plugins/channelrx/demodam/amdemodgui.h b/plugins/channelrx/demodam/amdemodgui.h index 24a84e7ba..2fb6974fb 100644 --- a/plugins/channelrx/demodam/amdemodgui.h +++ b/plugins/channelrx/demodam/amdemodgui.h @@ -76,6 +76,7 @@ private slots: void onWidgetRolled(QWidget* widget, bool rollDown); void onMenuDialogCalled(const QPoint& p); void handleInputMessages(); + void audioSelect(); void tick(); }; diff --git a/plugins/channelrx/demodam/amdemodgui.ui b/plugins/channelrx/demodam/amdemodgui.ui index deb8182dc..ee4538366 100644 --- a/plugins/channelrx/demodam/amdemodgui.ui +++ b/plugins/channelrx/demodam/amdemodgui.ui @@ -59,16 +59,7 @@ 3 - - 2 - - - 2 - - - 2 - - + 2 @@ -171,7 +162,7 @@ - Mute/Unmute audio + Left: Mute/Unmute audio Right: view/select audio device ... diff --git a/plugins/channelrx/demodam/amdemodsettings.cpp b/plugins/channelrx/demodam/amdemodsettings.cpp index f1d94a1d6..5d50a9c80 100644 --- a/plugins/channelrx/demodam/amdemodsettings.cpp +++ b/plugins/channelrx/demodam/amdemodsettings.cpp @@ -41,6 +41,7 @@ void AMDemodSettings::resetToDefaults() m_udpPort = 9999; m_rgbColor = QColor(255, 255, 0).rgb(); m_title = "AM Demodulator"; + m_audioDeviceName = AudioDeviceManager::m_defaultDeviceName; } QByteArray AMDemodSettings::serialize() const @@ -59,6 +60,7 @@ QByteArray AMDemodSettings::serialize() const s.writeBool(8, m_bandpassEnable); s.writeString(9, m_title); s.writeBool(10, m_copyAudioUseRTP); + s.writeString(11, m_audioDeviceName); return s.final(); } @@ -95,6 +97,7 @@ bool AMDemodSettings::deserialize(const QByteArray& data) d.readBool(8, &m_bandpassEnable, false); d.readString(9, &m_title, "AM Demodulator"); d.readBool(10, &m_copyAudioUseRTP, false); + d.readString(11, &m_audioDeviceName, AudioDeviceManager::m_defaultDeviceName); return true; } diff --git a/plugins/channelrx/demodam/amdemodsettings.h b/plugins/channelrx/demodam/amdemodsettings.h index 129ef810d..f676e25a5 100644 --- a/plugins/channelrx/demodam/amdemodsettings.h +++ b/plugins/channelrx/demodam/amdemodsettings.h @@ -36,6 +36,7 @@ struct AMDemodSettings quint32 m_rgbColor; QString m_title; Serializable *m_channelMarker; + QString m_audioDeviceName; AMDemodSettings(); void resetToDefaults(); diff --git a/sdrbase/audio/audiodevicemanager.cpp b/sdrbase/audio/audiodevicemanager.cpp index f88a8da6c..1e1a7157e 100644 --- a/sdrbase/audio/audiodevicemanager.cpp +++ b/sdrbase/audio/audiodevicemanager.cpp @@ -109,6 +109,33 @@ bool AudioDeviceManager::getInputDeviceName(int inputDeviceIndex, QString &devic } } +int AudioDeviceManager::getOutputDeviceIndex(const QString &deviceName) const +{ + for (int i = 0; i < m_outputDevicesInfo.size(); i++) + { + //qDebug("AudioDeviceManager::getOutputDeviceIndex: %d: %s|%s", i, qPrintable(deviceName), qPrintable(m_outputDevicesInfo[i].deviceName())); + if (deviceName == m_outputDevicesInfo[i].deviceName()) { + return i; + } + } + + return -1; // system default +} + +int AudioDeviceManager::getInputDeviceIndex(const QString &deviceName) const +{ + for (int i = 0; i < m_inputDevicesInfo.size(); i++) + { + //qDebug("AudioDeviceManager::getInputDeviceIndex: %d: %s|%s", i, qPrintable(deviceName), qPrintable(m_inputDevicesInfo[i].deviceName())); + if (deviceName == m_inputDevicesInfo[i].deviceName()) { + return i; + } + } + + return -1; // system default +} + + void AudioDeviceManager::resetToDefaults() { } @@ -203,6 +230,9 @@ void AudioDeviceManager::addAudioSink(AudioFifo* audioFifo, MessageQueue *sample if (m_audioSinkFifos.find(audioFifo) == m_audioSinkFifos.end()) // new FIFO { m_audioOutputs[outputDeviceIndex]->addFifo(audioFifo); + m_audioSinkFifos[audioFifo] = outputDeviceIndex; // register audio FIFO + m_audioFifoToSinkMessageQueues[audioFifo] = sampleSinkMessageQueue; + m_outputDeviceSinkMessageQueues[outputDeviceIndex].append(sampleSinkMessageQueue); } else { @@ -212,12 +242,11 @@ void AudioDeviceManager::addAudioSink(AudioFifo* audioFifo, MessageQueue *sample { removeAudioSink(audioFifo); // remove from current m_audioOutputs[outputDeviceIndex]->addFifo(audioFifo); // add to new + m_audioSinkFifos[audioFifo] = outputDeviceIndex; // new index + m_outputDeviceSinkMessageQueues[audioOutputDeviceIndex].removeOne(sampleSinkMessageQueue); + m_outputDeviceSinkMessageQueues[outputDeviceIndex].append(sampleSinkMessageQueue); } } - - m_audioSinkFifos[audioFifo] = outputDeviceIndex; // register audio FIFO - m_audioFifoToSinkMessageQueues[audioFifo] = sampleSinkMessageQueue; - m_outputDeviceSinkMessageQueues[outputDeviceIndex].append(sampleSinkMessageQueue); } void AudioDeviceManager::removeAudioSink(AudioFifo* audioFifo) diff --git a/sdrbase/audio/audiodevicemanager.h b/sdrbase/audio/audiodevicemanager.h index 6cb24d456..901e48e5f 100644 --- a/sdrbase/audio/audiodevicemanager.h +++ b/sdrbase/audio/audiodevicemanager.h @@ -87,6 +87,8 @@ public: bool getOutputDeviceName(int outputDeviceIndex, QString &deviceName) const; bool getInputDeviceName(int inputDeviceIndex, QString &deviceName) const; + int getOutputDeviceIndex(const QString &deviceName) const; + int getInputDeviceIndex(const QString &deviceName) const; void addAudioSink(AudioFifo* audioFifo, MessageQueue *sampleSinkMessageQueue, int outputDeviceIndex = -1); //!< Add the audio sink void removeAudioSink(AudioFifo* audioFifo); //!< Remove the audio sink diff --git a/sdrbase/audio/audiooutput.cpp b/sdrbase/audio/audiooutput.cpp index 5d798f245..504ec89cd 100644 --- a/sdrbase/audio/audiooutput.cpp +++ b/sdrbase/audio/audiooutput.cpp @@ -60,7 +60,7 @@ bool AudioOutput::start(int device, int rate) if (device < 0) { devInfo = QAudioDeviceInfo::defaultOutputDevice(); - qWarning("AudioOutput::start: using default device %s", qPrintable(devInfo.defaultOutputDevice().deviceName())); + qWarning("AudioOutput::start: using system default device %s", qPrintable(devInfo.defaultOutputDevice().deviceName())); } else { @@ -69,12 +69,12 @@ bool AudioOutput::start(int device, int rate) if (device < devicesInfo.size()) { devInfo = devicesInfo[device]; - qWarning("AudioOutput::start: using audio device #%d: %s", device, qPrintable(devInfo.defaultOutputDevice().deviceName())); + qWarning("AudioOutput::start: using audio device #%d: %s", device, qPrintable(devInfo.deviceName())); } else { devInfo = QAudioDeviceInfo::defaultOutputDevice(); - qWarning("AudioOutput::start: audio device #%d does not exist. Using default device %s", device, qPrintable(devInfo.defaultOutputDevice().deviceName())); + qWarning("AudioOutput::start: audio device #%d does not exist. Using system default device %s", device, qPrintable(devInfo.defaultOutputDevice().deviceName())); } } @@ -90,7 +90,14 @@ bool AudioOutput::start(int device, int rate) if (!devInfo.isFormatSupported(m_audioFormat)) { m_audioFormat = devInfo.nearestFormat(m_audioFormat); - qWarning("AudioOutput::start: %d Hz S16_LE audio format not supported. New rate: %d", rate, m_audioFormat.sampleRate()); + std::ostringstream os; + os << " sampleRate: " << m_audioFormat.sampleRate() + << " channelCount: " << m_audioFormat.channelCount() + << " sampleSize: " << m_audioFormat.sampleSize() + << " codec: " << m_audioFormat.codec().toStdString() + << " byteOrder: " << (m_audioFormat.byteOrder() == QAudioFormat::BigEndian ? "BE" : "LE") + << " sampleType: " << (int) m_audioFormat.sampleType(); + qWarning("AudioOutput::start: format %d Hz 2xS16LE audio/pcm not supported. Using: %s", rate, os.str().c_str()); } else { diff --git a/sdrgui/CMakeLists.txt b/sdrgui/CMakeLists.txt index 149fff50a..4da2e430e 100644 --- a/sdrgui/CMakeLists.txt +++ b/sdrgui/CMakeLists.txt @@ -4,6 +4,8 @@ set(sdrgui_SOURCES mainwindow.cpp gui/aboutdialog.cpp gui/addpresetdialog.cpp + gui/audiodialog.cpp + gui/audioselectdialog.cpp gui/basicchannelsettingsdialog.cpp gui/buttonswitch.cpp gui/channelwindow.cpp @@ -12,6 +14,7 @@ set(sdrgui_SOURCES gui/commanditem.cpp gui/commandkeyreceiver.cpp gui/commandoutputdialog.cpp + gui/crightclickenabler.cpp gui/cwkeyergui.cpp gui/editcommanddialog.cpp gui/externalclockbutton.cpp @@ -32,7 +35,6 @@ set(sdrgui_SOURCES gui/loggingdialog.cpp gui/mypositiondialog.cpp gui/pluginsdialog.cpp - gui/audiodialog.cpp gui/presetitem.cpp gui/rollupwidget.cpp gui/samplingdevicecontrol.cpp @@ -62,6 +64,8 @@ set(sdrgui_HEADERS mainwindow.h gui/aboutdialog.h gui/addpresetdialog.h + gui/audiodialog.h + gui/audioselectdialog.h gui/basicchannelsettingsdialog.h gui/buttonswitch.h gui/channelwindow.h @@ -69,6 +73,7 @@ set(sdrgui_HEADERS gui/commanditem.h gui/commandkeyreceiver.h gui/commandoutputdialog.h + gui/crightclickenabler.h gui/cwkeyergui.h gui/editcommanddialog.h gui/externalclockbutton.h @@ -90,7 +95,6 @@ set(sdrgui_HEADERS gui/mypositiondialog.h gui/physicalunit.h gui/pluginsdialog.h - gui/audiodialog.h gui/presetitem.h gui/rollupwidget.h gui/samplingdevicecontrol.h @@ -136,6 +140,7 @@ set(sdrgui_FORMS gui/glspectrumgui.ui gui/pluginsdialog.ui gui/audiodialog.ui + gui/audioselectdialog.ui gui/samplingdevicecontrol.ui gui/samplingdevicedialog.ui gui/myposdialog.ui diff --git a/sdrgui/gui/audiodialog.cpp b/sdrgui/gui/audiodialog.cpp index 8aa9cac5b..270cfbc3a 100644 --- a/sdrgui/gui/audiodialog.cpp +++ b/sdrgui/gui/audiodialog.cpp @@ -23,9 +23,12 @@ AudioDialogX::AudioDialogX(AudioDeviceManager* audioDeviceManager, QWidget* pare for(QList::const_iterator it = outputDevices.begin(); it != outputDevices.end(); ++it) { - bool isDefaultDevice = it->deviceName() == defaultOutputDeviceInfo.deviceName(); treeItem = new QTreeWidgetItem(ui->audioOutTree); - treeItem->setText(0, it->deviceName() + (isDefaultDevice ? "(*)" : "")); + treeItem->setText(0, it->deviceName()); + + if (it->deviceName() == defaultOutputDeviceInfo.deviceName()) { + treeItem->setBackground(0, QBrush(qRgb(96,96,96))); + } } // in panel @@ -39,9 +42,12 @@ AudioDialogX::AudioDialogX(AudioDeviceManager* audioDeviceManager, QWidget* pare for(QList::const_iterator it = inputDevices.begin(); it != inputDevices.end(); ++it) { - bool isDefaultDevice = it->deviceName() == defaultInputDeviceInfo.deviceName(); treeItem = new QTreeWidgetItem(ui->audioInTree); - treeItem->setText(0, it->deviceName() + (isDefaultDevice ? "(*)" : "")); + treeItem->setText(0, it->deviceName()); + + if (it->deviceName() == defaultInputDeviceInfo.deviceName()) { + treeItem->setBackground(0, QBrush(qRgb(96,96,96))); + } } m_outputUDPPort = 9998; @@ -124,13 +130,12 @@ void AudioDialogX::on_audioOutTree_currentItemChanged( ui->outputResetKey->setChecked(false); } + //qDebug("AudioDialogX::on_audioOutTree_currentItemChanged: %s", qPrintable(outDeviceName)); bool found = m_audioDeviceManager->getOutputDeviceInfo(outDeviceName, outDeviceInfo); m_outputDeviceInfo = outDeviceInfo; ui->outputDefaultText->setText(found ? "" : "D"); updateOutputDisplay(); - - //qDebug("AudioDialogX::on_audioOutTree_currentItemChanged: %d:%s", outIndex, qPrintable(outDeviceName)); } void AudioDialogX::on_inputVolume_valueChanged(int value) diff --git a/sdrgui/gui/audioselectdialog.cpp b/sdrgui/gui/audioselectdialog.cpp new file mode 100644 index 000000000..82b3a9301 --- /dev/null +++ b/sdrgui/gui/audioselectdialog.cpp @@ -0,0 +1,94 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2018 F4EXB // +// written by Edouard Griffiths // +// // +// 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 "audioselectdialog.h" +#include "ui_audioselectdialog.h" + +AudioSelectDialog::AudioSelectDialog(AudioDeviceManager* audioDeviceManager, const QString& deviceName, bool input, QWidget* parent) : + QDialog(parent), + m_selected(false), + ui(new Ui::AudioSelectDialog), + m_audioDeviceManager(audioDeviceManager), + m_input(input) +{ + ui->setupUi(this); + QTreeWidgetItem *treeItem, *defaultItem, *selectedItem = 0; + + // panel + + QAudioDeviceInfo defaultDeviceInfo = input ? QAudioDeviceInfo::defaultInputDevice() : QAudioDeviceInfo::defaultOutputDevice(); + defaultItem = new QTreeWidgetItem(ui->audioTree); + defaultItem->setText(0, AudioDeviceManager::m_defaultDeviceName); + + QList devices = input ? m_audioDeviceManager->getInputDevices() : m_audioDeviceManager->getOutputDevices(); + + for(QList::const_iterator it = devices.begin(); it != devices.end(); ++it) + { + treeItem = new QTreeWidgetItem(ui->audioTree); + treeItem->setText(0, it->deviceName()); + + if (it->deviceName() == defaultDeviceInfo.deviceName()) { + treeItem->setBackground(0, QBrush(qRgb(96,96,96))); + } + + if (deviceName == it->deviceName()) { + selectedItem = treeItem; + } + } + + if (selectedItem) { + ui->audioTree->setCurrentItem(selectedItem); + } else { + ui->audioTree->setCurrentItem(defaultItem); + } +} + +AudioSelectDialog::~AudioSelectDialog() +{ + delete ui; +} + +void AudioSelectDialog::accept() +{ + int deviceIndex = ui->audioTree->indexOfTopLevelItem(ui->audioTree->currentItem()) - 1; + + if (m_input) + { + if (!m_audioDeviceManager->getInputDeviceName(deviceIndex, m_audioDeviceName)) { + m_audioDeviceName = AudioDeviceManager::m_defaultDeviceName; + } + } + else + { + if (!m_audioDeviceManager->getOutputDeviceName(deviceIndex, m_audioDeviceName)) { + m_audioDeviceName = AudioDeviceManager::m_defaultDeviceName; + } + + qDebug("AudioSelectDialog::accept: output: %d (%s)", deviceIndex, qPrintable(m_audioDeviceName)); + } + + m_selected = true; + QDialog::accept(); +} + +void AudioSelectDialog::reject() +{ + QDialog::reject(); +} + + + diff --git a/sdrgui/gui/audioselectdialog.h b/sdrgui/gui/audioselectdialog.h new file mode 100644 index 000000000..371d7c4e1 --- /dev/null +++ b/sdrgui/gui/audioselectdialog.h @@ -0,0 +1,53 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2018 F4EXB // +// written by Edouard Griffiths // +// // +// 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 SDRGUI_GUI_AUDIOSELECTDIALOG_H_ +#define SDRGUI_GUI_AUDIOSELECTDIALOG_H_ + +#include + +#include "export.h" +#include "audio/audiodevicemanager.h" + +class QTreeWidgetItem; + +namespace Ui { + class AudioSelectDialog; +} + +class SDRGUI_API AudioSelectDialog : public QDialog { + Q_OBJECT +public: + explicit AudioSelectDialog(AudioDeviceManager* audioDeviceManager, const QString& deviceName, bool input = false, QWidget* parent = 0); + ~AudioSelectDialog(); + + QString m_audioDeviceName; + bool m_selected; + +private: + Ui::AudioSelectDialog* ui; + AudioDeviceManager* m_audioDeviceManager; + bool m_input; + +private slots: + void accept(); + void reject(); + //void on_audioInTree_currentItemChanged(QTreeWidgetItem* currentItem, QTreeWidgetItem* previousItem); + +}; + +#endif /* SDRGUI_GUI_AUDIOSELECTDIALOG_H_ */ diff --git a/sdrgui/gui/audioselectdialog.ui b/sdrgui/gui/audioselectdialog.ui new file mode 100644 index 000000000..4b80685f8 --- /dev/null +++ b/sdrgui/gui/audioselectdialog.ui @@ -0,0 +1,84 @@ + + + AudioSelectDialog + + + + 0 + 0 + 400 + 349 + + + + + Sans Serif + 9 + + + + Select audio device + + + + + + + Device + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + buttonBox + + + + + + + buttonBox + accepted() + AudioSelectDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + AudioSelectDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/sdrgui/gui/crightclickenabler.cpp b/sdrgui/gui/crightclickenabler.cpp new file mode 100644 index 000000000..f464fad88 --- /dev/null +++ b/sdrgui/gui/crightclickenabler.cpp @@ -0,0 +1,13 @@ +/* + * crightclickenabler.cpp + * + * Created on: Mar 26, 2018 + * Author: f4exb + */ + +#include "crightclickenabler.h" + +CRightClickEnabler::CRightClickEnabler(QAbstractButton *button): QObject(button), _button(button) { + button->installEventFilter(this); +}; + diff --git a/sdrgui/gui/crightclickenabler.h b/sdrgui/gui/crightclickenabler.h new file mode 100644 index 000000000..bfa05dfb4 --- /dev/null +++ b/sdrgui/gui/crightclickenabler.h @@ -0,0 +1,49 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2018 F4EXB // +// written by Edouard Griffiths // +// // +// 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 SDRGUI_GUI_CRIGHTCLICKENABLER_H_ +#define SDRGUI_GUI_CRIGHTCLICKENABLER_H_ + +#include +#include + +class CRightClickEnabler : public QObject { + Q_OBJECT +public: + CRightClickEnabler(QAbstractButton *button); + +signals: + void rightClick(); + +protected: + inline bool eventFilter(QObject *watched __attribute__((unused)), QEvent *event) override { + if (event->type() == QEvent::MouseButtonPress) + { + auto mouseEvent = (QMouseEvent*)event; + if (mouseEvent->button() == Qt::RightButton) { + //_button->click(); + emit rightClick(); + } + } + return false; + } + +private: + QAbstractButton* _button; +}; + +#endif /* SDRGUI_GUI_CRIGHTCLICKENABLER_H_ */