From 3551d68cdd08b8f535d38a4e3790dd7178cdeedb Mon Sep 17 00:00:00 2001 From: codeboss <2422523675@qq.com> Date: Tue, 5 Aug 2025 11:50:14 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86CustomRule=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TranslateUI/TranslateBasic.cpp | 31 ++++++-- TranslateUI/TranslateBasic.h | 7 +- TranslateUI/TranslateUI.cpp | 141 ++++++++++++++++++++++++++++++++- TranslateUI/TranslateUI.h | 65 +++++++++++++-- TranslateUI/extract_basic.cpp | 10 +++ TranslateUI/extract_basic.h | 5 +- TranslateUI/main.cpp | 3 +- 7 files changed, 241 insertions(+), 21 deletions(-) diff --git a/TranslateUI/TranslateBasic.cpp b/TranslateUI/TranslateBasic.cpp index 4e80213..3a80dfe 100644 --- a/TranslateUI/TranslateBasic.cpp +++ b/TranslateUI/TranslateBasic.cpp @@ -66,19 +66,38 @@ QHash> TranslateBasic::extractUnitList() c return _extractor_types; } -void TranslateBasic::setCustomRule(const QString& name, std::shared_ptr inst) +void TranslateBasic::setCustomRule(const QString& name, std::shared_ptr inst) { - this->_extractor_types[name] = inst; + auto exist = std::count_if( + this->_custom_rule_types.begin(), this->_custom_rule_types.end(), + [=](std::shared_ptr v) { + return v->name() == name; + }); + assert("RuleName不能重复" && !exist); + + inst->setCustomName(name); + this->_custom_rule_types << inst; } void TranslateBasic::removeCustomRule(const QString& name) { - _extractor_types.remove(name); + for (auto idxp = 0; idxp< this->_custom_rule_types.size(); idxp++) { + auto rule = this->_custom_rule_types.at(idxp); + if (rule->customName() == name) { + this->_custom_rule_types.removeAt(idxp--); + return; + } + } + + assert("指定RuleName不合法" && 0); } -QHash> TranslateBasic::customRules() const +QHash> TranslateBasic::customRules() const { - return this->_custom_rule_types; + QHash> value_set; + for (auto instv : this->_custom_rule_types) + value_set[instv->customName()] = instv; + return value_set; } QHash> TranslateBasic::sizeProviderList() const @@ -223,7 +242,7 @@ bool FieldManagerLayer::bindCurrent(const QString& unique_key) QHash FieldManagerLayer::prevFields() const { QHash fields; - for(auto pair : __Private::_fields_map) + for (auto pair : __Private::_fields_map) fields[pair.first] = pair.second; return fields; diff --git a/TranslateUI/TranslateBasic.h b/TranslateUI/TranslateBasic.h index e3fcc90..0772709 100644 --- a/TranslateUI/TranslateBasic.h +++ b/TranslateUI/TranslateBasic.h @@ -3,6 +3,7 @@ #include "extract_basic.h" #include "convert_basic.h" #include +#include /// /// 范围字段获取上下文 @@ -112,7 +113,7 @@ private: QHash> _rule_match_types; std::shared_ptr _default_rule_match = nullptr; - QHash> _custom_rule_types; + QList> _custom_rule_types; public: TranslateBasic(); @@ -125,9 +126,9 @@ public: std::shared_ptr defaultExtractUnit() const; QHash> extractUnitList() const; - void setCustomRule(const QString& name, std::shared_ptr inst); + void setCustomRule(const QString& name, std::shared_ptr inst); void removeCustomRule(const QString& name); - QHash> customRules() const; + QHash> customRules() const; }; /// diff --git a/TranslateUI/TranslateUI.cpp b/TranslateUI/TranslateUI.cpp index 709d32b..1ee78ca 100644 --- a/TranslateUI/TranslateUI.cpp +++ b/TranslateUI/TranslateUI.cpp @@ -1,10 +1,145 @@ #include "TranslateUI.h" +#include +#include +#include +#include +#include -TranslateUI::TranslateUI(QWidget *parent) - : QMainWindow(parent) +TranslateUI::TranslateUI(QWidget* parent) + : QMainWindow(parent), + _tab_widget(new QTabWidget(this)), + _ruleset_navi(new QTreeView(this)), + _solution_model(new QStandardItemModel(this)) { + _core._translate_core = std::make_shared(); + _core._view_mgr = new ViewManager(_core._translate_core, this); + + + + auto splitter = new QSplitter(Qt::Horizontal, this); + this->setCentralWidget(splitter); + splitter->addWidget(_ruleset_navi); + _ruleset_navi->setModel(_solution_model); + _ruleset_navi->setHeaderHidden(true); + _ruleset_navi->setContextMenuPolicy(Qt::CustomContextMenu); + connect(_ruleset_navi, &QWidget::customContextMenuRequested, [=](const QPoint& pos) { + QMenu m; + m.addAction(u8"添加Rule", this, &TranslateUI::addCustomRule); + m.addAction(u8"打开ExtractView", this, &TranslateUI::openExtractView); + m.exec(this->mapToGlobal(pos)); + }); + + + + + splitter->addWidget(_tab_widget); + _tab_widget->setTabsClosable(true); + connect(_tab_widget, &QTabWidget::tabCloseRequested, _core._view_mgr, &ViewManager::closeAt); + connect(_core._view_mgr, &ViewManager::appendRequest, _tab_widget, QOverload::of(&QTabWidget::addTab)); + connect(_core._view_mgr, &ViewManager::removeRequest, _tab_widget, &QTabWidget::removeTab); + connect(_core._view_mgr, &ViewManager::activeRequest, _tab_widget, &QTabWidget::setTabText); + + this->present_solution_customs(_core._translate_core, _solution_model); } TranslateUI::~TranslateUI() -{} +{ +} +#include +void TranslateUI::addCustomRule() +{ + auto name = QInputDialog::getText(this, u8"输入Rule名称", "Rule:"); + if (name == "") + return; + + auto names = this->_core._translate_core->customRules().keys(); + if (names.contains(name)) { + QMessageBox::critical(this, "输入校验", "RuleName不能重复"); + return; + } + + auto new_rule = std::make_shared(); + new_rule->setCustomName(name); + _core._translate_core->setCustomRule(name, new_rule); + + this->present_solution_customs(_core._translate_core, _solution_model); +} + +void TranslateUI::openExtractView() +{ + auto index = this->_ruleset_navi->currentIndex(); + if (!index.isValid()) + return; + + auto name = this->_solution_model->data(index, Qt::DisplayRole).toString(); + this->_core._view_mgr->open(name, ViewType::ExtractConfiguration, this); +} + +void TranslateUI::present_solution_customs(std::shared_ptr ins, QStandardItemModel* model) const +{ + model->removeRows(0, model->rowCount()); + + auto ruleset = ins->customRules(); + for (auto rule_name : ruleset.keys()) { + model->appendRow(new QStandardItem(rule_name)); + } +} + +#include "StructuralRuleView.h" + +ViewManager::ViewManager(std::shared_ptr base, QObject* p /*= nullptr*/) + :QObject(p), _translate_core(base) +{ + +} + +void ViewManager::open(const QString& rule_name, ViewType v_type, QWidget* p) +{ + for (auto vidx = 0; vidx < content_pages.size(); vidx++) { + auto v = content_pages.at(vidx); + if (std::get<0>(v)->name() == rule_name && std::get<2>(v) == v_type) { + emit this->activeRequest(vidx, rule_name); + return; + } + } + assert("指定rule_name必须合法" && _translate_core->customRules().contains(rule_name)); + + auto appoint = _translate_core->customRules()[rule_name]; + auto present = new StructuralRuleView(appoint, p); + content_pages << std::make_tuple(appoint, present, v_type); + emit this->appendRequest(present, rule_name); +} + +void ViewManager::closeAt(int index) +{ + assert("index必须有效" && (index < content_pages.size())); + emit this->removeRequest(index); + + auto current = this->content_pages.at(index); + std::get<1>(current)->deleteLater(); + content_pages.removeAt(index); +} + +void ViewManager::active(const QString& rule_name, ViewType v_type) +{ + for (auto vidx = 0; vidx < content_pages.size(); vidx++) { + auto v = content_pages.at(vidx); + if (std::get<0>(v)->name() == rule_name && std::get<2>(v) == v_type) { + emit this->activeRequest(vidx, rule_name); + return; + } + } + + assert("RuleName和V_Type组合必须有效" && 0); +} + +void ViewManager::purge(const QString& rule_name) +{ + for (auto vidx = 0; vidx < content_pages.size(); vidx++) { + auto v = content_pages.at(vidx); + if (std::get<0>(v)->name() == rule_name) { + this->closeAt(vidx--); + } + } +} diff --git a/TranslateUI/TranslateUI.h b/TranslateUI/TranslateUI.h index e1285b3..334cf1f 100644 --- a/TranslateUI/TranslateUI.h +++ b/TranslateUI/TranslateUI.h @@ -1,15 +1,68 @@ #pragma once #include +#include +#include "TranslateBasic.h" -class TranslateUI : public QMainWindow -{ - Q_OBJECT +enum class ViewType { + /// + /// 提取配置 + /// + ExtractConfiguration, + /// + /// 校验配置 + /// + ValidateConfiguration, +}; +class ViewManager : public QObject { + Q_OBJECT +private: + std::shared_ptr _translate_core = nullptr; + QList, QWidget*, ViewType>> content_pages; public: - TranslateUI(QWidget *parent = nullptr); - ~TranslateUI(); + ViewManager(std::shared_ptr base, QObject* p = nullptr); + +public slots: + void open(const QString& rule_name, ViewType v_type, QWidget* p = nullptr); + void closeAt(int index); + void active(const QString& rule_name, ViewType v_type); + void purge(const QString& rule_name); + + +signals: + void appendRequest(QWidget* view, const QString& title); + void removeRequest(int index); + void activeRequest(int index, const QString& new_title); -private: +}; + +#include +class TranslateUI : public QMainWindow +{ + Q_OBJECT +private: + QTabWidget *const _tab_widget; + QTreeView* const _ruleset_navi; + QStandardItemModel* _solution_model = nullptr; + +public: + struct __Private { + std::shared_ptr _translate_core = nullptr; + + ViewManager* _view_mgr = nullptr; + } _core; + +public: + TranslateUI(QWidget* parent = nullptr); + ~TranslateUI(); + + void addCustomRule(); + void openExtractView(); + + void removeCustomRule(const QString &name); + + void present_solution_customs( + std::shared_ptr ins, QStandardItemModel* model) const; }; diff --git a/TranslateUI/extract_basic.cpp b/TranslateUI/extract_basic.cpp index fb5717e..c65e929 100644 --- a/TranslateUI/extract_basic.cpp +++ b/TranslateUI/extract_basic.cpp @@ -697,3 +697,13 @@ std::shared_ptr BytesAsRuleSet::__Private::operator[](const QString return std::shared_ptr(); } + +void BytesAsRuleSet::setCustomName(const QString& name) +{ + _rules._name_store = name; +} + +QString BytesAsRuleSet::customName() const +{ + return _rules._name_store; +} diff --git a/TranslateUI/extract_basic.h b/TranslateUI/extract_basic.h index 29a3403..1cf878d 100644 --- a/TranslateUI/extract_basic.h +++ b/TranslateUI/extract_basic.h @@ -255,6 +255,7 @@ namespace extract { public: struct __Private { int _byte_offset = 0, _byte_count = 1; + QString _name_store; QList>> _sub_rules; QList fieldNames() const; @@ -267,6 +268,9 @@ namespace extract { __Private& append(const QString& nm, std::shared_ptr u); }_rules; + void setCustomName(const QString& name); + QString customName() const; + public: QString name() const override; void registSubField(std::shared_ptr inst) override; @@ -276,7 +280,6 @@ namespace extract { int countWithin() const override; std::shared_ptr newDefault() const override; - void parse(const QByteArray& bytes, std::shared_ptr out) const override; void loadFrom(std::shared_ptr core, const QJsonObject& obj) override; diff --git a/TranslateUI/main.cpp b/TranslateUI/main.cpp index 26cf9fb..34e5b66 100644 --- a/TranslateUI/main.cpp +++ b/TranslateUI/main.cpp @@ -10,8 +10,7 @@ int main(int argc, char *argv[]) { QApplication app(argc, argv); - auto vx = std::make_shared< extract::BytesAsRuleSet>(); - StructuralRuleView v(vx); + TranslateUI v; v.show(); return app.exec();