#include "StructuralRuleView.h" #include #include #include #include #include #include #include #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 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 u) { this->_target_modelindex = idx; _current_extractor = std::dynamic_pointer_cast(u); this->_unsigned_mark->setChecked(_current_extractor->unsignedMark()); }