QBinaryTranslate/TranslateUI/StructuralRuleView.cpp

73 lines
2.1 KiB
C++

#include "StructuralRuleView.h"
#include <QGridLayout>
#include <QLabel>
#include <QComboBox>
#include <QPushButton>
#include <QSplitter>
#include <QGroupBox>
#include <QTabWidget>
#include "TranslateBasic.h"
StructuralRuleView::StructuralRuleView(QWidget* p /*= nullptr*/)
:QWidget(p),
_sequence_view(new SequenceRulesView(this)),
_configs_stack(new QStackedWidget(this))
{
auto layout = new QVBoxLayout(this);
auto split = new QSplitter(Qt::Horizontal, this);
layout->addWidget(split);
split->addWidget(_sequence_view);
split->addWidget(_configs_stack);
_configs_stack->addWidget(new EmptyConfiguration(this));
auto int_config = new IntegerConfiguration(this);
_configs_stack->addWidget(int_config);
connect(int_config, &IntegerConfiguration::ruleHasBeenChanged,
_sequence_view, &SequenceRulesView::currentRuleRefresh);
connect(_sequence_view, &SequenceRulesView::currentRuleChanged,
[=](std::shared_ptr<ExtractUnit> u, const QModelIndex& i) {
if (u->name() == extract::BytesAsInteger().name()) {
_configs_stack->setCurrentIndex(1);
int_config->setCurrent(i, u);
}
else {
_configs_stack->setCurrentIndex(0);
}
});
}
EmptyConfiguration::EmptyConfiguration(QWidget* p/*=nullptr*/)
{
auto layout = new QVBoxLayout(this);
auto label = new QLabel(u8"当前规则无需配置", this);
label->setAlignment(Qt::AlignCenter);
layout->addWidget(label);
}
IntegerConfiguration::IntegerConfiguration(QWidget* p)
:_unsigned_mark(new QCheckBox(this))
{
auto layout = new QGridLayout(this);
layout->addWidget(new QLabel(u8"无符号?:"), 0, 0);
layout->addWidget(_unsigned_mark, 0, 1, 1, 2);
layout->setRowStretch(2, 1);
connect(_unsigned_mark, &QCheckBox::stateChanged, [=](){
auto checkmark = _unsigned_mark->isChecked();
_current_extractor->setUnsignedMark(checkmark);
emit this->ruleHasBeenChanged(_target_modelindex);
});
}
void IntegerConfiguration::setCurrent(const QModelIndex& idx, std::shared_ptr<ExtractUnit> u)
{
this->_target_modelindex = idx;
_current_extractor = std::dynamic_pointer_cast<extract::BytesAsInteger>(u);
this->_unsigned_mark->setChecked(_current_extractor->unsignedMark());
}