diff --git a/TranslateUI/ExtractRuleView.cpp b/TranslateUI/ExtractRuleView.cpp index dc6509f..cd14b0b 100644 --- a/TranslateUI/ExtractRuleView.cpp +++ b/TranslateUI/ExtractRuleView.cpp @@ -20,7 +20,7 @@ using namespace extract; ExtractRuleView::ExtractRuleView(std::shared_ptr base, std::shared_ptr inst_r, QWidget* p /*= nullptr*/) - : QWidget(p), _rule_base(inst_r), _base_bind(base), + : QWidget(p), _current_rule(inst_r), _basic_bind(base), _member_units(new QTableView(this)), _member_model(new QStandardItemModel(this)), _configs_stack(new QStackedWidget(this)) @@ -42,11 +42,14 @@ ExtractRuleView::ExtractRuleView(std::shared_ptr base, auto union_configs = new UnionBasedConfiguration(base, this); _configs_stack->addWidget(union_configs); + connect(single_configs, &SingleBasedConfiguration::reloadRequest, this, &ExtractRuleView::reload); + connect(list_configs, &ListBasedConfiguration::reloadRequest, this, &ExtractRuleView::reload); + connect(union_configs, &UnionBasedConfiguration::reloadRequest, this, &ExtractRuleView::reload); connect(_member_units, &QTableView::clicked, [=](const QModelIndex& target) { if (!target.isValid()) return; - auto unit = _rule_base->operator[](target.row()); + auto unit = _current_rule->operator[](target.row()); if (unit->baseType() == SingleBasedUnit::topic()) { _configs_stack->setCurrentIndex(1); single_configs->currentAccept(unit, target); @@ -54,8 +57,8 @@ ExtractRuleView::ExtractRuleView(std::shared_ptr base, else if (unit->baseType() == ListBasedUnit::topic()) { _configs_stack->setCurrentIndex(2); _current_fields_cache = std::make_shared("{self}"); - this->_rule_base->registSubField(_current_fields_cache); - auto current_field = this->_rule_base->operator[](target.row()); + this->_current_rule->registSubField(_current_fields_cache); + auto current_field = this->_current_rule->operator[](target.row()); _current_fields_cache->bindCurrent(current_field->name()); list_configs->currentAccept(unit, target, _current_fields_cache); } @@ -69,6 +72,8 @@ ExtractRuleView::ExtractRuleView(std::shared_ptr base, }); _member_units->setModel(_member_model); + connect(_member_model, &QStandardItemModel::itemChanged, this, &ExtractRuleView::dataChanged); + _member_units->setItemDelegateForColumn(2, new UnitSelectDelegate(_basic_bind)); _member_model->setHorizontalHeaderLabels(QStringList() << "FieldName" << "OffsetSpan" << "UnitType"); _member_units->setContextMenuPolicy(Qt::CustomContextMenu); connect(_member_units, &QTableView::customContextMenuRequested, [=](const QPoint& pt) { @@ -83,12 +88,12 @@ void ExtractRuleView::reload() auto cnt = _member_model->rowCount(); _member_model->removeRows(0, cnt); - auto list = _rule_base->fieldNames(); + auto list = _current_rule->fieldNames(); for (auto key : list) { - auto field_mbr = _rule_base->operator[](key); + auto field_mbr = _current_rule->operator[](key); QList row; row << new QStandardItem(field_mbr->name()); - row << new QStandardItem(QString("%1").arg(field_mbr->offsetSpan())); + row << new QStandardItem(QString("%1 bytes").arg(field_mbr->offsetSpan())); row.last()->setEditable(false); row << new QStandardItem(field_mbr->baseType()); _member_model->appendRow(row); @@ -96,6 +101,7 @@ void ExtractRuleView::reload() _member_units->resizeColumnsToContents(); } +#include #include void ExtractRuleView::appendUnit() { @@ -103,21 +109,66 @@ void ExtractRuleView::appendUnit() if (name_u == "") return; - auto inst_u = _base_bind->defaultExtractUnitType()->newDefault(); - auto new_unit = std::dynamic_pointer_cast(inst_u); + if (this->_current_rule->fieldNames().contains(name_u)) { + QMessageBox::critical(this, "DataValidate", "Field can't repeat"); + return; + } + + auto unit_template = _basic_bind->defaultExtractUnitType()->newDefault(); + auto new_unit = std::dynamic_pointer_cast(unit_template); new_unit->setName(name_u); - auto delt_key = _base_bind->delegateAlias().first(); - auto delt_o = _base_bind->operator[](delt_key); - auto delt_u = delt_o->newDefault(); + auto delt_key = _basic_bind->customDelegateAlias().first(); + auto delt_o = _basic_bind->operator[](delt_key); QJsonObject content; delt_o->saveTo(content); - delt_u->loadFrom(_base_bind, content); + auto delt_u = delt_o->newDefault(); + delt_u->loadFrom(_basic_bind, content); new_unit->setDelegate(std::dynamic_pointer_cast(delt_u)); - this->_rule_base->append(new_unit); + this->_current_rule->append(new_unit); reload(); } +void ExtractRuleView::dataChanged(QStandardItem* item) +{ + auto current_unit = this->_current_rule->operator[](item->row()); + switch (item->column()) { + case 0: { + auto fields_names = this->_current_rule->fieldNames(); + if (fields_names.contains(item->text())) { + QMessageBox::critical(this, "DataValidate", "Field can't repeat"); + } + else { + current_unit->setName(item->text()); + } + reload(); + }break; + + case 2: { + auto unit_template = this->_basic_bind->extractUnitTypeMap()[item->text()]; + auto unit_ins = std::dynamic_pointer_cast(unit_template->newDefault()); + unit_ins->setName(current_unit->name()); + + if (unit_ins->baseType() == SingleBasedUnit::topic()) { + auto single_ins = std::dynamic_pointer_cast(unit_ins); + + auto delt_name = _basic_bind->customDelegateAlias().first(); + auto delt_base = _basic_bind->operator[](delt_name); + QJsonObject object; + delt_base->saveTo(object); + auto delt_conv = std::dynamic_pointer_cast(delt_base->newDefault()); + delt_conv->loadFrom(_basic_bind, object); + single_ins->setDelegate(std::dynamic_pointer_cast(delt_conv)); + } + + }break; + + default: + break; + } + +} + void ExtractRuleView::showEvent(QShowEvent* e) { QWidget::showEvent(e); @@ -176,7 +227,7 @@ ListBasedConfiguration::ListBasedConfiguration( }); connect(_size_layout_select, QOverload::of(&QComboBox::currentTextChanged), [=](const QString& size_provider_name) { - auto size_o = _bind_core->sizeProviderMap()[size_provider_name]; + auto size_o = _bind_core->sizeProviderTypeMap()[size_provider_name]; auto size_ins = std::dynamic_pointer_cast(size_o->newDefault()); this->_bind_u->setSizeProvider(size_ins); @@ -237,12 +288,12 @@ void ListBasedConfiguration::currentAccept(std::shared_ptr inst_u, QSignalBlocker vx(_delegate_select); this->_bind_u = std::dynamic_pointer_cast(inst_u); _delegate_select->clear(); - _delegate_select->addItems(_bind_core->delegateAlias()); + _delegate_select->addItems(_bind_core->customDelegateAlias()); _delegate_select->setCurrentText(this->_bind_u->delegateInst()->aliasName()); QSignalBlocker vv(_size_layout_select); this->_size_layout_select->clear(); - this->_size_layout_select->addItems(_bind_core->sizeProviderMap().keys()); + this->_size_layout_select->addItems(_bind_core->sizeProviderTypeMap().keys()); this->_size_layout_select->setCurrentText(_bind_u->sizeProvider()->name()); if (this->_size_layout_select->currentText() == ConstNumberProvider::topic()) { _configs_stack->setCurrentIndex(0); @@ -323,7 +374,7 @@ void SingleBasedConfiguration::currentAccept(std::shared_ptr inst_u QSignalBlocker v(_delegate_changed); _delegate_changed->clear(); - _delegate_changed->addItems(_bind_core->delegateAlias()); + _delegate_changed->addItems(_bind_core->customDelegateAlias()); auto conv = std::dynamic_pointer_cast(inst_u); _delegate_changed->setCurrentText(conv->delegateInst()->aliasName()); @@ -343,3 +394,32 @@ void UnionBasedConfiguration::currentAccept(std::shared_ptr inst_u, { } + +UnitSelectDelegate::UnitSelectDelegate(std::shared_ptr ins) + : _kernel(ins) +{ + +} + +QWidget* UnitSelectDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const +{ + return new QComboBox(parent); +} + +void UnitSelectDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const +{ + auto combo = dynamic_cast(editor); + combo->addItems(_kernel->extractUnitTypeMap().keys()); + combo->setCurrentText(index.data(Qt::DisplayRole).toString()); +} + +void UnitSelectDelegate::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const +{ + auto combo = dynamic_cast(editor); + model->setData(index, combo->currentText(), Qt::EditRole); +} + +void UnitSelectDelegate::updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const +{ + editor->setGeometry(option.rect); +} diff --git a/TranslateUI/ExtractRuleView.h b/TranslateUI/ExtractRuleView.h index 5b0b1d6..dad5729 100644 --- a/TranslateUI/ExtractRuleView.h +++ b/TranslateUI/ExtractRuleView.h @@ -75,26 +75,41 @@ namespace unit_configurations { }; } +#include +class UnitSelectDelegate : public QStyledItemDelegate { +private: + std::shared_ptr _kernel; + +public: + UnitSelectDelegate(std::shared_ptr ins); + + virtual QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const override; + virtual void setEditorData(QWidget* editor, const QModelIndex& index) const override; + virtual void setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const override; + virtual void updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const override; +}; + class ExtractRuleView : public QWidget { private: + std::shared_ptr _basic_bind; + QTableView* const _member_units; QStandardItemModel* const _member_model; QStackedWidget* const _configs_stack; - std::shared_ptr _rule_base; - std::shared_ptr _base_bind; + std::shared_ptr _current_rule; std::shared_ptr _current_fields_cache = nullptr; public: - ExtractRuleView( - std::shared_ptr base, - std::shared_ptr inst_r, - QWidget* p = nullptr); + ExtractRuleView(std::shared_ptr base, + std::shared_ptr inst_r, QWidget* p = nullptr); void reload(); void appendUnit(); + void dataChanged(QStandardItem* item); + protected: void showEvent(QShowEvent* e) override; }; diff --git a/TranslateUI/TranslateBasic.cpp b/TranslateUI/TranslateBasic.cpp index ed9cb52..554befc 100644 --- a/TranslateUI/TranslateBasic.cpp +++ b/TranslateUI/TranslateBasic.cpp @@ -49,27 +49,27 @@ TranslateBasic::TranslateBasic() } -std::shared_ptr TranslateBasic::defaultExtractDelegateType() const +std::shared_ptr TranslateBasic::defaultExtractImplType() const { return _default_translate_rule; } -QHash> TranslateBasic::extractDelegateTypeMap() const +QHash> TranslateBasic::extractImplTypeMap() const { return _basic_extractor_types; } -std::shared_ptr TranslateBasic::defaultSizeProvider() const +std::shared_ptr TranslateBasic::defaultSizeProviderType() const { return _default_size_provider; } -std::shared_ptr TranslateBasic::defaultRuleMatch() const +std::shared_ptr TranslateBasic::defaultRuleMatchType() const { return _default_rule_match; } -void TranslateBasic::addDelegate(std::shared_ptr inst) +void TranslateBasic::addCustomDelegate(std::shared_ptr inst) { auto repeat_name_count = std::count_if( this->_custom_rule_types.begin(), this->_custom_rule_types.end(), @@ -91,7 +91,7 @@ void TranslateBasic::addDelegate(std::shared_ptr inst) this->_custom_rule_types << inst; } -void TranslateBasic::removeDelegate(const QString& typeAlias) +void TranslateBasic::removeCustomDelegate(const QString& typeAlias) { for (auto idxp = 0; idxp< this->_custom_rule_types.size(); idxp++) { auto rule = this->_custom_rule_types.at(idxp); @@ -104,7 +104,7 @@ void TranslateBasic::removeDelegate(const QString& typeAlias) throw new BaseException("指定RuleName不合法"); } -QList TranslateBasic::delegateAlias() const +QList TranslateBasic::customDelegateAlias() const { QList values; std::transform(_custom_rule_types.begin(), _custom_rule_types.end(), @@ -123,7 +123,7 @@ std::shared_ptr TranslateBasic::operator[](const QString& name) throw new BaseException(u8"指定Name不存在"); } -void TranslateBasic::replaceDelegate(const QString& name, std::shared_ptr inst) +void TranslateBasic::replaceCustomDelegate(const QString& name, std::shared_ptr inst) { for (auto idx = 0; _custom_rule_types.size(); ++idx) { auto rule_inst = _custom_rule_types.at(idx); @@ -136,12 +136,12 @@ void TranslateBasic::replaceDelegate(const QString& name, std::shared_ptr> TranslateBasic::sizeProviderMap() const +QHash> TranslateBasic::sizeProviderTypeMap() const { return _size_provider_types; } -QHash> TranslateBasic::ruleMatchMap() const +QHash> TranslateBasic::ruleMatchTypeMap() const { return _rule_match_types; } diff --git a/TranslateUI/TranslateBasic.h b/TranslateUI/TranslateBasic.h index a68b9ae..f236a75 100644 --- a/TranslateUI/TranslateBasic.h +++ b/TranslateUI/TranslateBasic.h @@ -130,19 +130,19 @@ private: public: TranslateBasic(); - std::shared_ptr defaultExtractDelegateType() const; - QHash> extractDelegateTypeMap() const; - std::shared_ptr defaultSizeProvider() const; - QHash> sizeProviderMap() const; - std::shared_ptr defaultRuleMatch() const; - QHash> ruleMatchMap() const; + std::shared_ptr defaultExtractImplType() const; + QHash> extractImplTypeMap() const; + std::shared_ptr defaultSizeProviderType() const; + QHash> sizeProviderTypeMap() const; + std::shared_ptr defaultRuleMatchType() const; + QHash> ruleMatchTypeMap() const; std::shared_ptr defaultExtractUnitType() const; QHash> extractUnitTypeMap() const; - void addDelegate(std::shared_ptr inst); - void removeDelegate(const QString& alias); - void replaceDelegate(const QString &name, std::shared_ptr inst); - QList delegateAlias() const; + void addCustomDelegate(std::shared_ptr inst); + void removeCustomDelegate(const QString& alias); + void replaceCustomDelegate(const QString &name, std::shared_ptr inst); + QList customDelegateAlias() const; std::shared_ptr operator[](const QString &name) const; }; diff --git a/TranslateUI/WrapConfigs.cpp b/TranslateUI/WrapConfigs.cpp index b4caba8..13c3e50 100644 --- a/TranslateUI/WrapConfigs.cpp +++ b/TranslateUI/WrapConfigs.cpp @@ -53,7 +53,7 @@ WrapConfigs::WrapConfigs(std::shared_ptr _base, QWidget* p) if (!idx.isValid()) return; - auto alias_key = _bind_base->delegateAlias()[idx.row()]; + auto alias_key = _bind_base->customDelegateAlias()[idx.row()]; auto delt_inst = _bind_base->operator[](alias_key); switch (delt_inst->outType()) { case DataType::Flt32: @@ -89,7 +89,7 @@ void WrapConfigs::aliasReload() auto row_cnt = _alias_model->rowCount(); _alias_model->removeRows(0, row_cnt); - auto alias_keys = _bind_base->delegateAlias(); + auto alias_keys = _bind_base->customDelegateAlias(); for (auto key_nm : alias_keys) { QList row; @@ -125,15 +125,15 @@ void WrapConfigs::aliasAppend() if (name == "") return; - auto exists = _bind_base->delegateAlias(); + auto exists = _bind_base->customDelegateAlias(); while (exists.contains(name)) name += "#"; - auto ins = _bind_base->defaultExtractDelegateType()->newDefault(); + auto ins = _bind_base->defaultExtractImplType()->newDefault(); auto nins = std::dynamic_pointer_cast(ins); nins->setAlias(name); - _bind_base->addDelegate(nins); + _bind_base->addCustomDelegate(nins); aliasReload(); } @@ -143,8 +143,8 @@ void WrapConfigs::aliasRemove() if (!index.isValid()) return; - auto origin_key = _bind_base->delegateAlias()[index.row()]; - _bind_base->removeDelegate(origin_key); + auto origin_key = _bind_base->customDelegateAlias()[index.row()]; + _bind_base->removeCustomDelegate(origin_key); aliasReload(); } @@ -154,7 +154,7 @@ void WrapConfigs::dataChanged(QStandardItem* cell) switch (cell->column()) { case 0: { // 修改alias-name auto cell_name = cell->text(); - auto total_alias_set = _bind_base->delegateAlias(); + auto total_alias_set = _bind_base->customDelegateAlias(); auto origin_key = total_alias_set.at(cell->row()); auto appoint_unit = _bind_base->operator[](origin_key); @@ -169,14 +169,14 @@ void WrapConfigs::dataChanged(QStandardItem* cell) appoint_unit->setAlias(cell_name); }break; case 1: { // 修改alias基础类型 - auto total_alias_set = _bind_base->delegateAlias(); + auto total_alias_set = _bind_base->customDelegateAlias(); auto origin_key = total_alias_set.at(cell->row()); auto new_type = cell->text(); - auto new_ins = _bind_base->extractDelegateTypeMap()[new_type]->newDefault(); + auto new_ins = _bind_base->extractImplTypeMap()[new_type]->newDefault(); auto new_delegate = std::dynamic_pointer_cast(new_ins); new_delegate->setAlias(origin_key); - _bind_base->replaceDelegate(origin_key, new_delegate); + _bind_base->replaceCustomDelegate(origin_key, new_delegate); }break; default: break; @@ -197,7 +197,7 @@ QWidget* RuleSelectDelegate::createEditor(QWidget* parent, const QStyleOptionVie void RuleSelectDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const { - auto rule_names = this->_kernel->extractDelegateTypeMap().keys(); + auto rule_names = this->_kernel->extractImplTypeMap().keys(); std::sort(rule_names.begin(), rule_names.end()); auto combo = dynamic_cast(editor); diff --git a/TranslateUI/WrapConfigs.h b/TranslateUI/WrapConfigs.h index 043392d..050e0ae 100644 --- a/TranslateUI/WrapConfigs.h +++ b/TranslateUI/WrapConfigs.h @@ -12,7 +12,6 @@ /// 翻译规则编辑代理 /// class RuleSelectDelegate : public QStyledItemDelegate { - Q_OBJECT private: std::shared_ptr _kernel; diff --git a/TranslateUI/extract_basic.cpp b/TranslateUI/extract_basic.cpp index 193022f..4c41963 100644 --- a/TranslateUI/extract_basic.cpp +++ b/TranslateUI/extract_basic.cpp @@ -643,7 +643,7 @@ void ListBasedUnit::loadFrom(std::shared_ptr core, const QJsonOb OBJECT_PEAK(provider_obj, obj); OBJECT_PEAK(delegate_obj, obj); - auto ins_size = core->sizeProviderMap()[provider_name]->newDefault(); + auto ins_size = core->sizeProviderTypeMap()[provider_name]->newDefault(); ins_size->loadFrom(core, provider_obj); auto ins_delt = core->operator[](delegate_name)->newDefault(); ins_delt->loadFrom(core, delegate_obj); @@ -771,7 +771,7 @@ void UnionBasedUnit::loadFrom(std::shared_ptr core, const QJsonO QString match_type; STRING_PEAK(match_type, rule_obj); - auto ninst = core->ruleMatchMap()[match_type]->newDefault(); + auto ninst = core->ruleMatchTypeMap()[match_type]->newDefault(); QJsonObject content_obj; OBJECT_PEAK(content_obj, rule_obj); ninst->loadFrom(core, content_obj);