remember last used load/save paths in preferences

This commit is contained in:
Jan Käberich 2025-06-23 16:39:18 +02:00
parent d8f042dcaa
commit 3330cee2ba
21 changed files with 91 additions and 43 deletions

View file

@ -1487,11 +1487,12 @@ bool Calibration::toFile(QString filename)
{
if(filename.isEmpty()) {
QString fn = descriptiveCalName();
filename = QFileDialog::getSaveFileName(nullptr, "Save calibration data", fn, "Calibration files (*.cal)", nullptr, Preferences::QFileDialogOptions());
filename = QFileDialog::getSaveFileName(nullptr, "Save calibration data", Preferences::getInstance().UISettings.Paths.cal + "/" + fn, "Calibration files (*.cal)", nullptr, Preferences::QFileDialogOptions());
if(filename.isEmpty()) {
// aborted selection
return false;
}
Preferences::getInstance().UISettings.Paths.cal = QFileInfo(filename).path();
}
if(filename.toLower().endsWith(".cal")) {
@ -1511,11 +1512,12 @@ bool Calibration::toFile(QString filename)
bool Calibration::fromFile(QString filename)
{
if(filename.isEmpty()) {
filename = QFileDialog::getOpenFileName(nullptr, "Load calibration data", "", "Calibration files (*.cal)", nullptr, Preferences::QFileDialogOptions());
filename = QFileDialog::getOpenFileName(nullptr, "Load calibration data", Preferences::getInstance().UISettings.Paths.cal, "Calibration files (*.cal)", nullptr, Preferences::QFileDialogOptions());
if(filename.isEmpty()) {
// aborted selection
return false;
}
Preferences::getInstance().UISettings.Paths.cal = QFileInfo(filename).path();
}
// force correct file ending

View file

@ -89,8 +89,9 @@ CalkitDialog::CalkitDialog(Calkit &c, QWidget *parent) :
accept();
});
connect(ui->buttonBox->button(QDialogButtonBox::Open), &QPushButton::clicked, [=](){
auto filename = QFileDialog::getOpenFileName(this, "Open calibration kit coefficients", "", "Calibration kit files (*.calkit)", nullptr, Preferences::QFileDialogOptions());
auto filename = QFileDialog::getOpenFileName(this, "Open calibration kit coefficients", Preferences::getInstance().UISettings.Paths.calkit, "Calibration kit files (*.calkit)", nullptr, Preferences::QFileDialogOptions());
if(filename.length() > 0) {
Preferences::getInstance().UISettings.Paths.calkit = QFileInfo(filename).path();
try {
kit = Calkit::fromFile(filename);
} catch (runtime_error &e) {
@ -103,8 +104,9 @@ CalkitDialog::CalkitDialog(Calkit &c, QWidget *parent) :
});
connect(ui->buttonBox->button(QDialogButtonBox::Save), &QPushButton::clicked, [=](){
auto filename = QFileDialog::getSaveFileName(this, "Save calibration kit coefficients", "", "Calibration kit files (*.calkit)", nullptr, Preferences::QFileDialogOptions());
auto filename = QFileDialog::getSaveFileName(this, "Save calibration kit coefficients", Preferences::getInstance().UISettings.Paths.calkit, "Calibration kit files (*.calkit)", nullptr, Preferences::QFileDialogOptions());
if(filename.length() > 0) {
Preferences::getInstance().UISettings.Paths.calkit = QFileInfo(filename).path();
parseEntries();
kit.toFile(filename);
}

View file

@ -64,8 +64,9 @@ void CSVImport::selectTrace(unsigned int index)
void CSVImport::on_browse_clicked()
{
auto filename = QFileDialog::getOpenFileName(nullptr, "Open measurement file", "", "CSV files (*.csv)", nullptr, Preferences::QFileDialogOptions());
auto filename = QFileDialog::getOpenFileName(nullptr, "Open measurement file", Preferences::getInstance().UISettings.Paths.data, "CSV files (*.csv)", nullptr, Preferences::QFileDialogOptions());
if (filename.length() > 0) {
Preferences::getInstance().UISettings.Paths.data = QFileInfo(filename).path();
ui->file->setText(filename);
evaluateFile();
}

View file

@ -112,8 +112,9 @@ void TouchstoneImport::setFile(QString filename)
void TouchstoneImport::on_browse_clicked()
{
auto filename = QFileDialog::getOpenFileName(nullptr, "Open measurement file", "", "Touchstone files (*.s1p *.s2p *.s3p *.s4p)", nullptr, Preferences::QFileDialogOptions());
auto filename = QFileDialog::getOpenFileName(nullptr, "Open measurement file", Preferences::getInstance().UISettings.Paths.data, "Touchstone files (*.s1p *.s2p *.s3p *.s4p)", nullptr, Preferences::QFileDialogOptions());
if (filename.length() > 0) {
Preferences::getInstance().UISettings.Paths.data = QFileInfo(filename).path();
ui->file->setText(filename);
}
}

View file

@ -44,11 +44,12 @@ AmplitudeCalDialog::AmplitudeCalDialog(LibreVNADriver *dev, QWidget *parent) :
connect(ui->saveFile, &QPushButton::clicked, [=](){
auto fileEnding = pointType() == Protocol::PacketType::SourceCalPoint ? ".srccal" : ".recvcal";
auto fileFilter = QString("Amplitude calibration files (*")+fileEnding+")";
auto filename = QFileDialog::getSaveFileName(nullptr, "Save calibration data", "", fileFilter, nullptr, Preferences::QFileDialogOptions());
auto filename = QFileDialog::getSaveFileName(nullptr, "Save calibration data", Preferences::getInstance().UISettings.Paths.vnacaldata, fileFilter, nullptr, Preferences::QFileDialogOptions());
if(filename.isEmpty()) {
// aborted selection
return;
}
Preferences::getInstance().UISettings.Paths.vnacaldata = QFileInfo(filename).path();
if(!filename.endsWith(fileEnding)) {
filename.append(fileEnding);
}
@ -70,11 +71,12 @@ AmplitudeCalDialog::AmplitudeCalDialog(LibreVNADriver *dev, QWidget *parent) :
connect(ui->loadFile, &QPushButton::clicked, [=](){
auto fileEnding = pointType() == Protocol::PacketType::SourceCalPoint ? ".srccal" : ".recvcal";
auto fileFilter = QString("Amplitude calibration files (*")+fileEnding+")";
auto filename = QFileDialog::getOpenFileName(nullptr, "Save calibration data", "", fileFilter, nullptr, Preferences::QFileDialogOptions());
auto filename = QFileDialog::getOpenFileName(nullptr, "Save calibration data", Preferences::getInstance().UISettings.Paths.vnacaldata, fileFilter, nullptr, Preferences::QFileDialogOptions());
if(filename.isEmpty()) {
// aborted selection
return;
}
Preferences::getInstance().UISettings.Paths.vnacaldata = QFileInfo(filename).path();
ifstream file;
file.open(filename.toStdString());
if(!file.is_open()) {

View file

@ -29,11 +29,12 @@ DevicePacketLogView::DevicePacketLogView(QWidget *parent) :
updateTree();
});
connect(ui->buttonBox->button(QDialogButtonBox::Save), &QPushButton::clicked, [=](){
QString filename = QFileDialog::getSaveFileName(nullptr, "Load LibreVNA log data", "", "LibreVNA log files (*.vnalog)", nullptr, Preferences::QFileDialogOptions());
QString filename = QFileDialog::getSaveFileName(nullptr, "Save LibreVNA log data", Preferences::getInstance().UISettings.Paths.packetlog, "LibreVNA log files (*.vnalog)", nullptr, Preferences::QFileDialogOptions());
if(filename.isEmpty()) {
// aborted selection
return;
}
Preferences::getInstance().UISettings.Paths.packetlog = QFileInfo(filename).path();
if(!filename.endsWith(".vnalog")) {
filename.append(".vnalog");
}
@ -43,11 +44,12 @@ DevicePacketLogView::DevicePacketLogView(QWidget *parent) :
file.close();
});
connect(ui->buttonBox->button(QDialogButtonBox::Open), &QPushButton::clicked, [=](){
QString filename = QFileDialog::getOpenFileName(nullptr, "Load LibreVNA log data", "", "LibreVNA log files (*.vnalog)", nullptr, Preferences::QFileDialogOptions());
QString filename = QFileDialog::getOpenFileName(nullptr, "Load LibreVNA log data", Preferences::getInstance().UISettings.Paths.packetlog, "LibreVNA log files (*.vnalog)", nullptr, Preferences::QFileDialogOptions());
if(filename.isEmpty()) {
// aborted selection
return;
}
Preferences::getInstance().UISettings.Paths.packetlog = QFileInfo(filename).path();
ifstream file;
file.open(filename.toStdString());
if(!file.is_open()) {

View file

@ -52,8 +52,9 @@ bool FirmwareUpdateDialog::FirmwareUpdate(LibreVNADriver *dev, QString file)
void FirmwareUpdateDialog::on_bFile_clicked()
{
ui->bStart->setEnabled(false);
auto filename = QFileDialog::getOpenFileName(nullptr, "Open firmware file", "", "Firmware file (*.vnafw)", nullptr, Preferences::QFileDialogOptions());
auto filename = QFileDialog::getOpenFileName(nullptr, "Open firmware file", Preferences::getInstance().UISettings.Paths.firmware, "Firmware file (*.vnafw)", nullptr, Preferences::QFileDialogOptions());
if (filename.length() > 0) {
Preferences::getInstance().UISettings.Paths.firmware = QFileInfo(filename).path();
ui->lFile->setText(filename);
reloadFile();
}

View file

@ -68,8 +68,9 @@ void DeviceLog::clear()
void DeviceLog::on_bToFile_clicked()
{
auto filename = QFileDialog::getSaveFileName(this, "Select file for device log", "", "", nullptr, Preferences::QFileDialogOptions());
auto filename = QFileDialog::getSaveFileName(this, "Select file for device log", Preferences::getInstance().UISettings.Paths.packetlog, "", nullptr, Preferences::QFileDialogOptions());
if(filename.length() > 0) {
Preferences::getInstance().UISettings.Paths.packetlog = QFileInfo(filename).path();
// create file
ofstream file;
file.open(filename.toStdString());

View file

@ -403,11 +403,12 @@ void EyeDiagramPlot::updateContextMenu()
auto image = new QAction("Save image...", contextmenu);
contextmenu->addAction(image);
connect(image, &QAction::triggered, this, [=]() {
auto filename = QFileDialog::getSaveFileName(nullptr, "Save plot image", "", "PNG image files (*.png)", nullptr, Preferences::QFileDialogOptions());
auto filename = QFileDialog::getSaveFileName(nullptr, "Save plot image", Preferences::getInstance().UISettings.Paths.image, "PNG image files (*.png)", nullptr, Preferences::QFileDialogOptions());
if(filename.isEmpty()) {
// aborted selection
return;
}
Preferences::getInstance().UISettings.Paths.image = QFileInfo(filename).path();
if(filename.endsWith(".png")) {
filename.chop(4);
}

View file

@ -72,11 +72,12 @@ void TraceCSVExport::on_buttonBox_accepted()
return;
}
auto filename = QFileDialog::getSaveFileName(nullptr, "Save calibration data", "", "CSV files (*.csv)", nullptr, Preferences::QFileDialogOptions());
auto filename = QFileDialog::getSaveFileName(nullptr, "Save calibration data", Preferences::getInstance().UISettings.Paths.data, "CSV files (*.csv)", nullptr, Preferences::QFileDialogOptions());
if(filename.isEmpty()) {
// aborted selection
return;
}
Preferences::getInstance().UISettings.Paths.data = QFileInfo(filename).path();
if(!filename.endsWith(".csv")) {
filename.append(".csv");
}

View file

@ -253,11 +253,12 @@ void TracePolar::updateContextMenu()
auto image = new QAction("Save image...", contextmenu);
contextmenu->addAction(image);
connect(image, &QAction::triggered, [=]() {
auto filename = QFileDialog::getSaveFileName(nullptr, "Save plot image", "", "PNG image files (*.png)", nullptr, Preferences::QFileDialogOptions());
auto filename = QFileDialog::getSaveFileName(nullptr, "Save plot image", Preferences::getInstance().UISettings.Paths.image, "PNG image files (*.png)", nullptr, Preferences::QFileDialogOptions());
if(filename.isEmpty()) {
// aborted selection
return;
}
Preferences::getInstance().UISettings.Paths.image = QFileInfo(filename).path();
if(filename.endsWith(".png")) {
filename.chop(4);
}

View file

@ -99,8 +99,9 @@ void TraceTouchstoneExport::on_buttonBox_accepted()
{
unsigned int ports = ui->sbPorts->value();
QString extension = ".s"+QString::number(ports)+"p";
auto filename = QFileDialog::getSaveFileName(this, "Select file for exporting traces", "", "Touchstone files (*"+extension+")", nullptr, Preferences::QFileDialogOptions());
auto filename = QFileDialog::getSaveFileName(this, "Select file for exporting traces", Preferences::getInstance().UISettings.Paths.data, "Touchstone files (*"+extension+")", nullptr, Preferences::QFileDialogOptions());
if(filename.length() > 0) {
Preferences::getInstance().UISettings.Paths.data = QFileInfo(filename).path();
auto t = Touchstone(ports);
t.setReferenceImpedance(ui->selector->getReferenceImpedance());
// add trace points to touchstone

View file

@ -213,11 +213,12 @@ void TraceWaterfall::updateContextMenu()
auto image = new QAction("Save image...", contextmenu);
contextmenu->addAction(image);
connect(image, &QAction::triggered, [=]() {
auto filename = QFileDialog::getSaveFileName(nullptr, "Save plot image", "", "PNG image files (*.png)", nullptr, Preferences::QFileDialogOptions());
auto filename = QFileDialog::getSaveFileName(nullptr, "Save plot image", Preferences::getInstance().UISettings.Paths.image, "PNG image files (*.png)", nullptr, Preferences::QFileDialogOptions());
if(filename.isEmpty()) {
// aborted selection
return;
}
Preferences::getInstance().UISettings.Paths.image = QFileInfo(filename).path();
if(filename.endsWith(".png")) {
filename.chop(4);
}

View file

@ -222,8 +222,9 @@ void TraceWidget::importDialog()
}
supported.chop(1);
supported += ")";
auto filename = QFileDialog::getOpenFileName(nullptr, "Open measurement file", "", supported, nullptr, Preferences::QFileDialogOptions());
auto filename = QFileDialog::getOpenFileName(nullptr, "Open measurement file", Preferences::getInstance().UISettings.Paths.data, supported, nullptr, Preferences::QFileDialogOptions());
if (!filename.isEmpty()) {
Preferences::getInstance().UISettings.Paths.data = QFileInfo(filename).path();
importFile(filename);
}
}

View file

@ -350,11 +350,12 @@ void TraceXYPlot::updateContextMenu()
auto image = new QAction("Save image...", contextmenu);
contextmenu->addAction(image);
connect(image, &QAction::triggered, [=]() {
auto filename = QFileDialog::getSaveFileName(nullptr, "Save plot image", "", "PNG image files (*.png)", nullptr, Preferences::QFileDialogOptions());
auto filename = QFileDialog::getSaveFileName(nullptr, "Save plot image", Preferences::getInstance().UISettings.Paths.image, "PNG image files (*.png)", nullptr, Preferences::QFileDialogOptions());
if(filename.isEmpty()) {
// aborted selection
return;
}
Preferences::getInstance().UISettings.Paths.image = QFileInfo(filename).path();
if(filename.endsWith(".png")) {
filename.chop(4);
}

View file

@ -242,11 +242,12 @@ XYplotAxisDialog::XYplotAxisDialog(TraceXYPlot *plot) :
removeLine(index);
});
connect(ui->exportLines, &QPushButton::clicked, this, [=](){
QString filename = QFileDialog::getSaveFileName(nullptr, "Save limit lines", "", "Limit files (*.limits)", nullptr, Preferences::QFileDialogOptions());
QString filename = QFileDialog::getSaveFileName(nullptr, "Save limit lines", Preferences::getInstance().UISettings.Paths.limitLines, "Limit files (*.limits)", nullptr, Preferences::QFileDialogOptions());
if(filename.isEmpty()) {
// aborted selection
return;
}
Preferences::getInstance().UISettings.Paths.limitLines = QFileInfo(filename).path();
if(!filename.endsWith(".limits")) {
filename.append(".limits");
}
@ -265,7 +266,7 @@ XYplotAxisDialog::XYplotAxisDialog(TraceXYPlot *plot) :
});
connect(ui->importLines, &QPushButton::clicked, [=](){
QString filename = QFileDialog::getOpenFileName(nullptr, "Load limit lines", "", "Limit files (*.limits)", nullptr, Preferences::QFileDialogOptions());
QString filename = QFileDialog::getOpenFileName(nullptr, "Load limit lines", Preferences::getInstance().UISettings.Paths.limitLines, "Limit files (*.limits)", nullptr, Preferences::QFileDialogOptions());
ifstream file;
file.open(filename.toStdString());
if(!file.is_open()) {

View file

@ -767,8 +767,9 @@ void MatchingComponent::mouseDoubleClickEvent(QMouseEvent *e)
Q_UNUSED(e);
if(type == Type::DefinedThrough || type == Type::DefinedShunt) {
// select new touchstone file
auto filename = QFileDialog::getOpenFileName(nullptr, "Open measurement file", "", "Touchstone files (*.s2p)", nullptr, Preferences::QFileDialogOptions());
auto filename = QFileDialog::getOpenFileName(nullptr, "Open measurement file", Preferences::getInstance().UISettings.Paths.data, "Touchstone files (*.s2p)", nullptr, Preferences::QFileDialogOptions());
if (!filename.isEmpty()) {
Preferences::getInstance().UISettings.Paths.data = QFileInfo(filename).path();
try {
*touchstone = Touchstone::fromFile(filename.toStdString());
} catch(const std::exception& e) {

View file

@ -229,19 +229,21 @@ void AppWindow::SetupMenu()
connect(ui->actionDisconnect, &QAction::triggered, this, &AppWindow::DisconnectDevice);
connect(ui->actionQuit, &QAction::triggered, this, &AppWindow::close);
connect(ui->actionSave_setup, &QAction::triggered, [=](){
auto filename = QFileDialog::getSaveFileName(nullptr, "Save setup data", "", "Setup files (*.setup)", nullptr, Preferences::QFileDialogOptions());
auto filename = QFileDialog::getSaveFileName(nullptr, "Save setup data", Preferences::getInstance().UISettings.Paths.setup, "Setup files (*.setup)", nullptr, Preferences::QFileDialogOptions());
if(filename.isEmpty()) {
// aborted selection
return;
}
Preferences::getInstance().UISettings.Paths.setup = QFileInfo(filename).path();
SaveSetup(filename);
});
connect(ui->actionLoad_setup, &QAction::triggered, [=](){
auto filename = QFileDialog::getOpenFileName(nullptr, "Load setup data", "", "Setup files (*.setup)", nullptr, Preferences::QFileDialogOptions());
auto filename = QFileDialog::getOpenFileName(nullptr, "Load setup data", Preferences::getInstance().UISettings.Paths.setup, "Setup files (*.setup)", nullptr, Preferences::QFileDialogOptions());
if(filename.isEmpty()) {
// aborted selection
return;
}
Preferences::getInstance().UISettings.Paths.setup = QFileInfo(filename).path();
LoadSetup(filename);
});
connect(ui->actionSave_image, &QAction::triggered, [=](){

View file

@ -141,11 +141,12 @@ Mode::Type Mode::TypeFromName(QString s)
void Mode::saveSreenshot()
{
auto filename = QFileDialog::getSaveFileName(nullptr, "Save plot image", "", "PNG image files (*.png)", nullptr, Preferences::QFileDialogOptions());
auto filename = QFileDialog::getSaveFileName(nullptr, "Save plot image", Preferences::getInstance().UISettings.Paths.image, "PNG image files (*.png)", nullptr, Preferences::QFileDialogOptions());
if(filename.isEmpty()) {
// aborted selection
return;
}
Preferences::getInstance().UISettings.Paths.image = QFileInfo(filename).path();
if(filename.endsWith(".png")) {
filename.chop(4);
}

View file

@ -68,7 +68,7 @@ PreferencesDialog::PreferencesDialog(Preferences *pref, QWidget *parent) :
ui->StartupStack->setCurrentWidget(ui->StartupPageSetupFile);
});
connect(ui->StartupBrowse, &QPushButton::clicked, [=](){
ui->StartupSetupFile->setText(QFileDialog::getOpenFileName(nullptr, "Select startup setup file", "", "Setup files (*.setup)", nullptr, Preferences::QFileDialogOptions()));
ui->StartupSetupFile->setText(QFileDialog::getOpenFileName(nullptr, "Select startup setup file", Preferences::getInstance().UISettings.Paths.setup, "Setup files (*.setup)", nullptr, Preferences::QFileDialogOptions()));
});
ui->StartupSweepStart->setUnit("Hz");
ui->StartupSweepStart->setPrefixes(" kMG");
@ -203,29 +203,31 @@ PreferencesDialog::PreferencesDialog(Preferences *pref, QWidget *parent) :
emit p->updated();
});
connect(ui->buttonBox->button(QDialogButtonBox::Save), &QPushButton::clicked, [=](){
auto filename = QFileDialog::getSaveFileName(this, "Save preferences", "", "LibreVNA preferences files (*.vnapref)", nullptr, Preferences::QFileDialogOptions());
auto filename = QFileDialog::getSaveFileName(this, "Save preferences", Preferences::getInstance().UISettings.Paths.pref, "LibreVNA preferences files (*.vnapref)", nullptr, Preferences::QFileDialogOptions());
if(filename.length() > 0) {
if(!filename.toLower().endsWith(".vnapref")) {
Preferences::getInstance().UISettings.Paths.pref = QFileInfo(filename).path();
if(!filename.toLower().endsWith(".vnapref")) {
filename.append(".vnapref");
}
ofstream file;
file.open(filename.toStdString());
updateFromGUI();
file << setw(1) << p->toJSON();
file.close();
}
ofstream file;
file.open(filename.toStdString());
updateFromGUI();
file << setw(1) << p->toJSON();
file.close();
}
});
connect(ui->buttonBox->button(QDialogButtonBox::Open), &QPushButton::clicked, [=](){
auto filename = QFileDialog::getOpenFileName(this, "Load preferences", "", "LibreVNA preferences files (*.vnapref)", nullptr, Preferences::QFileDialogOptions());
auto filename = QFileDialog::getOpenFileName(this, "Load preferences", Preferences::getInstance().UISettings.Paths.pref, "LibreVNA preferences files (*.vnapref)", nullptr, Preferences::QFileDialogOptions());
if(filename.length() > 0) {
ifstream file;
file.open(filename.toStdString());
nlohmann::json j;
file >> j;
file.close();
p->fromJSON(j);
setInitialGUIState();
emit p->updated();
Preferences::getInstance().UISettings.Paths.pref = QFileInfo(filename).path();
ifstream file;
file.open(filename.toStdString());
nlohmann::json j;
file >> j;
file.close();
p->fromJSON(j);
setInitialGUIState();
emit p->updated();
}
});
connect(ui->AcquisitionLimitTDRCheckbox, &QCheckBox::toggled, [=](bool enabled){

View file

@ -214,6 +214,18 @@ public:
unsigned int unitIndex;
QString exportedTraceNames;
} TouchstoneExport;
struct {
QString setup;
QString cal;
QString calkit;
QString data;
QString image;
QString vnacaldata;
QString packetlog;
QString limitLines;
QString pref;
QString firmware;
} Paths;
} UISettings;
bool TCPoverride; // in case of manual port specification via command line
@ -387,6 +399,16 @@ private:
{&UISettings.TouchstoneExport.formatIndex, "UISettings.TouchstoneExport.formatIndex", 2},
{&UISettings.TouchstoneExport.unitIndex, "UISettings.TouchstoneExport.unitIndex", 3},
{&UISettings.TouchstoneExport.exportedTraceNames, "UISettings.TouchstoneExport.exportedTraceNames", ""},
{&UISettings.Paths.setup, "UISettings.Paths.setup", ""},
{&UISettings.Paths.cal, "UISettings.Paths.cal", ""},
{&UISettings.Paths.calkit, "UISettings.Paths.calkit", ""},
{&UISettings.Paths.data, "UISettings.Paths.data", ""},
{&UISettings.Paths.image, "UISettings.Paths.image", ""},
{&UISettings.Paths.vnacaldata, "UISettings.Paths.vnacaldata", ""},
{&UISettings.Paths.packetlog, "UISettings.Paths.packetlog", ""},
{&UISettings.Paths.limitLines, "UISettings.Paths.limitLines", ""},
{&UISettings.Paths.pref, "UISettings.Paths.pref", ""},
{&UISettings.Paths.firmware, "UISettings.Paths.firmware", ""},
}};
};