diff --git a/TranslateUI/ExtractRuleView.cpp b/TranslateUI/ExtractRuleView.cpp index 7020e04..decf1e2 100644 --- a/TranslateUI/ExtractRuleView.cpp +++ b/TranslateUI/ExtractRuleView.cpp @@ -22,7 +22,7 @@ ExtractRuleView::ExtractRuleView(std::shared_ptr base, std::shared_ptr inst_r, QWidget* p /*= nullptr*/) : QWidget(p), _current_rule(inst_r), _basic_bind(base), _member_units(new QTableView(this)), - _member_model(new QStandardItemModel(this)), + _members_model(new QStandardItemModel(this)), _configs_stack(new QStackedWidget(this)) { this->_current_fields_cache = std::make_shared("", nullptr); @@ -65,17 +65,22 @@ ExtractRuleView::ExtractRuleView(std::shared_ptr base, } else if (unit->baseType() == UnionBasedUnit::topic()) { _configs_stack->setCurrentIndex(3); - union_configs->currentAccept(unit, target); + FieldManagerLayer::__Private::fields_map.clear(); + _current_fields_cache = std::make_shared("{self}"); + this->_current_rule->registSubField(_current_fields_cache); + auto current_field = this->_current_rule->operator[](target.row()); + _current_fields_cache->bindCurrent(current_field->name()); + union_configs->currentAccept(unit, target, _current_fields_cache); } else { _configs_stack->setCurrentIndex(0); } }); - _member_units->setModel(_member_model); - connect(_member_model, &QStandardItemModel::itemChanged, this, &ExtractRuleView::dataChanged); + _member_units->setModel(_members_model); + connect(_members_model, &QStandardItemModel::itemChanged, this, &ExtractRuleView::dataChanged); _member_units->setItemDelegateForColumn(2, new UnitSelectDelegate(_basic_bind)); - _member_model->setHorizontalHeaderLabels(QStringList() << "FieldName" << "OffsetSpan" << "UnitType"); + _members_model->setHorizontalHeaderLabels(QStringList() << "FieldName" << "OffsetSpan" << "UnitType"); _member_units->setContextMenuPolicy(Qt::CustomContextMenu); connect(_member_units, &QTableView::customContextMenuRequested, [=](const QPoint& pt) { QMenu m; @@ -86,8 +91,8 @@ ExtractRuleView::ExtractRuleView(std::shared_ptr base, void ExtractRuleView::reload() { - auto cnt = _member_model->rowCount(); - _member_model->removeRows(0, cnt); + auto cnt = _members_model->rowCount(); + _members_model->removeRows(0, cnt); auto list = _current_rule->fieldNames(); for (auto key : list) { @@ -97,7 +102,7 @@ void ExtractRuleView::reload() row << new QStandardItem(QString("%1 bytes").arg(field_mbr->offsetSpan())); row.last()->setEditable(false); row << new QStandardItem(field_mbr->baseType()); - _member_model->appendRow(row); + _members_model->appendRow(row); } _member_units->resizeColumnsToContents(); } @@ -421,12 +426,68 @@ void SingleBasedConfiguration::currentAccept(std::shared_ptr inst_u )); } +#include UnionBasedConfiguration::UnionBasedConfiguration(std::shared_ptr core, QWidget* p /*= nullptr*/) + : QWidget(p), + _offset_enter(new QSpinBox(this)), + _size_input(new QSpinBox(this)), + _context_present(new QTextEdit(this)), + _match_select(new QComboBox(this)), + _delegate_select(new QComboBox(this)), + _members_present(new QTableView(this)), + _members_model(new QStandardItemModel(this)), + _intfield_bind(new QComboBox(this)), + _compare_op(new QComboBox(this)), + _value_enters(new QSpinBox(this)) { + _members_present->setModel(_members_model); + auto layout = new QGridLayout(this); + layout->addWidget(new QLabel(tr("OffsetSpan:")), 0, 0); + layout->addWidget(_offset_enter, 0, 1, 1, 2); + layout->addWidget(new QLabel(tr("SizeConst:")), 1, 0); + layout->addWidget(_size_input, 1, 1, 1, 2); + + // ==================================================== + auto tabw = new QTabWidget(this); + layout->addWidget(tabw, 2, 0, 3, 3); + tabw->addTab(_context_present, tr("Unit")); + layout->setColumnStretch(1, 1); + + // ===================================================== + auto custom_panel = new QWidget(this); + tabw->addTab(custom_panel, tr("Members")); + auto cust_layout = new QGridLayout(custom_panel); + cust_layout->addWidget(_members_present, 0, 0, 3, 3); + cust_layout->addWidget(new QPushButton(tr("AppendNew")), 3, 1); + cust_layout->addWidget(new QPushButton(tr("Delete")), 3, 2); + cust_layout->addWidget(new QLabel(tr("MatchType:")), 4, 0); + cust_layout->addWidget(_match_select, 4, 1, 1, 2); + cust_layout->addWidget(new QLabel(tr("Delegate:")), 5, 0); + cust_layout->addWidget(_delegate_select, 5, 1, 1, 2); + auto toolbox = new QStackedWidget(this); + cust_layout->addWidget(toolbox, 6, 0, 3, 3); + + auto panelx = new QWidget(this); + toolbox->addWidget(panelx); + auto gpanelx = new QGridLayout(panelx); + gpanelx->addWidget(new QLabel(tr("BindField:")), 0, 0); + gpanelx->addWidget(_intfield_bind, 0, 1, 1, 2); + gpanelx->addWidget(new QLabel(tr("Operator:")), 1, 0); + gpanelx->addWidget(_compare_op, 1, 1, 1, 2); + gpanelx->addWidget(new QLabel(tr("Value:")), 2, 0); + gpanelx->addWidget(_value_enters, 2, 1, 1, 2); + gpanelx->setColumnStretch(1, 1); + gpanelx->setColumnStretch(2, 1); + gpanelx->setMargin(0); + + cust_layout->setRowStretch(1, 1); + cust_layout->setColumnStretch(1, 1); + cust_layout->setColumnStretch(2, 1); } -void UnionBasedConfiguration::currentAccept(std::shared_ptr inst_u, const QModelIndex& idx) +void UnionBasedConfiguration::currentAccept(std::shared_ptr inst_u, + const QModelIndex& idx, std::shared_ptr get) { } diff --git a/TranslateUI/ExtractRuleView.h b/TranslateUI/ExtractRuleView.h index dad5729..9fae2f1 100644 --- a/TranslateUI/ExtractRuleView.h +++ b/TranslateUI/ExtractRuleView.h @@ -66,9 +66,24 @@ namespace unit_configurations { class UnionBasedConfiguration : public QWidget { Q_OBJECT + private: + QSpinBox* const _offset_enter; // 偏移 + QSpinBox* const _size_input; // 尺寸输入 + QTextEdit* const _context_present; // 内容展示 + + QComboBox* const _match_select; // 匹配类型 + QComboBox* const _delegate_select; // 解析代理类型 + QTableView* const _members_present;// 成员代理类型 + QStandardItemModel* const _members_model; + + QComboBox* const _intfield_bind; + QComboBox* const _compare_op; + QSpinBox* const _value_enters; + public: UnionBasedConfiguration(std::shared_ptr core, QWidget* p = nullptr); - void currentAccept(std::shared_ptr inst_u, const QModelIndex& idx); + void currentAccept(std::shared_ptr inst_u, + const QModelIndex& idx, std::shared_ptr get); signals: void reloadRequest(); @@ -95,7 +110,7 @@ private: std::shared_ptr _basic_bind; QTableView* const _member_units; - QStandardItemModel* const _member_model; + QStandardItemModel* const _members_model; QStackedWidget* const _configs_stack; std::shared_ptr _current_rule;