diff --git a/TranslateUI/SequenceView.cpp b/TranslateUI/SequenceView.cpp index 14d6b99..5b55d02 100644 --- a/TranslateUI/SequenceView.cpp +++ b/TranslateUI/SequenceView.cpp @@ -66,7 +66,7 @@ void SequenceRulesView::peersRuleChanged(const QModelIndex& idx) if (typeid(*new_inst.get()) == typeid(BytesAsList)) { auto conv = std::dynamic_pointer_cast(new_inst); if (!conv->elementRule()) { - conv->setElementRule(this->base->defaultRule()); + conv->appendElementRule(this->base->defaultRule()); } if (!conv->sizeProvider()) { @@ -153,59 +153,6 @@ void SequenceRulesView::removeTranslateUnit() _sequence_model->removeRow(idx_curr.row()); } -TranslateBasic::TranslateBasic() -{ - // extractor type-list - std::shared_ptr u_ptr = std::make_shared(); - _extractor_types[u_ptr->name()] = u_ptr; - - u_ptr = std::make_shared(); - _extractor_types[u_ptr->name()] = u_ptr; - - u_ptr = std::make_shared(); - _extractor_types[u_ptr->name()] = u_ptr; - - u_ptr = std::make_shared(); - _extractor_types[u_ptr->name()] = u_ptr; - - u_ptr = std::make_shared(); - _extractor_types[u_ptr->name()] = u_ptr; - this->_default_translate_rule = u_ptr; - - u_ptr = std::make_shared(); - _extractor_types[u_ptr->name()] = u_ptr; - - 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 -{ - 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) { @@ -239,23 +186,3 @@ 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 60febe4..7781202 100644 --- a/TranslateUI/SequenceView.h +++ b/TranslateUI/SequenceView.h @@ -52,18 +52,6 @@ public: virtual void updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const override; }; -class ConstNumberProvider : public 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/TranslateBasic.cpp b/TranslateUI/TranslateBasic.cpp index 86e0077..d66277e 100644 --- a/TranslateUI/TranslateBasic.cpp +++ b/TranslateUI/TranslateBasic.cpp @@ -1 +1,78 @@ #include "TranslateBasic.h" + +using namespace extract; + + +TranslateBasic::TranslateBasic() +{ + // extractor type-list + std::shared_ptr u_ptr = std::make_shared(); + _extractor_types[u_ptr->name()] = u_ptr; + + u_ptr = std::make_shared(); + _extractor_types[u_ptr->name()] = u_ptr; + + u_ptr = std::make_shared(); + _extractor_types[u_ptr->name()] = u_ptr; + + u_ptr = std::make_shared(); + _extractor_types[u_ptr->name()] = u_ptr; + + u_ptr = std::make_shared(); + _extractor_types[u_ptr->name()] = u_ptr; + this->_default_translate_rule = u_ptr; + + u_ptr = std::make_shared(); + _extractor_types[u_ptr->name()] = u_ptr; + + 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 +{ + 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; +} + +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/TranslateBasic.h b/TranslateUI/TranslateBasic.h index e5ecc9d..b9f4f3e 100644 --- a/TranslateUI/TranslateBasic.h +++ b/TranslateUI/TranslateBasic.h @@ -22,3 +22,15 @@ public: QHash> extactors() const; QHash> sizeProviders() const; }; + +class ConstNumberProvider : public 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/common.h b/TranslateUI/common.h index 7457be2..26baabd 100644 --- a/TranslateUI/common.h +++ b/TranslateUI/common.h @@ -11,6 +11,7 @@ #define STRING_PEAK(codec_name) codec_name = obj[NAME(codec_name)].toString(); #define STRING_SAVE(codec_name) obj[NAME(codec_name)] = codec_name; +class TranslateBasic; /// /// 序列化实体 /// @@ -21,7 +22,7 @@ public: /// 反序列化 /// /// - virtual void loadFrom(const QJsonObject& obj) = 0; + virtual void loadFrom(std::shared_ptr core, const QJsonObject& obj) = 0; /// /// 序列化 /// diff --git a/TranslateUI/convert_basic.cpp b/TranslateUI/convert_basic.cpp index 8c4bd45..5b99962 100644 --- a/TranslateUI/convert_basic.cpp +++ b/TranslateUI/convert_basic.cpp @@ -24,7 +24,7 @@ DataType AbstractValueConvert::outType() const return _out_type; } -void AbstractValueConvert::loadFrom(const QJsonObject& obj) +void AbstractValueConvert::loadFrom(std::shared_ptr core, const QJsonObject& obj) { auto int_in_type = (int)_in_type; INT32_PEAK(int_in_type); diff --git a/TranslateUI/convert_basic.h b/TranslateUI/convert_basic.h index 1610870..b712720 100644 --- a/TranslateUI/convert_basic.h +++ b/TranslateUI/convert_basic.h @@ -28,7 +28,7 @@ namespace convert { DataType inType() const override; DataType outType() const override; - void loadFrom(const QJsonObject& obj) override; + void loadFrom(std::shared_ptr core, const QJsonObject& obj) override; void saveTo(QJsonObject& obj) const override; }; diff --git a/TranslateUI/extract_basic.cpp b/TranslateUI/extract_basic.cpp index 6d0e5bd..fabc2d9 100644 --- a/TranslateUI/extract_basic.cpp +++ b/TranslateUI/extract_basic.cpp @@ -42,7 +42,8 @@ int AbstractExtractor::countWithin() const return this->_abs_data.byte_count; } -void AbstractExtractor::loadFrom(const QJsonObject& obj) +void AbstractExtractor::loadFrom( + std::shared_ptr core, const QJsonObject& obj) { INT32_PEAK(_abs_data.byte_offset); INT32_PEAK(_abs_data.byte_count); @@ -82,7 +83,7 @@ BytesAsBitCombine::BytesAsBitCombine() bool BytesAsBitCombine::setSwitchOption(int bit_index, const QString& keyword) { if (bit_index >= 0 && bit_index <= this->countWithin() * 8) { - _combines._switch_options[bit_index] = keyword; + _combine._switch_options[bit_index] = keyword; return true; } return false; @@ -90,17 +91,17 @@ bool BytesAsBitCombine::setSwitchOption(int bit_index, const QString& keyword) QHash BytesAsBitCombine::switchOptions() const { - return _combines._switch_options; + return _combine._switch_options; } void BytesAsBitCombine::clearOptions() { - _combines._switch_options.clear(); + _combine._switch_options.clear(); } QVariant BytesAsBitCombine::parse(const QByteArray& bytes) const { - auto keys = _combines._switch_options.keys(); + auto keys = _combine._switch_options.keys(); std::sort(keys.begin(), keys.end()); QString result; @@ -109,23 +110,24 @@ QVariant BytesAsBitCombine::parse(const QByteArray& bytes) const auto bit_idx = idx % 8; auto char_v = bytes.at(byte_idx); if (char_v & (0x1u << bit_idx)) - result += QString("%1<%2>;").arg(_combines._switch_options[idx], "Y"); + result += QString("%1<%2>;").arg(_combine._switch_options[idx], "Y"); else - result += QString("%1<%2>;").arg(_combines._switch_options[idx], "N"); + result += QString("%1<%2>;").arg(_combine._switch_options[idx], "N"); } return result; } -void BytesAsBitCombine::loadFrom(const QJsonObject& obj) +void BytesAsBitCombine::loadFrom( + std::shared_ptr core, const QJsonObject& obj) { - AbstractExtractor::loadFrom(obj); + AbstractExtractor::loadFrom(core, obj); QStringList value_list; STRLIST_PEAK(value_list); - _combines._switch_options.clear(); + _combine._switch_options.clear(); for (auto pair : value_list) { auto items = pair.split("="); - _combines._switch_options[items.first().toInt()] = items.last(); + _combine._switch_options[items.first().toInt()] = items.last(); } } @@ -134,9 +136,9 @@ void BytesAsBitCombine::saveTo(QJsonObject& obj) const AbstractExtractor::saveTo(obj); QStringList value_list; - for (auto key : _combines._switch_options.keys()) { + for (auto key : _combine._switch_options.keys()) { auto pair_str = QString("%1=%2").arg(key) - .arg(_combines._switch_options[key]); + .arg(_combine._switch_options[key]); value_list << pair_str; } STRLIST_SAVE(value_list); @@ -207,9 +209,9 @@ QVariant BytesAsString::parse(const QByteArray& bytes) const return _strings._conv_with->toUnicode(bytes); } -void BytesAsString::loadFrom(const QJsonObject& obj) +void BytesAsString::loadFrom(std::shared_ptr core, const QJsonObject& obj) { - AbstractExtractor::loadFrom(obj); + AbstractExtractor::loadFrom(core, obj); QString codec_name; STRING_PEAK(codec_name); @@ -302,7 +304,7 @@ std::shared_ptr BytesAsList::elementRule() const return this->_list._bind_unit; } -bool BytesAsList::setElementRule(std::shared_ptr u) +bool BytesAsList::appendElementRule(std::shared_ptr u) { this->_list._bind_unit = u; return true; @@ -345,25 +347,32 @@ int BytesAsList::countWithin() const * this->_list._bind_unit->countWithin(); } -void BytesAsList::loadFrom(const QJsonObject& obj) +#include "TranslateBasic.h" +void BytesAsList::loadFrom(std::shared_ptr core, const QJsonObject& obj) { INT32_PEAK(_list._bytes_offset); + QString bind_unit_name = ""; + QString bind_size_provider_name = ""; + STRING_PEAK(bind_unit_name); + STRING_PEAK(bind_size_provider_name); + this->_list._bind_size_v = core->sizeProviders()[bind_size_provider_name]; + this->_list._bind_unit = core->extactors()[bind_unit_name]; + QString bind_provider_expr = ""; STRING_SAVE(bind_provider_expr); - if (this->_list._bind_size_v) - this->_list._bind_size_v->setExpression(bind_provider_expr); + this->_list._bind_size_v->setExpression(bind_provider_expr); } void BytesAsList::saveTo(QJsonObject& obj) const { + INT32_SAVE(_list._bytes_offset); + QString bind_unit_name = ""; if (this->_list._bind_unit) bind_unit_name = this->_list._bind_unit->name(); STRING_SAVE(bind_unit_name); - INT32_SAVE(_list._bytes_offset); - QString bind_size_provider_name = ""; QString bind_provider_expr = ""; if (this->_list._bind_size_v) { @@ -425,9 +434,11 @@ QVariant BytesAsUnion::parse(const QByteArray& bytes) const return QVariant(); } -void BytesAsUnion::loadFrom(const QJsonObject& obj) +void BytesAsUnion::loadFrom( + std::shared_ptr core, const QJsonObject& obj) { - throw std::logic_error("The method or operation is not implemented."); + INT32_PEAK(_union.byte_count); + INT32_PEAK(_union.byte_offset); } void BytesAsUnion::saveTo(QJsonObject& obj) const @@ -446,7 +457,7 @@ QList> BytesAsUnion::elementRules() const return _union._rule_list; } -bool BytesAsUnion::setElementRule(std::shared_ptr u) +bool BytesAsUnion::appendElementRule(std::shared_ptr u) { this->_union._rule_list << u; return true; diff --git a/TranslateUI/extract_basic.h b/TranslateUI/extract_basic.h index f9f7e97..8ace874 100644 --- a/TranslateUI/extract_basic.h +++ b/TranslateUI/extract_basic.h @@ -96,7 +96,7 @@ namespace extract { int countWithin() const override; // Serializable ============================== - void loadFrom(const QJsonObject& obj) override; + void loadFrom(std::shared_ptr core, const QJsonObject& obj) override; void saveTo(QJsonObject& obj) const override; }; @@ -118,7 +118,7 @@ namespace extract { public: struct __Private { QHash _switch_options; - } _combines; + } _combine; BytesAsBitCombine(); @@ -130,7 +130,7 @@ namespace extract { QVariant parse(const QByteArray& bytes) const override; // Serializable ============================== - void loadFrom(const QJsonObject& obj) override; + void loadFrom(std::shared_ptr core, const QJsonObject& obj) override; void saveTo(QJsonObject& obj) const override; std::shared_ptr newDefault() const override; }; @@ -184,7 +184,7 @@ namespace extract { QVariant parse(const QByteArray& bytes) const override; // Serializable ============================== - void loadFrom(const QJsonObject& obj) override; + void loadFrom(std::shared_ptr core, const QJsonObject& obj) override; void saveTo(QJsonObject& obj) const override; std::shared_ptr newDefault() const override; }; @@ -217,7 +217,7 @@ namespace extract { public: bool setOffsetSpan(int value); std::shared_ptr elementRule() const; - bool setElementRule(std::shared_ptr u); + bool appendElementRule(std::shared_ptr u); std::shared_ptr sizeProvider() const; bool setSizeProvider(std::shared_ptr ins); @@ -227,7 +227,7 @@ namespace extract { int offsetSpan() const override; int countWithin() const override; - void loadFrom(const QJsonObject& obj) override; + void loadFrom(std::shared_ptr core, const QJsonObject& obj) override; void saveTo(QJsonObject& obj) const override; QVariant parse(const QByteArray& bytes) const override; @@ -238,7 +238,7 @@ namespace extract { class BytesAsUnion : public ExtractUnit { public: struct __Private { - int byte_offset, byte_count; + int byte_offset = 0, byte_count = 1; QList> _rule_list; } _union; @@ -247,7 +247,7 @@ namespace extract { void clearRules(); QList> elementRules() const; - bool setElementRule(std::shared_ptr u); + bool appendElementRule(std::shared_ptr u); public: QString name() const override; @@ -257,11 +257,10 @@ namespace extract { int countWithin() const override; QVariant parse(const QByteArray& bytes) const override; - void loadFrom(const QJsonObject& obj) override; - + void loadFrom(std::shared_ptr core, const QJsonObject& obj) override; void saveTo(QJsonObject& obj) const override; - std::shared_ptr newDefault() const override; + std::shared_ptr newDefault() const override; }; }