1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-05-29 13:32:26 -04:00

Massive UI revamping (v7): duplicate channel

This commit is contained in:
f4exb 2022-04-15 18:59:29 +02:00
parent e366f5eba6
commit edd9cb18d7
7 changed files with 239 additions and 22 deletions

View File

@ -91,6 +91,12 @@ ChannelGUI::ChannelGUI(QWidget *parent) :
m_closeButton->setIcon(closeIcon); m_closeButton->setIcon(closeIcon);
m_closeButton->setToolTip("Close channel"); m_closeButton->setToolTip("Close channel");
m_duplicateButton = new QPushButton();
m_duplicateButton->setFixedSize(20, 20);
QIcon m_duplicateIcon(":/duplicate.png");
m_duplicateButton->setIcon(m_duplicateIcon);
m_duplicateButton->setToolTip("Duplicate channel");
m_statusFrequency = new QLabel(); m_statusFrequency = new QLabel();
// QFont font = m_statusFrequency->font(); // QFont font = m_statusFrequency->font();
// font.setPointSize(8); // font.setPointSize(8);
@ -135,7 +141,8 @@ ChannelGUI::ChannelGUI(QWidget *parent) :
m_bottomLayout = new QHBoxLayout(); m_bottomLayout = new QHBoxLayout();
m_bottomLayout->setContentsMargins(0, 0, 0, 0); m_bottomLayout->setContentsMargins(0, 0, 0, 0);
m_bottomLayout->addWidget(m_statusFrequency ); m_bottomLayout->addWidget(m_duplicateButton);
m_bottomLayout->addWidget(m_statusFrequency);
m_bottomLayout->addWidget(m_statusLabel); m_bottomLayout->addWidget(m_statusLabel);
m_sizeGripBottomRight = new QSizeGrip(this); m_sizeGripBottomRight = new QSizeGrip(this);
m_sizeGripBottomRight->setStyleSheet("QSizeGrip { background-color: rgb(128, 128, 128); width: 10px; height: 10px; }"); m_sizeGripBottomRight->setStyleSheet("QSizeGrip { background-color: rgb(128, 128, 128); width: 10px; height: 10px; }");
@ -157,6 +164,7 @@ ChannelGUI::ChannelGUI(QWidget *parent) :
connect(this, SIGNAL(forceShrink()), this, SLOT(shrinkWindow())); connect(this, SIGNAL(forceShrink()), this, SLOT(shrinkWindow()));
connect(m_hideButton, SIGNAL(clicked()), this, SLOT(hide())); connect(m_hideButton, SIGNAL(clicked()), this, SLOT(hide()));
connect(m_closeButton, SIGNAL(clicked()), this, SLOT(close())); connect(m_closeButton, SIGNAL(clicked()), this, SLOT(close()));
connect(m_duplicateButton, SIGNAL(clicked()), this, SLOT(duplicateChannel()));
connect( connect(
m_rollupContents, m_rollupContents,
@ -270,6 +278,12 @@ void ChannelGUI::onWidgetRolled(QWidget *widget, bool show)
} }
} }
void ChannelGUI::duplicateChannel()
{
qDebug("ChannelGUI::duplicateChannel");
emit duplicateChannelEmitted();
}
void ChannelGUI::shrinkWindow() void ChannelGUI::shrinkWindow()
{ {
qDebug("ChannelGUI::shrinkWindow"); qDebug("ChannelGUI::shrinkWindow");

View File

@ -78,7 +78,7 @@ public:
void setIndex(int index); void setIndex(int index);
int getIndex() const { return m_channelIndex; } int getIndex() const { return m_channelIndex; }
void setDeviceSetIndex(int index); void setDeviceSetIndex(int index);
int getDeviceSetIndex() const { return m_channelIndex; } int getDeviceSetIndex() const { return m_deviceSetIndex; }
void setStatusFrequency(qint64 frequency); void setStatusFrequency(qint64 frequency);
void setStatusText(const QString& text); void setStatusText(const QString& text);
@ -113,6 +113,7 @@ private:
QPushButton *m_shrinkButton; QPushButton *m_shrinkButton;
QPushButton *m_hideButton; QPushButton *m_hideButton;
QPushButton *m_closeButton; QPushButton *m_closeButton;
QPushButton *m_duplicateButton;
QLabel *m_statusFrequency; QLabel *m_statusFrequency;
QLabel *m_statusLabel; QLabel *m_statusLabel;
QVBoxLayout *m_layouts; QVBoxLayout *m_layouts;
@ -130,11 +131,13 @@ private slots:
void showHelp(); void showHelp();
void openMoveToWorkspaceDialog(); void openMoveToWorkspaceDialog();
void onWidgetRolled(QWidget *widget, bool show); void onWidgetRolled(QWidget *widget, bool show);
void duplicateChannel();
signals: signals:
void closing(); void closing();
void moveToWorkspace(int workspaceIndex); void moveToWorkspace(int workspaceIndex);
void forceShrink(); void forceShrink();
void duplicateChannelEmitted();
}; };
#endif // SDRGUI_CHANNEL_CHANNELGUI_H_ #endif // SDRGUI_CHANNEL_CHANNELGUI_H_

View File

@ -141,7 +141,7 @@ signals:
void deviceChange(int newDeviceIndex); void deviceChange(int newDeviceIndex);
void showSpectrum(int deviceSetIndex); void showSpectrum(int deviceSetIndex);
void showAllChannels(int deviceSetIndex); void showAllChannels(int deviceSetIndex);
void addChannelEmitted(int channelIndex); void addChannelEmitted(int channelPluginIndex);
void deviceSetPresetsDialogRequested(QPoint, DeviceGUI*); void deviceSetPresetsDialogRequested(QPoint, DeviceGUI*);
}; };

View File

@ -330,6 +330,12 @@ void DeviceUISet::loadRxChannelSettings(const Preset *preset, PluginAPI *pluginA
this, this,
[=](int wsIndexDest){ MainWindow::getInstance()->channelMove(rxChannelGUI, wsIndexDest); } [=](int wsIndexDest){ MainWindow::getInstance()->channelMove(rxChannelGUI, wsIndexDest); }
); );
QObject::connect(
rxChannelGUI,
&ChannelGUI::duplicateChannelEmitted,
this,
[=](){ MainWindow::getInstance()->channelDuplicate(rxChannelGUI); }
);
} }
} }
} }
@ -444,6 +450,12 @@ void DeviceUISet::loadTxChannelSettings(const Preset *preset, PluginAPI *pluginA
this, this,
[=](int wsIndexDest){ MainWindow::getInstance()->channelMove(txChannelGUI, wsIndexDest); } [=](int wsIndexDest){ MainWindow::getInstance()->channelMove(txChannelGUI, wsIndexDest); }
); );
QObject::connect(
txChannelGUI,
&ChannelGUI::duplicateChannelEmitted,
this,
[=](){ MainWindow::getInstance()->channelDuplicate(txChannelGUI); }
);
} }
} }
} }
@ -560,6 +572,12 @@ void DeviceUISet::loadMIMOChannelSettings(const Preset *preset, PluginAPI *plugi
this, this,
[=](int wsIndexDest){ MainWindow::getInstance()->channelMove(mimoChannelGUI, wsIndexDest); } [=](int wsIndexDest){ MainWindow::getInstance()->channelMove(mimoChannelGUI, wsIndexDest); }
); );
QObject::connect(
mimoChannelGUI,
&ChannelGUI::duplicateChannelEmitted,
this,
[=](){ MainWindow::getInstance()->channelDuplicate(mimoChannelGUI); }
);
} }
} }
} }

View File

@ -48,7 +48,7 @@ private slots:
void apply(QAbstractButton*); void apply(QAbstractButton*);
signals: signals:
void addChannel(int); void addChannel(int channelPluginIndex);
}; };
#endif /* SDRGUI_GUI_CHANNELADDDIALOG_H_ */ #endif /* SDRGUI_GUI_CHANNELADDDIALOG_H_ */

View File

@ -316,7 +316,7 @@ void MainWindow::sampleSourceAdd(Workspace *deviceWorkspace, Workspace *spectrum
m_deviceUIs.back()->m_deviceGUI, m_deviceUIs.back()->m_deviceGUI,
&DeviceGUI::addChannelEmitted, &DeviceGUI::addChannelEmitted,
this, this,
[=](int channelIndex){ this->channelAddClicked(deviceWorkspace, deviceSetIndex, channelIndex); } [=](int channelPluginIndex){ this->channelAddClicked(deviceWorkspace, deviceSetIndex, channelPluginIndex); }
); );
deviceWorkspace->addToMdiArea(m_deviceUIs.back()->m_deviceGUI); deviceWorkspace->addToMdiArea(m_deviceUIs.back()->m_deviceGUI);
@ -531,7 +531,7 @@ void MainWindow::sampleSinkAdd(Workspace *deviceWorkspace, Workspace *spectrumWo
m_deviceUIs.back()->m_deviceGUI, m_deviceUIs.back()->m_deviceGUI,
&DeviceGUI::addChannelEmitted, &DeviceGUI::addChannelEmitted,
this, this,
[=](int channelIndex){ this->channelAddClicked(deviceWorkspace, deviceSetIndex, channelIndex); } [=](int channelPluginIndex){ this->channelAddClicked(deviceWorkspace, deviceSetIndex, channelPluginIndex); }
); );
deviceWorkspace->addToMdiArea(m_deviceUIs.back()->m_deviceGUI); deviceWorkspace->addToMdiArea(m_deviceUIs.back()->m_deviceGUI);
@ -754,7 +754,7 @@ void MainWindow::sampleMIMOAdd(Workspace *deviceWorkspace, Workspace *spectrumWo
m_deviceUIs.back()->m_deviceGUI, m_deviceUIs.back()->m_deviceGUI,
&DeviceGUI::addChannelEmitted, &DeviceGUI::addChannelEmitted,
this, this,
[=](int channelIndex){ this->channelAddClicked(deviceWorkspace, deviceSetIndex, channelIndex); } [=](int channelPluginIndex){ this->channelAddClicked(deviceWorkspace, deviceSetIndex, channelPluginIndex); }
); );
deviceWorkspace->addToMdiArea(m_deviceUIs.back()->m_deviceGUI); deviceWorkspace->addToMdiArea(m_deviceUIs.back()->m_deviceGUI);
@ -2059,7 +2059,7 @@ void MainWindow::sampleSourceChange(int deviceSetIndex, int newDeviceIndex, Work
deviceUISet->m_deviceGUI, deviceUISet->m_deviceGUI,
&DeviceGUI::addChannelEmitted, &DeviceGUI::addChannelEmitted,
this, this,
[=](int channelIndex){ this->channelAddClicked(workspace, deviceSetIndex, channelIndex); } [=](int channelPluginIndex){ this->channelAddClicked(workspace, deviceSetIndex, channelPluginIndex); }
); );
} }
} }
@ -2088,7 +2088,7 @@ void MainWindow::sampleSinkChange(int deviceSetIndex, int newDeviceIndex, Worksp
deviceUISet->m_deviceGUI, deviceUISet->m_deviceGUI,
&DeviceGUI::addChannelEmitted, &DeviceGUI::addChannelEmitted,
this, this,
[=](int channelIndex){ this->channelAddClicked(workspace, deviceSetIndex, channelIndex); } [=](int channelPluginIndex){ this->channelAddClicked(workspace, deviceSetIndex, channelPluginIndex); }
); );
} }
} }
@ -2116,14 +2116,189 @@ void MainWindow::sampleMIMOChange(int deviceSetIndex, int newDeviceIndex, Worksp
deviceUISet->m_deviceGUI, deviceUISet->m_deviceGUI,
&DeviceGUI::addChannelEmitted, &DeviceGUI::addChannelEmitted,
this, this,
[=](int channelIndex){ this->channelAddClicked(workspace, deviceSetIndex, channelIndex); } [=](int channelPluginIndex){ this->channelAddClicked(workspace, deviceSetIndex, channelPluginIndex); }
); );
} }
} }
void MainWindow::channelAddClicked(Workspace *workspace, int deviceSetIndex, int channelIndex) void MainWindow::channelDuplicate(ChannelGUI *sourceChannelGUI)
{ {
if (deviceSetIndex >= 0) int deviceSetIndex = sourceChannelGUI->getDeviceSetIndex();
int channelIndex = sourceChannelGUI->getIndex();
qDebug("MainWindow::channelDuplicate: %s at %d:%d in workspace %d",
qPrintable(sourceChannelGUI->getTitle()), deviceSetIndex, channelIndex, sourceChannelGUI->getWorkspaceIndex());
if (deviceSetIndex < (int) m_deviceUIs.size())
{
DeviceUISet *deviceUI = m_deviceUIs[deviceSetIndex];
ChannelAPI *sourceChannelAPI = deviceUI->getChannelAt(channelIndex);
DeviceAPI *deviceAPI = deviceUI->m_deviceAPI;
ChannelGUI *gui = nullptr;
if (deviceUI->m_deviceSourceEngine) // source device => Rx channels
{
PluginAPI::ChannelRegistrations *channelRegistrations = m_pluginManager->getRxChannelRegistrations();
PluginInterface *pluginInterface = nullptr;
for (const auto& channelRegistration : *channelRegistrations)
{
if (channelRegistration.m_channelIdURI == sourceChannelAPI->getURI())
{
pluginInterface = channelRegistration.m_plugin;
break;
}
}
if (pluginInterface)
{
ChannelAPI *channelAPI;
BasebandSampleSink *rxChannel;
pluginInterface->createRxChannel(deviceUI->m_deviceAPI, &rxChannel, &channelAPI);
gui = pluginInterface->createRxChannelGUI(deviceUI, rxChannel);
deviceUI->registerRxChannelInstance(channelAPI, gui);
gui->setDeviceType(ChannelGUI::DeviceRx);
gui->setIndex(channelAPI->getIndexInDeviceSet());
QByteArray b = sourceChannelGUI->serialize();
gui->deserialize(b);
}
}
else if (deviceUI->m_deviceSinkEngine) // sink device => Tx channels
{
PluginAPI::ChannelRegistrations *channelRegistrations = m_pluginManager->getTxChannelRegistrations(); // Available channel plugins
PluginInterface *pluginInterface = nullptr;
for (const auto& channelRegistration : *channelRegistrations)
{
if (channelRegistration.m_channelIdURI == sourceChannelAPI->getURI())
{
pluginInterface = channelRegistration.m_plugin;
break;
}
}
if (pluginInterface)
{
ChannelAPI *channelAPI;
BasebandSampleSource *txChannel;
pluginInterface->createTxChannel(deviceUI->m_deviceAPI, &txChannel, &channelAPI);
gui = pluginInterface->createTxChannelGUI(deviceUI, txChannel);
deviceUI->registerTxChannelInstance(channelAPI, gui);
gui->setDeviceType(ChannelGUI::DeviceTx);
gui->setIndex(channelAPI->getIndexInDeviceSet());
QByteArray b = sourceChannelGUI->serialize();
gui->deserialize(b);
}
}
else if (deviceUI->m_deviceMIMOEngine) // MIMO device => Any type of channel is possible
{
PluginAPI::ChannelRegistrations *rxChannelRegistrations = m_pluginManager->getRxChannelRegistrations();
PluginAPI::ChannelRegistrations *txChannelRegistrations = m_pluginManager->getTxChannelRegistrations();
PluginAPI::ChannelRegistrations *mimoChannelRegistrations = m_pluginManager->getMIMOChannelRegistrations();
PluginInterface *pluginInterface = nullptr;
for (const auto& channelRegistration : *rxChannelRegistrations)
{
if (channelRegistration.m_channelIdURI == sourceChannelAPI->getURI())
{
pluginInterface = channelRegistration.m_plugin;
break;
}
}
if (pluginInterface) // Rx channel
{
ChannelAPI *channelAPI;
BasebandSampleSink *rxChannel;
pluginInterface->createRxChannel(deviceUI->m_deviceAPI, &rxChannel, &channelAPI);
gui = pluginInterface->createRxChannelGUI(deviceUI, rxChannel);
deviceUI->registerRxChannelInstance(channelAPI, gui);
gui->setDeviceType(ChannelGUI::DeviceMIMO);
gui->setIndex(channelAPI->getIndexInDeviceSet());
QByteArray b = sourceChannelGUI->serialize();
gui->deserialize(b);
}
else
{
for (const auto& channelRegistration : *txChannelRegistrations)
{
if (channelRegistration.m_channelIdURI == sourceChannelAPI->getURI())
{
pluginInterface = channelRegistration.m_plugin;
break;
}
}
if (pluginInterface) // Tx channel
{
ChannelAPI *channelAPI;
BasebandSampleSource *txChannel;
pluginInterface->createTxChannel(deviceUI->m_deviceAPI, &txChannel, &channelAPI);
gui = pluginInterface->createTxChannelGUI(deviceUI, txChannel);
deviceUI->registerTxChannelInstance(channelAPI, gui);
gui->setDeviceType(ChannelGUI::DeviceMIMO);
gui->setIndex(channelAPI->getIndexInDeviceSet());
QByteArray b = sourceChannelGUI->serialize();
gui->deserialize(b);
}
else
{
for (const auto& channelRegistration : *mimoChannelRegistrations)
{
if (channelRegistration.m_channelIdURI == sourceChannelAPI->getURI())
{
pluginInterface = channelRegistration.m_plugin;
break;
}
}
if (pluginInterface)
{
ChannelAPI *channelAPI;
MIMOChannel *mimoChannel;
pluginInterface->createMIMOChannel(deviceUI->m_deviceAPI, &mimoChannel, &channelAPI);
gui = pluginInterface->createMIMOChannelGUI(deviceUI, mimoChannel);
deviceUI->registerChannelInstance(channelAPI, gui);
gui->setDeviceType(ChannelGUI::DeviceMIMO);
gui->setIndex(channelAPI->getIndexInDeviceSet());
QByteArray b = sourceChannelGUI->serialize();
gui->deserialize(b);
}
}
}
}
int workspaceIndex = sourceChannelGUI->getWorkspaceIndex();
Workspace *workspace = workspaceIndex < m_workspaces.size() ? m_workspaces[sourceChannelGUI->getWorkspaceIndex()] : nullptr;
if (gui && workspace)
{
QObject::connect(
gui,
&ChannelGUI::moveToWorkspace,
this,
[=](int wsIndexDest){ this->channelMove(gui, wsIndexDest); }
);
QObject::connect(
gui,
&ChannelGUI::duplicateChannelEmitted,
this,
[=](){ this->channelDuplicate(gui); }
);
gui->setDeviceSetIndex(deviceSetIndex);
gui->setToolTip(deviceAPI->getSamplingDeviceDisplayName());
gui->setWorkspaceIndex(workspace->getIndex());
qDebug("MainWindow::channelDuplicate: adding %s to workspace #%d",
qPrintable(gui->getTitle()), workspace->getIndex());
workspace->addToMdiArea((QMdiSubWindow*) gui);
}
}
}
void MainWindow::channelAddClicked(Workspace *workspace, int deviceSetIndex, int channelPluginIndex)
{
if (deviceSetIndex < (int) m_deviceUIs.size())
{ {
DeviceUISet *deviceUI = m_deviceUIs[deviceSetIndex]; DeviceUISet *deviceUI = m_deviceUIs[deviceSetIndex];
ChannelGUI *gui = nullptr; ChannelGUI *gui = nullptr;
@ -2132,7 +2307,7 @@ void MainWindow::channelAddClicked(Workspace *workspace, int deviceSetIndex, int
if (deviceUI->m_deviceSourceEngine) // source device => Rx channels if (deviceUI->m_deviceSourceEngine) // source device => Rx channels
{ {
PluginAPI::ChannelRegistrations *channelRegistrations = m_pluginManager->getRxChannelRegistrations(); // Available channel plugins PluginAPI::ChannelRegistrations *channelRegistrations = m_pluginManager->getRxChannelRegistrations(); // Available channel plugins
PluginInterface *pluginInterface = (*channelRegistrations)[channelIndex].m_plugin; PluginInterface *pluginInterface = (*channelRegistrations)[channelPluginIndex].m_plugin;
ChannelAPI *channelAPI; ChannelAPI *channelAPI;
BasebandSampleSink *rxChannel; BasebandSampleSink *rxChannel;
pluginInterface->createRxChannel(deviceUI->m_deviceAPI, &rxChannel, &channelAPI); pluginInterface->createRxChannel(deviceUI->m_deviceAPI, &rxChannel, &channelAPI);
@ -2144,7 +2319,7 @@ void MainWindow::channelAddClicked(Workspace *workspace, int deviceSetIndex, int
else if (deviceUI->m_deviceSinkEngine) // sink device => Tx channels else if (deviceUI->m_deviceSinkEngine) // sink device => Tx channels
{ {
PluginAPI::ChannelRegistrations *channelRegistrations = m_pluginManager->getTxChannelRegistrations(); // Available channel plugins PluginAPI::ChannelRegistrations *channelRegistrations = m_pluginManager->getTxChannelRegistrations(); // Available channel plugins
PluginInterface *pluginInterface = (*channelRegistrations)[channelIndex].m_plugin; PluginInterface *pluginInterface = (*channelRegistrations)[channelPluginIndex].m_plugin;
ChannelAPI *channelAPI; ChannelAPI *channelAPI;
BasebandSampleSource *txChannel; BasebandSampleSource *txChannel;
pluginInterface->createTxChannel(deviceUI->m_deviceAPI, &txChannel, &channelAPI); pluginInterface->createTxChannel(deviceUI->m_deviceAPI, &txChannel, &channelAPI);
@ -2159,12 +2334,12 @@ void MainWindow::channelAddClicked(Workspace *workspace, int deviceSetIndex, int
int nbRxChannels = deviceUI->getNumberOfAvailableRxChannels(); int nbRxChannels = deviceUI->getNumberOfAvailableRxChannels();
int nbTxChannels = deviceUI->getNumberOfAvailableTxChannels(); int nbTxChannels = deviceUI->getNumberOfAvailableTxChannels();
qDebug("MainWindow::channelAddClicked: MIMO: dev %d : nbMIMO: %d nbRx: %d nbTx: %d selected: %d", qDebug("MainWindow::channelAddClicked: MIMO: dev %d : nbMIMO: %d nbRx: %d nbTx: %d selected: %d",
deviceSetIndex, nbMIMOChannels, nbRxChannels, nbTxChannels, channelIndex); deviceSetIndex, nbMIMOChannels, nbRxChannels, nbTxChannels, channelPluginIndex);
if (channelIndex < nbMIMOChannels) if (channelPluginIndex < nbMIMOChannels)
{ {
PluginAPI::ChannelRegistrations *channelRegistrations = m_pluginManager->getMIMOChannelRegistrations(); // Available channel plugins PluginAPI::ChannelRegistrations *channelRegistrations = m_pluginManager->getMIMOChannelRegistrations(); // Available channel plugins
PluginInterface *pluginInterface = (*channelRegistrations)[channelIndex].m_plugin; PluginInterface *pluginInterface = (*channelRegistrations)[channelPluginIndex].m_plugin;
ChannelAPI *channelAPI; ChannelAPI *channelAPI;
MIMOChannel *mimoChannel; MIMOChannel *mimoChannel;
pluginInterface->createMIMOChannel(deviceUI->m_deviceAPI, &mimoChannel, &channelAPI); pluginInterface->createMIMOChannel(deviceUI->m_deviceAPI, &mimoChannel, &channelAPI);
@ -2172,10 +2347,10 @@ void MainWindow::channelAddClicked(Workspace *workspace, int deviceSetIndex, int
deviceUI->registerChannelInstance(channelAPI, gui); deviceUI->registerChannelInstance(channelAPI, gui);
gui->setIndex(channelAPI->getIndexInDeviceSet()); gui->setIndex(channelAPI->getIndexInDeviceSet());
} }
else if (channelIndex < nbMIMOChannels + nbRxChannels) // Rx else if (channelPluginIndex < nbMIMOChannels + nbRxChannels) // Rx
{ {
PluginAPI::ChannelRegistrations *channelRegistrations = m_pluginManager->getRxChannelRegistrations(); // Available channel plugins PluginAPI::ChannelRegistrations *channelRegistrations = m_pluginManager->getRxChannelRegistrations(); // Available channel plugins
PluginInterface *pluginInterface = (*channelRegistrations)[channelIndex - nbMIMOChannels].m_plugin; PluginInterface *pluginInterface = (*channelRegistrations)[channelPluginIndex - nbMIMOChannels].m_plugin;
ChannelAPI *channelAPI; ChannelAPI *channelAPI;
BasebandSampleSink *rxChannel; BasebandSampleSink *rxChannel;
pluginInterface->createRxChannel(deviceUI->m_deviceAPI, &rxChannel, &channelAPI); pluginInterface->createRxChannel(deviceUI->m_deviceAPI, &rxChannel, &channelAPI);
@ -2183,10 +2358,10 @@ void MainWindow::channelAddClicked(Workspace *workspace, int deviceSetIndex, int
deviceUI->registerRxChannelInstance(channelAPI, gui); deviceUI->registerRxChannelInstance(channelAPI, gui);
gui->setIndex(channelAPI->getIndexInDeviceSet()); gui->setIndex(channelAPI->getIndexInDeviceSet());
} }
else if (channelIndex < nbMIMOChannels + nbRxChannels + nbTxChannels) else if (channelPluginIndex < nbMIMOChannels + nbRxChannels + nbTxChannels)
{ {
PluginAPI::ChannelRegistrations *channelRegistrations = m_pluginManager->getTxChannelRegistrations(); // Available channel plugins PluginAPI::ChannelRegistrations *channelRegistrations = m_pluginManager->getTxChannelRegistrations(); // Available channel plugins
PluginInterface *pluginInterface = (*channelRegistrations)[channelIndex - nbMIMOChannels - nbRxChannels].m_plugin; PluginInterface *pluginInterface = (*channelRegistrations)[channelPluginIndex - nbMIMOChannels - nbRxChannels].m_plugin;
ChannelAPI *channelAPI; ChannelAPI *channelAPI;
BasebandSampleSource *txChannel; BasebandSampleSource *txChannel;
pluginInterface->createTxChannel(deviceUI->m_deviceAPI, &txChannel, &channelAPI); pluginInterface->createTxChannel(deviceUI->m_deviceAPI, &txChannel, &channelAPI);
@ -2206,6 +2381,12 @@ void MainWindow::channelAddClicked(Workspace *workspace, int deviceSetIndex, int
this, this,
[=](int wsIndexDest){ this->channelMove(gui, wsIndexDest); } [=](int wsIndexDest){ this->channelMove(gui, wsIndexDest); }
); );
QObject::connect(
gui,
&ChannelGUI::duplicateChannelEmitted,
this,
[=](){ this->channelDuplicate(gui); }
);
gui->setDeviceSetIndex(deviceSetIndex); gui->setDeviceSetIndex(deviceSetIndex);
gui->setToolTip(deviceAPI->getSamplingDeviceDisplayName()); gui->setToolTip(deviceAPI->getSamplingDeviceDisplayName());

View File

@ -82,6 +82,7 @@ public:
public slots: public slots:
void channelMove(ChannelGUI *gui, int wsIndexDestnation); void channelMove(ChannelGUI *gui, int wsIndexDestnation);
void channelDuplicate(ChannelGUI *gui);
private: private:
enum { enum {
@ -198,7 +199,7 @@ private slots:
void sampleSinkAdd(Workspace *workspace, Workspace *spectrumWorkspace, int deviceIndex); void sampleSinkAdd(Workspace *workspace, Workspace *spectrumWorkspace, int deviceIndex);
void sampleMIMOAdd(Workspace *workspace, Workspace *spectrumWorkspace, int deviceIndex); void sampleMIMOAdd(Workspace *workspace, Workspace *spectrumWorkspace, int deviceIndex);
void samplingDeviceChangeHandler(DeviceGUI *deviceGUI, int newDeviceIndex); void samplingDeviceChangeHandler(DeviceGUI *deviceGUI, int newDeviceIndex);
void channelAddClicked(Workspace *workspace, int deviceSetIndex, int channelIndex); void channelAddClicked(Workspace *workspace, int deviceSetIndex, int channelPluginIndex);
void featureAddClicked(Workspace *workspace, int featureIndex); void featureAddClicked(Workspace *workspace, int featureIndex);
void featureMove(FeatureGUI *gui, int wsIndexDestnation); void featureMove(FeatureGUI *gui, int wsIndexDestnation);
void openFeaturePresetsDialog(QPoint p, Workspace *workspace); void openFeaturePresetsDialog(QPoint p, Workspace *workspace);