This commit is contained in:
codeboss 2025-08-03 17:26:53 +08:00
parent b812c16045
commit 094ac3347e
5 changed files with 58 additions and 34 deletions

View File

@ -37,21 +37,21 @@ void IntDelegate::updateEditorGeometry(QWidget* editor, const QStyleOptionViewIt
void SequenceRulesView::currentRuleRefresh(const QModelIndex& idx) void SequenceRulesView::currentRuleRefresh(const QModelIndex& idx)
{ {
auto rule_insv = _rule_sequence.at(idx.row()); auto rule_insv = _rule_v._rule_sequence.at(idx.row());
auto offset_index = idx.sibling(idx.row(), 1); auto offset_index = idx.sibling(idx.row(), 1);
auto offset_number = offset_index.data(Qt::DisplayRole).toInt(); auto offset_number = offset_index.data(Qt::DisplayRole).toInt();
rule_insv->setOffsetSpan(offset_number); rule_insv->setOffsetSpan(offset_number);
auto count_index = idx.sibling(idx.row(), 3); auto count_index = idx.sibling(idx.row(), 3);
_sequence_model->setData(offset_index, rule_insv->offsetSpan(), Qt::EditRole); _rule_v._sequence_model->setData(offset_index, rule_insv->offsetSpan(), Qt::EditRole);
_sequence_model->setData(count_index, rule_insv->countWithin(), Qt::EditRole); _rule_v._sequence_model->setData(count_index, rule_insv->countWithin(), Qt::EditRole);
auto param_index = idx.sibling(idx.row(), 4); auto param_index = idx.sibling(idx.row(), 4);
QJsonObject obj; QJsonObject obj;
rule_insv->saveTo(obj); rule_insv->saveTo(obj);
auto bytes = QJsonDocument(obj).toJson(QJsonDocument::Compact); auto bytes = QJsonDocument(obj).toJson(QJsonDocument::Compact);
_sequence_model->setData(param_index, QString::fromUtf8(bytes)); _rule_v._sequence_model->setData(param_index, QString::fromUtf8(bytes));
this->resizeColumnsToContents(); this->resizeColumnsToContents();
} }
@ -59,18 +59,18 @@ void SequenceRulesView::currentRuleRefresh(const QModelIndex& idx)
void SequenceRulesView::peersRuleChanged(const QModelIndex& idx) void SequenceRulesView::peersRuleChanged(const QModelIndex& idx)
{ {
auto rule_idx = idx.sibling(idx.row(), 2); auto rule_idx = idx.sibling(idx.row(), 2);
auto rule_nm = base->extractUnitList()[rule_idx.data(Qt::DisplayRole).toString()]; auto rule_nm = _rule_v.base->extractUnitList()[rule_idx.data(Qt::DisplayRole).toString()];
auto new_inst = std::dynamic_pointer_cast<ExtractUnit>(rule_nm->newDefault()); auto new_inst = std::dynamic_pointer_cast<ExtractUnit>(rule_nm->newDefault());
_rule_sequence.replace(idx.row(), new_inst); _rule_v._rule_sequence.replace(idx.row(), new_inst);
if (typeid(*new_inst.get()) == typeid(BytesAsList)) { if (typeid(*new_inst.get()) == typeid(BytesAsList)) {
auto conv = std::dynamic_pointer_cast<BytesAsList>(new_inst); auto conv = std::dynamic_pointer_cast<BytesAsList>(new_inst);
if (!conv->elementRule()) { if (!conv->elementRule()) {
conv->appendElementRule(this->base->defaultExtractUnit()); conv->appendElementRule(this->_rule_v.base->defaultExtractUnit());
} }
if (!conv->sizeProvider()) { if (!conv->sizeProvider()) {
conv->setSizeProvider(this->base->defaultSizeProvider()); conv->setSizeProvider(this->_rule_v.base->defaultSizeProvider());
} }
} }
@ -79,18 +79,19 @@ void SequenceRulesView::peersRuleChanged(const QModelIndex& idx)
#include <QItemSelectionModel> #include <QItemSelectionModel>
SequenceRulesView::SequenceRulesView(QWidget* p /*= nullptr*/) SequenceRulesView::SequenceRulesView(QWidget* p /*= nullptr*/)
:QTableView(p), :QTableView(p)
_sequence_model(new QStandardItemModel),
base(std::make_shared<TranslateBasic>())
{ {
this->setModel(_sequence_model); _rule_v._sequence_model = new QStandardItemModel();
_sequence_model->setHorizontalHeaderLabels(QStringList() _rule_v.base = std::make_shared<TranslateBasic>();
this->setModel(_rule_v._sequence_model);
_rule_v._sequence_model->setHorizontalHeaderLabels(QStringList()
<< tr(u8"Field Name") << tr(u8"Bytes Offset") << tr(u8"Translate Rule") << tr(u8"Field Name") << tr(u8"Bytes Offset") << tr(u8"Translate Rule")
<< tr(u8"Bytes Count") << tr(u8"Arguments")); << tr(u8"Bytes Count") << tr(u8"Arguments"));
auto int_delegate = new IntDelegate(0, INT_MAX); auto int_delegate = new IntDelegate(0, INT_MAX);
this->setItemDelegateForColumn(1, int_delegate); this->setItemDelegateForColumn(1, int_delegate);
auto rule_delegate = new RuleSelectDelegate(base); auto rule_delegate = new RuleSelectDelegate(_rule_v.base);
this->setItemDelegateForColumn(2, rule_delegate); this->setItemDelegateForColumn(2, rule_delegate);
this->setContextMenuPolicy(Qt::CustomContextMenu); this->setContextMenuPolicy(Qt::CustomContextMenu);
@ -102,7 +103,7 @@ SequenceRulesView::SequenceRulesView(QWidget* p /*= nullptr*/)
if (!curr.isValid()) if (!curr.isValid())
return; return;
emit this->currentRuleChanged(_rule_sequence[curr.row()], curr); emit this->currentRuleChanged(_rule_v._rule_sequence[curr.row()], curr);
}); });
} }
@ -117,17 +118,17 @@ void SequenceRulesView::customTranslateRuleEdit(const QPoint& pos)
void SequenceRulesView::addTranslateUnit() void SequenceRulesView::addTranslateUnit()
{ {
auto row_cnt = this->_sequence_model->rowCount(); auto row_cnt = this->_rule_v._sequence_model->rowCount();
QList<QStandardItem*> new_row; QList<QStandardItem*> new_row;
new_row << new QStandardItem(QString(u8"rule_%1").arg(row_cnt)); new_row << new QStandardItem(QString(u8"rule_%1").arg(row_cnt));
new_row << new QStandardItem(u8"0"); new_row << new QStandardItem(u8"0");
new_row << new QStandardItem(base->defaultExtractUnit()->name()); new_row << new QStandardItem(_rule_v.base->defaultExtractUnit()->name());
new_row << new QStandardItem(u8"1"); new_row << new QStandardItem(u8"1");
new_row.last()->setEditable(false); new_row.last()->setEditable(false);
auto curr_rule = base->defaultExtractUnit()->newDefault(); auto curr_rule = _rule_v.base->defaultExtractUnit()->newDefault();
this->_rule_sequence << std::static_pointer_cast<AbstractExtractor>(curr_rule); this->_rule_v._rule_sequence << std::static_pointer_cast<AbstractExtractor>(curr_rule);
auto hex_rule = std::static_pointer_cast<BytesAsHex>(curr_rule); auto hex_rule = std::static_pointer_cast<BytesAsHex>(curr_rule);
hex_rule->setCountWithin(1); hex_rule->setCountWithin(1);
@ -139,7 +140,7 @@ void SequenceRulesView::addTranslateUnit()
new_row << new QStandardItem(json_doc); new_row << new QStandardItem(json_doc);
new_row.last()->setEditable(false); new_row.last()->setEditable(false);
this->_sequence_model->appendRow(new_row); this->_rule_v._sequence_model->appendRow(new_row);
this->resizeColumnsToContents(); this->resizeColumnsToContents();
} }
@ -149,8 +150,8 @@ void SequenceRulesView::removeTranslateUnit()
if (!idx_curr.isValid()) if (!idx_curr.isValid())
return; return;
_rule_sequence.removeAt(idx_curr.row()); _rule_v._rule_sequence.removeAt(idx_curr.row());
_sequence_model->removeRow(idx_curr.row()); _rule_v._sequence_model->removeRow(idx_curr.row());
} }

View File

@ -41,7 +41,7 @@ private:
std::shared_ptr<TranslateBasic> _kernel; std::shared_ptr<TranslateBasic> _kernel;
signals: signals:
void dataChanged(const QModelIndex &idx) const; void dataChanged(const QModelIndex& idx) const;
public: public:
RuleSelectDelegate(std::shared_ptr<TranslateBasic> ins); RuleSelectDelegate(std::shared_ptr<TranslateBasic> ins);
@ -57,17 +57,19 @@ public:
/// </summary> /// </summary>
class SequenceRulesView : public QTableView { class SequenceRulesView : public QTableView {
Q_OBJECT Q_OBJECT
private: public:
QStandardItemModel* const _sequence_model; struct __Private {
std::shared_ptr<TranslateBasic> base = nullptr; QStandardItemModel* _sequence_model;
QList<std::shared_ptr<ExtractUnit>> _rule_sequence; std::shared_ptr<TranslateBasic> base = nullptr;
QList<std::shared_ptr<ExtractUnit>> _rule_sequence;
} _rule_v;
signals: signals:
void currentRuleChanged(std::shared_ptr<ExtractUnit> u, const QModelIndex &i) const; void currentRuleChanged(std::shared_ptr<ExtractUnit> u, const QModelIndex& i) const;
public: public:
void currentRuleRefresh(const QModelIndex &idx); void currentRuleRefresh(const QModelIndex& idx);
void peersRuleChanged(const QModelIndex &idx_rule); void peersRuleChanged(const QModelIndex& idx_rule);
public: public:
SequenceRulesView(QWidget* p = nullptr); SequenceRulesView(QWidget* p = nullptr);

View File

@ -27,6 +27,8 @@ StructuralRuleView::StructuralRuleView(QWidget* p /*= nullptr*/)
_configs_stack->addWidget(encode_config); _configs_stack->addWidget(encode_config);
auto combine_config = new BitCombineConfiguration(this); auto combine_config = new BitCombineConfiguration(this);
_configs_stack->addWidget(combine_config); _configs_stack->addWidget(combine_config);
auto list_config = new ListUnitConfiguration(this->_sequence_view->_rule_v.base, this);
_configs_stack->addWidget(list_config);
connect(count_span, &CountWithinConfiguration::currentRuleChanged, connect(count_span, &CountWithinConfiguration::currentRuleChanged,
_sequence_view, &SequenceRulesView::currentRuleRefresh); _sequence_view, &SequenceRulesView::currentRuleRefresh);
@ -54,6 +56,9 @@ StructuralRuleView::StructuralRuleView(QWidget* p /*= nullptr*/)
_configs_stack->setCurrentIndex(1); _configs_stack->setCurrentIndex(1);
count_span->currentRuleAccept(u, i); count_span->currentRuleAccept(u, i);
break; break;
case DataType::LIST_COLLECTION:
_configs_stack->setCurrentIndex(4);
break;
default: default:
_configs_stack->setCurrentIndex(0); _configs_stack->setCurrentIndex(0);
break; break;
@ -262,19 +267,29 @@ ListUnitConfiguration::ListUnitConfiguration(
auto layout = new QGridLayout(this); auto layout = new QGridLayout(this);
layout->addWidget(new QLabel(tr("RuleAppoint:")), 0, 0); layout->addWidget(new QLabel(tr("RuleAppoint:")), 0, 0);
layout->addWidget(_rule_select, 0, 1, 1, 2); layout->addWidget(_rule_select, 0, 1, 1, 2);
layout->addWidget(new QLabel(tr("SizeAppoint£º")), 1, 0); layout->addWidget(new QLabel(tr("SizeAppoint:")), 1, 0);
layout->addWidget(_size_layout_select, 1, 1, 1, 2); layout->addWidget(_size_layout_select, 1, 1, 1, 2);
layout->addWidget(_configs_stack, 2, 0, 2, 3); layout->addWidget(_configs_stack, 2, 0, 2, 3);
_configs_stack->addWidget(_const_number_input); _configs_stack->addWidget(_const_number_input);
_configs_stack->addWidget(_prev_field_refer); _configs_stack->addWidget(_prev_field_refer);
layout->setRowStretch(4, 1);
layout->setColumnStretch(1, 1);
for (auto key : this->_bind_core->customRules().keys()) for (auto key : this->_bind_core->customRules().keys())
_rule_select->addItem(key, CUSTOM_RULE); _rule_select->addItem(key, CUSTOM_RULE);
for (auto key : this->_bind_core->extractUnitList().keys()) for (auto key : this->_bind_core->extractUnitList().keys())
_rule_select->addItem(key, BASIC_RULE); _rule_select->addItem(key, BASIC_RULE);
for (auto key : this->_bind_core->sizeProviderList().keys())
_size_layout_select->addItem(key); auto keys = this->_bind_core->sizeProviderList().keys();
std::sort(keys.begin(), keys.end());
_size_layout_select->addItems(keys);
connect(_size_layout_select, QOverload<int>::of(&QComboBox::currentIndexChanged),
[=](int idx) {
this->_configs_stack->setCurrentIndex(this->_size_layout_select->currentIndex());
});
} }
void ListUnitConfiguration::currentRuleAccept( void ListUnitConfiguration::currentRuleAccept(

View File

@ -82,6 +82,9 @@ signals:
void currentRuleChanged(const QModelIndex& idx); void currentRuleChanged(const QModelIndex& idx);
}; };
/// <summary>
/// <20><>±ם<C2B1><D79D><EFBFBD><C2B6>ה<EFBFBD><D794><EFBFBD>ז°ו
/// </summary>
class ListUnitConfiguration : public QWidget { class ListUnitConfiguration : public QWidget {
Q_OBJECT Q_OBJECT
private: private:

View File

@ -38,9 +38,12 @@ TranslateBasic::TranslateBasic()
_extractor_types[u_ptr->name()] = u_ptr; _extractor_types[u_ptr->name()] = u_ptr;
// size-provider type-list // size-provider type-list
auto sz_ptr = std::make_shared<ConstNumberProvider>(); std::shared_ptr<SizeProvider> sz_ptr = std::make_shared<ConstNumberProvider>();
this->_default_size_provider = sz_ptr; this->_default_size_provider = sz_ptr;
_size_provider_types[sz_ptr->name()] = sz_ptr; _size_provider_types[sz_ptr->name()] = sz_ptr;
sz_ptr = std::make_shared<InterpretedNumberPrivider>();
_size_provider_types[sz_ptr->name()] = sz_ptr;
} }
std::shared_ptr<ExtractUnit> TranslateBasic::defaultExtractUnit() const std::shared_ptr<ExtractUnit> TranslateBasic::defaultExtractUnit() const