diff --git a/companion/src/firmwares/modeldata.cpp b/companion/src/firmwares/modeldata.cpp index a04a15f2f..9d5422114 100644 --- a/companion/src/firmwares/modeldata.cpp +++ b/companion/src/firmwares/modeldata.cpp @@ -2046,3 +2046,8 @@ const Board::SwitchType ModelData::getSwitchType(int sw, const GeneralSettings & } return gs.switchConfig[sw].type; } + +QString ModelData::getChecklistFilename() const +{ + return QString(name).replace(" ", "_").append(".txt").toLower(); +} diff --git a/companion/src/firmwares/modeldata.h b/companion/src/firmwares/modeldata.h index 1424a7afd..080b3d9fb 100644 --- a/companion/src/firmwares/modeldata.h +++ b/companion/src/firmwares/modeldata.h @@ -125,19 +125,6 @@ class ModelData { public: ModelData(); ModelData(const ModelData & src); - ModelData & operator = (const ModelData & src); - - void convert(RadioDataConversionState & cstate); - - ExpoData * insertInput(const int idx); - void removeInput(const int idx, bool clearName = true); - - bool isInputValid(const unsigned int idx) const; - bool hasExpos(uint8_t inputIdx) const; - bool hasMixes(uint8_t output) const; - - QVector expos(int input) const; - QVector mixes(int channel) const; char semver[8 + 1]; bool used; @@ -243,6 +230,22 @@ class ModelData { unsigned int usbJoystickCircularCut; USBJoystickChData usbJoystickCh[CPN_USBJ_MAX_JOYSTICK_CHANNELS]; + QByteArray checklistData; + + ModelData & operator = (const ModelData & src); + + void convert(RadioDataConversionState & cstate); + + ExpoData * insertInput(const int idx); + void removeInput(const int idx, bool clearName = true); + + bool isInputValid(const unsigned int idx) const; + bool hasExpos(uint8_t inputIdx) const; + bool hasMixes(uint8_t output) const; + + QVector expos(int input) const; + QVector mixes(int channel) const; + void clear(); bool isEmpty() const; void setDefaultInputs(const GeneralSettings & settings); @@ -283,7 +286,9 @@ class ModelData { bool isFunctionSwitchSourceAllowed(int index) const; const Board::SwitchType getSwitchType(int sw, const GeneralSettings & gs) const; - + + QString getChecklistFilename() const; + enum ReferenceUpdateAction { REF_UPD_ACT_CLEAR, REF_UPD_ACT_SHIFT, diff --git a/companion/src/helpers.cpp b/companion/src/helpers.cpp index 14c50dace..1dbeb6c4d 100644 --- a/companion/src/helpers.cpp +++ b/companion/src/helpers.cpp @@ -718,24 +718,6 @@ void TableLayout::setColumnStretch(int col, int stretch) #endif } -QString Helpers::getChecklistsPath() -{ - return QDir::toNativeSeparators(g.profile[g.id()].sdPath() + "/MODELS/"); // TODO : add sub folder to constants -} - -QString Helpers::getChecklistFilename(const ModelData * model) -{ - QString name = model->name; - name.replace(" ", "_"); - name.append(".txt"); // TODO : add to constants - return name; -} - -QString Helpers::getChecklistFilePath(const ModelData * model) -{ - return getChecklistsPath() + getChecklistFilename(model); -} - QString Helpers::removeAccents(const QString & str) { // UTF-8 ASCII Table diff --git a/companion/src/helpers.h b/companion/src/helpers.h index 05952d920..5b8009531 100644 --- a/companion/src/helpers.h +++ b/companion/src/helpers.h @@ -110,9 +110,6 @@ namespace Helpers void exportAppSettings(QWidget * dlgParent = nullptr); - QString getChecklistsPath(); - QString getChecklistFilename(const ModelData * model); - QString getChecklistFilePath(const ModelData * model); QString removeAccents(const QString & str); unsigned int getBitmappedValue(const unsigned int & field, const unsigned int index = 0, const unsigned int numbits = 1, const unsigned int offset = 0); void setBitmappedValue(unsigned int & field, unsigned int value, unsigned int index = 0, unsigned int numbits = 1, unsigned int offset = 0); diff --git a/companion/src/modeledit/checklistdialog.cpp b/companion/src/modeledit/checklistdialog.cpp index d057fd22e..7def2397c 100644 --- a/companion/src/modeledit/checklistdialog.cpp +++ b/companion/src/modeledit/checklistdialog.cpp @@ -24,31 +24,32 @@ #include "helpers.h" #include -#include -ChecklistDialog::ChecklistDialog(QWidget *parent, const ModelData * model): +ChecklistDialog::ChecklistDialog(QWidget *parent, ModelData * model): QDialog(parent), ui(new Ui::ChecklistDialog), + model(model), mDirty(false) { ui->setupUi(this); setWindowIcon(CompanionIcon("edit.png")); - mChecklistFolder = Helpers::getChecklistsPath(); - mModelChecklist = Helpers::getChecklistFilePath(model); - ui->file->setText("File: " + mModelChecklist); - ui->pteCheck->setPlainText(readFile(mModelChecklist, QFile::exists(mModelChecklist))); - - QFont f("Courier", 12, QFont::Normal); // fixed width font + QFont f("Courier", 10, QFont::Normal); // fixed width font ui->pteCheck->setFont(f); - connect(ui->pteCheck, SIGNAL(textChanged()), this, SLOT(changed())); - connect(ui->pteCheck, SIGNAL(cursorPositionChanged()), this, SLOT(cursorChanged())); - connect(ui->pbImport, SIGNAL(clicked()), this, SLOT(import())); - connect(ui->pbCancel, SIGNAL(clicked()), this, SLOT(reject())); - connect(ui->pbOK, SIGNAL(clicked()), this, SLOT(update())); + connect(ui->pteCheck, &QPlainTextEdit::textChanged, [&]() { mDirty = true; }); + connect(ui->pteCheck, &QPlainTextEdit::cursorPositionChanged, [&]() + { + QTextCursor tc = ui->pteCheck->textCursor(); + ui->lblCursorPos->setText(tr("Line %1, Col %2").arg(tc.blockNumber() + 1).arg(tc.positionInBlock() + 1)); + } + ); + connect(ui->pbImport, &QPushButton::clicked, this, &ChecklistDialog::import); + connect(ui->pbCancel, &QPushButton::clicked, [this]() { reject(); }); + connect(ui->pbOK, &QPushButton::clicked, this, &ChecklistDialog::update); - cursorChanged(); // force label to update + ui->pteCheck->setPlainText(model->checklistData.data()); + mDirty = false; } ChecklistDialog::~ChecklistDialog() @@ -56,57 +57,45 @@ ChecklistDialog::~ChecklistDialog() delete ui; } -void ChecklistDialog::changed() +void ChecklistDialog::update() { - mDirty = true; + if (mDirty) { + model->checklistData = Helpers::removeAccents(ui->pteCheck->toPlainText()).toUtf8(); + if (model->checklistData.trimmed().isEmpty()) + model->checklistData.clear(); + emit updated(); + } + + emit accept(); } void ChecklistDialog::import() { - QString filename = QFileDialog::getOpenFileName(this, tr("Open Checklist"), mChecklistFolder, tr("Checklist Files (*.txt)")); - if (!filename.isNull()) - ui->pteCheck->setPlainText(readFile(filename,true)); - mDirty = true; -} + QString filename = QFileDialog::getOpenFileName(this, tr("Import Checklist File"), QString(), tr("Checklist Files (*.txt)")); -void ChecklistDialog::update() -{ - if (mDirty) { - QFile file(mModelChecklist); - if (!file.open(QFile::WriteOnly | QFile::Text)) { - QMessageBox::critical(this, tr("Model Checklist"), tr("Cannot open file for writing %1:\n%2.").arg(mModelChecklist, file.errorString())); - } - else { - QTextStream out(&file); - if (out.status()==QTextStream::Ok) { - out << Helpers::removeAccents(ui->pteCheck->toPlainText()); - if (!(out.status()==QTextStream::Ok)) { - QMessageBox::critical(this, tr("Model Checklist"), tr("Cannot write to file %1:\n%2.").arg(mModelChecklist, file.errorString())); - if (!file.flush()) { - QMessageBox::critical(this, tr("Model Checklist"), tr("Cannot write file %1:\n%2.").arg(mModelChecklist, file.errorString())); - } - } - } - } - file.close(); + if (!filename.isEmpty()) { + ui->pteCheck->setPlainText(readFile(filename,true)); + mDirty = true; } - emit accept(); } QString ChecklistDialog::readFile(const QString & filepath, const bool exists) { QString data = ""; + if (!filepath.isNull()) { QFile file(filepath); + if (!file.open(QFile::ReadOnly | QFile::Text)) { if (exists) { QMessageBox::critical(this, tr("Model Checklist"), tr("Cannot open file %1:\n%2.").arg(QDir::toNativeSeparators(filepath), file.errorString())); } - } - else { + } else { QTextStream in(&file); + if (in.status()==QTextStream::Ok) { data = Helpers::removeAccents(in.readAll()); + if (!(in.status()==QTextStream::Ok)) { QMessageBox::critical(this, tr("Model Checklist"), tr("Cannot read file %1:\n%2.").arg(QDir::toNativeSeparators(filepath), file.errorString())); data = ""; @@ -117,9 +106,3 @@ QString ChecklistDialog::readFile(const QString & filepath, const bool exists) } return data; } - -void ChecklistDialog::cursorChanged() -{ - QTextCursor tc = ui->pteCheck->textCursor(); - ui->lblCursorPos->setText(tr("Line %1, Col %2").arg(tc.blockNumber() + 1).arg(tc.positionInBlock() + 1)); -} diff --git a/companion/src/modeledit/checklistdialog.h b/companion/src/modeledit/checklistdialog.h index 8f0534191..c8d264842 100644 --- a/companion/src/modeledit/checklistdialog.h +++ b/companion/src/modeledit/checklistdialog.h @@ -19,8 +19,7 @@ * GNU General Public License for more details. */ -#ifndef _CHECKLISTDIALOG_H_ -#define _CHECKLISTDIALOG_H_ +#pragma once #include "modeldata.h" @@ -34,21 +33,19 @@ class ChecklistDialog : public QDialog { Q_OBJECT public: - ChecklistDialog(QWidget *parent, const ModelData * model); + ChecklistDialog(QWidget *parent, ModelData * model); ~ChecklistDialog(); +signals: + void updated(); + private slots: void import(); void update(); - void changed(); - void cursorChanged(); private: Ui::ChecklistDialog *ui; - QString mModelChecklist; - QString mChecklistFolder; - QString readFile(const QString & filepath, const bool exists); + ModelData *model; bool mDirty; + QString readFile(const QString & filepath, const bool exists); }; - -#endif // _CHECKLISTDIALOG_H_ diff --git a/companion/src/modeledit/checklistdialog.ui b/companion/src/modeledit/checklistdialog.ui index 43327e8b1..7588fb2c0 100644 --- a/companion/src/modeledit/checklistdialog.ui +++ b/companion/src/modeledit/checklistdialog.ui @@ -14,13 +14,13 @@ Edit Checklist - + - Qt::Vertical + Qt::Orientation::Vertical - QSizePolicy::Fixed + QSizePolicy::Policy::Fixed @@ -30,7 +30,7 @@ - + @@ -44,26 +44,26 @@ - Qt::ScrollBarAsNeeded + Qt::ScrollBarPolicy::ScrollBarAsNeeded - Qt::ScrollBarAsNeeded + Qt::ScrollBarPolicy::ScrollBarAsNeeded true - QPlainTextEdit::NoWrap + QPlainTextEdit::LineWrapMode::NoWrap - + 6 - QLayout::SetMinimumSize + QLayout::SizeConstraint::SetMinimumSize @@ -75,10 +75,10 @@ - Qt::Horizontal + Qt::Orientation::Horizontal - QSizePolicy::Expanding + QSizePolicy::Policy::Expanding @@ -135,20 +135,10 @@ - + - Please note, the maximum width displayable is radio model limited. Also, renaming the model will break the link to this checklist file. - - - true - - - - - - - File: unknown + Please note, the maximum width displayable is limited by the physical radio screen true diff --git a/companion/src/modeledit/setup.cpp b/companion/src/modeledit/setup.cpp index 61b22d99b..23e72e198 100644 --- a/companion/src/modeledit/setup.cpp +++ b/companion/src/modeledit/setup.cpp @@ -180,7 +180,7 @@ SetupPanel::SetupPanel(QWidget * parent, ModelData & model, GeneralSettings & ge if (!firmware->getCapability(HasDisplayText)) { ui->displayText->hide(); - ui->editText->hide(); + ui->editChecklist->hide(); } if (!firmware->getCapability(GlobalFunctions)) { @@ -322,8 +322,6 @@ SetupPanel::SetupPanel(QWidget * parent, ModelData & model, GeneralSettings & ge } } - disableMouseScrolling(); - lock = false; } @@ -646,17 +644,12 @@ void SetupPanel::onBeepCenterToggled(bool checked) } } -void SetupPanel::on_editText_clicked() +void SetupPanel::on_editChecklist_clicked() { - const QString path = Helpers::getChecklistsPath(); - QDir d(path); - if (!d.exists()) { - QMessageBox::critical(this, tr("Profile Settings"), tr("SD structure path not specified or invalid")); - } - else { - ChecklistDialog *g = new ChecklistDialog(this, model); - g->exec(); - } + ChecklistDialog *chk = new ChecklistDialog(this, model); + connect(chk, &ChecklistDialog::updated, [this]() { emit modified(); }); + chk->exec(); + chk->deleteLater(); } void SetupPanel::onTimerCustomContextMenuRequested(QPoint pos) diff --git a/companion/src/modeledit/setup.h b/companion/src/modeledit/setup.h index 8ed030b95..7d1e583c0 100644 --- a/companion/src/modeledit/setup.h +++ b/companion/src/modeledit/setup.h @@ -69,7 +69,7 @@ class SetupPanel : public ModelPanel void startupSwitchToggled(bool checked); void potWarningToggled(bool checked); void on_potWarningMode_currentIndexChanged(int index); - void on_editText_clicked(); + void on_editChecklist_clicked(); void onTimerCustomContextMenuRequested(QPoint pos); void cmTimerClear(bool prompt = true); void cmTimerClearAll(); diff --git a/companion/src/modeledit/setup.ui b/companion/src/modeledit/setup.ui index 95da3907d..9de1ea075 100644 --- a/companion/src/modeledit/setup.ui +++ b/companion/src/modeledit/setup.ui @@ -20,7 +20,6 @@ - 50 false @@ -28,7 +27,7 @@ Timer 1 - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter @@ -52,10 +51,10 @@ - Qt::Horizontal + Qt::Orientation::Horizontal - QSizePolicy::Fixed + QSizePolicy::Policy::Fixed @@ -93,10 +92,10 @@ - QFrame::Panel + QFrame::Shape::Panel - QFrame::Raised + QFrame::Shadow::Raised @@ -112,7 +111,7 @@ - Qt::Horizontal + Qt::Orientation::Horizontal @@ -127,17 +126,16 @@ - Qt::Horizontal + Qt::Orientation::Horizontal - + - 75 true @@ -145,7 +143,7 @@ Model - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter @@ -153,7 +151,6 @@ - 50 false @@ -161,17 +158,16 @@ Timer 3 - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - + - 50 false @@ -179,15 +175,14 @@ Throttle Source - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - + - 50 false @@ -195,15 +190,14 @@ Hats Mode - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - + - 50 false @@ -211,7 +205,7 @@ Trim Step - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter @@ -219,7 +213,6 @@ - 50 false @@ -227,7 +220,7 @@ Trims Display - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter @@ -237,7 +230,6 @@ - 50 false @@ -245,11 +237,11 @@ Top LCD Timer - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - + @@ -259,7 +251,6 @@ - 75 true @@ -267,7 +258,7 @@ Warnings - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter @@ -289,7 +280,7 @@ - Qt::Horizontal + Qt::Orientation::Horizontal @@ -304,15 +295,14 @@ - Qt::Horizontal + Qt::Orientation::Horizontal - + - 50 false @@ -320,14 +310,14 @@ Timer 2 - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - Qt::Horizontal + Qt::Orientation::Horizontal @@ -345,7 +335,7 @@ - QLayout::SetMinimumSize + QLayout::SizeConstraint::SetMinimumSize 0 @@ -361,7 +351,7 @@ - Qt::Vertical + Qt::Orientation::Vertical @@ -375,7 +365,7 @@ - + Pot/Slider Warnings @@ -384,7 +374,7 @@ - + @@ -406,7 +396,7 @@ - Qt::Vertical + Qt::Orientation::Vertical @@ -423,7 +413,7 @@ - Qt::Horizontal + Qt::Orientation::Horizontal @@ -438,7 +428,7 @@ - Qt::Horizontal + Qt::Orientation::Horizontal @@ -446,7 +436,6 @@ - 50 false @@ -454,7 +443,7 @@ Center beep - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter @@ -529,7 +518,7 @@ - Qt::LeftToRight + Qt::LayoutDirection::LeftToRight Throttle Warning @@ -539,7 +528,7 @@ - Qt::LeftToRight + Qt::LayoutDirection::LeftToRight Custom Throttle Warning @@ -565,7 +554,7 @@ - Qt::LeftToRight + Qt::LayoutDirection::LeftToRight Display Checklist @@ -582,7 +571,7 @@ - Qt::LeftToRight + Qt::LayoutDirection::LeftToRight Interactive Checklist @@ -593,7 +582,6 @@ - 50 false @@ -631,7 +619,7 @@ - + 0 @@ -646,7 +634,7 @@ - Qt::LeftToRight + Qt::LayoutDirection::LeftToRight Throttle Trim Idle Only @@ -662,7 +650,7 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi - Qt::LeftToRight + Qt::LayoutDirection::LeftToRight Reverse Throttle @@ -679,7 +667,7 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi - Qt::LeftToRight + Qt::LayoutDirection::LeftToRight Extended Trims @@ -689,7 +677,7 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi - Qt::LeftToRight + Qt::LayoutDirection::LeftToRight Extended Limits @@ -709,7 +697,7 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi - Qt::Horizontal + Qt::Orientation::Horizontal @@ -732,7 +720,7 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi - Qt::Vertical + Qt::Orientation::Vertical diff --git a/companion/src/print/modelprinter.cpp b/companion/src/print/modelprinter.cpp index 4f352c82c..4df6abd12 100644 --- a/companion/src/print/modelprinter.cpp +++ b/companion/src/print/modelprinter.cpp @@ -1107,18 +1107,10 @@ QString ModelPrinter::printTelemetryScreen(unsigned int idx, unsigned int line, QString ModelPrinter::printChecklist() { - if (!model.displayChecklist) - return ""; - QString str = tr("Error: Unable to open or read file!"); - QFile file(Helpers::getChecklistFilePath(&model)); - if (file.open(QFile::ReadOnly | QFile::Text)) { - QTextStream in(&file); - if (in.status() == QTextStream::Ok) { - str = in.readAll(); - str.replace("\n", "
"); - str.remove("\r"); - } - file.close(); - } + if (!model.displayChecklist) return QString(); + + QString str(model.checklistData); + str.replace("\n", "
"); + str.remove("\r"); return str; } diff --git a/companion/src/storage/etx.cpp b/companion/src/storage/etx.cpp index a3a3ea571..242a9bf38 100644 --- a/companion/src/storage/etx.cpp +++ b/companion/src/storage/etx.cpp @@ -90,12 +90,17 @@ bool EtxFormat::write(const RadioData & radioData) return result; } -bool EtxFormat::loadFile(QByteArray & filedata, const QString & filename) +bool EtxFormat::loadFile(QByteArray & filedata, const QString & filename, bool optional) { size_t size; void * data = mz_zip_reader_extract_file_to_heap(&zip_archive, qPrintable(filename), &size, 0); if (!data) { - return false; + if (optional) { + //qDebug() << "File not found:" << filename; + return true; + } else { + return false; + } } qDebug() << QString("Extracted file %1, size=%2").arg(filename).arg(size); diff --git a/companion/src/storage/etx.h b/companion/src/storage/etx.h index 4bf2602d6..6bdfc11c7 100644 --- a/companion/src/storage/etx.h +++ b/companion/src/storage/etx.h @@ -40,7 +40,7 @@ class EtxFormat : public LabelsStorageFormat virtual bool write(const RadioData & radioData); protected: - virtual bool loadFile(QByteArray & fileData, const QString & fileName); + virtual bool loadFile(QByteArray & fileData, const QString & fileName, bool optional = false); virtual bool writeFile(const QByteArray & fileData, const QString & fileName); virtual bool getFileList(std::list& filelist); virtual bool deleteFile(const QString & fileName) { return false; } diff --git a/companion/src/storage/labeled.cpp b/companion/src/storage/labeled.cpp index 5469c9cfd..a289b22c3 100644 --- a/companion/src/storage/labeled.cpp +++ b/companion/src/storage/labeled.cpp @@ -160,6 +160,9 @@ bool LabelsStorageFormat::load(RadioData & radioData) return false; } + if (!loadChecklist(model)) + return false; + model.modelIndex = modelIdx; strncpy(model.filename, mc.filename.c_str(), sizeof(model.filename)-1); @@ -235,6 +238,9 @@ bool LabelsStorageFormat::write(const RadioData & radioData) writeModelToYaml(model, modelData); if (!writeFile(modelData, modelFilename)) return false; + + if (!writeChecklist(model)) + return false; } if (hasLabels) { @@ -245,3 +251,32 @@ bool LabelsStorageFormat::write(const RadioData & radioData) return true; } + +bool LabelsStorageFormat::loadChecklist(ModelData & model) +{ + const QString fname("MODELS/" + model.getChecklistFilename()); + //qDebug() << "Searching for checklist file:" << fname; + + if (!loadFile(model.checklistData, fname, true)) { + setError(tr("Cannot load ") + fname); + return false; + } + + return true; +} + +bool LabelsStorageFormat::writeChecklist(const ModelData & model) +{ + const QString fname("MODELS/" + model.getChecklistFilename()); + + // not every model has a checklist + if (!model.checklistData.isEmpty()) { + //qDebug() << "Writing checklist file:" << fname; + if (!writeFile(model.checklistData, fname)) { + setError(tr("Cannot write ") + fname); + return false; + } + } + + return true; +} diff --git a/companion/src/storage/labeled.h b/companion/src/storage/labeled.h index b36d2fcbf..a08109b79 100644 --- a/companion/src/storage/labeled.h +++ b/companion/src/storage/labeled.h @@ -45,10 +45,13 @@ class LabelsStorageFormat : public StorageFormat virtual bool write(const RadioData & radioData); protected: - virtual bool loadFile(QByteArray & fileData, const QString & fileName) = 0; + virtual bool loadFile(QByteArray & fileData, const QString & fileName, bool optional = false) = 0; virtual bool writeFile(const QByteArray & fileData, const QString & fileName) = 0; virtual bool getFileList(std::list& filelist) = 0; virtual bool deleteFile(const QString & fileName) = 0; StorageType probeFormat(); + + bool loadChecklist(ModelData &model); + bool writeChecklist(const ModelData & model); }; diff --git a/companion/src/storage/sdcard.cpp b/companion/src/storage/sdcard.cpp index 38520d478..d3287d9a1 100644 --- a/companion/src/storage/sdcard.cpp +++ b/companion/src/storage/sdcard.cpp @@ -31,10 +31,19 @@ bool SdcardFormat::write(const RadioData & radioData) return LabelsStorageFormat::write(radioData); } -bool SdcardFormat::loadFile(QByteArray & filedata, const QString & filename) +bool SdcardFormat::loadFile(QByteArray & filedata, const QString & filename, bool optional) { QString path = this->filename + "/" + filename; QFile file(path); + if (!file.exists()) { + if (optional) { + //qDebug() << "File not found:" << filename; + return true; + } else { + return false; + } + } + if (!file.open(QFile::ReadOnly)) { setError(tr("Error opening file %1:\n%2.").arg(path).arg(file.errorString())); return false; diff --git a/companion/src/storage/sdcard.h b/companion/src/storage/sdcard.h index 6065ef7aa..42cb219ea 100644 --- a/companion/src/storage/sdcard.h +++ b/companion/src/storage/sdcard.h @@ -39,7 +39,7 @@ class SdcardFormat : public LabelsStorageFormat virtual bool write(const RadioData & radioData); protected: - virtual bool loadFile(QByteArray & fileData, const QString & fileName); + virtual bool loadFile(QByteArray & fileData, const QString & fileName, bool optional = false); virtual bool writeFile(const QByteArray & fileData, const QString & fileName); virtual bool getFileList(std::list& filelist); virtual bool deleteFile(const QString & fileName);