From 4503ee0d88c5086ca34e282dab9925e3a9b8e79d Mon Sep 17 00:00:00 2001 From: codeboss <2422523675@qq.com> Date: Sat, 2 Aug 2025 07:06:42 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9E=84=E5=BB=BAList=E8=A7=A3=E6=9E=90?= =?UTF-8?q?=E6=A1=86=E6=9E=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TranslateUI/SequenceView.cpp | 67 +++++++++++++++++--- TranslateUI/SequenceView.h | 20 +++++- TranslateUI/extract_basic.cpp | 116 ++++++++++++++++++++++++++++++---- TranslateUI/extract_basic.h | 49 +++++++++----- 4 files changed, 212 insertions(+), 40 deletions(-) diff --git a/TranslateUI/SequenceView.cpp b/TranslateUI/SequenceView.cpp index 0670cb1..557e447 100644 --- a/TranslateUI/SequenceView.cpp +++ b/TranslateUI/SequenceView.cpp @@ -37,18 +37,15 @@ void IntDelegate::updateEditorGeometry(QWidget* editor, const QStyleOptionViewIt void SequenceRulesView::currentRuleRefresh(const QModelIndex& idx) { - auto new_inst = _rule_sequence.at(idx.row()); - auto rule_insv = std::dynamic_pointer_cast(new_inst); + auto rule_insv = _rule_sequence.at(idx.row()); auto offset_index = idx.sibling(idx.row(), 1); - if (rule_insv) { - auto offset_number = offset_index.data(Qt::DisplayRole).toInt(); - rule_insv->setOffsetSpan(offset_number); - } + auto offset_number = offset_index.data(Qt::DisplayRole).toInt(); + rule_insv->setOffsetSpan(offset_number); auto count_index = idx.sibling(idx.row(), 3); - _sequence_model->setData(offset_index, new_inst->offsetSpan(), Qt::EditRole); - _sequence_model->setData(count_index, new_inst->countWithin(), Qt::EditRole); + _sequence_model->setData(offset_index, rule_insv->offsetSpan(), Qt::EditRole); + _sequence_model->setData(count_index, rule_insv->countWithin(), Qt::EditRole); auto param_index = idx.sibling(idx.row(), 4); QJsonObject obj; @@ -66,6 +63,17 @@ void SequenceRulesView::peersRuleChanged(const QModelIndex& idx) auto new_inst = std::dynamic_pointer_cast(rule_nm->newDefault()); _rule_sequence.replace(idx.row(), new_inst); + if (typeid(*new_inst.get()) == typeid(BytesAsList)) { + auto conv = std::dynamic_pointer_cast(new_inst); + if (!conv->elementRule()) { + conv->setElementRule(this->base->defaultRule()); + } + + if (!conv->sizeProvider()) { + conv->setSizeProvider(this->base->defaultSizeProvider()); + } + } + currentRuleRefresh(idx); } @@ -77,7 +85,7 @@ SequenceRulesView::SequenceRulesView(QWidget* p /*= nullptr*/) { this->setModel(_sequence_model); _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")); auto int_delegate = new IntDelegate(0, INT_MAX); @@ -95,7 +103,7 @@ SequenceRulesView::SequenceRulesView(QWidget* p /*= nullptr*/) return; emit this->currentRuleChanged(_rule_sequence[curr.row()], curr); - }); + }); } #include @@ -147,6 +155,7 @@ void SequenceRulesView::removeTranslateUnit() TranslateBasic::TranslateBasic() { + // extractor type-list std::shared_ptr u_ptr = std::make_shared(); _extractor_types[u_ptr->name()] = u_ptr; @@ -168,6 +177,14 @@ TranslateBasic::TranslateBasic() u_ptr = std::make_shared(); _extractor_types[u_ptr->name()] = u_ptr; + + u_ptr = std::make_shared(); + _extractor_types[u_ptr->name()] = u_ptr; + + // size-provider type-list + auto sz_ptr = std::make_shared(); + this->_default_size_provider = sz_ptr; + _size_provider_types[sz_ptr->name()] = sz_ptr; } std::shared_ptr TranslateBasic::defaultRule() const @@ -175,11 +192,21 @@ std::shared_ptr TranslateBasic::defaultRule() const return _default_translate_rule; } +std::shared_ptr TranslateBasic::defaultSizeProvider() const +{ + return _default_size_provider; +} + QHash> TranslateBasic::extactors() const { return _extractor_types; } +QHash> TranslateBasic::sizeProviders() const +{ + return _size_provider_types; +} + RuleSelectDelegate::RuleSelectDelegate(std::shared_ptr ins) :_kernel(ins) { } @@ -212,3 +239,23 @@ void RuleSelectDelegate::updateEditorGeometry(QWidget* editor, const QStyleOptio { editor->setGeometry(option.rect); } + +QString ConstNumberProvider::name() const +{ + return NAME(ConstNumberProvider); +} + +int32_t ConstNumberProvider::value(const QString& expr) const +{ + return expr.toInt(); +} + +void ConstNumberProvider::setExpression(const QString& expr) +{ + this->_number_value = expr; +} + +QString ConstNumberProvider::expression() const +{ + return this->_number_value; +} diff --git a/TranslateUI/SequenceView.h b/TranslateUI/SequenceView.h index c9d5c87..db7c387 100644 --- a/TranslateUI/SequenceView.h +++ b/TranslateUI/SequenceView.h @@ -6,7 +6,8 @@ #include #include #include -class ExtractUnit; +#include "TranslateBasic.h" + /// /// 翻译程序核心 @@ -14,13 +15,17 @@ class ExtractUnit; class TranslateBasic { private: QHash> _extractor_types; - std::shared_ptr _default_translate_rule; + std::shared_ptr _default_translate_rule = nullptr; + QHash> _size_provider_types; + std::shared_ptr _default_size_provider = nullptr; public: TranslateBasic(); std::shared_ptr defaultRule() const; + std::shared_ptr defaultSizeProvider() const; QHash> extactors() const; + QHash> sizeProviders() const; }; @@ -65,6 +70,17 @@ public: virtual void updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const override; }; +class ConstNumberProvider : public extract::SizeProvider { +private: + QString _number_value; + +public: + QString name() const override; + + int32_t value(const QString& expr) const override; + void setExpression(const QString &expr) override; + QString expression() const override; +}; /// /// 序列化规则视图 diff --git a/TranslateUI/extract_basic.cpp b/TranslateUI/extract_basic.cpp index ec4f801..35e3f2e 100644 --- a/TranslateUI/extract_basic.cpp +++ b/TranslateUI/extract_basic.cpp @@ -286,21 +286,9 @@ std::shared_ptr BytesAsUnsigned::newDefault() const } #include -QVariant BytesAsList::parse(const QByteArray& bytes) const -{ - throw std::logic_error("The method or operation is not implemented."); -} - -std::shared_ptr BytesAsList::newDefault() const -{ - throw std::logic_error("The method or operation is not implemented."); -} bool BytesAsUnion::setSizeProvider(std::shared_ptr ins) { - if(ins->value() < 1) - return false; - this->_provider_ins = ins; return true; } @@ -314,3 +302,107 @@ std::shared_ptr BytesAsUnion::newDefault() const { throw std::logic_error("The method or operation is not implemented."); } + +bool BytesAsList::setOffsetSpan(int value) +{ + this->_bytes_offset = value; + return true; +} + +std::shared_ptr BytesAsList::elementRule() const +{ + return this->_bind_unit; +} + +bool BytesAsList::setElementRule(std::shared_ptr u) +{ + this->_bind_unit = u; + return true; +} + +std::shared_ptr BytesAsList::sizeProvider() const +{ + return this->_bind_size_v; +} + +bool BytesAsList::setSizeProvider(std::shared_ptr ins) +{ + this->_bind_size_v = ins; + return true; +} + +QString BytesAsList::name() const +{ + return NAME(BytesAsList); +} + +DataType BytesAsList::outType() const +{ + return DataType::LIST_COLLECTION; +} + +int BytesAsList::offsetSpan() const +{ + return _bytes_offset; +} + +int BytesAsList::countWithin() const +{ + auto expr = this->_bind_size_v->expression(); + if (this->_bind_size_v->value(expr) < 0) { + return 0; + } + + return this->_bind_size_v->value(expr) * this->_bind_unit->countWithin(); +} + +void BytesAsList::loadFrom(const QJsonObject& obj) +{ + INT32_PEAK(_bytes_offset); + + QString bind_provider_expr = ""; + STRING_SAVE(bind_provider_expr); + if (this->_bind_size_v) + this->_bind_size_v->setExpression(bind_provider_expr); +} + +void BytesAsList::saveTo(QJsonObject& obj) const +{ + QString bind_unit_name = ""; + if (this->_bind_unit) + bind_unit_name = this->_bind_unit->name(); + STRING_SAVE(bind_unit_name); + + INT32_SAVE(_bytes_offset); + + QString bind_size_provider_name = ""; + QString bind_provider_expr = ""; + if (this->_bind_size_v) { + bind_provider_expr = this->_bind_size_v->expression(); + bind_size_provider_name = this->_bind_size_v->name(); + } + STRING_SAVE(bind_size_provider_name); + STRING_SAVE(bind_provider_expr); +} + +QVariant BytesAsList::parse(const QByteArray& bytes) const +{ + QVariantList value_list; + + auto expr = this->_bind_size_v->expression(); + auto size_value = this->_bind_size_v->value(expr); + auto unit_size = this->_bind_unit->countWithin(); + + for (auto idx = 0; idx < size_value; ++idx) { + auto secn = bytes.mid(unit_size * idx, unit_size); + auto value_v = this->_bind_unit->parse(secn); + value_list << value_v; + } + + return value_list; +} + +std::shared_ptr BytesAsList::newDefault() const +{ + return std::make_shared(); +} diff --git a/TranslateUI/extract_basic.h b/TranslateUI/extract_basic.h index b2e64e6..3554415 100644 --- a/TranslateUI/extract_basic.h +++ b/TranslateUI/extract_basic.h @@ -22,7 +22,11 @@ public: /// /// virtual DataType outType() const = 0; - + /// + /// 设置偏移字节数量 + /// + /// + virtual bool setOffsetSpan(int bytes) = 0; /// /// 从上一个单元字节偏移字节数量 /// @@ -51,16 +55,16 @@ namespace extract { public: AbstractExtractor(const QString& name, DataType data); - /// - /// 设置偏移字节数量 - /// - /// - virtual bool setOffsetSpan(int bytes); virtual bool setCountWithin(int bytes); // ExtractUnit =========================== QString name() const override; virtual DataType outType() const; + /// + /// 设置偏移字节数量 + /// + /// + virtual bool setOffsetSpan(int bytes); int offsetSpan() const override; int countWithin() const override; @@ -183,28 +187,41 @@ namespace extract { /// class SizeProvider { public: + virtual QString name() const = 0; /// /// 获取值,如果该值无法预先计算得知,返回-1 /// /// 尺寸值 - virtual int32_t value() const = 0; + virtual int32_t value(const QString& expr) const = 0; + + virtual void setExpression(const QString& expr) = 0; virtual QString expression() const = 0; }; - class BytesAsList : public AbstractExtractor { + + class BytesAsList : public ExtractUnit { + private: + std::shared_ptr _bind_unit = nullptr; + int _bytes_offset = 0; + + std::shared_ptr _bind_size_v = nullptr; public: + bool setOffsetSpan(int value); std::shared_ptr elementRule() const; bool setElementRule(std::shared_ptr u); - - /// - /// 设置尺寸解析器,返回值标志是否接受该设置 - /// - /// - /// true-有效,false-无效 - virtual bool setSizeProvider(std::shared_ptr ins) = 0; - + std::shared_ptr sizeProvider() const; + bool setSizeProvider(std::shared_ptr ins); public: + + QString name() const override; + DataType outType() const override; + int offsetSpan() const override; + int countWithin() const override; + + void loadFrom(const QJsonObject& obj) override; + void saveTo(QJsonObject& obj) const override; + QVariant parse(const QByteArray& bytes) const override; std::shared_ptr newDefault() const override;