146 lines
4.2 KiB
C++
146 lines
4.2 KiB
C++
#include "TranslateUI.h"
|
|
#include <QSplitter>
|
|
#include <QTreeView>
|
|
#include <QTabWidget>
|
|
#include <QMenu>
|
|
#include <QInputDialog>
|
|
|
|
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<TranslateBasic>();
|
|
_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<QWidget*, const QString&>::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 <QMessageBox>
|
|
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<extract::BytesAsRuleSet>();
|
|
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<TranslateBasic> 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<TranslateBasic> 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--);
|
|
}
|
|
}
|
|
}
|