feat(cpn): model notes and checklist files packaged with model files (#6578)

This commit is contained in:
Neil Horne
2025-10-02 14:47:29 +10:00
committed by GitHub
parent 7e53dd87fd
commit 96400a7aff
17 changed files with 191 additions and 207 deletions
+5
View File
@@ -2046,3 +2046,8 @@ const Board::SwitchType ModelData::getSwitchType(int sw, const GeneralSettings &
} }
return gs.switchConfig[sw].type; return gs.switchConfig[sw].type;
} }
QString ModelData::getChecklistFilename() const
{
return QString(name).replace(" ", "_").append(".txt").toLower();
}
+19 -14
View File
@@ -125,19 +125,6 @@ class ModelData {
public: public:
ModelData(); ModelData();
ModelData(const ModelData & src); 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<const ExpoData *> expos(int input) const;
QVector<const MixData *> mixes(int channel) const;
char semver[8 + 1]; char semver[8 + 1];
bool used; bool used;
@@ -243,6 +230,22 @@ class ModelData {
unsigned int usbJoystickCircularCut; unsigned int usbJoystickCircularCut;
USBJoystickChData usbJoystickCh[CPN_USBJ_MAX_JOYSTICK_CHANNELS]; 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<const ExpoData *> expos(int input) const;
QVector<const MixData *> mixes(int channel) const;
void clear(); void clear();
bool isEmpty() const; bool isEmpty() const;
void setDefaultInputs(const GeneralSettings & settings); void setDefaultInputs(const GeneralSettings & settings);
@@ -283,7 +286,9 @@ class ModelData {
bool isFunctionSwitchSourceAllowed(int index) const; bool isFunctionSwitchSourceAllowed(int index) const;
const Board::SwitchType getSwitchType(int sw, const GeneralSettings & gs) const; const Board::SwitchType getSwitchType(int sw, const GeneralSettings & gs) const;
QString getChecklistFilename() const;
enum ReferenceUpdateAction { enum ReferenceUpdateAction {
REF_UPD_ACT_CLEAR, REF_UPD_ACT_CLEAR,
REF_UPD_ACT_SHIFT, REF_UPD_ACT_SHIFT,
-18
View File
@@ -718,24 +718,6 @@ void TableLayout::setColumnStretch(int col, int stretch)
#endif #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) QString Helpers::removeAccents(const QString & str)
{ {
// UTF-8 ASCII Table // UTF-8 ASCII Table
-3
View File
@@ -110,9 +110,6 @@ namespace Helpers
void exportAppSettings(QWidget * dlgParent = nullptr); void exportAppSettings(QWidget * dlgParent = nullptr);
QString getChecklistsPath();
QString getChecklistFilename(const ModelData * model);
QString getChecklistFilePath(const ModelData * model);
QString removeAccents(const QString & str); 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); 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); void setBitmappedValue(unsigned int & field, unsigned int value, unsigned int index = 0, unsigned int numbits = 1, unsigned int offset = 0);
+33 -50
View File
@@ -24,31 +24,32 @@
#include "helpers.h" #include "helpers.h"
#include <QFile> #include <QFile>
#include <QTextStream>
ChecklistDialog::ChecklistDialog(QWidget *parent, const ModelData * model): ChecklistDialog::ChecklistDialog(QWidget *parent, ModelData * model):
QDialog(parent), QDialog(parent),
ui(new Ui::ChecklistDialog), ui(new Ui::ChecklistDialog),
model(model),
mDirty(false) mDirty(false)
{ {
ui->setupUi(this); ui->setupUi(this);
setWindowIcon(CompanionIcon("edit.png")); setWindowIcon(CompanionIcon("edit.png"));
mChecklistFolder = Helpers::getChecklistsPath(); QFont f("Courier", 10, QFont::Normal); // fixed width font
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
ui->pteCheck->setFont(f); ui->pteCheck->setFont(f);
connect(ui->pteCheck, SIGNAL(textChanged()), this, SLOT(changed())); connect(ui->pteCheck, &QPlainTextEdit::textChanged, [&]() { mDirty = true; });
connect(ui->pteCheck, SIGNAL(cursorPositionChanged()), this, SLOT(cursorChanged())); connect(ui->pteCheck, &QPlainTextEdit::cursorPositionChanged, [&]()
connect(ui->pbImport, SIGNAL(clicked()), this, SLOT(import())); {
connect(ui->pbCancel, SIGNAL(clicked()), this, SLOT(reject())); QTextCursor tc = ui->pteCheck->textCursor();
connect(ui->pbOK, SIGNAL(clicked()), this, SLOT(update())); 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() ChecklistDialog::~ChecklistDialog()
@@ -56,57 +57,45 @@ ChecklistDialog::~ChecklistDialog()
delete ui; 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() void ChecklistDialog::import()
{ {
QString filename = QFileDialog::getOpenFileName(this, tr("Open Checklist"), mChecklistFolder, tr("Checklist Files (*.txt)")); QString filename = QFileDialog::getOpenFileName(this, tr("Import Checklist File"), QString(), tr("Checklist Files (*.txt)"));
if (!filename.isNull())
ui->pteCheck->setPlainText(readFile(filename,true));
mDirty = true;
}
void ChecklistDialog::update() if (!filename.isEmpty()) {
{ ui->pteCheck->setPlainText(readFile(filename,true));
if (mDirty) { mDirty = true;
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();
} }
emit accept();
} }
QString ChecklistDialog::readFile(const QString & filepath, const bool exists) QString ChecklistDialog::readFile(const QString & filepath, const bool exists)
{ {
QString data = ""; QString data = "";
if (!filepath.isNull()) { if (!filepath.isNull()) {
QFile file(filepath); QFile file(filepath);
if (!file.open(QFile::ReadOnly | QFile::Text)) { if (!file.open(QFile::ReadOnly | QFile::Text)) {
if (exists) { if (exists) {
QMessageBox::critical(this, tr("Model Checklist"), tr("Cannot open file %1:\n%2.").arg(QDir::toNativeSeparators(filepath), file.errorString())); QMessageBox::critical(this, tr("Model Checklist"), tr("Cannot open file %1:\n%2.").arg(QDir::toNativeSeparators(filepath), file.errorString()));
} }
} } else {
else {
QTextStream in(&file); QTextStream in(&file);
if (in.status()==QTextStream::Ok) { if (in.status()==QTextStream::Ok) {
data = Helpers::removeAccents(in.readAll()); data = Helpers::removeAccents(in.readAll());
if (!(in.status()==QTextStream::Ok)) { if (!(in.status()==QTextStream::Ok)) {
QMessageBox::critical(this, tr("Model Checklist"), tr("Cannot read file %1:\n%2.").arg(QDir::toNativeSeparators(filepath), file.errorString())); QMessageBox::critical(this, tr("Model Checklist"), tr("Cannot read file %1:\n%2.").arg(QDir::toNativeSeparators(filepath), file.errorString()));
data = ""; data = "";
@@ -117,9 +106,3 @@ QString ChecklistDialog::readFile(const QString & filepath, const bool exists)
} }
return data; 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));
}
+7 -10
View File
@@ -19,8 +19,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
*/ */
#ifndef _CHECKLISTDIALOG_H_ #pragma once
#define _CHECKLISTDIALOG_H_
#include "modeldata.h" #include "modeldata.h"
@@ -34,21 +33,19 @@ class ChecklistDialog : public QDialog {
Q_OBJECT Q_OBJECT
public: public:
ChecklistDialog(QWidget *parent, const ModelData * model); ChecklistDialog(QWidget *parent, ModelData * model);
~ChecklistDialog(); ~ChecklistDialog();
signals:
void updated();
private slots: private slots:
void import(); void import();
void update(); void update();
void changed();
void cursorChanged();
private: private:
Ui::ChecklistDialog *ui; Ui::ChecklistDialog *ui;
QString mModelChecklist; ModelData *model;
QString mChecklistFolder;
QString readFile(const QString & filepath, const bool exists);
bool mDirty; bool mDirty;
QString readFile(const QString & filepath, const bool exists);
}; };
#endif // _CHECKLISTDIALOG_H_
+13 -23
View File
@@ -14,13 +14,13 @@
<string>Edit Checklist</string> <string>Edit Checklist</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<item row="3" column="0"> <item row="2" column="0">
<spacer name="verticalSpacer"> <spacer name="verticalSpacer">
<property name="orientation"> <property name="orientation">
<enum>Qt::Vertical</enum> <enum>Qt::Orientation::Vertical</enum>
</property> </property>
<property name="sizeType"> <property name="sizeType">
<enum>QSizePolicy::Fixed</enum> <enum>QSizePolicy::Policy::Fixed</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
@@ -30,7 +30,7 @@
</property> </property>
</spacer> </spacer>
</item> </item>
<item row="1" column="0"> <item row="0" column="0">
<widget class="QPlainTextEdit" name="pteCheck"> <widget class="QPlainTextEdit" name="pteCheck">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred"> <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
@@ -44,26 +44,26 @@
</font> </font>
</property> </property>
<property name="verticalScrollBarPolicy"> <property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAsNeeded</enum> <enum>Qt::ScrollBarPolicy::ScrollBarAsNeeded</enum>
</property> </property>
<property name="horizontalScrollBarPolicy"> <property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAsNeeded</enum> <enum>Qt::ScrollBarPolicy::ScrollBarAsNeeded</enum>
</property> </property>
<property name="tabChangesFocus"> <property name="tabChangesFocus">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="lineWrapMode"> <property name="lineWrapMode">
<enum>QPlainTextEdit::NoWrap</enum> <enum>QPlainTextEdit::LineWrapMode::NoWrap</enum>
</property> </property>
</widget> </widget>
</item> </item>
<item row="4" column="0"> <item row="3" column="0">
<layout class="QHBoxLayout" name="horizontalLayout"> <layout class="QHBoxLayout" name="horizontalLayout">
<property name="spacing"> <property name="spacing">
<number>6</number> <number>6</number>
</property> </property>
<property name="sizeConstraint"> <property name="sizeConstraint">
<enum>QLayout::SetMinimumSize</enum> <enum>QLayout::SizeConstraint::SetMinimumSize</enum>
</property> </property>
<item> <item>
<widget class="QLabel" name="lblCursorPos"> <widget class="QLabel" name="lblCursorPos">
@@ -75,10 +75,10 @@
<item> <item>
<spacer name="horizontalSpacer"> <spacer name="horizontalSpacer">
<property name="orientation"> <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Orientation::Horizontal</enum>
</property> </property>
<property name="sizeType"> <property name="sizeType">
<enum>QSizePolicy::Expanding</enum> <enum>QSizePolicy::Policy::Expanding</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
@@ -135,20 +135,10 @@
</item> </item>
</layout> </layout>
</item> </item>
<item row="2" column="0"> <item row="1" column="0">
<widget class="QLabel" name="label"> <widget class="QLabel" name="label">
<property name="text"> <property name="text">
<string>Please note, the maximum width displayable is radio model limited. Also, renaming the model will break the link to this checklist file.</string> <string>Please note, the maximum width displayable is limited by the physical radio screen</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="file">
<property name="text">
<string>File: unknown</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
+6 -13
View File
@@ -180,7 +180,7 @@ SetupPanel::SetupPanel(QWidget * parent, ModelData & model, GeneralSettings & ge
if (!firmware->getCapability(HasDisplayText)) { if (!firmware->getCapability(HasDisplayText)) {
ui->displayText->hide(); ui->displayText->hide();
ui->editText->hide(); ui->editChecklist->hide();
} }
if (!firmware->getCapability(GlobalFunctions)) { if (!firmware->getCapability(GlobalFunctions)) {
@@ -322,8 +322,6 @@ SetupPanel::SetupPanel(QWidget * parent, ModelData & model, GeneralSettings & ge
} }
} }
disableMouseScrolling();
lock = false; 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(); ChecklistDialog *chk = new ChecklistDialog(this, model);
QDir d(path); connect(chk, &ChecklistDialog::updated, [this]() { emit modified(); });
if (!d.exists()) { chk->exec();
QMessageBox::critical(this, tr("Profile Settings"), tr("SD structure path not specified or invalid")); chk->deleteLater();
}
else {
ChecklistDialog *g = new ChecklistDialog(this, model);
g->exec();
}
} }
void SetupPanel::onTimerCustomContextMenuRequested(QPoint pos) void SetupPanel::onTimerCustomContextMenuRequested(QPoint pos)
+1 -1
View File
@@ -69,7 +69,7 @@ class SetupPanel : public ModelPanel
void startupSwitchToggled(bool checked); void startupSwitchToggled(bool checked);
void potWarningToggled(bool checked); void potWarningToggled(bool checked);
void on_potWarningMode_currentIndexChanged(int index); void on_potWarningMode_currentIndexChanged(int index);
void on_editText_clicked(); void on_editChecklist_clicked();
void onTimerCustomContextMenuRequested(QPoint pos); void onTimerCustomContextMenuRequested(QPoint pos);
void cmTimerClear(bool prompt = true); void cmTimerClear(bool prompt = true);
void cmTimerClearAll(); void cmTimerClearAll();
+44 -56
View File
@@ -20,7 +20,6 @@
<widget class="QLabel" name="label_timer1"> <widget class="QLabel" name="label_timer1">
<property name="font"> <property name="font">
<font> <font>
<weight>50</weight>
<bold>false</bold> <bold>false</bold>
</font> </font>
</property> </property>
@@ -28,7 +27,7 @@
<string>Timer 1</string> <string>Timer 1</string>
</property> </property>
<property name="alignment"> <property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> <set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property> </property>
</widget> </widget>
</item> </item>
@@ -52,10 +51,10 @@
<item> <item>
<spacer name="horizontalSpacer_2"> <spacer name="horizontalSpacer_2">
<property name="orientation"> <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Orientation::Horizontal</enum>
</property> </property>
<property name="sizeType"> <property name="sizeType">
<enum>QSizePolicy::Fixed</enum> <enum>QSizePolicy::Policy::Fixed</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
@@ -93,10 +92,10 @@
</size> </size>
</property> </property>
<property name="frameShape"> <property name="frameShape">
<enum>QFrame::Panel</enum> <enum>QFrame::Shape::Panel</enum>
</property> </property>
<property name="frameShadow"> <property name="frameShadow">
<enum>QFrame::Raised</enum> <enum>QFrame::Shadow::Raised</enum>
</property> </property>
<property name="text"> <property name="text">
<string/> <string/>
@@ -112,7 +111,7 @@
<item> <item>
<spacer name="horizontalSpacer_26"> <spacer name="horizontalSpacer_26">
<property name="orientation"> <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Orientation::Horizontal</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
@@ -127,17 +126,16 @@
<item> <item>
<widget class="Line" name="line"> <widget class="Line" name="line">
<property name="orientation"> <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Orientation::Horizontal</enum>
</property> </property>
</widget> </widget>
</item> </item>
</layout> </layout>
</item> </item>
<item row="0" column="0" alignment="Qt::AlignLeft|Qt::AlignTop"> <item row="0" column="0" alignment="Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop">
<widget class="QLabel" name="label"> <widget class="QLabel" name="label">
<property name="font"> <property name="font">
<font> <font>
<weight>75</weight>
<bold>true</bold> <bold>true</bold>
</font> </font>
</property> </property>
@@ -145,7 +143,7 @@
<string>Model</string> <string>Model</string>
</property> </property>
<property name="alignment"> <property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> <set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property> </property>
</widget> </widget>
</item> </item>
@@ -153,7 +151,6 @@
<widget class="QLabel" name="label_timer3"> <widget class="QLabel" name="label_timer3">
<property name="font"> <property name="font">
<font> <font>
<weight>50</weight>
<bold>false</bold> <bold>false</bold>
</font> </font>
</property> </property>
@@ -161,17 +158,16 @@
<string>Timer 3</string> <string>Timer 3</string>
</property> </property>
<property name="alignment"> <property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> <set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property> </property>
</widget> </widget>
</item> </item>
<item row="6" column="0"> <item row="6" column="0">
<layout class="QVBoxLayout" name="verticalLayout_2"> <layout class="QVBoxLayout" name="verticalLayout_2">
<item alignment="Qt::AlignRight"> <item alignment="Qt::AlignmentFlag::AlignRight">
<widget class="QLabel" name="label_ttrace"> <widget class="QLabel" name="label_ttrace">
<property name="font"> <property name="font">
<font> <font>
<weight>50</weight>
<bold>false</bold> <bold>false</bold>
</font> </font>
</property> </property>
@@ -179,15 +175,14 @@
<string>Throttle Source</string> <string>Throttle Source</string>
</property> </property>
<property name="alignment"> <property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> <set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property> </property>
</widget> </widget>
</item> </item>
<item alignment="Qt::AlignRight"> <item alignment="Qt::AlignmentFlag::AlignRight">
<widget class="QLabel" name="lblHatsMode"> <widget class="QLabel" name="lblHatsMode">
<property name="font"> <property name="font">
<font> <font>
<weight>50</weight>
<bold>false</bold> <bold>false</bold>
</font> </font>
</property> </property>
@@ -195,15 +190,14 @@
<string>Hats Mode</string> <string>Hats Mode</string>
</property> </property>
<property name="alignment"> <property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> <set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property> </property>
</widget> </widget>
</item> </item>
<item alignment="Qt::AlignRight"> <item alignment="Qt::AlignmentFlag::AlignRight">
<widget class="QLabel" name="label_10"> <widget class="QLabel" name="label_10">
<property name="font"> <property name="font">
<font> <font>
<weight>50</weight>
<bold>false</bold> <bold>false</bold>
</font> </font>
</property> </property>
@@ -211,7 +205,7 @@
<string>Trim Step</string> <string>Trim Step</string>
</property> </property>
<property name="alignment"> <property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> <set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property> </property>
</widget> </widget>
</item> </item>
@@ -219,7 +213,6 @@
<widget class="QLabel" name="labelTrimsDisplay"> <widget class="QLabel" name="labelTrimsDisplay">
<property name="font"> <property name="font">
<font> <font>
<weight>50</weight>
<bold>false</bold> <bold>false</bold>
</font> </font>
</property> </property>
@@ -227,7 +220,7 @@
<string>Trims Display</string> <string>Trims Display</string>
</property> </property>
<property name="alignment"> <property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> <set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property> </property>
</widget> </widget>
</item> </item>
@@ -237,7 +230,6 @@
<widget class="QLabel" name="toplcdTimerLabel"> <widget class="QLabel" name="toplcdTimerLabel">
<property name="font"> <property name="font">
<font> <font>
<weight>50</weight>
<bold>false</bold> <bold>false</bold>
</font> </font>
</property> </property>
@@ -245,11 +237,11 @@
<string>Top LCD Timer</string> <string>Top LCD Timer</string>
</property> </property>
<property name="alignment"> <property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> <set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property> </property>
</widget> </widget>
</item> </item>
<item row="10" column="0" alignment="Qt::AlignLeft|Qt::AlignTop"> <item row="10" column="0" alignment="Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop">
<widget class="QLabel" name="swwarn_label"> <widget class="QLabel" name="swwarn_label">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum"> <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
@@ -259,7 +251,6 @@
</property> </property>
<property name="font"> <property name="font">
<font> <font>
<weight>75</weight>
<bold>true</bold> <bold>true</bold>
</font> </font>
</property> </property>
@@ -267,7 +258,7 @@
<string>Warnings</string> <string>Warnings</string>
</property> </property>
<property name="alignment"> <property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> <set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property> </property>
</widget> </widget>
</item> </item>
@@ -289,7 +280,7 @@
<item> <item>
<spacer name="horizontalSpacer_4"> <spacer name="horizontalSpacer_4">
<property name="orientation"> <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Orientation::Horizontal</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
@@ -304,15 +295,14 @@
<item row="7" column="1"> <item row="7" column="1">
<widget class="Line" name="line_4"> <widget class="Line" name="line_4">
<property name="orientation"> <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Orientation::Horizontal</enum>
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="0" alignment="Qt::AlignRight|Qt::AlignVCenter"> <item row="2" column="0" alignment="Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignVCenter">
<widget class="QLabel" name="label_timer2"> <widget class="QLabel" name="label_timer2">
<property name="font"> <property name="font">
<font> <font>
<weight>50</weight>
<bold>false</bold> <bold>false</bold>
</font> </font>
</property> </property>
@@ -320,14 +310,14 @@
<string>Timer 2</string> <string>Timer 2</string>
</property> </property>
<property name="alignment"> <property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> <set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property> </property>
</widget> </widget>
</item> </item>
<item row="9" column="0" colspan="2"> <item row="9" column="0" colspan="2">
<widget class="Line" name="line_3"> <widget class="Line" name="line_3">
<property name="orientation"> <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Orientation::Horizontal</enum>
</property> </property>
</widget> </widget>
</item> </item>
@@ -345,7 +335,7 @@
<item> <item>
<layout class="QGridLayout" name="switchesStartupLayout" rowstretch="0" columnstretch="0"> <layout class="QGridLayout" name="switchesStartupLayout" rowstretch="0" columnstretch="0">
<property name="sizeConstraint"> <property name="sizeConstraint">
<enum>QLayout::SetMinimumSize</enum> <enum>QLayout::SizeConstraint::SetMinimumSize</enum>
</property> </property>
<property name="topMargin"> <property name="topMargin">
<number>0</number> <number>0</number>
@@ -361,7 +351,7 @@
<item> <item>
<spacer name="verticalSpacer_2"> <spacer name="verticalSpacer_2">
<property name="orientation"> <property name="orientation">
<enum>Qt::Vertical</enum> <enum>Qt::Orientation::Vertical</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
@@ -375,7 +365,7 @@
</item> </item>
<item> <item>
<layout class="QVBoxLayout" name="verticalLayout_7"> <layout class="QVBoxLayout" name="verticalLayout_7">
<item alignment="Qt::AlignTop"> <item alignment="Qt::AlignmentFlag::AlignTop">
<widget class="QLabel" name="label_potWarning"> <widget class="QLabel" name="label_potWarning">
<property name="text"> <property name="text">
<string>Pot/Slider Warnings</string> <string>Pot/Slider Warnings</string>
@@ -384,7 +374,7 @@
</item> </item>
<item> <item>
<layout class="QGridLayout" name="potWarningLayout"> <layout class="QGridLayout" name="potWarningLayout">
<item row="0" column="0" alignment="Qt::AlignTop"> <item row="0" column="0" alignment="Qt::AlignmentFlag::AlignTop">
<widget class="QComboBox" name="potWarningMode"> <widget class="QComboBox" name="potWarningMode">
<item> <item>
<property name="text"> <property name="text">
@@ -406,7 +396,7 @@
<item row="1" column="0"> <item row="1" column="0">
<spacer name="verticalSpacer"> <spacer name="verticalSpacer">
<property name="orientation"> <property name="orientation">
<enum>Qt::Vertical</enum> <enum>Qt::Orientation::Vertical</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
@@ -423,7 +413,7 @@
<item> <item>
<spacer name="horizontalSpacer_3"> <spacer name="horizontalSpacer_3">
<property name="orientation"> <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Orientation::Horizontal</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
@@ -438,7 +428,7 @@
<item row="5" column="1"> <item row="5" column="1">
<widget class="Line" name="line_2"> <widget class="Line" name="line_2">
<property name="orientation"> <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Orientation::Horizontal</enum>
</property> </property>
</widget> </widget>
</item> </item>
@@ -446,7 +436,6 @@
<widget class="QLabel" name="label_12"> <widget class="QLabel" name="label_12">
<property name="font"> <property name="font">
<font> <font>
<weight>50</weight>
<bold>false</bold> <bold>false</bold>
</font> </font>
</property> </property>
@@ -454,7 +443,7 @@
<string>Center beep</string> <string>Center beep</string>
</property> </property>
<property name="alignment"> <property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> <set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property> </property>
</widget> </widget>
</item> </item>
@@ -529,7 +518,7 @@
<item row="0" column="2"> <item row="0" column="2">
<widget class="QCheckBox" name="throttleWarning"> <widget class="QCheckBox" name="throttleWarning">
<property name="layoutDirection"> <property name="layoutDirection">
<enum>Qt::LeftToRight</enum> <enum>Qt::LayoutDirection::LeftToRight</enum>
</property> </property>
<property name="text"> <property name="text">
<string>Throttle Warning</string> <string>Throttle Warning</string>
@@ -539,7 +528,7 @@
<item row="1" column="2"> <item row="1" column="2">
<widget class="QCheckBox" name="enableCustomThrottleWarning"> <widget class="QCheckBox" name="enableCustomThrottleWarning">
<property name="layoutDirection"> <property name="layoutDirection">
<enum>Qt::LeftToRight</enum> <enum>Qt::LayoutDirection::LeftToRight</enum>
</property> </property>
<property name="text"> <property name="text">
<string>Custom Throttle Warning</string> <string>Custom Throttle Warning</string>
@@ -565,7 +554,7 @@
<item row="2" column="3"> <item row="2" column="3">
<widget class="QCheckBox" name="displayText"> <widget class="QCheckBox" name="displayText">
<property name="layoutDirection"> <property name="layoutDirection">
<enum>Qt::LeftToRight</enum> <enum>Qt::LayoutDirection::LeftToRight</enum>
</property> </property>
<property name="text"> <property name="text">
<string>Display Checklist</string> <string>Display Checklist</string>
@@ -582,7 +571,7 @@
<item row="3" column="3"> <item row="3" column="3">
<widget class="QCheckBox" name="checklistInteractive"> <widget class="QCheckBox" name="checklistInteractive">
<property name="layoutDirection"> <property name="layoutDirection">
<enum>Qt::LeftToRight</enum> <enum>Qt::LayoutDirection::LeftToRight</enum>
</property> </property>
<property name="text"> <property name="text">
<string>Interactive Checklist</string> <string>Interactive Checklist</string>
@@ -593,7 +582,6 @@
<widget class="QLabel" name="label_jitterFilter"> <widget class="QLabel" name="label_jitterFilter">
<property name="font"> <property name="font">
<font> <font>
<weight>50</weight>
<bold>false</bold> <bold>false</bold>
</font> </font>
</property> </property>
@@ -631,7 +619,7 @@
<widget class="AutoComboBox" name="cboHatsMode"/> <widget class="AutoComboBox" name="cboHatsMode"/>
</item> </item>
<item row="2" column="4"> <item row="2" column="4">
<widget class="QPushButton" name="editText"> <widget class="QPushButton" name="editChecklist">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed"> <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch> <horstretch>0</horstretch>
@@ -646,7 +634,7 @@
<item row="0" column="1"> <item row="0" column="1">
<widget class="QCheckBox" name="throttleTrim"> <widget class="QCheckBox" name="throttleTrim">
<property name="layoutDirection"> <property name="layoutDirection">
<enum>Qt::LeftToRight</enum> <enum>Qt::LayoutDirection::LeftToRight</enum>
</property> </property>
<property name="text"> <property name="text">
<string>Throttle Trim Idle Only</string> <string>Throttle Trim Idle Only</string>
@@ -662,7 +650,7 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi
</string> </string>
</property> </property>
<property name="layoutDirection"> <property name="layoutDirection">
<enum>Qt::LeftToRight</enum> <enum>Qt::LayoutDirection::LeftToRight</enum>
</property> </property>
<property name="text"> <property name="text">
<string>Reverse Throttle</string> <string>Reverse Throttle</string>
@@ -679,7 +667,7 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi
<item row="2" column="2"> <item row="2" column="2">
<widget class="QCheckBox" name="extendedTrims"> <widget class="QCheckBox" name="extendedTrims">
<property name="layoutDirection"> <property name="layoutDirection">
<enum>Qt::LeftToRight</enum> <enum>Qt::LayoutDirection::LeftToRight</enum>
</property> </property>
<property name="text"> <property name="text">
<string>Extended Trims</string> <string>Extended Trims</string>
@@ -689,7 +677,7 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi
<item row="2" column="1"> <item row="2" column="1">
<widget class="QCheckBox" name="extendedLimits"> <widget class="QCheckBox" name="extendedLimits">
<property name="layoutDirection"> <property name="layoutDirection">
<enum>Qt::LeftToRight</enum> <enum>Qt::LayoutDirection::LeftToRight</enum>
</property> </property>
<property name="text"> <property name="text">
<string>Extended Limits</string> <string>Extended Limits</string>
@@ -709,7 +697,7 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi
<item row="2" column="6"> <item row="2" column="6">
<spacer name="horizontalSpacer"> <spacer name="horizontalSpacer">
<property name="orientation"> <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Orientation::Horizontal</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
@@ -732,7 +720,7 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi
<item> <item>
<spacer name="verticalSpacer_3"> <spacer name="verticalSpacer_3">
<property name="orientation"> <property name="orientation">
<enum>Qt::Vertical</enum> <enum>Qt::Orientation::Vertical</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
+5 -13
View File
@@ -1107,18 +1107,10 @@ QString ModelPrinter::printTelemetryScreen(unsigned int idx, unsigned int line,
QString ModelPrinter::printChecklist() QString ModelPrinter::printChecklist()
{ {
if (!model.displayChecklist) if (!model.displayChecklist) return QString();
return "";
QString str = tr("Error: Unable to open or read file!"); QString str(model.checklistData);
QFile file(Helpers::getChecklistFilePath(&model)); str.replace("\n", "<br />");
if (file.open(QFile::ReadOnly | QFile::Text)) { str.remove("\r");
QTextStream in(&file);
if (in.status() == QTextStream::Ok) {
str = in.readAll();
str.replace("\n", "<br />");
str.remove("\r");
}
file.close();
}
return str; return str;
} }
+7 -2
View File
@@ -90,12 +90,17 @@ bool EtxFormat::write(const RadioData & radioData)
return result; return result;
} }
bool EtxFormat::loadFile(QByteArray & filedata, const QString & filename) bool EtxFormat::loadFile(QByteArray & filedata, const QString & filename, bool optional)
{ {
size_t size; size_t size;
void * data = mz_zip_reader_extract_file_to_heap(&zip_archive, qPrintable(filename), &size, 0); void * data = mz_zip_reader_extract_file_to_heap(&zip_archive, qPrintable(filename), &size, 0);
if (!data) { 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); qDebug() << QString("Extracted file %1, size=%2").arg(filename).arg(size);
+1 -1
View File
@@ -40,7 +40,7 @@ class EtxFormat : public LabelsStorageFormat
virtual bool write(const RadioData & radioData); virtual bool write(const RadioData & radioData);
protected: 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 writeFile(const QByteArray & fileData, const QString & fileName);
virtual bool getFileList(std::list<std::string>& filelist); virtual bool getFileList(std::list<std::string>& filelist);
virtual bool deleteFile(const QString & fileName) { return false; } virtual bool deleteFile(const QString & fileName) { return false; }
+35
View File
@@ -160,6 +160,9 @@ bool LabelsStorageFormat::load(RadioData & radioData)
return false; return false;
} }
if (!loadChecklist(model))
return false;
model.modelIndex = modelIdx; model.modelIndex = modelIdx;
strncpy(model.filename, mc.filename.c_str(), sizeof(model.filename)-1); strncpy(model.filename, mc.filename.c_str(), sizeof(model.filename)-1);
@@ -235,6 +238,9 @@ bool LabelsStorageFormat::write(const RadioData & radioData)
writeModelToYaml(model, modelData); writeModelToYaml(model, modelData);
if (!writeFile(modelData, modelFilename)) if (!writeFile(modelData, modelFilename))
return false; return false;
if (!writeChecklist(model))
return false;
} }
if (hasLabels) { if (hasLabels) {
@@ -245,3 +251,32 @@ bool LabelsStorageFormat::write(const RadioData & radioData)
return true; 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;
}
+4 -1
View File
@@ -45,10 +45,13 @@ class LabelsStorageFormat : public StorageFormat
virtual bool write(const RadioData & radioData); virtual bool write(const RadioData & radioData);
protected: 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 writeFile(const QByteArray & fileData, const QString & fileName) = 0;
virtual bool getFileList(std::list<std::string>& filelist) = 0; virtual bool getFileList(std::list<std::string>& filelist) = 0;
virtual bool deleteFile(const QString & fileName) = 0; virtual bool deleteFile(const QString & fileName) = 0;
StorageType probeFormat(); StorageType probeFormat();
bool loadChecklist(ModelData &model);
bool writeChecklist(const ModelData & model);
}; };
+10 -1
View File
@@ -31,10 +31,19 @@ bool SdcardFormat::write(const RadioData & radioData)
return LabelsStorageFormat::write(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; QString path = this->filename + "/" + filename;
QFile file(path); QFile file(path);
if (!file.exists()) {
if (optional) {
//qDebug() << "File not found:" << filename;
return true;
} else {
return false;
}
}
if (!file.open(QFile::ReadOnly)) { if (!file.open(QFile::ReadOnly)) {
setError(tr("Error opening file %1:\n%2.").arg(path).arg(file.errorString())); setError(tr("Error opening file %1:\n%2.").arg(path).arg(file.errorString()));
return false; return false;
+1 -1
View File
@@ -39,7 +39,7 @@ class SdcardFormat : public LabelsStorageFormat
virtual bool write(const RadioData & radioData); virtual bool write(const RadioData & radioData);
protected: 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 writeFile(const QByteArray & fileData, const QString & fileName);
virtual bool getFileList(std::list<std::string>& filelist); virtual bool getFileList(std::list<std::string>& filelist);
virtual bool deleteFile(const QString & fileName); virtual bool deleteFile(const QString & fileName);