QBinaryTranslate/TranslateUI/TranslateUI.cpp

148 lines
4.4 KiB
C++
Raw Normal View History

2025-07-13 18:33:40 +00:00
#include "TranslateUI.h"
2025-08-05 11:36:19 +00:00
#include "StructuralRuleView.h"
2025-08-05 03:50:14 +00:00
#include <QSplitter>
#include <QTreeView>
#include <QTabWidget>
#include <QMenu>
#include <QInputDialog>
2025-08-05 11:36:19 +00:00
#include <QMessageBox>
2025-07-13 18:33:40 +00:00
2025-08-05 03:50:14 +00:00
TranslateUI::TranslateUI(QWidget* parent)
: QMainWindow(parent),
_tab_widget(new QTabWidget(this)),
_ruleset_navi(new QTreeView(this)),
_solution_model(new QStandardItemModel(this))
2025-07-13 18:33:40 +00:00
{
2025-08-05 03:50:14 +00:00
_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;
2025-08-05 10:30:24 +00:00
m.addAction(u8"Add Rule", this, &TranslateUI::addCustomRule);
2025-08-05 11:37:59 +00:00
m.addSeparator();
2025-08-05 10:30:24 +00:00
m.addAction(u8"Open ExtractView", this, &TranslateUI::openExtractView);
2025-08-05 03:50:14 +00:00
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);
2025-08-05 10:30:24 +00:00
connect(_core._view_mgr, &ViewManager::activeRequest, _tab_widget, &QTabWidget::setCurrentIndex);
2025-08-05 03:50:14 +00:00
this->present_solution_customs(_core._translate_core, _solution_model);
2025-08-05 10:30:24 +00:00
splitter->setStretchFactor(1, 1);
2025-07-13 18:33:40 +00:00
}
TranslateUI::~TranslateUI()
2025-08-05 03:50:14 +00:00
{
}
void TranslateUI::addCustomRule()
{
2025-08-05 10:30:24 +00:00
auto name = QInputDialog::getText(this, u8"Please Enter Rule Name", "Rule:");
2025-08-05 03:50:14 +00:00
if (name == "")
return;
auto names = this->_core._translate_core->customRules().keys();
if (names.contains(name)) {
2025-08-05 10:30:24 +00:00
QMessageBox::critical(this, u8"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD>", u8"RuleName<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD>");
2025-08-05 03:50:14 +00:00
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());
2025-07-13 18:33:40 +00:00
2025-08-05 03:50:14 +00:00
auto ruleset = ins->customRules();
for (auto rule_name : ruleset.keys()) {
model->appendRow(new QStandardItem(rule_name));
}
}
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);
2025-08-05 10:30:24 +00:00
if (std::get<0>(v)->customName() == rule_name && std::get<2>(v) == v_type) {
2025-08-05 03:50:14 +00:00
emit this->activeRequest(vidx, rule_name);
return;
}
}
2025-08-05 10:30:24 +00:00
assert(u8"ָ<EFBFBD><EFBFBD>rule_name<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD>" && _translate_core->customRules().contains(rule_name));
2025-08-05 03:50:14 +00:00
auto appoint = _translate_core->customRules()[rule_name];
2025-08-05 10:30:24 +00:00
auto present = new StructuralRuleView(_translate_core, appoint, p);
2025-08-05 03:50:14 +00:00
content_pages << std::make_tuple(appoint, present, v_type);
emit this->appendRequest(present, rule_name);
2025-08-05 10:30:24 +00:00
emit this->activeRequest(content_pages.size() - 1, rule_name);
2025-08-05 03:50:14 +00:00
}
void ViewManager::closeAt(int index)
{
2025-08-05 10:30:24 +00:00
assert(u8"index<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч" && (index < content_pages.size()));
2025-08-05 03:50:14 +00:00
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;
}
}
2025-08-05 10:30:24 +00:00
assert(u8"RuleName<EFBFBD><EFBFBD>V_Type<EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч" && 0);
2025-08-05 03:50:14 +00:00
}
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--);
}
}
}