diff --git a/TranslateUI/SequenceView.cpp b/TranslateUI/SequenceView.cpp index 2d002d3..735bede 100644 --- a/TranslateUI/SequenceView.cpp +++ b/TranslateUI/SequenceView.cpp @@ -37,21 +37,21 @@ void IntDelegate::updateEditorGeometry(QWidget* editor, const QStyleOptionViewIt void SequenceRulesView::currentRuleRefresh(const QModelIndex& idx) { - auto rule_insv = _view._ruleset->_rules[idx.row()]; + auto rule_insv = _view._ruleset->_bind[idx.row()]; auto offset_index = idx.sibling(idx.row(), 1); auto offset_number = offset_index.data(Qt::DisplayRole).toInt(); rule_insv.second->setOffsetSpan(offset_number); auto count_index = idx.sibling(idx.row(), 3); - _view._sequence_model->setData(offset_index, rule_insv.second->offsetSpan(), Qt::EditRole); - _view._sequence_model->setData(count_index, rule_insv.second->countWithin(), Qt::EditRole); + _view._seqs_model->setData(offset_index, rule_insv.second->offsetSpan(), Qt::EditRole); + _view._seqs_model->setData(count_index, rule_insv.second->countWithin(), Qt::EditRole); auto param_index = idx.sibling(idx.row(), 4); QJsonObject obj; rule_insv.second->saveTo(obj); auto bytes = QJsonDocument(obj).toJson(QJsonDocument::Compact); - _view._sequence_model->setData(param_index, QString::fromUtf8(bytes)); + _view._seqs_model->setData(param_index, QString::fromUtf8(bytes)); this->resizeColumnsToContents(); } @@ -66,7 +66,7 @@ void SequenceRulesView::peersRuleChanged(const QModelIndex& idx) auto rule_nm = _view.base->extractUnitList()[rule_name]; auto new_inst = std::dynamic_pointer_cast(rule_nm->newDefault()); - _view._ruleset->_rules.replace(idx.row(), std::make_pair(field_name, new_inst)); + _view._ruleset->_bind.replace(idx.row(), std::make_pair(field_name, new_inst)); // 对ListUnit执行特殊初始化步骤 if (typeid(*new_inst.get()) == typeid(BytesAsList)) { @@ -83,16 +83,25 @@ void SequenceRulesView::peersRuleChanged(const QModelIndex& idx) currentRuleRefresh(idx); } +void SequenceRulesView::showEvent(QShowEvent* e) +{ + QTableView::showEvent(e); + + membersPresent(this->_view._ruleset, this->_view._seqs_model); +} + #include -SequenceRulesView::SequenceRulesView(std::shared_ptr rule_set, QWidget* p /*= nullptr*/) +SequenceRulesView::SequenceRulesView( + std::shared_ptr base, + std::shared_ptr rule_set, QWidget* p /*= nullptr*/) :QTableView(p) { _view._ruleset = rule_set; - _view._sequence_model = new QStandardItemModel(); + _view._seqs_model = new QStandardItemModel(); _view.base = std::make_shared(); - this->setModel(_view._sequence_model); - _view._sequence_model->setHorizontalHeaderLabels(QStringList() + this->setModel(_view._seqs_model); + _view._seqs_model->setHorizontalHeaderLabels(QStringList() << tr(u8"Field Name") << tr(u8"Bytes Offset") << tr(u8"Translate Rule") << tr(u8"Bytes Count") << tr(u8"Arguments")); @@ -110,7 +119,7 @@ SequenceRulesView::SequenceRulesView(std::shared_ptr ru if (!curr.isValid()) return; - emit this->currentRuleChanged(_view._ruleset->_rules[curr.row()].second, curr); + emit this->currentRuleChanged(_view._ruleset->_bind[curr.row()].second, curr); }); } @@ -125,31 +134,15 @@ void SequenceRulesView::customTranslateRuleEdit(const QPoint& pos) void SequenceRulesView::addTranslateUnit() { - auto row_cnt = this->_view._sequence_model->rowCount(); - - QList new_row; - new_row << new QStandardItem(QString(u8"rule_%1").arg(row_cnt)); - new_row << new QStandardItem(u8"0"); - new_row << new QStandardItem(_view.base->defaultExtractUnit()->name()); - new_row << new QStandardItem(u8"1"); - new_row.last()->setEditable(false); - auto curr_rule = _view.base->defaultExtractUnit()->newDefault(); - this->_view._ruleset->_rules.append( - new_row.first()->text(), std::static_pointer_cast(curr_rule)); + this->_view._ruleset->_bind.append( + QString(u8"rule_%1").arg(_view._ruleset->_bind.sub_units.size()), + std::static_pointer_cast(curr_rule)); auto hex_rule = std::static_pointer_cast(curr_rule); hex_rule->setCountWithin(1); - QJsonObject obj; - curr_rule->saveTo(obj); - auto bytes = QJsonDocument(obj).toJson(QJsonDocument::Compact); - auto json_doc = QString::fromUtf8(bytes); - new_row << new QStandardItem(json_doc); - new_row.last()->setEditable(false); - - this->_view._sequence_model->appendRow(new_row); - this->resizeColumnsToContents(); + membersPresent(this->_view._ruleset, this->_view._seqs_model); } void SequenceRulesView::removeTranslateUnit() @@ -158,10 +151,37 @@ void SequenceRulesView::removeTranslateUnit() if (!idx_curr.isValid()) return; - _view._ruleset->_rules.removeAt(idx_curr.row()); - _view._sequence_model->removeRow(idx_curr.row()); + _view._ruleset->_bind.removeAt(idx_curr.row()); + _view._seqs_model->removeRow(idx_curr.row()); } +void SequenceRulesView::membersPresent(std::shared_ptr ruleset, QStandardItemModel* model) +{ + model->removeRows(0, model->rowCount()); + + auto units = ruleset->_bind.sub_units; + for (auto uidx = 0; uidx < units.size(); ++uidx) { + auto u_pair = units.at(uidx); + + QList new_row; + new_row << new QStandardItem(u_pair.first); + new_row << new QStandardItem(QString("%1").arg(u_pair.second->offsetSpan())); + new_row << new QStandardItem(_view.base->defaultExtractUnit()->name()); + new_row << new QStandardItem(QString("%1").arg(u_pair.second->countWithin())); + new_row.last()->setEditable(false); + + QJsonObject obj; + u_pair.second->saveTo(obj); + auto bytes = QJsonDocument(obj).toJson(QJsonDocument::Compact); + auto json_doc = QString::fromUtf8(bytes); + new_row << new QStandardItem(json_doc); + new_row.last()->setEditable(false); + + this->_view._seqs_model->appendRow(new_row); + } + + this->resizeColumnsToContents(); +} RuleSelectDelegate::RuleSelectDelegate(std::shared_ptr ins) :_kernel(ins) { diff --git a/TranslateUI/SequenceView.h b/TranslateUI/SequenceView.h index 58f78c6..6b95780 100644 --- a/TranslateUI/SequenceView.h +++ b/TranslateUI/SequenceView.h @@ -57,9 +57,9 @@ public: /// class SequenceRulesView : public QTableView { Q_OBJECT -public: +private: struct __Private { - QStandardItemModel* _sequence_model; + QStandardItemModel* _seqs_model; std::shared_ptr base = nullptr; std::shared_ptr _ruleset = nullptr; } _view; @@ -71,11 +71,18 @@ public: void currentRuleRefresh(const QModelIndex& idx); void peersRuleChanged(const QModelIndex& idx_rule); +protected: + void showEvent(QShowEvent* e) override; + public: - SequenceRulesView(std::shared_ptr rule_set, QWidget* p = nullptr); + SequenceRulesView( + std::shared_ptr base, + std::shared_ptr rule_set, QWidget* p = nullptr); void customTranslateRuleEdit(const QPoint& pos); void addTranslateUnit(); void removeTranslateUnit(); + + void membersPresent(std::shared_ptr _bind, QStandardItemModel* model); }; diff --git a/TranslateUI/StructuralRuleView.cpp b/TranslateUI/StructuralRuleView.cpp index e66026c..fa4c793 100644 --- a/TranslateUI/StructuralRuleView.cpp +++ b/TranslateUI/StructuralRuleView.cpp @@ -9,9 +9,10 @@ #include "TranslateBasic.h" StructuralRuleView::StructuralRuleView( + std::shared_ptr base, std::shared_ptr inst_r, QWidget* p /*= nullptr*/) - : QWidget(p), - _sequence_view(new SequenceRulesView(inst_r, this)), + : QWidget(p), _rule_base(inst_r), + _sequence_view(new SequenceRulesView(base, inst_r, this)), _configs_stack(new QStackedWidget(this)) { this->_current_fields_cache = std::make_shared("", nullptr); @@ -30,7 +31,7 @@ StructuralRuleView::StructuralRuleView( _configs_stack->addWidget(encode_config); auto combine_config = new BitCombineConfiguration(this); _configs_stack->addWidget(combine_config); - auto list_config = new ListUnitConfiguration(this->_sequence_view->_view.base, this); + auto list_config = new ListUnitConfiguration(base, this); _configs_stack->addWidget(list_config); connect(count_span, &CountWithinConfiguration::currentRuleChanged, @@ -76,12 +77,12 @@ void StructuralRuleView::cacheRefresh(const QModelIndex& curr, ListUnitConfigura return; this->_current_fields_cache->clear(); - this->_sequence_view->_view._ruleset->registSubField(this->_current_fields_cache); + this->_rule_base->registSubField(this->_current_fields_cache); auto field_idx = curr.sibling(curr.row(), 0); this->_current_fields_cache->bindCurrent(field_idx.data(Qt::DisplayRole).toString()); - auto ins = this->_sequence_view->_view._ruleset->_rules[curr.row()]; + auto ins = this->_rule_base->_bind[curr.row()]; auto conv = std::dynamic_pointer_cast(ins.second); if (conv) { t->currentRuleAccept(conv, curr, this->_current_fields_cache); diff --git a/TranslateUI/StructuralRuleView.h b/TranslateUI/StructuralRuleView.h index c1945c6..8248db1 100644 --- a/TranslateUI/StructuralRuleView.h +++ b/TranslateUI/StructuralRuleView.h @@ -119,11 +119,13 @@ private: SequenceRulesView* const _sequence_view; QStackedWidget* const _configs_stack; + std::shared_ptr _rule_base; std::shared_ptr _current_fields_cache = nullptr; public: - StructuralRuleView(std::shared_ptr inst_r, QWidget* p = nullptr); + StructuralRuleView(std::shared_ptr base, + std::shared_ptr inst_r, QWidget* p = nullptr); - void cacheRefresh(const QModelIndex &curr, ListUnitConfiguration* t); + void cacheRefresh(const QModelIndex& curr, ListUnitConfiguration* t); }; diff --git a/TranslateUI/TranslateUI.cpp b/TranslateUI/TranslateUI.cpp index 1ee78ca..3e7f274 100644 --- a/TranslateUI/TranslateUI.cpp +++ b/TranslateUI/TranslateUI.cpp @@ -24,8 +24,8 @@ TranslateUI::TranslateUI(QWidget* parent) _ruleset_navi->setContextMenuPolicy(Qt::CustomContextMenu); connect(_ruleset_navi, &QWidget::customContextMenuRequested, [=](const QPoint& pos) { QMenu m; - m.addAction(u8"添加Rule", this, &TranslateUI::addCustomRule); - m.addAction(u8"打开ExtractView", this, &TranslateUI::openExtractView); + m.addAction(u8"Add Rule", this, &TranslateUI::addCustomRule); + m.addAction(u8"Open ExtractView", this, &TranslateUI::openExtractView); m.exec(this->mapToGlobal(pos)); }); @@ -37,9 +37,10 @@ TranslateUI::TranslateUI(QWidget* parent) connect(_tab_widget, &QTabWidget::tabCloseRequested, _core._view_mgr, &ViewManager::closeAt); connect(_core._view_mgr, &ViewManager::appendRequest, _tab_widget, QOverload::of(&QTabWidget::addTab)); connect(_core._view_mgr, &ViewManager::removeRequest, _tab_widget, &QTabWidget::removeTab); - connect(_core._view_mgr, &ViewManager::activeRequest, _tab_widget, &QTabWidget::setTabText); + connect(_core._view_mgr, &ViewManager::activeRequest, _tab_widget, &QTabWidget::setCurrentIndex); this->present_solution_customs(_core._translate_core, _solution_model); + splitter->setStretchFactor(1, 1); } TranslateUI::~TranslateUI() @@ -49,13 +50,13 @@ TranslateUI::~TranslateUI() #include void TranslateUI::addCustomRule() { - auto name = QInputDialog::getText(this, u8"输入Rule名称", "Rule:"); + auto name = QInputDialog::getText(this, u8"Please Enter Rule Name", "Rule:"); if (name == "") return; auto names = this->_core._translate_core->customRules().keys(); if (names.contains(name)) { - QMessageBox::critical(this, "输入校验", "RuleName不能重复"); + QMessageBox::critical(this, u8"输入校验", u8"RuleName不能重复"); return; } @@ -98,22 +99,23 @@ void ViewManager::open(const QString& rule_name, ViewType v_type, QWidget* p) { for (auto vidx = 0; vidx < content_pages.size(); vidx++) { auto v = content_pages.at(vidx); - if (std::get<0>(v)->name() == rule_name && std::get<2>(v) == v_type) { + if (std::get<0>(v)->customName() == rule_name && std::get<2>(v) == v_type) { emit this->activeRequest(vidx, rule_name); return; } } - assert("指定rule_name必须合法" && _translate_core->customRules().contains(rule_name)); + assert(u8"指定rule_name必须合法" && _translate_core->customRules().contains(rule_name)); auto appoint = _translate_core->customRules()[rule_name]; - auto present = new StructuralRuleView(appoint, p); + auto present = new StructuralRuleView(_translate_core, appoint, p); content_pages << std::make_tuple(appoint, present, v_type); emit this->appendRequest(present, rule_name); + emit this->activeRequest(content_pages.size() - 1, rule_name); } void ViewManager::closeAt(int index) { - assert("index必须有效" && (index < content_pages.size())); + assert(u8"index必须有效" && (index < content_pages.size())); emit this->removeRequest(index); auto current = this->content_pages.at(index); @@ -131,7 +133,7 @@ void ViewManager::active(const QString& rule_name, ViewType v_type) } } - assert("RuleName和V_Type组合必须有效" && 0); + assert(u8"RuleName和V_Type组合必须有效" && 0); } void ViewManager::purge(const QString& rule_name) diff --git a/TranslateUI/extract_basic.cpp b/TranslateUI/extract_basic.cpp index c65e929..fdc1e12 100644 --- a/TranslateUI/extract_basic.cpp +++ b/TranslateUI/extract_basic.cpp @@ -559,8 +559,8 @@ void BytesAsUnion::registSubField(std::shared_ptr inst) void BytesAsRuleSet::registSubField(std::shared_ptr inst) { - for (auto rl_key : this->_rules.fieldNames()){ - auto rlinst = this->_rules[rl_key]; + for (auto rl_key : this->_bind.fieldNames()){ + auto rlinst = this->_bind[rl_key]; inst->setField(rl_key, rlinst->outType()); auto layer = std::make_shared(rl_key, inst); rlinst->registSubField(layer); @@ -570,11 +570,11 @@ void BytesAsRuleSet::registSubField(std::shared_ptr inst) void BytesAsRuleSet::parse(const QByteArray& bytes, std::shared_ptr out) const { auto bufx = bytes; - for (auto keym : this->_rules.fieldNames()) { + for (auto keym : this->_bind.fieldNames()) { auto rule_context = std::make_shared(); rule_context->init(keym, out); - auto rule = this->_rules[keym]; + auto rule = this->_bind[keym]; bufx = bufx.mid(rule->offsetSpan()); auto count = rule->countWithin(); auto secx = bufx.mid(0, count); @@ -595,24 +595,24 @@ DataType BytesAsRuleSet::outType() const bool BytesAsRuleSet::setOffsetSpan(int bytes) { - this->_rules._byte_offset = bytes; + this->_bind._byte_offset = bytes; return true; } int BytesAsRuleSet::offsetSpan() const { - return this->_rules._byte_offset; + return this->_bind._byte_offset; } int BytesAsRuleSet::countWithin() const { - return this->_rules._byte_count; + return this->_bind._byte_count; } void BytesAsRuleSet::loadFrom(std::shared_ptr core, const QJsonObject& obj) { - INT32_PEAK(_rules._byte_count, obj); - INT32_PEAK(_rules._byte_offset, obj); + INT32_PEAK(_bind._byte_count, obj); + INT32_PEAK(_bind._byte_offset, obj); QJsonArray array; ARRAY_SAVE(array, obj); @@ -627,17 +627,17 @@ void BytesAsRuleSet::loadFrom(std::shared_ptr core, const QJsonO auto xdev = core->extractUnitList()[match_name]->newDefault(); xdev->loadFrom(core, match_obj); - _rules._sub_rules << std::make_pair(key, std::dynamic_pointer_cast(xdev)); + _bind.sub_units << std::make_pair(key, std::dynamic_pointer_cast(xdev)); } } void BytesAsRuleSet::saveTo(QJsonObject& obj) const { - INT32_SAVE(_rules._byte_count, obj); - INT32_SAVE(_rules._byte_offset, obj); + INT32_SAVE(_bind._byte_count, obj); + INT32_SAVE(_bind._byte_offset, obj); QJsonArray array; - for (auto pairk : _rules._sub_rules) { + for (auto pairk : _bind.sub_units) { QJsonObject rule_obj, match_obj; auto key = pairk.first; @@ -660,29 +660,29 @@ std::shared_ptr BytesAsRuleSet::newDefault() const std::pair> BytesAsRuleSet::__Private::operator[](int index) const { - return this->_sub_rules[index]; + return this->sub_units[index]; } void BytesAsRuleSet::__Private::replace(int index, std::pair> inst) { - this->_sub_rules.replace(index, inst); + this->sub_units.replace(index, inst); } extract::BytesAsRuleSet::__Private& BytesAsRuleSet::__Private::append(const QString& nm, std::shared_ptr u) { - this->_sub_rules.append(std::make_pair(nm, u)); + this->sub_units.append(std::make_pair(nm, u)); return *this; } void BytesAsRuleSet::__Private::removeAt(int index) { - this->_sub_rules.removeAt(index); + this->sub_units.removeAt(index); } QList BytesAsRuleSet::__Private::fieldNames() const { QList fields_store; - for (auto fpair : this->_sub_rules) { + for (auto fpair : this->sub_units) { fields_store << fpair.first; } return fields_store;; @@ -690,7 +690,7 @@ QList BytesAsRuleSet::__Private::fieldNames() const std::shared_ptr BytesAsRuleSet::__Private::operator[](const QString& field) const { - for (auto pair : this->_sub_rules) { + for (auto pair : this->sub_units) { if(pair.first == field) return pair.second; } @@ -700,10 +700,10 @@ std::shared_ptr BytesAsRuleSet::__Private::operator[](const QString void BytesAsRuleSet::setCustomName(const QString& name) { - _rules._name_store = name; + _bind._name_store = name; } QString BytesAsRuleSet::customName() const { - return _rules._name_store; + return _bind._name_store; } diff --git a/TranslateUI/extract_basic.h b/TranslateUI/extract_basic.h index 1cf878d..a0e7cde 100644 --- a/TranslateUI/extract_basic.h +++ b/TranslateUI/extract_basic.h @@ -256,7 +256,7 @@ namespace extract { struct __Private { int _byte_offset = 0, _byte_count = 1; QString _name_store; - QList>> _sub_rules; + QList>> sub_units; QList fieldNames() const; std::shared_ptr operator[](const QString &field) const; @@ -266,7 +266,7 @@ namespace extract { void replace(int index, std::pair> inst); void removeAt(int index); __Private& append(const QString& nm, std::shared_ptr u); - }_rules; + }_bind; void setCustomName(const QString& name); QString customName() const;