SingleBaseUnit配置

This commit is contained in:
codeboss 2025-08-11 22:11:20 +08:00
parent 6670a333c2
commit 7a9ae2812c
9 changed files with 188 additions and 23 deletions

View File

@ -5,19 +5,22 @@
#include <QGridLayout> #include <QGridLayout>
#include <QLabel> #include <QLabel>
#include <QComboBox> #include <QComboBox>
#include <QJsonDocument>
#include <QPushButton> #include <QPushButton>
#include <QSplitter> #include <QSplitter>
#include <QGroupBox> #include <QGroupBox>
#include <QTabWidget> #include <QTabWidget>
#include <QTextCodec> #include <QTextCodec>
#include <QMenu>
#include <QHeaderView> #include <QHeaderView>
using namespace unit_configurations; using namespace unit_configurations;
using namespace size_provider; using namespace size_provider;
using namespace extract;
ExtractRuleView::ExtractRuleView(std::shared_ptr<TranslateBasic> base, 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), _rule_base(inst_r), : QWidget(p), _rule_base(inst_r), _base_bind(base),
_member_units(new QTableView(this)), _member_units(new QTableView(this)),
_member_model(new QStandardItemModel(this)), _member_model(new QStandardItemModel(this)),
_configs_stack(new QStackedWidget(this)) _configs_stack(new QStackedWidget(this))
@ -33,8 +36,81 @@ ExtractRuleView::ExtractRuleView(std::shared_ptr<TranslateBasic> base,
_configs_stack->addWidget(new configurations::EmptyConfiguration(this)); _configs_stack->addWidget(new configurations::EmptyConfiguration(this));
auto single_configs = new SingleBasedConfiguration(base, this); auto single_configs = new SingleBasedConfiguration(base, this);
_configs_stack->addWidget(single_configs);
auto list_configs = new ListBasedConfiguration(base, this); auto list_configs = new ListBasedConfiguration(base, this);
_configs_stack->addWidget(list_configs);
auto union_configs = new UnionBasedConfiguration(base, this); auto union_configs = new UnionBasedConfiguration(base, this);
_configs_stack->addWidget(union_configs);
connect(_member_units, &QTableView::clicked, [=](const QModelIndex& target) {
if (!target.isValid())
return;
auto unit = _rule_base->operator[](target.row());
if (unit->baseType() == SingleBasedUnit::topic()) {
_configs_stack->setCurrentIndex(1);
single_configs->currentAccept(unit, target);
}
else {
_configs_stack->setCurrentIndex(0);
}
});
_member_units->setModel(_member_model);
_member_model->setHorizontalHeaderLabels(QStringList() << "FieldName" << "OffsetSpan"<< "UnitType" );
_member_units->setContextMenuPolicy(Qt::CustomContextMenu);
connect(_member_units, &QTableView::customContextMenuRequested, [=](const QPoint& pt) {
QMenu m;
m.addAction("Append Unit", this, &ExtractRuleView::appendUnit);
m.exec(_member_units->mapToGlobal(pt));
});
}
void ExtractRuleView::reload()
{
auto cnt = _member_model->rowCount();
_member_model->removeRows(0, cnt);
auto list = _rule_base->fieldNames();
for (auto key : list) {
auto field_mbr = _rule_base->operator[](key);
QList<QStandardItem*> row;
row << new QStandardItem(field_mbr->name());
row << new QStandardItem(QString("%1").arg(field_mbr->offsetSpan()));
row.last()->setEditable(false);
row << new QStandardItem(field_mbr->baseType());
_member_model->appendRow(row);
}
_member_units->resizeColumnsToContents();
}
#include <QInputDialog>
void ExtractRuleView::appendUnit()
{
auto name_u = QInputDialog::getText(this, "FieldName Enter", "Name");
if (name_u == "")
return;
auto inst_u = _base_bind->defaultExtractUnitType()->newDefault();
auto new_unit = std::dynamic_pointer_cast<SingleBasedUnit>(inst_u);
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();
QJsonObject content;
delt_o->saveTo(content);
delt_u->loadFrom(_base_bind, content);
new_unit->setDelegate(std::dynamic_pointer_cast<ExtractDelegate>(delt_u));
this->_rule_base->append(new_unit);
reload();
}
void ExtractRuleView::showEvent(QShowEvent* e)
{
QWidget::showEvent(e);
reload();
} }
ListBasedConfiguration::ListBasedConfiguration( ListBasedConfiguration::ListBasedConfiguration(
@ -62,9 +138,56 @@ ListBasedConfiguration::ListBasedConfiguration(
layout->setColumnStretch(1, 1); layout->setColumnStretch(1, 1);
} }
SingleBasedConfiguration::SingleBasedConfiguration(std::shared_ptr<TranslateBasic> core, QWidget* p /*= nullptr*/)
{
SingleBasedConfiguration::SingleBasedConfiguration(std::shared_ptr<TranslateBasic> core, QWidget* p /*= nullptr*/)
: QWidget(p), _bind_core(core),
_offset_enter(new QSpinBox(this)),
_delegate_changed(new QComboBox(this)),
_delegate_sync(new QPushButton("Sync", this)),
_content_display(new QTextBrowser(this))
{
auto layout = new QGridLayout(this);
layout->addWidget(new QLabel("Offset:", this), 0, 0);
layout->addWidget(this->_offset_enter, 0, 1);
layout->addWidget(this->_delegate_sync, 0, 2);
layout->addWidget(new QLabel("Delegate:", this), 1, 0);
layout->addWidget(this->_delegate_changed, 1, 1, 1, 2);
layout->addWidget(this->_content_display, 2, 0, 3, 3);
layout->setColumnStretch(1, 1);
connect(this->_offset_enter, QOverload<int>::of(&QSpinBox::valueChanged),
[=](int v_offset) {
inst_current->setOffsetSpan(v_offset);
emit this->reloadRequest();
});
connect(this->_delegate_changed, QOverload<const QString&>::of(&QComboBox::currentTextChanged),
[=](const QString& current_alias) {
auto vinst = _bind_core->operator[](current_alias)->newDefault();
inst_current->setDelegate(std::dynamic_pointer_cast<ExtractDelegate>(vinst));
emit this->reloadRequest();
});
}
void SingleBasedConfiguration::currentAccept(std::shared_ptr<ExtractUnit> inst_u, const QModelIndex& idx)
{
inst_current = std::dynamic_pointer_cast<SingleBasedUnit>(inst_u);
idx_current = idx;
QSignalBlocker b(_offset_enter);
_offset_enter->setRange(0, INT_MAX);
_offset_enter->setValue(inst_u->offsetSpan());
QSignalBlocker v(_delegate_changed);
_delegate_changed->clear();
_delegate_changed->addItems(_bind_core->delegateAlias());
auto conv = std::dynamic_pointer_cast<SingleBasedUnit>(inst_u);
_delegate_changed->setCurrentText(conv->delegateInst()->aliasName());
QJsonObject contents;
inst_u->saveTo(contents);
this->_content_display->setPlainText(QString::fromUtf8(
QJsonDocument(contents).toJson()
));
} }
UnionBasedConfiguration::UnionBasedConfiguration(std::shared_ptr<TranslateBasic> core, QWidget* p /*= nullptr*/) UnionBasedConfiguration::UnionBasedConfiguration(std::shared_ptr<TranslateBasic> core, QWidget* p /*= nullptr*/)

View File

@ -6,14 +6,35 @@
#include <QLineEdit> #include <QLineEdit>
#include <QStackedWidget> #include <QStackedWidget>
#include <QSpinBox> #include <QSpinBox>
#include <QPushButton>
#include <QCheckBox> #include <QCheckBox>
#include <QTextBrowser>
#include "extract_basic.h" #include "extract_basic.h"
#include "TranslateBasic.h" #include "TranslateBasic.h"
namespace extract {
class SingleBasedUnit;
}
namespace unit_configurations { namespace unit_configurations {
class SingleBasedConfiguration : public QWidget { class SingleBasedConfiguration : public QWidget {
Q_OBJECT
private:
std::shared_ptr<TranslateBasic> _bind_core;
QSpinBox* const _offset_enter;
QComboBox* const _delegate_changed;
QPushButton* const _delegate_sync;
QTextBrowser* const _content_display;
std::shared_ptr<extract::SingleBasedUnit> inst_current = nullptr;
QModelIndex idx_current;
public: public:
SingleBasedConfiguration(std::shared_ptr<TranslateBasic> core, QWidget* p = nullptr); SingleBasedConfiguration(std::shared_ptr<TranslateBasic> core, QWidget* p = nullptr);
void currentAccept(std::shared_ptr<ExtractUnit> inst_u, const QModelIndex& idx);
signals:
void reloadRequest();
}; };
/// <summary> /// <summary>
@ -46,15 +67,24 @@ namespace unit_configurations {
class ExtractRuleView : public QWidget class ExtractRuleView : public QWidget
{ {
private: private:
QTableView *const _member_units; QTableView* const _member_units;
QStandardItemModel *const _member_model; QStandardItemModel* const _member_model;
QStackedWidget* const _configs_stack; QStackedWidget* const _configs_stack;
std::shared_ptr<extract::AsRuleSet> _rule_base; std::shared_ptr<extract::AsRuleSet> _rule_base;
std::shared_ptr<TranslateBasic> _base_bind;
std::shared_ptr<FieldManagerLayer> _current_fields_cache = nullptr; std::shared_ptr<FieldManagerLayer> _current_fields_cache = nullptr;
public: public:
ExtractRuleView(std::shared_ptr<TranslateBasic> base, ExtractRuleView(
std::shared_ptr<extract::AsRuleSet> inst_r, QWidget* p = nullptr); std::shared_ptr<TranslateBasic> base,
std::shared_ptr<extract::AsRuleSet> inst_r,
QWidget* p = nullptr);
void reload();
void appendUnit();
protected:
void showEvent(QShowEvent *e) override;
}; };

View File

@ -49,12 +49,12 @@ TranslateBasic::TranslateBasic()
} }
std::shared_ptr<ExtractDelegate> TranslateBasic::defaultExtractDelegate() const std::shared_ptr<ExtractDelegate> TranslateBasic::defaultExtractDelegateType() const
{ {
return _default_translate_rule; return _default_translate_rule;
} }
QHash<QString, std::shared_ptr<ExtractDelegate>> TranslateBasic::extractorMap() const QHash<QString, std::shared_ptr<ExtractDelegate>> TranslateBasic::extractDelegateTypeMap() const
{ {
return _basic_extractor_types; return _basic_extractor_types;
} }
@ -146,12 +146,12 @@ QHash<QString, std::shared_ptr<RuleMatch>> TranslateBasic::ruleMatchMap() const
return _rule_match_types; return _rule_match_types;
} }
std::shared_ptr<ExtractUnit> TranslateBasic::defaultExtractUnit() const std::shared_ptr<ExtractUnit> TranslateBasic::defaultExtractUnitType() const
{ {
return _default_process_unit; return _default_process_unit;
} }
QHash<QString, std::shared_ptr<ExtractUnit>> TranslateBasic::extractUnitMap() const QHash<QString, std::shared_ptr<ExtractUnit>> TranslateBasic::extractUnitTypeMap() const
{ {
return _process_unit_types; return _process_unit_types;
} }

View File

@ -130,14 +130,14 @@ private:
public: public:
TranslateBasic(); TranslateBasic();
std::shared_ptr<ExtractDelegate> defaultExtractDelegate() const; std::shared_ptr<ExtractDelegate> defaultExtractDelegateType() const;
QHash<QString, std::shared_ptr<ExtractDelegate>> extractorMap() const; QHash<QString, std::shared_ptr<ExtractDelegate>> extractDelegateTypeMap() const;
std::shared_ptr<SizeProvider> defaultSizeProvider() const; std::shared_ptr<SizeProvider> defaultSizeProvider() const;
QHash<QString, std::shared_ptr<SizeProvider>> sizeProviderMap() const; QHash<QString, std::shared_ptr<SizeProvider>> sizeProviderMap() const;
std::shared_ptr<RuleMatch> defaultRuleMatch() const; std::shared_ptr<RuleMatch> defaultRuleMatch() const;
QHash<QString, std::shared_ptr<RuleMatch>> ruleMatchMap() const; QHash<QString, std::shared_ptr<RuleMatch>> ruleMatchMap() const;
std::shared_ptr<ExtractUnit> defaultExtractUnit() const; std::shared_ptr<ExtractUnit> defaultExtractUnitType() const;
QHash<QString, std::shared_ptr<ExtractUnit>> extractUnitMap() const; QHash<QString, std::shared_ptr<ExtractUnit>> extractUnitTypeMap() const;
void addDelegate(std::shared_ptr<ExtractDelegate> inst); void addDelegate(std::shared_ptr<ExtractDelegate> inst);
void removeDelegate(const QString& alias); void removeDelegate(const QString& alias);

View File

@ -7,7 +7,7 @@
using namespace configurations; using namespace configurations;
WrapConfigs::WrapConfigs(std::shared_ptr<TranslateBasic> _base, QWidget* p) WrapConfigs::WrapConfigs(std::shared_ptr<TranslateBasic> _base, QWidget* p)
: QWidget(p), _bind_base(_base), : QDialog(p), _bind_base(_base),
_alias_view(new QTableView(this)), _alias_view(new QTableView(this)),
_alias_model(new QStandardItemModel(this)), _alias_model(new QStandardItemModel(this)),
_configurations(new QStackedWidget(this)) _configurations(new QStackedWidget(this))
@ -129,7 +129,7 @@ void WrapConfigs::aliasAppend()
while (exists.contains(name)) while (exists.contains(name))
name += "#"; name += "#";
auto ins = _bind_base->defaultExtractDelegate()->newDefault(); auto ins = _bind_base->defaultExtractDelegateType()->newDefault();
auto nins = std::dynamic_pointer_cast<ExtractDelegate>(ins); auto nins = std::dynamic_pointer_cast<ExtractDelegate>(ins);
nins->setAlias(name); nins->setAlias(name);
@ -173,7 +173,7 @@ void WrapConfigs::dataChanged(QStandardItem* cell)
auto origin_key = total_alias_set.at(cell->row()); auto origin_key = total_alias_set.at(cell->row());
auto new_type = cell->text(); auto new_type = cell->text();
auto new_ins = _bind_base->extractorMap()[new_type]->newDefault(); auto new_ins = _bind_base->extractUnitTypeMap()[new_type]->newDefault();
auto new_delegate = std::dynamic_pointer_cast<ExtractDelegate>(new_ins); auto new_delegate = std::dynamic_pointer_cast<ExtractDelegate>(new_ins);
new_delegate->setAlias(origin_key); new_delegate->setAlias(origin_key);
_bind_base->replaceDelegate(origin_key, new_delegate); _bind_base->replaceDelegate(origin_key, new_delegate);
@ -197,7 +197,7 @@ QWidget* RuleSelectDelegate::createEditor(QWidget* parent, const QStyleOptionVie
void RuleSelectDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const void RuleSelectDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const
{ {
auto rule_names = this->_kernel->extractorMap().keys(); auto rule_names = this->_kernel->extractUnitTypeMap().keys();
std::sort(rule_names.begin(), rule_names.end()); std::sort(rule_names.begin(), rule_names.end());
auto combo = dynamic_cast<QComboBox*>(editor); auto combo = dynamic_cast<QComboBox*>(editor);

View File

@ -3,6 +3,7 @@
#include <QStandardItemModel> #include <QStandardItemModel>
#include <QTableView> #include <QTableView>
#include <QStackedWidget> #include <QStackedWidget>
#include <QDialog>
#include <QStyledItemDelegate> #include <QStyledItemDelegate>
#include "TranslateBasic.h" #include "TranslateBasic.h"
@ -24,7 +25,7 @@ public:
virtual void updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const override; virtual void updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const override;
}; };
class WrapConfigs : public QWidget { class WrapConfigs : public QDialog {
private: private:
std::shared_ptr<TranslateBasic> _bind_base; std::shared_ptr<TranslateBasic> _bind_base;

View File

@ -384,7 +384,7 @@ void AsRuleSet::loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject
QJsonObject match_obj; QJsonObject match_obj;
OBJECT_PEAK(match_obj, rule_obj); OBJECT_PEAK(match_obj, rule_obj);
auto xdev = core->extractUnitMap()[unit_type]->newDefault(); auto xdev = core->extractUnitTypeMap()[unit_type]->newDefault();
xdev->loadFrom(core, match_obj); xdev->loadFrom(core, match_obj);
_bind.sub_units << std::dynamic_pointer_cast<ExtractUnit>(xdev); _bind.sub_units << std::dynamic_pointer_cast<ExtractUnit>(xdev);
} }
@ -566,6 +566,11 @@ int SingleBasedUnit::countWithin() const
} }
QString SingleBasedUnit::baseType() const QString SingleBasedUnit::baseType() const
{
return topic();
}
QString SingleBasedUnit::topic()
{ {
return NAME(SingleBasedUnit); return NAME(SingleBasedUnit);
} }

View File

@ -287,6 +287,7 @@ namespace extract {
void setDelegate(std::shared_ptr<ExtractDelegate> inst); void setDelegate(std::shared_ptr<ExtractDelegate> inst);
public: public:
static QString topic();
QString baseType() const; QString baseType() const;
QString name() const override; QString name() const override;
void setName(const QString& name) override; void setName(const QString& name) override;

View File

@ -4,14 +4,19 @@
#include "TranslateBasic.h" #include "TranslateBasic.h"
#include <cmath> #include <cmath>
#include "WrapConfigs.h" #include "WrapConfigs.h"
#include "ExtractRuleView.h"
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
QApplication app(argc, argv); QApplication app(argc, argv);
auto core = std::make_shared<TranslateBasic>(); auto core = std::make_shared<TranslateBasic>();
WrapConfigs w(core); WrapConfigs v(core);
w.show(); v.exec();
auto rule = std::make_shared<extract::AsRuleSet>();
ExtractRuleView view(core, rule);
view.show();
return app.exec(); return app.exec();
} }