diff --git a/TranslateUI/ExtractRuleView.cpp b/TranslateUI/ExtractRuleView.cpp index 556ab83..296af59 100644 --- a/TranslateUI/ExtractRuleView.cpp +++ b/TranslateUI/ExtractRuleView.cpp @@ -5,19 +5,22 @@ #include #include #include +#include #include #include #include #include #include +#include #include using namespace unit_configurations; using namespace size_provider; +using namespace extract; ExtractRuleView::ExtractRuleView(std::shared_ptr base, std::shared_ptr 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_model(new QStandardItemModel(this)), _configs_stack(new QStackedWidget(this)) @@ -33,8 +36,81 @@ ExtractRuleView::ExtractRuleView(std::shared_ptr base, _configs_stack->addWidget(new configurations::EmptyConfiguration(this)); auto single_configs = new SingleBasedConfiguration(base, this); + _configs_stack->addWidget(single_configs); auto list_configs = new ListBasedConfiguration(base, this); + _configs_stack->addWidget(list_configs); 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 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 +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(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(delt_u)); + this->_rule_base->append(new_unit); + + reload(); +} + +void ExtractRuleView::showEvent(QShowEvent* e) +{ + QWidget::showEvent(e); + + reload(); } ListBasedConfiguration::ListBasedConfiguration( @@ -62,9 +138,56 @@ ListBasedConfiguration::ListBasedConfiguration( layout->setColumnStretch(1, 1); } -SingleBasedConfiguration::SingleBasedConfiguration(std::shared_ptr core, QWidget* p /*= nullptr*/) -{ +SingleBasedConfiguration::SingleBasedConfiguration(std::shared_ptr 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::of(&QSpinBox::valueChanged), + [=](int v_offset) { + inst_current->setOffsetSpan(v_offset); + emit this->reloadRequest(); + }); + connect(this->_delegate_changed, QOverload::of(&QComboBox::currentTextChanged), + [=](const QString& current_alias) { + auto vinst = _bind_core->operator[](current_alias)->newDefault(); + inst_current->setDelegate(std::dynamic_pointer_cast(vinst)); + emit this->reloadRequest(); + }); +} + +void SingleBasedConfiguration::currentAccept(std::shared_ptr inst_u, const QModelIndex& idx) +{ + inst_current = std::dynamic_pointer_cast(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(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 core, QWidget* p /*= nullptr*/) diff --git a/TranslateUI/ExtractRuleView.h b/TranslateUI/ExtractRuleView.h index 91b9849..331c65f 100644 --- a/TranslateUI/ExtractRuleView.h +++ b/TranslateUI/ExtractRuleView.h @@ -6,14 +6,35 @@ #include #include #include +#include #include +#include #include "extract_basic.h" #include "TranslateBasic.h" +namespace extract { + class SingleBasedUnit; +} + namespace unit_configurations { class SingleBasedConfiguration : public QWidget { + Q_OBJECT + private: + std::shared_ptr _bind_core; + QSpinBox* const _offset_enter; + QComboBox* const _delegate_changed; + QPushButton* const _delegate_sync; + QTextBrowser* const _content_display; + + std::shared_ptr inst_current = nullptr; + QModelIndex idx_current; + public: SingleBasedConfiguration(std::shared_ptr core, QWidget* p = nullptr); + void currentAccept(std::shared_ptr inst_u, const QModelIndex& idx); + + signals: + void reloadRequest(); }; /// @@ -46,15 +67,24 @@ namespace unit_configurations { class ExtractRuleView : public QWidget { private: - QTableView *const _member_units; - QStandardItemModel *const _member_model; + 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_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(); + +protected: + void showEvent(QShowEvent *e) override; }; diff --git a/TranslateUI/TranslateBasic.cpp b/TranslateUI/TranslateBasic.cpp index 36b1bf5..4366525 100644 --- a/TranslateUI/TranslateBasic.cpp +++ b/TranslateUI/TranslateBasic.cpp @@ -49,12 +49,12 @@ TranslateBasic::TranslateBasic() } -std::shared_ptr TranslateBasic::defaultExtractDelegate() const +std::shared_ptr TranslateBasic::defaultExtractDelegateType() const { return _default_translate_rule; } -QHash> TranslateBasic::extractorMap() const +QHash> TranslateBasic::extractDelegateTypeMap() const { return _basic_extractor_types; } @@ -146,12 +146,12 @@ QHash> TranslateBasic::ruleMatchMap() const return _rule_match_types; } -std::shared_ptr TranslateBasic::defaultExtractUnit() const +std::shared_ptr TranslateBasic::defaultExtractUnitType() const { return _default_process_unit; } -QHash> TranslateBasic::extractUnitMap() const +QHash> TranslateBasic::extractUnitTypeMap() const { return _process_unit_types; } diff --git a/TranslateUI/TranslateBasic.h b/TranslateUI/TranslateBasic.h index d2dc192..862f8ac 100644 --- a/TranslateUI/TranslateBasic.h +++ b/TranslateUI/TranslateBasic.h @@ -130,14 +130,14 @@ private: public: TranslateBasic(); - std::shared_ptr defaultExtractDelegate() const; - QHash> extractorMap() const; + 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 defaultExtractUnit() const; - QHash> extractUnitMap() const; + std::shared_ptr defaultExtractUnitType() const; + QHash> extractUnitTypeMap() const; void addDelegate(std::shared_ptr inst); void removeDelegate(const QString& alias); diff --git a/TranslateUI/WrapConfigs.cpp b/TranslateUI/WrapConfigs.cpp index ebeb009..de2e1a6 100644 --- a/TranslateUI/WrapConfigs.cpp +++ b/TranslateUI/WrapConfigs.cpp @@ -7,7 +7,7 @@ using namespace configurations; WrapConfigs::WrapConfigs(std::shared_ptr _base, QWidget* p) - : QWidget(p), _bind_base(_base), + : QDialog(p), _bind_base(_base), _alias_view(new QTableView(this)), _alias_model(new QStandardItemModel(this)), _configurations(new QStackedWidget(this)) @@ -129,7 +129,7 @@ void WrapConfigs::aliasAppend() while (exists.contains(name)) name += "#"; - auto ins = _bind_base->defaultExtractDelegate()->newDefault(); + auto ins = _bind_base->defaultExtractDelegateType()->newDefault(); auto nins = std::dynamic_pointer_cast(ins); nins->setAlias(name); @@ -173,7 +173,7 @@ void WrapConfigs::dataChanged(QStandardItem* cell) auto origin_key = total_alias_set.at(cell->row()); 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(new_ins); new_delegate->setAlias(origin_key); _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 { - auto rule_names = this->_kernel->extractorMap().keys(); + auto rule_names = this->_kernel->extractUnitTypeMap().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 f0fbaf6..043392d 100644 --- a/TranslateUI/WrapConfigs.h +++ b/TranslateUI/WrapConfigs.h @@ -3,6 +3,7 @@ #include #include #include +#include #include #include "TranslateBasic.h" @@ -24,7 +25,7 @@ public: virtual void updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const override; }; -class WrapConfigs : public QWidget { +class WrapConfigs : public QDialog { private: std::shared_ptr _bind_base; diff --git a/TranslateUI/extract_basic.cpp b/TranslateUI/extract_basic.cpp index af14e95..0eb3368 100644 --- a/TranslateUI/extract_basic.cpp +++ b/TranslateUI/extract_basic.cpp @@ -384,7 +384,7 @@ void AsRuleSet::loadFrom(std::shared_ptr core, const QJsonObject QJsonObject match_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); _bind.sub_units << std::dynamic_pointer_cast(xdev); } @@ -566,6 +566,11 @@ int SingleBasedUnit::countWithin() const } QString SingleBasedUnit::baseType() const +{ + return topic(); +} + +QString SingleBasedUnit::topic() { return NAME(SingleBasedUnit); } diff --git a/TranslateUI/extract_basic.h b/TranslateUI/extract_basic.h index 27d2e1f..4c4542f 100644 --- a/TranslateUI/extract_basic.h +++ b/TranslateUI/extract_basic.h @@ -287,6 +287,7 @@ namespace extract { void setDelegate(std::shared_ptr inst); public: + static QString topic(); QString baseType() const; QString name() const override; void setName(const QString& name) override; diff --git a/TranslateUI/main.cpp b/TranslateUI/main.cpp index d90cae5..60d666f 100644 --- a/TranslateUI/main.cpp +++ b/TranslateUI/main.cpp @@ -4,14 +4,19 @@ #include "TranslateBasic.h" #include #include "WrapConfigs.h" +#include "ExtractRuleView.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); auto core = std::make_shared(); - WrapConfigs w(core); - w.show(); + WrapConfigs v(core); + v.exec(); + + auto rule = std::make_shared(); + ExtractRuleView view(core, rule); + view.show(); return app.exec(); }