Hexes/ruledialog.cpp
2024-10-28 19:15:40 -04:00

299 lines
9.1 KiB
C++

#include "ruledialog.h"
#include "ui_ruledialog.h"
RuleDialog::RuleDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::RuleDialog) {
ui->setupUi(this);
pRuleNames = QStringList();
pVars = QMap<QString, BlockValue>();
pDefaultRuleCount = 1;
pRules = QVector<Rule>();
pHideLayout(ui->layout_Skip);
ui->groupBox_2->hide();
ui->groupBox_PreSkip->hide();
ui->groupBox_PostSkip->hide();
connect(ui->verticalScrollBar, &QScrollBar::valueChanged, ui->widget_RulePreview, &RulePreview::SetScrollValue);
connect(ui->widget_RulePreview, &RulePreview::ScrollMaxChanged, ui->verticalScrollBar, &QScrollBar::setMaximum);
connect(ui->pushButton_QueueRule, &QPushButton::clicked, this, &RuleDialog::pQueueRule);
connect(ui->pushButton_Cancel, &QPushButton::clicked, this, &RuleDialog::pCancelDialog);
connect(ui->pushButton_Clear, &QPushButton::clicked, this, &RuleDialog::pClearRules);
connect(ui->pushButton_PopFirstRule, &QPushButton::clicked, this, &RuleDialog::pPopFirstRule);
connect(ui->pushButton_PopLastRule, &QPushButton::clicked, this, &RuleDialog::pPopLastRule);
connect(ui->pushButton_Save, &QPushButton::clicked, this, &RuleDialog::pSaveRules);
connect(ui->comboBox_Type, &QComboBox::currentIndexChanged, this, &RuleDialog::pTypeChanged);
connect(this, &RuleDialog::RulesChanged, ui->widget_RulePreview, &RulePreview::SetRules);
connect(ui->groupBox_RepeatRule, &QGroupBox::toggled, this, &RuleDialog::pRepeatToggled);
ui->comboBox_Vars->hide();
connect(ui->radioButton_PrevVar, &QRadioButton::toggled, this, &RuleDialog::pPrevVarToggled);
connect(ui->radioButton_StaticVal, &QRadioButton::toggled, this, &RuleDialog::pStaticValToggled);
ui->comboBox_Pre_Vars->hide();
connect(ui->radioButton_Pre_StaticVal, &QRadioButton::toggled, this, &RuleDialog::pPre_StaticValToggled);
connect(ui->radioButton_Pre_PrevVar, &QRadioButton::toggled, this, &RuleDialog::pPre_PrevVarToggled);
ui->comboBox_Post_Vars->hide();
connect(ui->radioButton_Post_StaticVal, &QRadioButton::toggled, this, &RuleDialog::pPost_StaticValToggled);
connect(ui->radioButton_Post_PrevVar, &QRadioButton::toggled, this, &RuleDialog::pPost_PrevVarToggled);
}
RuleDialog::~RuleDialog() {
delete ui;
}
void RuleDialog::pQueueRule() {
int index = ui->comboBox_Type->currentIndex();
RULE_TYPE type = (RULE_TYPE)index;
if (type == TYPE_NONE) { return; }
int repeatCount = 0;
int preSkip = 0;
int postSkip = 0;
if (ui->groupBox_RepeatRule->isChecked()) {
if (ui->radioButton_PrevVar->isChecked()) {
QString itemText = ui->comboBox_Vars->currentText();
const QString leadingNumber = itemText.split('.').first() + ".";
const QString varText = itemText.replace(leadingNumber, "")
.split('(').first().trimmed();
BlockValue blockVal = pVars[varText];
repeatCount = blockVal.ValueToInt();
} else if (ui->radioButton_StaticVal->isChecked()) {
repeatCount = ui->spinBox_2->value();
}
}
QString name = ui->lineEdit_Name->text();
if (name == "") { return; }
if (ui->groupBox_PreSkip->isChecked()) {
if (ui->radioButton_Pre_StaticVal->isChecked()) {
preSkip = ui->spinBox_Pre_StaticVal->value();
} else {
QString itemText = ui->comboBox_Pre_Vars->currentText();
const QString leadingNumber = itemText.split('.').first() + ".";
const QString varText = itemText.replace(leadingNumber, "")
.split('(').first().trimmed();
BlockValue blockVal = pVars[varText];
preSkip = blockVal.ValueToInt();
}
}
if (ui->groupBox_PostSkip->isChecked()) {
if (ui->radioButton_Post_StaticVal->isChecked()) {
postSkip = ui->spinBox_Post_StaticVal->value();
} else {
QString itemText = ui->comboBox_Post_Vars->currentText();
const QString leadingNumber = itemText.split('.').first() + ".";
const QString varText = itemText.replace(leadingNumber, "")
.split('(').first().trimmed();
BlockValue blockVal = pVars[varText];
postSkip = blockVal.ValueToInt();
}
}
QString ruleName = name;
BYTE_ORDER byteOrder = BYTE_ORDER_NONE;
if (ui->radioButton_BE->isChecked()) {
byteOrder = BYTE_ORDER_BE;
} else {
byteOrder = BYTE_ORDER_LE;
}
Rule rule;
rule.SetName(ruleName);
rule.SetType(type);
rule.SetByteOrder(byteOrder);
rule.SetRepeatCount(repeatCount);
rule.SetPreSkipCount(preSkip);
rule.SetPostSkipCount(postSkip);
if (index == 1) { // skip
rule.SetLength(ui->spinBox->value());
}
pRules.push_back(rule);
ui->widget_RulePreview->SetRules(pRules);
}
void RuleDialog::pSaveRules() {
emit RulesChanged(pRules);
close();
}
void RuleDialog::pClearRules() {
pRules.clear();
ui->widget_RulePreview->SetRules(pRules);
}
void RuleDialog::pPopFirstRule() {
pRules.pop_front();
ui->widget_RulePreview->SetRules(pRules);
}
void RuleDialog::pPopLastRule() {
pRules.pop_back();
ui->widget_RulePreview->SetRules(pRules);
}
void RuleDialog::pCancelDialog() {
pDefaultRuleCount--;
close();
}
void RuleDialog::pHideLayout(QLayout* layout) {
if (!layout)
return;
for (int i = 0; i < layout->count(); ++i) {
QWidget *widget = layout->itemAt(i)->widget();
if (widget) {
widget->hide(); // Hide each widget in the layout
}
}
}
void RuleDialog::pShowLayout(QLayout* layout) {
if (!layout)
return;
for (int i = 0; i < layout->count(); ++i) {
QWidget *widget = layout->itemAt(i)->widget();
if (widget) {
widget->show(); // Hide each widget in the layout
}
}
}
void RuleDialog::pTypeChanged(int index) {
pHideLayout(ui->layout_Skip);
pShowLayout(ui->layout_ByteOrder);
switch (index) {
case 0: // none
break;
case 1: // skip
pShowLayout(ui->layout_Skip);
pHideLayout(ui->layout_ByteOrder);
break;
case 2: // int8 [1]
break;
case 3: // uint8 [1]
break;
case 4: // int16 [2]
break;
case 5: // uint16 [2]
break;
case 6: // int32 [3]
break;
case 7: // uint32 [3]
break;
case 8: // int64 [4]
break;
case 9: // uint64 [4]
break;
}
}
void RuleDialog::pRepeatToggled(bool toggled) {
ui->groupBox_PreSkip->setVisible(toggled);
ui->groupBox_PostSkip->setVisible(toggled);
}
void RuleDialog::pPrevVarToggled(bool toggled) {
ui->comboBox_Vars->setVisible(toggled);
ui->spinBox_2->setVisible(!toggled);
}
void RuleDialog::pStaticValToggled(bool toggled) {
ui->comboBox_Vars->setVisible(!toggled);
ui->spinBox_2->setVisible(toggled);
}
void RuleDialog::pPre_PrevVarToggled(bool toggled) {
ui->comboBox_Pre_Vars->setVisible(toggled);
ui->spinBox_Pre_StaticVal->setVisible(!toggled);
}
void RuleDialog::pPre_StaticValToggled(bool toggled) {
ui->comboBox_Pre_Vars->setVisible(!toggled);
ui->spinBox_Pre_StaticVal->setVisible(toggled);
}
void RuleDialog::pPost_PrevVarToggled(bool toggled) {
ui->comboBox_Post_Vars->setVisible(toggled);
ui->spinBox_Post_StaticVal->setVisible(!toggled);
}
void RuleDialog::pPost_StaticValToggled(bool toggled) {
ui->comboBox_Post_Vars->setVisible(!toggled);
ui->spinBox_Post_StaticVal->setVisible(toggled);
}
void RuleDialog::closeEvent(QCloseEvent *event) {
pDefaultRuleCount++;
const QString defaultName = QString("RULE %1").arg(pDefaultRuleCount);
ui->lineEdit_Name->setText(defaultName);
ui->comboBox_Type->setCurrentIndex(0);
ui->radioButton_LE->setChecked(true);
ui->spinBox->setValue(1);
ui->radioButton_StaticVal->setChecked(true);
ui->spinBox_2->setValue(1);
ui->comboBox_Vars->setCurrentIndex(0);
pRules.clear();
ui->widget_RulePreview->SetRules(pRules);
QDialog::closeEvent(event);
}
Rule RuleDialog::GetRule() {
return pRule;
}
void RuleDialog::SetRule(const Rule rule) {
ui->lineEdit_Name->setText(rule.Name());
if (rule.Type() == TYPE_SKIP) {
ui->spinBox->setValue(rule.Length());
}
}
void RuleDialog::SetRuleNames(QStringList ruleNames) {
pRuleNames = ruleNames;
}
void RuleDialog::SetVars(QMap<QString, BlockValue> vars) {
ui->comboBox_Vars->clear();
ui->comboBox_Vars->addItem("Select Variable");
ui->comboBox_Pre_Vars->clear();
ui->comboBox_Pre_Vars->addItem("Select Variable");
ui->comboBox_Post_Vars->clear();
ui->comboBox_Post_Vars->addItem("Select Variable");
int i = 0;
for (auto [key, value] : vars.asKeyValueRange()) {
i++;
QString varName = (QString)key;
BlockValue varVal = (BlockValue)value;
QString itemName = QString("%1. %2 (%3)")
.arg(QString::number(i), varName, varVal.Value().toString());
ui->comboBox_Vars->addItem(itemName);
ui->comboBox_Pre_Vars->addItem(itemName);
ui->comboBox_Post_Vars->addItem(itemName);
}
pVars = vars;
}