QBinaryTranslate/TranslateUI/StructuralRuleView.cpp

144 lines
4.3 KiB
C++
Raw Normal View History

2025-07-19 02:58:46 +00:00
#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));
2025-08-01 07:03:35 +00:00
auto count_span = new CountWithinConfiguration(this);
_configs_stack->addWidget(count_span);
2025-08-01 08:09:48 +00:00
auto encode_config = new EncodingConfiguration(this);
_configs_stack->addWidget(encode_config);
2025-07-19 02:58:46 +00:00
2025-08-01 07:03:35 +00:00
connect(count_span, &CountWithinConfiguration::currentRuleChanged,
_sequence_view, &SequenceRulesView::currentRuleRefresh);
2025-08-01 08:09:48 +00:00
connect(encode_config, &EncodingConfiguration::currentRuleChanged,
_sequence_view, &SequenceRulesView::currentRuleRefresh);
2025-07-19 02:58:46 +00:00
connect(_sequence_view, &SequenceRulesView::currentRuleChanged,
[=](std::shared_ptr<ExtractUnit> u, const QModelIndex& i) {
2025-08-01 07:03:35 +00:00
switch (u->outType()) {
case DataType::TextString:
2025-08-01 08:09:48 +00:00
if (typeid(*u.get()) == typeid(extract::BytesAsString)) {
_configs_stack->setCurrentIndex(2);
encode_config->currentRuleAccept(u, i);
break;
}
2025-08-01 07:03:35 +00:00
case DataType::Integer:
case DataType::Unsigned:
2025-07-19 02:58:46 +00:00
_configs_stack->setCurrentIndex(1);
2025-08-01 07:03:35 +00:00
count_span->currentRuleAccept(u, i);
break;
default:
2025-07-19 02:58:46 +00:00
_configs_stack->setCurrentIndex(0);
2025-08-01 07:03:35 +00:00
break;
2025-07-19 02:58:46 +00:00
}
});
}
EmptyConfiguration::EmptyConfiguration(QWidget* p/*=nullptr*/)
{
auto layout = new QVBoxLayout(this);
auto label = new QLabel(u8"<EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", this);
label->setAlignment(Qt::AlignCenter);
layout->addWidget(label);
2025-08-01 07:03:35 +00:00
}
#include "extract_basic.h"
CountWithinConfiguration::CountWithinConfiguration(QWidget* p /*= nullptr*/)
: QWidget(p), _bind_u(nullptr), _count_input(new QSpinBox(this))
{
auto layout = new QGridLayout(this);
layout->addWidget(new QLabel(tr("BytesCount:")));
layout->addWidget(_count_input, 0, 1);
_count_input->setRange(1, 100);
layout->setRowStretch(1, 1);
layout->setColumnStretch(1, 1);
connect(_count_input, QOverload<int>::of(&QSpinBox::valueChanged), [=](int value) {
if (this->_bind_u) {
auto ptr = std::dynamic_pointer_cast<extract::AbstractExtractor>(this->_bind_u);
if (ptr) {
ptr->setCountWithin(value);
emit this->currentRuleChanged(_bind_index);
}
}
});
}
2025-08-01 08:09:48 +00:00
void CountWithinConfiguration::currentRuleAccept(std::shared_ptr<ExtractUnit> u, const QModelIndex& i)
{
this->_bind_u = u;
this->_bind_index = i;
_count_input->setValue(u->countWithin());
}
#include <QTextCodec>
EncodingConfiguration::EncodingConfiguration(QWidget* p /*= nullptr*/)
: QWidget(p), _bind_u(nullptr), _count_input(new QSpinBox(this)),
_encoding_set(new QComboBox(this))
{
auto layout = new QGridLayout(this);
layout->addWidget(new QLabel(tr("BytesCount:")));
layout->addWidget(_count_input, 0, 1);
layout->addWidget(new QLabel(tr("Encoding:")), 1, 0);
layout->addWidget(_encoding_set, 1, 1);
layout->setRowStretch(2, 1);
layout->setColumnStretch(1, 1);
connect(_count_input, QOverload<int>::of(&QSpinBox::valueChanged), [=](int value) {
if (this->_bind_u) {
auto ptr = std::dynamic_pointer_cast<extract::AbstractExtractor>(this->_bind_u);
if (ptr) {
ptr->setCountWithin(value);
emit this->currentRuleChanged(_bind_index);
}
}
});
auto codec_list = QTextCodec::availableCodecs();
for(auto codec : codec_list)
_encoding_set->addItem(QString::fromLatin1(codec));
connect(_encoding_set, QOverload<const QString&>::of(&QComboBox::currentIndexChanged),
[=](const QString &value) {
if (this->_bind_u) {
auto ptr = std::dynamic_pointer_cast<extract::BytesAsString>(this->_bind_u);
if (ptr) {
auto insx = QTextCodec::codecForName(value.toUtf8());
ptr->setStrCodec(insx);
emit this->currentRuleChanged(_bind_index);
}
}
});
}
void EncodingConfiguration::currentRuleAccept(std::shared_ptr<ExtractUnit> u, const QModelIndex& i)
2025-08-01 07:03:35 +00:00
{
2025-08-01 08:09:48 +00:00
this->_bind_u = u;
this->_bind_index = i;
2025-08-01 07:03:35 +00:00
_count_input->setValue(u->countWithin());
2025-08-01 08:09:48 +00:00
auto codec_name = std::dynamic_pointer_cast<extract::BytesAsString>(u)->codecName();
QSignalBlocker x(this->_encoding_set);
this->_encoding_set->setCurrentText(codec_name);
2025-08-01 07:03:35 +00:00
}