diff --git a/Software/PC_Application/LibreVNA-GUI/SpectrumAnalyzer/spectrumanalyzer.cpp b/Software/PC_Application/LibreVNA-GUI/SpectrumAnalyzer/spectrumanalyzer.cpp index 43161a9b..dcc1611a 100644 --- a/Software/PC_Application/LibreVNA-GUI/SpectrumAnalyzer/spectrumanalyzer.cpp +++ b/Software/PC_Application/LibreVNA-GUI/SpectrumAnalyzer/spectrumanalyzer.cpp @@ -289,6 +289,13 @@ SpectrumAnalyzer::SpectrumAnalyzer(AppWindow *window, QString name) window->addDockWidget(Qt::LeftDockWidgetArea, tracesDock); docks.insert(tracesDock); + auto importAction = new QAction("CSV"); + connect(importAction, &QAction::triggered, traceWidget, &TraceWidgetSA::importDialog); + importActions.push_back(importAction); + + auto exportAction = new QAction("CSV"); + connect(exportAction, &QAction::triggered, traceWidget, &TraceWidgetSA::exportDialog); + exportActions.push_back(exportAction); auto markerWidget = new MarkerWidget(*markerModel); diff --git a/Software/PC_Application/LibreVNA-GUI/SpectrumAnalyzer/spectrumanalyzer.h b/Software/PC_Application/LibreVNA-GUI/SpectrumAnalyzer/spectrumanalyzer.h index 5960875b..fa78eef3 100644 --- a/Software/PC_Application/LibreVNA-GUI/SpectrumAnalyzer/spectrumanalyzer.h +++ b/Software/PC_Application/LibreVNA-GUI/SpectrumAnalyzer/spectrumanalyzer.h @@ -5,7 +5,7 @@ #include "mode.h" #include "CustomWidgets/tilewidget.h" #include "scpi.h" -#include "Traces/tracewidget.h" +#include "tracewidgetsa.h" #include #include @@ -36,6 +36,9 @@ class SpectrumAnalyzer : public Mode void preset() override; + QList getImportOptions() override { return importActions;} + QList getExportOptions() override { return exportActions;} + virtual void deviceInfoUpdated() override; public slots: @@ -98,7 +101,7 @@ private slots: double firstPointTime; // timestamp of the first point in the sweep, only use when zerospan is used TraceModel traceModel; - TraceWidget *traceWidget; + TraceWidgetSA *traceWidget; MarkerModel *markerModel; Averaging average; @@ -125,6 +128,10 @@ private slots: QCheckBox *enable; } normalize; + // import/export actions + QList importActions; + QList exportActions; + signals: void dataChanged(); void startFreqChanged(double freq); diff --git a/Software/PC_Application/LibreVNA-GUI/SpectrumAnalyzer/tracewidgetsa.h b/Software/PC_Application/LibreVNA-GUI/SpectrumAnalyzer/tracewidgetsa.h index 7a610e2e..5e24244d 100644 --- a/Software/PC_Application/LibreVNA-GUI/SpectrumAnalyzer/tracewidgetsa.h +++ b/Software/PC_Application/LibreVNA-GUI/SpectrumAnalyzer/tracewidgetsa.h @@ -7,7 +7,7 @@ class TraceWidgetSA : public TraceWidget { public: TraceWidgetSA(TraceModel &model, QWidget *parent = nullptr); -protected slots: +public slots: virtual void exportDialog() override; virtual void importDialog() override; diff --git a/Software/PC_Application/LibreVNA-GUI/VNA/tracewidgetvna.cpp b/Software/PC_Application/LibreVNA-GUI/VNA/tracewidgetvna.cpp index 76342dfe..8190a69f 100644 --- a/Software/PC_Application/LibreVNA-GUI/VNA/tracewidgetvna.cpp +++ b/Software/PC_Application/LibreVNA-GUI/VNA/tracewidgetvna.cpp @@ -17,36 +17,41 @@ TraceWidgetVNA::TraceWidgetVNA(TraceModel &model, Calibration &cal, Deembedding deembed(deembed) { auto exportMenu = new QMenu(); - auto exportTouchstone = new QAction("Touchstone"); - auto exportCSV = new QAction("CSV"); - exportMenu->addAction(exportTouchstone); - exportMenu->addAction(exportCSV); + auto exportTouchstoneAction = new QAction("Touchstone"); + auto exportCSVAction = new QAction("CSV"); + exportMenu->addAction(exportTouchstoneAction); + exportMenu->addAction(exportCSVAction); ui->bExport->setMenu(exportMenu); - connect(exportTouchstone, &QAction::triggered, [&]() { - auto e = new TraceTouchstoneExport(model); - // Attempt to set default traces (this will result in correctly populated - // 2 port export if the initial 4 traces have not been modified) - e->setPortNum(2); - auto traces = model.getTraces(); - for(unsigned int i=0;i<4;i++) { - if(i >= traces.size()) { - break; - } - e->setTrace(i%2+1, i/2+1, traces[i]); - } - if(AppWindow::showGUI()) { - e->show(); - } - }); + connect(exportTouchstoneAction, &QAction::triggered, this, &TraceWidgetVNA::exportTouchstone); + connect(exportCSVAction, &QAction::triggered, this, &TraceWidgetVNA::exportCSV); +} - connect(exportCSV, &QAction::triggered, [&]() { - auto e = new TraceCSVExport(model); - if(AppWindow::showGUI()) { - e->show(); +void TraceWidgetVNA::exportCSV() +{ + auto e = new TraceCSVExport(model); + if(AppWindow::showGUI()) { + e->show(); + } +} + +void TraceWidgetVNA::exportTouchstone() +{ + auto e = new TraceTouchstoneExport(model); + // Attempt to set default traces (this will result in correctly populated + // 2 port export if the initial 4 traces have not been modified) + e->setPortNum(2); + auto traces = model.getTraces(); + for(unsigned int i=0;i<4;i++) { + if(i >= traces.size()) { + break; } - }); + e->setTrace(i%2+1, i/2+1, traces[i]); + } + if(AppWindow::showGUI()) { + e->show(); + } } void TraceWidgetVNA::importDialog() diff --git a/Software/PC_Application/LibreVNA-GUI/VNA/tracewidgetvna.h b/Software/PC_Application/LibreVNA-GUI/VNA/tracewidgetvna.h index 304ed3a1..77b50391 100644 --- a/Software/PC_Application/LibreVNA-GUI/VNA/tracewidgetvna.h +++ b/Software/PC_Application/LibreVNA-GUI/VNA/tracewidgetvna.h @@ -9,7 +9,9 @@ class TraceWidgetVNA : public TraceWidget { public: TraceWidgetVNA(TraceModel &model, Calibration &cal, Deembedding &deembed, QWidget *parent = nullptr); -protected slots: +public slots: + void exportCSV(); + void exportTouchstone(); virtual void exportDialog() override {} virtual void importDialog() override; diff --git a/Software/PC_Application/LibreVNA-GUI/VNA/vna.cpp b/Software/PC_Application/LibreVNA-GUI/VNA/vna.cpp index 8bbd1c47..87c3492b 100644 --- a/Software/PC_Application/LibreVNA-GUI/VNA/vna.cpp +++ b/Software/PC_Application/LibreVNA-GUI/VNA/vna.cpp @@ -581,6 +581,18 @@ VNA::VNA(AppWindow *window, QString name) window->addDockWidget(Qt::LeftDockWidgetArea, tracesDock); docks.insert(tracesDock); + auto importAction = new QAction("Touchstone/CSV"); + connect(importAction, &QAction::triggered, traceWidget, &TraceWidgetVNA::importDialog); + importActions.push_back(importAction); + + auto exportTouchstone = new QAction("Touchstone"); + connect(exportTouchstone, &QAction::triggered, traceWidget, &TraceWidgetVNA::exportTouchstone); + exportActions.push_back(exportTouchstone); + + auto exportCSV = new QAction("CSV"); + connect(exportCSV, &QAction::triggered, traceWidget, &TraceWidgetVNA::exportCSV); + exportActions.push_back(exportCSV); + auto markerWidget = new MarkerWidget(*markerModel); diff --git a/Software/PC_Application/LibreVNA-GUI/VNA/vna.h b/Software/PC_Application/LibreVNA-GUI/VNA/vna.h index 4a4392b2..9792a0f5 100644 --- a/Software/PC_Application/LibreVNA-GUI/VNA/vna.h +++ b/Software/PC_Application/LibreVNA-GUI/VNA/vna.h @@ -6,7 +6,7 @@ #include "CustomWidgets/tilewidget.h" #include "Deembedding/deembedding.h" #include "scpi.h" -#include "Traces/tracewidget.h" +#include "tracewidgetvna.h" #include "Calibration/calibration.h" #include @@ -38,6 +38,9 @@ class VNA : public Mode void preset() override; + QList getImportOptions() override { return importActions;} + QList getExportOptions() override { return exportActions;} + enum class SweepType { Frequency = 0, Power = 1, @@ -140,7 +143,7 @@ private slots: Settings settings; unsigned int averages; TraceModel traceModel; - TraceWidget *traceWidget; + TraceWidgetVNA *traceWidget; MarkerModel *markerModel; Averaging average; bool singleSweep; @@ -179,6 +182,10 @@ private slots: TileWidget *tiles; QScrollArea *central; + // import/export actions + QList importActions; + QList exportActions; + signals: void deviceInitialized(); void dataChanged(); diff --git a/Software/PC_Application/LibreVNA-GUI/appwindow.cpp b/Software/PC_Application/LibreVNA-GUI/appwindow.cpp index a8ca10ef..61820ad2 100644 --- a/Software/PC_Application/LibreVNA-GUI/appwindow.cpp +++ b/Software/PC_Application/LibreVNA-GUI/appwindow.cpp @@ -171,6 +171,7 @@ AppWindow::AppWindow(QWidget *parent) }; connect(modeHandler, &ModeHandler::StatusBarMessageChanged, setModeStatusbar); + connect(modeHandler, &ModeHandler::CurrentModeChanged, this, &AppWindow::UpdateImportExportMenus); SetupMenu(); @@ -1384,6 +1385,27 @@ bool AppWindow::LoadSetup(QString filename) return true; } +void AppWindow::UpdateImportExportMenus() +{ + // clear menus of all actions first + ui->menuImport->clear(); + ui->menuExport->clear(); + + // add action from currently active mode + auto active = modeHandler->getActiveMode(); + if(active) { + for(auto a : active->getImportOptions()) { + ui->menuImport->addAction(a); + } + for(auto a : active->getExportOptions()) { + ui->menuExport->addAction(a); + } + } + // disable/enable menus + ui->menuImport->setEnabled(ui->menuImport->actions().size()); + ui->menuExport->setEnabled(ui->menuExport->actions().size()); +} + void AppWindow::LoadSetup(nlohmann::json j) { // auto d = new JSONPickerDialog(j); diff --git a/Software/PC_Application/LibreVNA-GUI/appwindow.h b/Software/PC_Application/LibreVNA-GUI/appwindow.h index 54b542b1..2fd231ac 100644 --- a/Software/PC_Application/LibreVNA-GUI/appwindow.h +++ b/Software/PC_Application/LibreVNA-GUI/appwindow.h @@ -88,6 +88,7 @@ private slots: void DeviceInfoUpdated(); void SaveSetup(QString filename); bool LoadSetup(QString filename); + void UpdateImportExportMenus(); private: nlohmann::json SaveSetup(); void LoadSetup(nlohmann::json j); diff --git a/Software/PC_Application/LibreVNA-GUI/main.ui b/Software/PC_Application/LibreVNA-GUI/main.ui index 7116e9b7..0eafa2ba 100644 --- a/Software/PC_Application/LibreVNA-GUI/main.ui +++ b/Software/PC_Application/LibreVNA-GUI/main.ui @@ -27,9 +27,23 @@ File + + + Import + + + + + Export + + + + + + @@ -232,6 +246,16 @@ Create Debug Data + + + dummy + + + + + Dummy + + diff --git a/Software/PC_Application/LibreVNA-GUI/mode.h b/Software/PC_Application/LibreVNA-GUI/mode.h index c5c8d073..e620081f 100644 --- a/Software/PC_Application/LibreVNA-GUI/mode.h +++ b/Software/PC_Application/LibreVNA-GUI/mode.h @@ -46,6 +46,8 @@ class Mode : public QObject, public Savable, public SCPINode virtual void setAveragingMode(Averaging::Mode mode) = 0; virtual void preset() = 0; + virtual QList getImportOptions() { return {};} + virtual QList getExportOptions() { return {};} signals: void statusbarMessage(QString msg);