脉络视图及其基础构建

This commit is contained in:
玉宇清音 2022-11-18 13:43:27 +08:00
parent c1f17f4be2
commit dbbdece7fe
12 changed files with 186 additions and 26 deletions

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject> <!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 4.15.0, 2022-11-17T13:44:35. --> <!-- Written by QtCreator 4.15.0, 2022-11-18T11:14:33. -->
<qtcreator> <qtcreator>
<data> <data>
<variable>EnvironmentId</variable> <variable>EnvironmentId</variable>
@ -99,7 +99,7 @@
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt5.51211.win64_msvc2017_64_kit</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt5.51211.win64_msvc2017_64_kit</value>
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value> <value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value> <value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value> <value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">2</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0"> <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
<value type="int" key="EnableQmlDebugging">0</value> <value type="int" key="EnableQmlDebugging">0</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:\Projects\Cpp\build-QtNovelDesc-Desktop_Qt_5_12_11_MSVC2017_64bit-Debug</value> <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:\Projects\Cpp\build-QtNovelDesc-Desktop_Qt_5_12_11_MSVC2017_64bit-Debug</value>

View File

@ -1,12 +1,14 @@
#include "SourceEditView.h" #include "SourceEditView.h"
#include "chainhightlighter.h" #include "keywordshightlighter.h"
#include <QMenu>
using namespace Components; using namespace Components;
using namespace Parse::Result; using namespace Parse::Result;
using namespace Enhancement;
StoryChainSourceEdit::StoryChainSourceEdit(const QFileInfo &file, QWidget *parent) StoryChainSourceEdit::StoryChainSourceEdit(const QFileInfo &file, QWidget *parent)
: MakeTools::VariedTextView(file,parent), edit_square(new QTextEdit(parent)), : MakeTools::VariedTextView(file,parent), edit_square(new QTextEdit(parent)),
highter_ins(new Enhancement::ChainHightlighter(this)), highter_ins(new KeywordsHightlighter(this)),
core_ins(nullptr) core_ins(nullptr)
{ {
connect(edit_square, &QTextEdit::textChanged, [this](){ connect(edit_square, &QTextEdit::textChanged, [this](){
@ -14,6 +16,14 @@ StoryChainSourceEdit::StoryChainSourceEdit(const QFileInfo &file, QWidget *paren
}); });
highter_ins->setDocument(this->edit_square->document()); highter_ins->setDocument(this->edit_square->document());
edit_square->setContextMenuPolicy(Qt::CustomContextMenu);
connect(edit_square, &QTextEdit::customContextMenuRequested, [this](const QPoint &pos){
auto menu = edit_square->createStandardContextMenu();
menu->addSeparator();
menu->addAction("刷新", [this](){highter_ins->rehighlight();});
menu->exec(edit_square->mapToGlobal(pos));
});
} }
void StoryChainSourceEdit::modeReset(const QString &) const{} void StoryChainSourceEdit::modeReset(const QString &) const{}
@ -36,7 +46,7 @@ QString StoryChainSourceEdit::title() const
void StoryChainSourceEdit::reset(Parse::Result::DocCore *syntax_base) void StoryChainSourceEdit::reset(Parse::Result::DocCore *syntax_base)
{ {
this->core_ins = syntax_base; this->core_ins = syntax_base;
static_cast<Enhancement::ChainHightlighter*>(this->highter_ins)->reset(core_ins); static_cast<Enhancement::KeywordsHightlighter*>(this->highter_ins)->reset(core_ins);
} }
QWidget *StoryChainSourceEdit::textView() const QWidget *StoryChainSourceEdit::textView() const

View File

@ -12,20 +12,22 @@ SOURCES += \
ContentPresent.cpp \ ContentPresent.cpp \
SensitiveCore.cpp \ SensitiveCore.cpp \
SourceEditView.cpp \ SourceEditView.cpp \
chainhightlighter.cpp \ keywordshightlighter.cpp \
main.cpp \ main.cpp \
mainwindow.cpp \ mainwindow.cpp \
messagepresent.cpp \ messagepresent.cpp \
projectview.cpp projectview.cpp \
storychainspresent.cpp
HEADERS += \ HEADERS += \
ContentPresent.h \ ContentPresent.h \
SensitiveCore.h \ SensitiveCore.h \
SourceEditView.h \ SourceEditView.h \
chainhightlighter.h \ keywordshightlighter.h \
mainwindow.h \ mainwindow.h \
messagepresent.h \ messagepresent.h \
projectview.h projectview.h \
storychainspresent.h
TRANSLATIONS += \ TRANSLATIONS += \
WordsIDE_zh_CN.ts WordsIDE_zh_CN.ts

View File

@ -1,21 +1,21 @@
#include "chainhightlighter.h" #include "keywordshightlighter.h"
#include <QDebug> #include <QDebug>
using namespace Parse; using namespace Parse;
using namespace Enhancement; using namespace Enhancement;
ChainHightlighter::ChainHightlighter(QObject *parent) KeywordsHightlighter::KeywordsHightlighter(QObject *parent)
: QSyntaxHighlighter(parent), parse_core(nullptr) : QSyntaxHighlighter(parent), parse_core(nullptr)
{ {
} }
void ChainHightlighter::reset(Parse::Result::DocCore *base) void KeywordsHightlighter::reset(Parse::Result::DocCore *base)
{ {
this->parse_core = base; this->parse_core = base;
} }
void ChainHightlighter::highlightBlock(const QString &text) void KeywordsHightlighter::highlightBlock(const QString &text)
{ {
if(parse_core == nullptr) if(parse_core == nullptr)
return; return;

View File

@ -11,10 +11,10 @@ namespace Enhancement {
/** /**
* @brief * @brief
*/ */
class ChainHightlighter : public QSyntaxHighlighter class KeywordsHightlighter : public QSyntaxHighlighter
{ {
public: public:
ChainHightlighter(QObject *parent = nullptr); KeywordsHightlighter(QObject *parent = nullptr);
void reset(Parse::Result::DocCore *base); void reset(Parse::Result::DocCore *base);
private: private:

View File

@ -28,9 +28,11 @@ MainWindow::MainWindow(QWidget *parent)
center_funcs(new QTabWidget(this)), center_funcs(new QTabWidget(this)),
bottom_funcs(new QTabWidget(this)), bottom_funcs(new QTabWidget(this)),
project_manager(new XMLProjectManager(this)), project_manager(new XMLProjectManager(this)),
syntax_core(new ParseCore()), parse_core(new ParseCore()),
make_tool(new StoryTool(syntax_core)), make_tool(new StoryTool(parse_core)),
project_list(new QListView(this)),
project_view(new ProjectView(project_manager, this)), project_view(new ProjectView(project_manager, this)),
chains_view(new StoryChainsPresent(parse_core, this)),
errors_present(new MessagePresent(make_tool, this)), errors_present(new MessagePresent(make_tool, this)),
framework(new SensitiveCore(make_tool)) framework(new SensitiveCore(make_tool))
{ {
@ -193,7 +195,7 @@ MainWindow::MainWindow(QWidget *parent)
this->vertical_split->addWidget(bottom_funcs); this->vertical_split->addWidget(bottom_funcs);
setCentralWidget(this->horizontal_split); setCentralWidget(this->horizontal_split);
center_funcs->addTab(new QTextEdit(this), "编辑区域"); center_funcs->addTab(project_list, "欢迎界面");
left_funcs->addTab(project_view, "项目管理"); left_funcs->addTab(project_view, "项目管理");
connect(project_view, &ProjectView::activeDocument, [this](const QString &file_path, const QString &name){ connect(project_view, &ProjectView::activeDocument, [this](const QString &file_path, const QString &name){
if(framework->contains(file_path)){ if(framework->contains(file_path)){
@ -206,7 +208,11 @@ MainWindow::MainWindow(QWidget *parent)
if(file_path.endsWith("storychain")){ if(file_path.endsWith("storychain")){
tview = new Components::StoryChainSourceEdit(QFileInfo(file_path), this); tview = new Components::StoryChainSourceEdit(QFileInfo(file_path), this);
framework->addPerceptionList(tview); framework->addPerceptionList(tview);
auto doc = syntax_core->queryDocument(QFileInfo(file_path)); auto doc = parse_core->queryDocument(QFileInfo(file_path));
if(doc == nullptr){
this->make_tool->compile(QFileInfo(file_path));
doc = parse_core->queryDocument(QFileInfo(file_path));
}
tview->reset(doc); tview->reset(doc);
} }
else if(file_path.endsWith("storyunit")){ else if(file_path.endsWith("storyunit")){
@ -244,7 +250,12 @@ MainWindow::MainWindow(QWidget *parent)
center_funcs->setCurrentWidget(tview->textView()); center_funcs->setCurrentWidget(tview->textView());
}); });
bottom_funcs->addTab(errors_present, "错误列表"); bottom_funcs->addTab(errors_present, "错误列表");
framework->addProcTrigger([this](){ errors_present->refresh(); }); right_funcs->addTab(chains_view, "脉络展示");
framework->addProcTrigger([this](){
errors_present->refresh();
chains_view->refresh();
});
} }
MainWindow::~MainWindow() MainWindow::~MainWindow()
@ -273,6 +284,7 @@ void MainWindow::build_internal(bool all_from_disk)
make_tool->compile(it); make_tool->compile(it);
errors_present->refresh(); errors_present->refresh();
chains_view->refresh();
} }
void MainWindow::closeEvent(QCloseEvent *event) void MainWindow::closeEvent(QCloseEvent *event)

View File

@ -7,8 +7,10 @@
#include <ProjectManager.h> #include <ProjectManager.h>
#include <StoryTool.h> #include <StoryTool.h>
#include <QTreeView> #include <QTreeView>
#include <QListView>
#include "SensitiveCore.h" #include "SensitiveCore.h"
#include "messagepresent.h" #include "messagepresent.h"
#include "storychainspresent.h"
#include "projectview.h" #include "projectview.h"
class MainWindow : public QMainWindow class MainWindow : public QMainWindow
@ -30,10 +32,12 @@ private:
Project::ProjectManager *const project_manager; Project::ProjectManager *const project_manager;
Parse::Result::ParseCore *const syntax_core; Parse::Result::ParseCore *const parse_core;
MakeTools::StoryTool *const make_tool; MakeTools::StoryTool *const make_tool;
QListView *const project_list;
Components::ProjectView *const project_view; Components::ProjectView *const project_view;
Components::StoryChainsPresent *const chains_view;
Components::MessagePresent *const errors_present; Components::MessagePresent *const errors_present;
MakeTools::SensitiveCore *const framework; MakeTools::SensitiveCore *const framework;

View File

@ -0,0 +1,88 @@
#include "storychainspresent.h"
#include <QSplitter>
#include <QVBoxLayout>
using namespace Components;
using namespace Parse;
using namespace Parse::Result;
StoryChainsPresent::StoryChainsPresent(Parse::Result::ParseCore *core, QWidget *parent)
: QWidget(parent), core_ins(core), model_base(new QStandardItemModel(this)),
tree_view(new QTreeView(this)), details_show(new QPlainTextEdit(this))
{
tree_view->setModel(model_base);
tree_view->setHeaderHidden(true);
auto layoutx = new QVBoxLayout(this);
layoutx->setMargin(0);
auto split = new QSplitter(Qt::Vertical, this);
layoutx->addWidget(split);
split->addWidget(tree_view);
split->addWidget(details_show);
details_show->setReadOnly(true);
connect(tree_view, &QTreeView::clicked, this, &StoryChainsPresent::action_details_show);
}
void StoryChainsPresent::refresh()
{
model_base->clear();
auto list = core_ins->allStoryChains();
for(auto &chain : list){
auto chain_node = new QStandardItem(static_cast<NamedNode*>(chain)->name());
chain_node->setEditable(false);
model_base->appendRow(chain_node);
auto children = chain->children();
for(auto &point : children){
if(point->typeValue() == NODE_STORYPOINT){
auto point_node = new QStandardItem(static_cast<NamedNode*>(point)->name());
point_node->setEditable(false);
chain_node->appendRow(point_node);
}
}
}
}
void StoryChainsPresent::action_details_show(const QModelIndex &curr)
{
if(!curr.isValid())
return;
details_show->clear();
auto item = model_base->itemFromIndex(curr);
if(item->parent() == nullptr){
auto node = core_ins->queryStoryChain(item->text());
auto children = node.first()->children();
for(auto &it : children){
if(it->typeValue() != NODE_STORYPOINT){
details_show->appendPlainText(it->toString());
}
}
}
else{
auto node = core_ins->queryStoryChain(item->parent()->text());
auto point = core_ins->queryStoryPoint(node.first(), item->text());
auto children = point.first()->children();
for(auto &it : children){
details_show->appendPlainText(it->toString());
}
}
}

View File

@ -0,0 +1,33 @@
#ifndef STORYCHAINSPRESENT_H
#define STORYCHAINSPRESENT_H
#include <QPlainTextEdit>
#include <QStandardItemModel>
#include <QTreeView>
#include <QWidget>
#include <libParse.h>
namespace Components {
class StoryChainsPresent : public QWidget
{
Q_OBJECT
public:
explicit StoryChainsPresent(Parse::Result::ParseCore *core, QWidget *parent = nullptr);
void refresh();
signals:
private:
Parse::Result::ParseCore *const core_ins;
QStandardItemModel *const model_base;
QTreeView *const tree_view;
QPlainTextEdit *const details_show;
void action_details_show(const QModelIndex &curr);
};
}
#endif // STORYCHAINSPRESENT_H

View File

@ -48,6 +48,7 @@ QList<QString> StoryTool::compile(const QFileInfo &file)
results.append(parser.analysis(doc_core, file.absoluteFilePath())); results.append(parser.analysis(doc_core, file.absoluteFilePath()));
} }
parse_core->registerDoc(doc_core);
for(auto n : results) for(auto n : results)
parse_core->registerNode(doc_core, n); parse_core->registerNode(doc_core, n);

View File

@ -160,17 +160,26 @@ void ParseCore::deleteDocument(DocCore *ins)
delete ins; delete ins;
} }
QList<Result::DesNode*> ParseCore::queryStoryChain(const QString &name) const QList<DesNode *> ParseCore::allStoryChains() const
{ {
QList<Result::DesNode*> retlist; QList<Result::DesNode*> retlist;
auto keys = nodes_map.keys(); auto keys = nodes_map.keys();
for(auto &k : keys) for(auto &k : keys)
if(k->docType() == DocType::STORYCHAIN) if(k->docType() == DocType::STORYCHAIN)
for(auto &n : *nodes_map[k]){ for(auto &n : *nodes_map[k])
if(n->typeValue()==NODE_STORYCHAIN && if(n->typeValue()==NODE_STORYCHAIN)
static_cast<NamedNode*>(n)->name() == name)
retlist << n; retlist << n;
}
return retlist;
}
QList<Result::DesNode*> ParseCore::queryStoryChain(const QString &name) const
{
QList<Result::DesNode*> retlist;
for(auto &xnode : allStoryChains())
if(static_cast<NamedNode*>(xnode)->name() == name)
retlist << xnode;
return retlist; return retlist;
} }

View File

@ -305,6 +305,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 QList<Result::DesNode*> allStoryChains() const;
virtual QList<Result::DesNode*> queryStoryChain(const QString & name) const; virtual QList<Result::DesNode*> queryStoryChain(const QString & name) const;
virtual QList<Result::DesNode*> queryStoryPoint(Result::DesNode* chain, const QString &name) const; virtual QList<Result::DesNode*> queryStoryPoint(Result::DesNode* chain, const QString &name) const;