切换Union配置面板

This commit is contained in:
codeboss 2025-08-23 22:07:47 +08:00
parent bc916dcd99
commit 2a10596532
2 changed files with 87 additions and 11 deletions

View File

@ -22,7 +22,7 @@ ExtractRuleView::ExtractRuleView(std::shared_ptr<TranslateBasic> base,
std::shared_ptr<extract::AsRuleSet> inst_r, QWidget* p /*= nullptr*/) std::shared_ptr<extract::AsRuleSet> inst_r, QWidget* p /*= nullptr*/)
: QWidget(p), _current_rule(inst_r), _basic_bind(base), : QWidget(p), _current_rule(inst_r), _basic_bind(base),
_member_units(new QTableView(this)), _member_units(new QTableView(this)),
_member_model(new QStandardItemModel(this)), _members_model(new QStandardItemModel(this)),
_configs_stack(new QStackedWidget(this)) _configs_stack(new QStackedWidget(this))
{ {
this->_current_fields_cache = std::make_shared<FieldManagerLayer>("", nullptr); this->_current_fields_cache = std::make_shared<FieldManagerLayer>("", nullptr);
@ -65,17 +65,22 @@ ExtractRuleView::ExtractRuleView(std::shared_ptr<TranslateBasic> base,
} }
else if (unit->baseType() == UnionBasedUnit::topic()) { else if (unit->baseType() == UnionBasedUnit::topic()) {
_configs_stack->setCurrentIndex(3); _configs_stack->setCurrentIndex(3);
union_configs->currentAccept(unit, target); FieldManagerLayer::__Private::fields_map.clear();
_current_fields_cache = std::make_shared<FieldManagerLayer>("{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 { else {
_configs_stack->setCurrentIndex(0); _configs_stack->setCurrentIndex(0);
} }
}); });
_member_units->setModel(_member_model); _member_units->setModel(_members_model);
connect(_member_model, &QStandardItemModel::itemChanged, this, &ExtractRuleView::dataChanged); connect(_members_model, &QStandardItemModel::itemChanged, this, &ExtractRuleView::dataChanged);
_member_units->setItemDelegateForColumn(2, new UnitSelectDelegate(_basic_bind)); _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); _member_units->setContextMenuPolicy(Qt::CustomContextMenu);
connect(_member_units, &QTableView::customContextMenuRequested, [=](const QPoint& pt) { connect(_member_units, &QTableView::customContextMenuRequested, [=](const QPoint& pt) {
QMenu m; QMenu m;
@ -86,8 +91,8 @@ ExtractRuleView::ExtractRuleView(std::shared_ptr<TranslateBasic> base,
void ExtractRuleView::reload() void ExtractRuleView::reload()
{ {
auto cnt = _member_model->rowCount(); auto cnt = _members_model->rowCount();
_member_model->removeRows(0, cnt); _members_model->removeRows(0, cnt);
auto list = _current_rule->fieldNames(); auto list = _current_rule->fieldNames();
for (auto key : list) { for (auto key : list) {
@ -97,7 +102,7 @@ void ExtractRuleView::reload()
row << new QStandardItem(QString("%1 bytes").arg(field_mbr->offsetSpan())); row << new QStandardItem(QString("%1 bytes").arg(field_mbr->offsetSpan()));
row.last()->setEditable(false); row.last()->setEditable(false);
row << new QStandardItem(field_mbr->baseType()); row << new QStandardItem(field_mbr->baseType());
_member_model->appendRow(row); _members_model->appendRow(row);
} }
_member_units->resizeColumnsToContents(); _member_units->resizeColumnsToContents();
} }
@ -421,12 +426,68 @@ void SingleBasedConfiguration::currentAccept(std::shared_ptr<ExtractUnit> inst_u
)); ));
} }
#include <QToolBox>
UnionBasedConfiguration::UnionBasedConfiguration(std::shared_ptr<TranslateBasic> core, QWidget* p /*= nullptr*/) UnionBasedConfiguration::UnionBasedConfiguration(std::shared_ptr<TranslateBasic> 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<ExtractUnit> inst_u, const QModelIndex& idx) void UnionBasedConfiguration::currentAccept(std::shared_ptr<ExtractUnit> inst_u,
const QModelIndex& idx, std::shared_ptr<ScopeFieldsGetter> get)
{ {
} }

View File

@ -66,9 +66,24 @@ namespace unit_configurations {
class UnionBasedConfiguration : public QWidget { class UnionBasedConfiguration : public QWidget {
Q_OBJECT 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: public:
UnionBasedConfiguration(std::shared_ptr<TranslateBasic> core, QWidget* p = nullptr); UnionBasedConfiguration(std::shared_ptr<TranslateBasic> core, QWidget* p = nullptr);
void currentAccept(std::shared_ptr<ExtractUnit> inst_u, const QModelIndex& idx); void currentAccept(std::shared_ptr<ExtractUnit> inst_u,
const QModelIndex& idx, std::shared_ptr<ScopeFieldsGetter> get);
signals: signals:
void reloadRequest(); void reloadRequest();
@ -95,7 +110,7 @@ private:
std::shared_ptr<TranslateBasic> _basic_bind; std::shared_ptr<TranslateBasic> _basic_bind;
QTableView* const _member_units; QTableView* const _member_units;
QStandardItemModel* const _member_model; QStandardItemModel* const _members_model;
QStackedWidget* const _configs_stack; QStackedWidget* const _configs_stack;
std::shared_ptr<extract::AsRuleSet> _current_rule; std::shared_ptr<extract::AsRuleSet> _current_rule;