重构,功能聚集

This commit is contained in:
玉宇清音 2022-12-31 21:05:58 +08:00
parent 0ca56d9906
commit c0051e4ab8
24 changed files with 335 additions and 306 deletions

View File

@ -36,22 +36,21 @@ int main(int argc, char *argv[])
// auto retlist = frame.analysis(&doc, "D:\\Projects\\Cpp\\QtNovelDesc\\DesParser\\example.storyboard"); // auto retlist = frame.analysis(&doc, "D:\\Projects\\Cpp\\QtNovelDesc\\DesParser\\example.storyboard");
ParseCore core; MakeTools::StoryTool tool;
MakeTools::StoryTool tool(&core);
// auto path = "D:\\Projects\\Cpp\\QtNovelDesc\\DesParser\\example.storyvolume"; // auto path = "D:\\Projects\\Cpp\\QtNovelDesc\\DesParser\\example.storyvolume";
auto path = "D:\\Projects\\Cpp\\QtNovelDesc\\DesParser\\example.storyunit"; auto path = "D:\\Projects\\Cpp\\QtNovelDesc\\DesParser\\example.storyunit";
tool.compile(QFileInfo(path), "后台编译"); tool.compile(QFileInfo(path), "后台编译");
auto doc = core.queryDocument(QFileInfo(path)); auto doc = tool.getCore()->queryDocument(QFileInfo(path));
auto retlist = core.queryRootNodes(doc); auto retlist = doc->syntaxNodes();
for (auto x : qAsConst(retlist)) { for (auto x : qAsConst(retlist)) {
qDebug().noquote() << x->toString(); qDebug().noquote() << x->toString();
} }
QList<ErrorMessage> errors; QList<ErrorMessage> errors;
if(!tool.checkPass(errors)) if(!tool.checkPass(errors))
for(auto x : errors) for(auto &x : errors)
qDebug() << QString("%1, %2, %3, %4, %5").arg(x.Reason).arg(x.Text).arg(x.FilePath).arg(x.CodeRow).arg(x.CodeCol); qDebug() << QString("%1, %2, %3, %4, %5").arg(x.Reason).arg(x.Text).arg(x.FilePath).arg(x.CodeRow).arg(x.CodeCol);
return a.exec(); return a.exec();

188
WordsIDE/DocsManager.cpp Normal file
View File

@ -0,0 +1,188 @@
#include "DocsManager.h"
#include "mainwindow.h"
#include <QMessageBox>
#include <QTextStream>
#include <QDebug>
using namespace MakeTools;
using namespace Core;
DocsManager::DocsManager(StoryTool *tool, AppCore *host, MainWindow *views)
: host_core(host), views_holder(views), make_core(tool)
{
}
void DocsManager::saveAll() const
{
for(auto &it : sourcecode_map)
it->save();
for(auto &it : plaintext_map)
it->save();
}
void DocsManager::closeAll()
{
for(auto &it : sourcecode_map.keys())
closeTextComponent(QFileInfo(it));
for(auto &it : plaintext_map.keys())
closeTextComponent(QFileInfo(it));
host_core->getMakeCore()->getCore()->clear();
}
bool DocsManager::contains(const QFileInfo &target) const
{
for(auto &it : sourcecode_map.keys())
if(it == target.absoluteFilePath())
return true;
for(auto &it : plaintext_map.keys())
if(it == target.absoluteFilePath())
return true;
return false;
}
TextView *DocsManager::queryTextComponent(const QWidget *child_view) const
{
for(auto ins : sourcecode_map)
if(ins->textView() == child_view)
return ins;
for(auto ins : plaintext_map)
if(ins->textView() == child_view)
return ins;
return nullptr;
}
TextView *DocsManager::queryTextComponent(const QFileInfo &target) const
{
for(auto &it : sourcecode_map.keys())
if(it == target.absoluteFilePath())
return sourcecode_map[it];
for(auto &it : plaintext_map.keys())
if(it == target.absoluteFilePath())
return plaintext_map[it];
return nullptr;
}
void DocsManager::closeTextComponent(const QFileInfo &target)
{
auto key = target.absoluteFilePath();
if(sourcecode_map.contains(key)){
sourcecode_map[key]->save();
delete sourcecode_map[key];
sourcecode_map.remove(key);
}
else if(plaintext_map.contains(key)){
plaintext_map[key]->save();
delete plaintext_map[key];
plaintext_map.remove(key);
}
}
void DocsManager::openTextDocument(const QString &src, const QString &name)
{
auto xfactorys = host_core->extensions(QFileInfo(src).suffix());
if(contains(src)){
auto ins = queryTextComponent(QFileInfo(src));
dynamic_cast<Core::Extension*>(ins)->reloadConfigrations(host_core->getConfigs(xfactorys[0]->configs()));
views_holder->contentViewAppend(ins->textView(), name);
return;
}
make_core->compile(QFileInfo(src), name);
TextView *tview = dynamic_cast<TextView*>(xfactorys[0]->newInstance(host_core));
tview->initSource(host_core, QFileInfo(src), name, views_holder);
addPerceptionList(tview);
dynamic_cast<Core::Extension*>(tview)->resetProcsType(QFileInfo(src).suffix());
dynamic_cast<Core::Extension*>(tview)->reloadConfigrations(host_core->getConfigs(xfactorys[0]->configs()));
QFile fin(src);
if(!fin.open(QIODevice::ReadOnly | QIODevice::Text)){
QMessageBox::critical(views_holder, "系统错误", QString("无法打开指定文件:%1(%2)").arg(name, src));
return;
}
QTextStream tin(&fin);
tview->textContentReset(tin.readAll());
views_holder->contentViewAppend(tview->textView(), name);
}
void DocsManager::addPerceptionList(TextView *ins, SensitiveType type)
{
if(type == SensitiveType::CompileAtChanged){
connect(ins, &TextView::dataChanged, [ins, this](const QString &path){
this->recompile(path, ins->docName());
});
this->sourcecode_map[ins->absoluteFilePath()] = ins;
}
else{
this->plaintext_map[ins->absoluteFilePath()] = ins;
}
}
void DocsManager::addProcTrigger(std::function<void ()> exc)
{
this->trigger_list << exc;
}
void DocsManager::recompile(const QString &file_path, const QString &doc_name)
{
if(!sourcecode_map.contains(file_path))
return;
auto view = this->sourcecode_map[file_path];
make_core->compileSource(QFileInfo(file_path), view->textContent(), doc_name);
for(auto &ex : trigger_list)
ex();
}
TextView::TextView()
: QObject(nullptr){}
void TextView::initSource(Core::AppCore *core, const QFileInfo &src, const QString &name, QWidget *parent)
{
this->doc_name = name;
this->initSource(core, src, parent);
}
QString TextView::absoluteFilePath() const
{
return source_x;
}
void TextView::save() const
{
QFile bout(absoluteFilePath());
if(!bout.open(QIODevice::WriteOnly|QIODevice::Text)){
QMessageBox::critical(nullptr, "系统错误", absoluteFilePath()+"文件无法打开");
return;
}
QTextStream tout(&bout);
tout << textContent();
tout.flush();
}
QString TextView::docName() const
{
return doc_name;
}
void TextView::initSource(Core::AppCore *core, const QFileInfo &src, QWidget *parent)
{
this->source_x = src.absoluteFilePath();
if(parent)
this->setParent(parent);
}

View File

@ -1,5 +1,5 @@
#ifndef SENSITIVECORE_H #ifndef DOCSMANAGER_H
#define SENSITIVECORE_H #define DOCSMANAGER_H
#include "ContentPresent.h" #include "ContentPresent.h"
@ -20,7 +20,7 @@ namespace MakeTools {
void initSource(Core::AppCore *core, const QFileInfo &src, const QString &name, QWidget *parent=nullptr); void initSource(Core::AppCore *core, const QFileInfo &src, const QString &name, QWidget *parent=nullptr);
QString filePath() const; QString absoluteFilePath() const;
void save() const; void save() const;
virtual void jumpTo(const QList<QString> &path) = 0; virtual void jumpTo(const QList<QString> &path) = 0;
@ -50,7 +50,7 @@ namespace MakeTools {
/** /**
* @brief * @brief
*/ */
class SensitiveCore : public QObject class DocsManager : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
@ -58,13 +58,15 @@ namespace MakeTools {
* @brief * @brief
* @param tool * @param tool
*/ */
SensitiveCore(StoryTool *tool); DocsManager(StoryTool *tool, Core::AppCore *host, MainWindow *views);
/** /**
* @brief * @brief
*/ */
void saveAll() const; void saveAll() const;
void closeAll();
/** /**
* @brief * @brief
* @param target * @param target
@ -82,17 +84,26 @@ namespace MakeTools {
* @param target * @param target
* @return * @return
*/ */
TextView * queryTextComponent(const QFileInfo &target) const; TextView *queryTextComponent(const QFileInfo &target) const;
/** /**
* @brief * @brief
* @param target * @param target
*/ */
void closeTextComponent(const QFileInfo &target); void closeTextComponent(const QFileInfo &target);
/**
* @brief
* @param src
* @param name
*/
void openTextDocument(const QString &src, const QString &name);
void addPerceptionList(TextView *ins, SensitiveType type = SensitiveType::CompileAtChanged); void addPerceptionList(TextView *ins, SensitiveType type = SensitiveType::CompileAtChanged);
void addProcTrigger(std::function<void()> exc); void addProcTrigger(std::function<void()> exc);
private: private:
Core::AppCore *const host_core;
MainWindow *const views_holder;
StoryTool *const make_core; StoryTool *const make_core;
QHash<QString, TextView*> sourcecode_map; QHash<QString, TextView*> sourcecode_map;
QHash<QString, TextView*> plaintext_map; QHash<QString, TextView*> plaintext_map;
@ -102,4 +113,4 @@ namespace MakeTools {
}; };
} }
#endif // SENSITIVECORE_H #endif // DOCSMANAGER_H

View File

@ -1,144 +0,0 @@
#include "SensitiveCore.h"
#include <QMessageBox>
#include <QTextStream>
#include <QDebug>
using namespace MakeTools;
SensitiveCore::SensitiveCore(StoryTool *tool)
: make_core(tool)
{
}
void SensitiveCore::saveAll() const
{
for(auto &it : sourcecode_map)
it->save();
for(auto &it : plaintext_map)
it->save();
}
bool SensitiveCore::contains(const QFileInfo &target) const
{
for(auto &it : sourcecode_map.keys())
if(it == target.absoluteFilePath())
return true;
for(auto &it : plaintext_map.keys())
if(it == target.absoluteFilePath())
return true;
return false;
}
TextView *SensitiveCore::queryTextComponent(const QWidget *child_view) const
{
for(auto ins : sourcecode_map)
if(ins->textView() == child_view)
return ins;
for(auto ins : plaintext_map)
if(ins->textView() == child_view)
return ins;
return nullptr;
}
TextView *SensitiveCore::queryTextComponent(const QFileInfo &target) const
{
for(auto &it : sourcecode_map.keys())
if(it == target.absoluteFilePath())
return sourcecode_map[it];
for(auto &it : plaintext_map.keys())
if(it == target.absoluteFilePath())
return plaintext_map[it];
return nullptr;
}
void SensitiveCore::closeTextComponent(const QFileInfo &target)
{
for(auto &it : sourcecode_map.keys()){
if(it == target.absoluteFilePath()){
sourcecode_map[it]->save();
delete sourcecode_map[it];
sourcecode_map.remove(it);
}
}
for(auto &it : plaintext_map.keys())
if(it == target.absoluteFilePath()){
sourcecode_map[it]->save();
delete sourcecode_map[it];
sourcecode_map.remove(it);
}
}
void SensitiveCore::addPerceptionList(TextView *ins, SensitiveType type)
{
if(type == SensitiveType::CompileAtChanged){
connect(ins, &TextView::dataChanged, [ins, this](const QString &path){
this->recompile(path, ins->docName());
});
this->sourcecode_map[ins->filePath()] = ins;
}
else{
this->plaintext_map[ins->filePath()] = ins;
}
}
void SensitiveCore::addProcTrigger(std::function<void ()> exc)
{
this->trigger_list << exc;
}
void SensitiveCore::recompile(const QString &file_path, const QString &doc_name)
{
if(!sourcecode_map.contains(file_path))
return;
auto view = this->sourcecode_map[file_path];
make_core->compileSource(QFileInfo(file_path), view->textContent(), doc_name);
for(auto &ex : trigger_list)
ex();
}
TextView::TextView()
: QObject(nullptr){}
void TextView::initSource(Core::AppCore *core, const QFileInfo &src, const QString &name, QWidget *parent)
{
this->doc_name = name;
this->initSource(core, src, parent);
}
QString TextView::filePath() const
{
return source_x;
}
void TextView::save() const
{
QFile bout(filePath());
if(!bout.open(QIODevice::WriteOnly|QIODevice::Text)){
QMessageBox::critical(nullptr, "系统错误", filePath()+"文件无法打开");
return;
}
QTextStream tout(&bout);
tout << textContent();
tout.flush();
}
QString TextView::docName() const
{
return doc_name;
}
void TextView::initSource(Core::AppCore *core, const QFileInfo &src, QWidget *parent)
{
this->source_x = src.absoluteFilePath();
if(parent)
this->setParent(parent);
}

View File

@ -76,7 +76,7 @@ FormattedTextEdit::FormattedTextEdit()
{ {
ex_unit = [](QMenu*){}; ex_unit = [](QMenu*){};
connect(edit_square, &QTextEdit::textChanged, [this](){ connect(edit_square, &QTextEdit::textChanged, [this](){
emit this->dataChanged(this->filePath()); emit this->dataChanged(this->absoluteFilePath());
}); });
edit_square->setContextMenuPolicy(Qt::CustomContextMenu); edit_square->setContextMenuPolicy(Qt::CustomContextMenu);

View File

@ -1,7 +1,7 @@
#ifndef SOURCEEDITVIEW_H #ifndef SOURCEEDITVIEW_H
#define SOURCEEDITVIEW_H #define SOURCEEDITVIEW_H
#include "SensitiveCore.h" #include "DocsManager.h"
#include "ContentPresent.h" #include "ContentPresent.h"
#include <QSyntaxHighlighter> #include <QSyntaxHighlighter>

View File

@ -10,7 +10,7 @@ CONFIG += c++11
SOURCES += \ SOURCES += \
ContentPresent.cpp \ ContentPresent.cpp \
SensitiveCore.cpp \ DocsManager.cpp \
SourceEditView.cpp \ SourceEditView.cpp \
appcore.cpp \ appcore.cpp \
fragmentsorderview.cpp \ fragmentsorderview.cpp \
@ -32,7 +32,7 @@ SOURCES += \
HEADERS += \ HEADERS += \
ContentPresent.h \ ContentPresent.h \
SensitiveCore.h \ DocsManager.h \
SourceEditView.h \ SourceEditView.h \
appcore.h \ appcore.h \
fragmentsorderview.h \ fragmentsorderview.h \

View File

@ -4,7 +4,7 @@
#include "storyunitsourceedit.h" #include "storyunitsourceedit.h"
#include "storyboardsourceedit.h" #include "storyboardsourceedit.h"
#include "storyvolumesourceedit.h" #include "storyvolumesourceedit.h"
#include "SensitiveCore.h" #include "DocsManager.h"
#include "mainwindow.h" #include "mainwindow.h"
#include "sourcecodeeditor.h" #include "sourcecodeeditor.h"
@ -21,9 +21,8 @@ using namespace MakeTools;
AppCore::AppCore(MainWindow *win, QObject *parent) AppCore::AppCore(MainWindow *win, QObject *parent)
: QObject(parent), views_holder(win), : QObject(parent), views_holder(win),
global_config(new Config::XMLConfig(this)), global_config(new Config::XMLConfig(this)),
parse_core(new ParseCore()), makes_core(new StoryTool()),
make_tool(new StoryTool(parse_core)), docs_manager(new DocsManager(makes_core, this, win))
framework(new SensitiveCore(make_tool))
{ {
global_config->loadFile(QDir(QApplication::applicationDirPath()).filePath(".software.xml")); global_config->loadFile(QDir(QApplication::applicationDirPath()).filePath(".software.xml"));
extensions_list << new StoryChainSourceEditFactory() extensions_list << new StoryChainSourceEditFactory()
@ -70,7 +69,7 @@ QList<Config::Configration *> AppCore::getConfigs(QList<Scale> types) const
Parse::Result::ParseCore *AppCore::parseCore() const Parse::Result::ParseCore *AppCore::parseCore() const
{ {
return parse_core; return makes_core->getCore();
} }
QList<FileExtensionFactory *> AppCore::extensions(const QString &suffix) const QList<FileExtensionFactory *> AppCore::extensions(const QString &suffix) const
@ -90,46 +89,14 @@ QList<FileExtensionFactory *> AppCore::extensions(const QString &suffix) const
return rets; return rets;
} }
MakeTools::StoryTool *AppCore::getMake_tool() const MakeTools::StoryTool *AppCore::getMakeCore() const
{ {
return make_tool; return makes_core;
} }
MakeTools::SensitiveCore *AppCore::getFramework() const MakeTools::DocsManager *AppCore::getDocsManager() const
{ {
return framework; return docs_manager;
}
void AppCore::openTextDocument(const QString &src, const QString &name)
{
auto xfactorys = extensions(QFileInfo(src).suffix());
if(framework->contains(src)){
auto ins = framework->queryTextComponent(QFileInfo(src));
dynamic_cast<Core::Extension*>(ins)->reloadConfigrations(this->getConfigs(xfactorys[0]->configs()));
views_holder->contentViewAppend(ins->textView(), name);
return;
}
this->make_tool->compile(QFileInfo(src), name);
TextView *tview = dynamic_cast<TextView*>(xfactorys[0]->newInstance(this));
tview->initSource(this, QFileInfo(src), name, views_holder);
framework->addPerceptionList(tview);
dynamic_cast<Extension*>(tview)->resetProcsType(QFileInfo(src).suffix());
dynamic_cast<Core::Extension*>(tview)->reloadConfigrations(this->getConfigs(xfactorys[0]->configs()));
QFile fin(src);
if(!fin.open(QIODevice::ReadOnly | QIODevice::Text)){
QMessageBox::critical(views_holder, "系统错误", QString("无法打开指定文件:%1(%2)").arg(name, src));
return;
}
QTextStream tin(&fin);
tview->textContentReset(tin.readAll());
views_holder->contentViewAppend(tview->textView(), name);
} }

View File

@ -10,7 +10,7 @@ class MainWindow;
namespace MakeTools { namespace MakeTools {
class StoryTool; class StoryTool;
class SensitiveCore; class DocsManager;
} }
namespace Core { namespace Core {
@ -104,14 +104,24 @@ namespace Core {
}; };
/**
* @brief
*/
class AppCore : public QObject class AppCore : public QObject
{ {
public: public:
AppCore(MainWindow *win, QObject *parent = nullptr); AppCore(MainWindow *win, QObject *parent = nullptr);
virtual ~AppCore() = default; virtual ~AppCore() = default;
/**
* @brief
*/
void save(); void save();
/**
* @brief
* @return
*/
Config::Configration * globalConfig() const; Config::Configration * globalConfig() const;
void setCurrentProject(Project::ProjectManager *project); void setCurrentProject(Project::ProjectManager *project);
@ -121,22 +131,18 @@ namespace Core {
QList<Core::FileExtensionFactory*> extensions(const QString &suffix = QString()) const; QList<Core::FileExtensionFactory*> extensions(const QString &suffix = QString()) const;
MakeTools::StoryTool *getMake_tool() const; MakeTools::StoryTool *getMakeCore() const;
MakeTools::SensitiveCore *getFramework() const; MakeTools::DocsManager *getDocsManager() const;
void openTextDocument(const QString &src, const QString &name);
private: private:
MainWindow *const views_holder; MainWindow *const views_holder;
Config::Configration *const global_config; Config::Configration *const global_config;
Project::ProjectManager * current_project; Project::ProjectManager * current_project;
QList<Core::FileExtensionFactory*> extensions_list; QList<Core::FileExtensionFactory*> extensions_list;
Parse::Result::ParseCore *const parse_core;
MakeTools::StoryTool *const make_tool; MakeTools::StoryTool *const makes_core;
MakeTools::SensitiveCore *const framework; MakeTools::DocsManager *const docs_manager;
}; };
} }

View File

@ -1,5 +1,5 @@
#include "fragmentsorderview.h" #include "fragmentsorderview.h"
#include "SensitiveCore.h" #include "DocsManager.h"
#include <comdef.h> #include <comdef.h>
#include <StoryUnitDocumentParser.h> #include <StoryUnitDocumentParser.h>
#include <QVBoxLayout> #include <QVBoxLayout>
@ -52,8 +52,8 @@ void FragmentsOrderView::double_click(const QModelIndex &index)
auto unit_ins = this->core_ins->parseCore()->queryStoryUnit(path[0]).first(); auto unit_ins = this->core_ins->parseCore()->queryStoryUnit(path[0]).first();
auto unit_doc = unit_ins->doc(); auto unit_doc = unit_ins->doc();
this->core_ins->openTextDocument(unit_doc->filePath(), unit_doc->docName()); this->core_ins->getDocsManager()->openTextDocument(unit_doc->filePath(), unit_doc->docName());
auto present = this->core_ins->getFramework()->queryTextComponent(QFileInfo(unit_doc->filePath())); auto present = this->core_ins->getDocsManager()->queryTextComponent(QFileInfo(unit_doc->filePath()));
if(path.size()){ if(path.size()){
present->jumpTo(path); present->jumpTo(path);

View File

@ -43,7 +43,7 @@ MainWindow::MainWindow(QWidget *parent)
project_structure(new ProjectView(app_core, project_manager, this)), project_structure(new ProjectView(app_core, project_manager, this)),
chains_view(new StoryChainsPresent(app_core, this)), chains_view(new StoryChainsPresent(app_core, this)),
units_view(new StoryUnitsPresent(app_core, this)), units_view(new StoryUnitsPresent(app_core, this)),
errors_present(new MessagePresent(app_core->getMake_tool(), this)), errors_present(new MessagePresent(app_core->getMakeCore(), this)),
boards_view(new StoryBoardsPresent(app_core, this)), boards_view(new StoryBoardsPresent(app_core, this)),
concept_view(new StoryConceptsPresent(app_core, this)), concept_view(new StoryConceptsPresent(app_core, this)),
fragments_order(new FragmentsOrderView(app_core, this)) fragments_order(new FragmentsOrderView(app_core, this))
@ -106,7 +106,7 @@ MainWindow::MainWindow(QWidget *parent)
sync_kernel->registerActionSync(sav, [this]()->bool{return project_manager->isOpen();}); sync_kernel->registerActionSync(sav, [this]()->bool{return project_manager->isOpen();});
connect(sav, &QAction::triggered, [this](){ connect(sav, &QAction::triggered, [this](){
this->project_manager->save(); this->project_manager->save();
app_core->getFramework()->saveAll(); app_core->getDocsManager()->saveAll();
}); });
project->addSeparator(); project->addSeparator();
auto opnp = project->addAction("打开项目"); auto opnp = project->addAction("打开项目");
@ -308,9 +308,7 @@ MainWindow::MainWindow(QWidget *parent)
auto build = tool->addAction("编译", [this](){ auto build = tool->addAction("编译", [this](){
this->build_internal(); this->build_internal();
}); });
sync_kernel->registerActionSync(build, [this]()->bool{ sync_kernel->registerActionSync(build, [this]()->bool{ return project_manager->isOpen(); });
return project_manager->isOpen();
});
// 窗口菜单 // 窗口菜单
auto window = mbar->addMenu("窗口"); auto window = mbar->addMenu("窗口");
@ -350,23 +348,23 @@ MainWindow::MainWindow(QWidget *parent)
[this](int index){ [this](int index){
auto view = center_funcs->widget(index); auto view = center_funcs->widget(index);
toggle_widget_visible(false, center_funcs, view); toggle_widget_visible(false, center_funcs, view);
auto comp = app_core->getFramework()->queryTextComponent(view); auto comp = app_core->getDocsManager()->queryTextComponent(view);
if(comp) if(comp)
app_core->getFramework()->closeTextComponent(QFileInfo(comp->filePath())); app_core->getDocsManager()->closeTextComponent(QFileInfo(comp->absoluteFilePath()));
}); });
connect(project_structure, &ProjectView::aboutToBoDelete, connect(project_structure, &ProjectView::aboutToBoDelete,
[this](QList<QFileInfo> infos){ [this](QList<QFileInfo> infos){
for(auto &key : infos){ for(auto &key : infos){
auto comp = app_core->getFramework()->queryTextComponent(key); auto comp = app_core->getDocsManager()->queryTextComponent(key);
if(comp){ if(comp){
toggle_widget_visible(false, center_funcs, comp->textView()); toggle_widget_visible(false, center_funcs, comp->textView());
app_core->getFramework()->closeTextComponent(key); app_core->getDocsManager()->closeTextComponent(key);
} }
} }
}); });
this->app_core->getFramework()->addProcTrigger([this](){ this->app_core->getDocsManager()->addProcTrigger([this](){
this->chains_view->refresh(); this->chains_view->refresh();
this->units_view->refresh(); this->units_view->refresh();
this->errors_present->refresh(); this->errors_present->refresh();
@ -379,7 +377,7 @@ MainWindow::MainWindow(QWidget *parent)
center_funcs->addTab(current_projects, "欢迎界面"); center_funcs->addTab(current_projects, "欢迎界面");
connect(project_structure, &ProjectView::activeDocument, connect(project_structure, &ProjectView::activeDocument,
app_core, &AppCore::openTextDocument); app_core->getDocsManager(), &MakeTools::DocsManager::openTextDocument);
uilayout_load(); uilayout_load();
@ -410,27 +408,27 @@ void MainWindow::contentViewAppend(QWidget *widget, const QString &name)
void MainWindow::build_internal(bool all_from_disk) void MainWindow::build_internal(bool all_from_disk)
{ {
if(!all_from_disk) if(!all_from_disk)
app_core->getFramework()->saveAll(); app_core->getDocsManager()->saveAll();
auto chains = project_manager->filesWithEnds("storychain"); auto chains = project_manager->filesWithEnds("storychain");
for(auto &it : chains) for(auto &it : chains)
app_core->getMake_tool()->compile(std::get<0>(it), std::get<1>(it)); app_core->getMakeCore()->compile(std::get<0>(it), std::get<1>(it));
auto units = project_manager->filesWithEnds("storyunit"); auto units = project_manager->filesWithEnds("storyunit");
for(auto &it : units) for(auto &it : units)
app_core->getMake_tool()->compile(std::get<0>(it), std::get<1>(it)); app_core->getMakeCore()->compile(std::get<0>(it), std::get<1>(it));
auto storys = project_manager->filesWithEnds("storyboard"); auto storys = project_manager->filesWithEnds("storyboard");
for(auto &it : storys) for(auto &it : storys)
app_core->getMake_tool()->compile(std::get<0>(it), std::get<1>(it)); app_core->getMakeCore()->compile(std::get<0>(it), std::get<1>(it));
auto volumes = project_manager->filesWithEnds("storyvolume"); auto volumes = project_manager->filesWithEnds("storyvolume");
for(auto &it : volumes) for(auto &it : volumes)
app_core->getMake_tool()->compile(std::get<0>(it), std::get<1>(it)); app_core->getMakeCore()->compile(std::get<0>(it), std::get<1>(it));
auto concepts = project_manager->filesWithEnds("storyconcept"); auto concepts = project_manager->filesWithEnds("storyconcept");
for(auto &it : concepts) for(auto &it : concepts)
app_core->getMake_tool()->compile(std::get<0>(it), std::get<1>(it)); app_core->getMakeCore()->compile(std::get<0>(it), std::get<1>(it));
errors_present->refresh(); errors_present->refresh();
chains_view->refresh(); chains_view->refresh();
@ -514,7 +512,7 @@ void MainWindow::closeEvent(QCloseEvent *event)
// 关闭事件 // 关闭事件
if(project_manager->isOpen()){ if(project_manager->isOpen()){
project_manager->save(); project_manager->save();
app_core->getFramework()->saveAll(); app_core->getDocsManager()->saveAll();
} }
uilayout_save(); uilayout_save();

View File

@ -8,7 +8,7 @@
#include <StoryTool.h> #include <StoryTool.h>
#include <QTreeView> #include <QTreeView>
#include <QListView> #include <QListView>
#include "SensitiveCore.h" #include "DocsManager.h"
#include "messagepresent.h" #include "messagepresent.h"
#include "storychainspresent.h" #include "storychainspresent.h"
#include "storyunitspresent.h" #include "storyunitspresent.h"

View File

@ -23,7 +23,7 @@ SourceCodeEditor::SourceCodeEditor(Core::FileExtensionFactory *factory)
void SourceCodeEditor::concept_jump(const QList<QString> &path) void SourceCodeEditor::concept_jump(const QList<QString> &path)
{ {
auto fpath = this->filePath(); auto fpath = this->absoluteFilePath();
auto core = core_ins->parseCore(); auto core = core_ins->parseCore();
if(path.size()){ if(path.size()){
auto storynode = core->queryStoryConcept(path[0]).first(); auto storynode = core->queryStoryConcept(path[0]).first();

View File

@ -70,7 +70,7 @@ void StoryBoardSourceEdit::initSource(Core::AppCore *core, const QFileInfo &src,
void StoryBoardSourceEdit::jumpTo(const QList<QString> &path) void StoryBoardSourceEdit::jumpTo(const QList<QString> &path)
{ {
auto fpath = this->filePath(); auto fpath = this->absoluteFilePath();
auto core = core_temp->parseCore(); auto core = core_temp->parseCore();
if(path.size()){ if(path.size()){
auto storynode = core->queryStoryBoard(path[0]).first(); auto storynode = core->queryStoryBoard(path[0]).first();

View File

@ -79,7 +79,7 @@ void StoryChainSourceEdit::resetProcsType(const QString &suffix)
void StoryChainSourceEdit::jumpTo(const QList<QString> &path) void StoryChainSourceEdit::jumpTo(const QList<QString> &path)
{ {
auto fpath = this->filePath(); auto fpath = this->absoluteFilePath();
auto core = core_ins->parseCore(); auto core = core_ins->parseCore();
if(path.size()){ if(path.size()){
auto storynode = core->queryStoryChain(path[0]).first(); auto storynode = core->queryStoryChain(path[0]).first();

View File

@ -2,7 +2,7 @@
#define STORYCHAINSOURCEEDITOR_H #define STORYCHAINSOURCEEDITOR_H
#include "ContentPresent.h" #include "ContentPresent.h"
#include "SensitiveCore.h" #include "DocsManager.h"
#include "SourceEditView.h" #include "SourceEditView.h"
#include <QObject> #include <QObject>

View File

@ -1,5 +1,5 @@
#include "storychainspresent.h" #include "storychainspresent.h"
#include "SensitiveCore.h" #include "DocsManager.h"
#include <QSplitter> #include <QSplitter>
#include <QVBoxLayout> #include <QVBoxLayout>
@ -93,8 +93,8 @@ void StoryChainsPresent::click_to(const QModelIndex &curr)
auto chain_ins = this->core_ins->parseCore()->queryStoryChain(path[0]).first(); auto chain_ins = this->core_ins->parseCore()->queryStoryChain(path[0]).first();
auto chain_doc = chain_ins->doc(); auto chain_doc = chain_ins->doc();
this->core_ins->openTextDocument(chain_doc->filePath(), chain_doc->docName()); this->core_ins->getDocsManager()->openTextDocument(chain_doc->filePath(), chain_doc->docName());
auto present = this->core_ins->getFramework()->queryTextComponent(QFileInfo(chain_doc->filePath())); auto present = this->core_ins->getDocsManager()->queryTextComponent(QFileInfo(chain_doc->filePath()));
if(path.size()){ if(path.size()){
present->jumpTo(path); present->jumpTo(path);

View File

@ -1,5 +1,5 @@
#include "storyconceptspresent.h" #include "storyconceptspresent.h"
#include "SensitiveCore.h" #include "DocsManager.h"
#include "opstream.h" #include "opstream.h"
#include <QSplitter> #include <QSplitter>
@ -101,8 +101,8 @@ void StoryConceptsPresent::click_to(const QModelIndex &curr)
auto unit_ins = this->core_ins->parseCore()->queryStoryConcept(path[0]).first(); auto unit_ins = this->core_ins->parseCore()->queryStoryConcept(path[0]).first();
auto chain_doc = unit_ins->doc(); auto chain_doc = unit_ins->doc();
this->core_ins->openTextDocument(chain_doc->filePath(), chain_doc->docName()); this->core_ins->getDocsManager()->openTextDocument(chain_doc->filePath(), chain_doc->docName());
auto present = this->core_ins->getFramework()->queryTextComponent(QFileInfo(chain_doc->filePath())); auto present = this->core_ins->getDocsManager()->queryTextComponent(QFileInfo(chain_doc->filePath()));
if(path.size()){ if(path.size()){
present->jumpTo(path); present->jumpTo(path);

View File

@ -91,7 +91,7 @@ void StoryUnitSourceEdit::cursor_contex_query()
refers_model->setHorizontalHeaderLabels(QStringList() << "故事" << "内容"); refers_model->setHorizontalHeaderLabels(QStringList() << "故事" << "内容");
auto cursor = edit_square->textCursor(); auto cursor = edit_square->textCursor();
auto doc = this->core_ins->parseCore()->queryDocument(QFileInfo(filePath())); auto doc = this->core_ins->parseCore()->queryDocument(QFileInfo(absoluteFilePath()));
auto words = doc->getWords(cursor.block().blockNumber()); auto words = doc->getWords(cursor.block().blockNumber());
QList<DesNode*> frags; QList<DesNode*> frags;
@ -172,7 +172,7 @@ void StoryUnitSourceEdit::present_refersed_tips(const QString &unit, const QStri
void StoryUnitSourceEdit::jumpTo(const QList<QString> &path) void StoryUnitSourceEdit::jumpTo(const QList<QString> &path)
{ {
auto fpath = this->filePath(); auto fpath = this->absoluteFilePath();
auto core = core_ins->parseCore(); auto core = core_ins->parseCore();
if(path.size()){ if(path.size()){
auto storynode = core->queryStoryUnit(path[0]).first(); auto storynode = core->queryStoryUnit(path[0]).first();

View File

@ -1,5 +1,5 @@
#include "storyunitspresent.h" #include "storyunitspresent.h"
#include "SensitiveCore.h" #include "DocsManager.h"
#include <QSplitter> #include <QSplitter>
#include <QVBoxLayout> #include <QVBoxLayout>
@ -93,8 +93,8 @@ void StoryUnitsPresent::click_to(const QModelIndex &curr)
auto unit_ins = this->core_ins->parseCore()->queryStoryUnit(path[0]).first(); auto unit_ins = this->core_ins->parseCore()->queryStoryUnit(path[0]).first();
auto chain_doc = unit_ins->doc(); auto chain_doc = unit_ins->doc();
this->core_ins->openTextDocument(chain_doc->filePath(), chain_doc->docName()); this->core_ins->getDocsManager()->openTextDocument(chain_doc->filePath(), chain_doc->docName());
auto present = this->core_ins->getFramework()->queryTextComponent(QFileInfo(chain_doc->filePath())); auto present = this->core_ins->getDocsManager()->queryTextComponent(QFileInfo(chain_doc->filePath()));
if(path.size()){ if(path.size()){
present->jumpTo(path); present->jumpTo(path);

View File

@ -11,8 +11,8 @@ using namespace Parse;
using namespace Parse::Result; using namespace Parse::Result;
using namespace CheckTools; using namespace CheckTools;
StoryTool::StoryTool(Parse::Result::ParseCore *core) StoryTool::StoryTool()
: parse_core(core), fragment_check(new FragmentsCheck(core)){} : parse_core(new ParseCore()), fragment_check(new FragmentsCheck(parse_core)){}
QList<QString> StoryTool::compile(const QFileInfo &file, const QString &doc_name) QList<QString> StoryTool::compile(const QFileInfo &file, const QString &doc_name)
{ {
@ -59,7 +59,7 @@ QList<QString> StoryTool::compile(const QFileInfo &file, const QString &doc_name
if(doc_core){ if(doc_core){
parse_core->registerDoc(doc_core); parse_core->registerDoc(doc_core);
for(auto n : results) for(auto n : results)
parse_core->registerNode(doc_core, n); doc_core->append(n);
} }
return QList<QString>(); return QList<QString>();
} }
@ -109,7 +109,7 @@ QList<QString> StoryTool::compileSource(const QFileInfo &_file, const QString &s
if(doc_core){ if(doc_core){
parse_core->registerDoc(doc_core); parse_core->registerDoc(doc_core);
for(auto n : results) for(auto n : results)
parse_core->registerNode(doc_core, n); doc_core->append(n);
} }
return QList<QString>(); return QList<QString>();
} }
@ -129,13 +129,18 @@ bool StoryTool::checkPass(QList<ErrorMessage> &errors)
errors << error; errors << error;
} }
for(auto &n : this->parse_core->queryRootNodes(d)) for(auto &n : d->syntaxNodes())
error_check(n, errors); error_check(n, errors);
} }
fragment_check->check(errors); fragment_check->check(errors);
return errors.size() == 0; return errors.size() == 0;
} }
ParseCore *StoryTool::getCore() const
{
return parse_core;
}
bool StoryTool::error_check(Parse::Result::DesNode * node, QList<ErrorMessage> &err_out) bool StoryTool::error_check(Parse::Result::DesNode * node, QList<ErrorMessage> &err_out)
{ {
node->check(err_out); node->check(err_out);

View File

@ -14,12 +14,13 @@ namespace MakeTools {
class LIBPARSE_EXPORT StoryTool class LIBPARSE_EXPORT StoryTool
{ {
public: public:
StoryTool(Parse::Result::ParseCore *core); StoryTool();
QList<QString> compile(const QFileInfo &file, const QString &doc_name); QList<QString> compile(const QFileInfo &file, const QString &doc_name);
QList<QString> compileSource(const QFileInfo &file, const QString &src, const QString &doc_name); QList<QString> compileSource(const QFileInfo &file, const QString &src, const QString &doc_name);
bool checkPass(QList<Parse::ErrorMessage> &errors); bool checkPass(QList<Parse::ErrorMessage> &errors);
Parse::Result::ParseCore *getCore() const;
private: private:
Parse::Result::ParseCore *const parse_core; Parse::Result::ParseCore *const parse_core;

View File

@ -109,46 +109,18 @@ ParseCore::ParseCore()
void ParseCore::registerDoc(DocCore *ins) void ParseCore::registerDoc(DocCore *ins)
{ {
if(!nodes_map.contains(ins)) if(!doc_nodes.contains(ins))
nodes_map[ins] = new QList<DesNode*>(); doc_nodes << ins;
}
void ParseCore::registerNode(DocCore *doc, DesNode *node)
{
if(!nodes_map.contains(doc))
nodes_map[doc] = new QList<DesNode*>();
nodes_map[doc]->append(node);
}
void ParseCore::clearNodes(DocCore *ins)
{
if(!nodes_map.contains(ins))
return;
auto c = nodes_map[ins];
for(auto &i : *c)
delete i;
c->clear();
} }
QList<DocCore *> ParseCore::allDocuments() const QList<DocCore *> ParseCore::allDocuments() const
{ {
return nodes_map.keys(); return doc_nodes;
}
QList<DesNode *> ParseCore::queryRootNodes(DocCore *doc) const
{
if(!nodes_map.contains(doc))
return QList<DesNode*>();
return *nodes_map[doc];
} }
DocCore *ParseCore::queryDocument(const QFileInfo &file_src) const DocCore *ParseCore::queryDocument(const QFileInfo &file_src) const
{ {
for(auto &d : nodes_map.keys()){ for(auto &d : doc_nodes){
auto anchor_file = d->filePath(); auto anchor_file = d->filePath();
if(anchor_file == file_src.absoluteFilePath()) if(anchor_file == file_src.absoluteFilePath())
return d; return d;
@ -159,17 +131,27 @@ DocCore *ParseCore::queryDocument(const QFileInfo &file_src) const
void ParseCore::deleteDocument(DocCore *ins) void ParseCore::deleteDocument(DocCore *ins)
{ {
ins->clear(); ins->clear();
nodes_map.remove(ins); doc_nodes.removeAll(ins);
delete ins; delete ins;
} }
void ParseCore::clear()
{
for(auto &ins : doc_nodes) {
ins->clear();
delete ins;
}
doc_nodes.clear();
}
QList<DesNode *> ParseCore::allStoryChains() const QList<DesNode *> ParseCore::allStoryChains() const
{ {
QList<Result::DesNode*> retlist; QList<Result::DesNode*> retlist;
auto keys = nodes_map.keys();
for(auto &k : keys) for(auto &k : doc_nodes)
if(k->docType() == DocType::STORYCHAIN) if(k->docType() == DocType::STORYCHAIN)
for(auto &n : *nodes_map[k]) for(auto &n : k->syntaxNodes())
if(n->typeValue()==NODE_STORYCHAIN) if(n->typeValue()==NODE_STORYCHAIN)
retlist << n; retlist << n;
@ -201,10 +183,10 @@ QList<Result::DesNode*> ParseCore::queryStoryPoint(DesNode *chain, const QString
QList<DesNode *> ParseCore::allStoryUnits() const QList<DesNode *> ParseCore::allStoryUnits() const
{ {
QList<Result::DesNode*> retlist; QList<Result::DesNode*> retlist;
auto keys = nodes_map.keys();
for(auto &k : keys) for(auto &k : doc_nodes)
if(k->docType() == DocType::STORYUNIT) if(k->docType() == DocType::STORYUNIT)
for(auto &n : *nodes_map[k]){ for(auto &n : k->syntaxNodes()){
if(n->typeValue()==NODE_STORYUNIT) if(n->typeValue()==NODE_STORYUNIT)
retlist << n; retlist << n;
} }
@ -264,10 +246,9 @@ QList<DesNode *> ParseCore::allStoryBoards() const
{ {
QList<Result::DesNode*> retlist; QList<Result::DesNode*> retlist;
auto keys = nodes_map.keys(); for(auto &k : doc_nodes)
for(auto &k : keys)
if(k->docType() == DocType::STORYBOARD) if(k->docType() == DocType::STORYBOARD)
for(auto &n : *nodes_map[k]){ for(auto &n : k->syntaxNodes()){
if(n->typeValue() == NODE_STORYBOARD) if(n->typeValue() == NODE_STORYBOARD)
retlist << n; retlist << n;
} }
@ -300,9 +281,10 @@ QList<DesNode *> ParseCore::queryStoryFragmentRefer(DesNode *unit, const QString
QList<DesNode *> ParseCore::allStoryConcept() const QList<DesNode *> ParseCore::allStoryConcept() const
{ {
QList<DesNode*> rets; QList<DesNode*> rets;
for(auto &it : nodes_map.keys()){
for(auto &it : doc_nodes){
if(it->docType() == DocType::STORYCONCEPTS) if(it->docType() == DocType::STORYCONCEPTS)
for(auto n : *nodes_map[it]) for(auto n : it->syntaxNodes())
if(n->typeValue() == NODE_STORYCONCEPT) if(n->typeValue() == NODE_STORYCONCEPT)
rets << n; rets << n;
} }
@ -336,9 +318,10 @@ QList<DesNode *> ParseCore::queryStoryStrongPoint(DesNode *concept, const QStrin
QList<DesNode *> ParseCore::queryStoryDepiction(const QString &name) const QList<DesNode *> ParseCore::queryStoryDepiction(const QString &name) const
{ {
QList<Result::DesNode*> retlist; QList<Result::DesNode*> retlist;
for(auto &it : nodes_map.keys()) {
for(auto &it : doc_nodes) {
if(it->docType() == DocType::STORYOUTLINES) if(it->docType() == DocType::STORYOUTLINES)
for(auto &n : *nodes_map[it]) for(auto &n : it->syntaxNodes())
if(n->typeValue() == NODE_STORYDEPICTION && if(n->typeValue() == NODE_STORYDEPICTION &&
static_cast<NamedNode*>(n)->name()[0] == name) static_cast<NamedNode*>(n)->name()[0] == name)
retlist << n; retlist << n;
@ -419,9 +402,12 @@ void DocCore::clear()
{ {
for(auto &it : words_store) for(auto &it : words_store)
delete it; delete it;
words_store.clear(); words_store.clear();
core()->clearNodes(this);
for(auto &it : root_nodes)
delete it;
root_nodes.clear();
static_cast<Unknown*>(unknown_host)->xClear(); static_cast<Unknown*>(unknown_host)->xClear();
} }
@ -446,3 +432,14 @@ QList<Words *> DocCore::getWords(int row, int col) const
return list; return list;
} }
int DocCore::append(DesNode *ins)
{
this->root_nodes.append(ins);
return 0;
}
QList<DesNode *> DocCore::syntaxNodes() const
{
return this->root_nodes;
}

View File

@ -276,6 +276,9 @@ namespace Parse
*/ */
QList<Words *> getWords(int row, int col=-1) const; QList<Words *> getWords(int row, int col=-1) const;
int append(DesNode *ins);
QList<DesNode*> syntaxNodes() const;
private: private:
Result::DesNode *const unknown_host; Result::DesNode *const unknown_host;
ParseCore *const core_store; ParseCore *const core_store;
@ -284,6 +287,7 @@ namespace Parse
DocType type_store; DocType type_store;
QList<Words*> words_store; QList<Words*> words_store;
QList<DesNode*> root_nodes;
}; };
/** /**
@ -292,20 +296,16 @@ namespace Parse
class LIBPARSE_EXPORT ParseCore class LIBPARSE_EXPORT ParseCore
{ {
private: private:
QHash<DocCore*, QList<DesNode*>*> nodes_map; QList<DocCore*> doc_nodes;
public: public:
explicit ParseCore(); explicit ParseCore();
virtual ~ParseCore() = default; virtual ~ParseCore() = default;
virtual void registerDoc(DocCore *ins); virtual void registerDoc(DocCore *ins);
virtual void registerNode(DocCore *doc, DesNode *node);
virtual void clearNodes(DocCore *ins);
virtual QList<DocCore *> allDocuments() const; virtual QList<DocCore *> allDocuments() const;
virtual QList<DesNode*> queryRootNodes(DocCore *doc) const;
/** /**
* nullptr. * nullptr.
* *
@ -314,6 +314,7 @@ namespace Parse
*/ */
virtual Result::DocCore* queryDocument(const QFileInfo &file_src) const; virtual Result::DocCore* queryDocument(const QFileInfo &file_src) const;
virtual void deleteDocument(Result::DocCore *ins); virtual void deleteDocument(Result::DocCore *ins);
virtual void clear();
virtual QList<Result::DesNode*> allStoryChains() const; virtual QList<Result::DesNode*> allStoryChains() const;
virtual QList<Result::DesNode*> queryStoryChain(const QString & name) const; virtual QList<Result::DesNode*> queryStoryChain(const QString & name) const;