完善FieldManagerLayout筛选机制

This commit is contained in:
codeboss 2025-08-12 23:02:35 +08:00
parent fb4f468520
commit a20e36294b
3 changed files with 36 additions and 20 deletions

View File

@ -53,7 +53,11 @@ ExtractRuleView::ExtractRuleView(std::shared_ptr<TranslateBasic> base,
}
else if (unit->baseType() == ListBasedUnit::topic()) {
_configs_stack->setCurrentIndex(2);
list_configs->currentAccept(unit, target);
_current_fields_cache = std::make_shared<FieldManagerLayer>("{self}");
this->_rule_base->registSubField(_current_fields_cache);
auto current_field = this->_rule_base->operator[](target.row());
_current_fields_cache->bindCurrent(current_field->name());
list_configs->currentAccept(unit, target, _current_fields_cache);
}
else if (unit->baseType() == UnionBasedUnit::topic()) {
_configs_stack->setCurrentIndex(3);
@ -188,7 +192,13 @@ ListBasedConfiguration::ListBasedConfiguration(
s.unblock();
auto fields_map = _fields_getter->prevFields();
for (auto field_name : fields_map.keys()) {
_prev_field_refer->addItem(field_name, (int)fields_map[field_name]);
switch (fields_map[field_name]) {
case DataType::Integer:
case DataType::Unsigned:
_prev_field_refer->addItem(field_name);
default:
break;
}
}
}
@ -246,9 +256,15 @@ void ListBasedConfiguration::currentAccept(std::shared_ptr<ExtractUnit> inst_u,
auto size_rt = std::dynamic_pointer_cast<InterpretedNumberPrivider>(_bind_u->sizeProvider());
QSignalBlocker s(_prev_field_refer);
_prev_field_refer->clear();
auto fields_map = get->prevFields();
auto fields_map = _fields_getter->prevFields();
for (auto field_name : fields_map.keys()) {
_prev_field_refer->addItem(field_name, (int)fields_map[field_name]);
switch (fields_map[field_name]) {
case DataType::Integer:
case DataType::Unsigned:
_prev_field_refer->addItem(field_name);
default:
break;
}
}
_prev_field_refer->setCurrentText(size_rt->expression());

View File

@ -296,10 +296,10 @@ QVariant ValueAccessContext::get(const QString& unique_key) const
bool FieldManagerLayer::bindCurrent(const QString& unique_key)
{
for (auto index = 0; index < __Private::_fields_map.size(); ++index) {
auto pair = __Private::_fields_map[index];
for (auto index = 0; index < __Private::fields_map.size(); ++index) {
auto pair = __Private::fields_map[index];
if (pair.first == unique_key) {
__Private::_fields_map = __Private::_fields_map.mid(0, index);
__Private::fields_map = __Private::fields_map.mid(0, index);
return true;
}
}
@ -309,7 +309,7 @@ bool FieldManagerLayer::bindCurrent(const QString& unique_key)
QHash<QString, DataType> FieldManagerLayer::prevFields() const
{
QHash<QString, DataType> fields;
for (auto pair : __Private::_fields_map)
for (auto pair : __Private::fields_map)
fields[pair.first] = pair.second;
return fields;
@ -317,26 +317,26 @@ QHash<QString, DataType> FieldManagerLayer::prevFields() const
void FieldManagerLayer::clear()
{
__Private::_fields_map.clear();
__Private::fields_map.clear();
}
FieldManagerLayer::FieldManagerLayer(const QString& self, std::shared_ptr<ScopeFieldsSetter> instp)
{
_setter._rule_name = self;
_setter._parent_setter = instp;
_setter.rule_name = self;
_setter.parent_setter = instp;
}
#include <stdexcept>
void FieldManagerLayer::setField(const QString& fieldName, DataType type)
{
if (_setter._parent_setter)
_setter._parent_setter->setField(QString("%1.%2").arg(_setter._rule_name, fieldName), type);
if (_setter.parent_setter)
_setter.parent_setter->setField(QString("%1.%2").arg(_setter.rule_name, fieldName), type);
else {
for (auto pair : __Private::_fields_map) {
for (auto pair : __Private::fields_map) {
if (pair.first == fieldName)
throw new std::invalid_argument("×Ö¶ÎÃû³ÆÖظ´");
}
__Private::_fields_map << std::make_pair(fieldName, type);
__Private::fields_map << std::make_pair(fieldName, type);
}
}
QList<std::pair<QString, DataType>> FieldManagerLayer::__Private::_fields_map;
QList<std::pair<QString, DataType>> FieldManagerLayer::__Private::fields_map;

View File

@ -225,9 +225,9 @@ public:
class FieldManagerLayer : public ScopeFieldsSetter, public ScopeFieldsGetter {
public:
struct __Private {
QString _rule_name;
std::shared_ptr<ScopeFieldsSetter> _parent_setter = nullptr;
static QList<std::pair<QString, DataType>> _fields_map;
QString rule_name;
std::shared_ptr<ScopeFieldsSetter> parent_setter = nullptr;
static QList<std::pair<QString, DataType>> fields_map;
}_setter;
@ -236,7 +236,7 @@ public:
void clear() override;
public:
FieldManagerLayer(const QString& self, std::shared_ptr<ScopeFieldsSetter> instp);
FieldManagerLayer(const QString& self, std::shared_ptr<ScopeFieldsSetter> instp = nullptr);
void setField(const QString& typeAlias, DataType type) override;
};