修改DocumentManager和EditView等机制

This commit is contained in:
玉宇清音 2023-08-15 22:14:00 +08:00
parent a8018c6e54
commit b87399da16
23 changed files with 444 additions and 610 deletions

View File

@ -1,3 +0,0 @@
#include "ContentPresent.h"
using namespace Presents;

View File

@ -1,34 +0,0 @@
#ifndef CONTENTPRESENT_H
#define CONTENTPRESENT_H
#include <QString>
#include <libConfig.h>
#include "appcore.h"
namespace Presents {
/**
* @brief
*/
class ModeView
{
public:
virtual ~ModeView() = default;
/**
* @brief
* @param type
*/
virtual void modeReset(const QString &type) const = 0;
/**
* @brief
* @return
*/
virtual QList<QString> modes() const = 0;
virtual QString currentMode() const = 0;
};
}
#endif // CONTENTPRESENT_H

View File

@ -1,11 +1,10 @@
#ifndef DOCSMANAGER_H #ifndef DOCSMANAGER_H
#define DOCSMANAGER_H #define DOCSMANAGER_H
#include "ContentPresent.h" #include "appcore.h"
#include <QHash> #include <QHash>
#include <QObject> #include <QObject>
#include <StoryTool.h> #include <libConfig.h>
namespace MakeTools { namespace MakeTools {
@ -35,6 +34,8 @@ namespace MakeTools {
virtual QString name() const = 0; virtual QString name() const = 0;
}; };
class EditException : public Config::ParseException {};
/** /**
* @brief * @brief
*/ */
@ -51,25 +52,6 @@ namespace MakeTools {
Q_DECLARE_FLAGS(Features, Feature) Q_DECLARE_FLAGS(Features, Feature)
virtual Features features() = 0; virtual Features features() = 0;
/**
* @brief
* @return
*/
virtual QList<QString> suffixes() const = 0;
/**
* @brief
* @param target
* @param name
* @param suffix
* @return
*/
virtual std::tuple<bool, QString> create(const QDir &target, const QString &name, const QString &suffix) = 0;
/**
* @brief
* @return
*/
virtual FilePresent *newInst() const = 0;
/** /**
* @brief * @brief
* @param core * @param core
@ -116,6 +98,41 @@ namespace MakeTools {
void dataChanged(const QString &filePath); void dataChanged(const QString &filePath);
}; };
Q_DECLARE_OPERATORS_FOR_FLAGS(FilePresent::Features); Q_DECLARE_OPERATORS_FOR_FLAGS(FilePresent::Features);
}
class PresentFactory : public QObject {
public:
virtual ~PresentFactory() = default;
/**
* @brief
* @param target
* @throw EditException
*/
virtual void create(const QFileInfo &target) = 0;
/**
* @brief Present实例
* @return
*/
virtual FilePresent *newInst(QObject *parent = nullptr) const = 0;
};
template <class PresentType> class TypedPresentFactory : public PresentFactory {
public:
virtual ~TypedPresentFactory() = default;
/**
* @brief
* @return
*/
static QString suffix() { return PresentType::file_suffix; }
virtual FilePresent *newInst(QObject *parent) const { return new PresentType(parent); }
};
#define DECL_PRESENT(type) \
private: \
static QString file_suffix; \
friend class MakeTools::TypedPresentFactory<type>;
} // namespace MakeTools
#endif // DOCSMANAGER_H #endif // DOCSMANAGER_H

View File

@ -18,12 +18,11 @@ msvc {
} }
SOURCES += \ SOURCES += \
ContentPresent.cpp \
DocsManager.cpp \ DocsManager.cpp \
appcore.cpp \ appcore.cpp \
command_list.cpp \ command_list.cpp \
contentpresenttest.cpp \ contentpresenttest.cpp \
keywordshighlighter.cpp \ # keywordshighlighter.cpp \
main.cpp \ main.cpp \
mainwindow.cpp \ mainwindow.cpp \
manager_docs.cpp \ manager_docs.cpp \
@ -39,12 +38,11 @@ SOURCES += \
xapp.cpp xapp.cpp
HEADERS += \ HEADERS += \
ContentPresent.h \
DocsManager.h \ DocsManager.h \
appcore.h \ appcore.h \
command_list.h \ command_list.h \
contentpresenttest.h \ contentpresenttest.h \
keywordshighlighter.h \ # keywordshighlighter.h \
mainwindow.h \ mainwindow.h \
manager_docs.h \ manager_docs.h \
messagespresent.h \ messagespresent.h \

View File

@ -22,7 +22,7 @@ QString NewPackage::name() const
void NewPackage::run(Schedule::CommandsDispatcher *core) const void NewPackage::run(Schedule::CommandsDispatcher *core) const
{ {
auto vmgr = core->get<DocumentsManager>(NAME(DocumentsManager)); auto vmgr = core->get<DocumentsManager>(NAME(DocumentsManager));
vmgr->newPackage(Route::collect(sequence)); vmgr->createPackage(Route::collect(sequence));
} }
QString NewPackage::toText() const QString NewPackage::toText() const
@ -46,7 +46,7 @@ QString NewFile::name() const
void NewFile::run(Schedule::CommandsDispatcher *core) const void NewFile::run(Schedule::CommandsDispatcher *core) const
{ {
auto vmgr = core->get<DocumentsManager>(NAME(DocumentsManager)); auto vmgr = core->get<DocumentsManager>(NAME(DocumentsManager));
vmgr->newFile(Route::collect(group_val), name_val, suffix); vmgr->createFile(Route::collect(group_val), name_val, suffix);
} }
QString NewFile::toText() const QString NewFile::toText() const

View File

@ -1,50 +1,49 @@
#include "keywordshighlighter.h" #include "keywordshighlighter.h"
#include <QDebug> #include <QDebug>
using namespace Parse;
using namespace Enhancement; using namespace Enhancement;
KeywordsHighlighter::KeywordsHighlighter(QObject *parent) // KeywordsHighlighter::KeywordsHighlighter(QObject *parent)
: QSyntaxHighlighter(parent), parse_core(nullptr) // : QSyntaxHighlighter(parent), parse_core(nullptr)
{ //{
} //}
void KeywordsHighlighter::reset(Parse::Result::DocCore *base) // void KeywordsHighlighter::reset(Parse::Result::DocCore *base)
{ //{
this->parse_core = base; // this->parse_core = base;
} //}
void KeywordsHighlighter::highlightBlock(const QString &text) // void KeywordsHighlighter::highlightBlock(const QString &text)
{ //{
if(parse_core == nullptr) // if(parse_core == nullptr)
return; // return;
QTextCharFormat unknowns; // QTextCharFormat unknowns;
unknowns.setForeground(QBrush(Qt::gray)); // unknowns.setForeground(QBrush(Qt::gray));
QTextCharFormat generate; // QTextCharFormat generate;
generate.setForeground(QBrush(Qt::blue)); // generate.setForeground(QBrush(Qt::blue));
QTextCharFormat error; // QTextCharFormat error;
error.setForeground(QBrush(Qt::red)); // error.setForeground(QBrush(Qt::red));
auto block = currentBlock(); // auto block = currentBlock();
auto words = parse_core->getWords(block.blockNumber()); // auto words = parse_core->getWords(block.blockNumber());
for(auto &w : words){ // for(auto &w : words){
QList<ErrorMessage> xerrors; // QList<ErrorMessage> xerrors;
if(w->host() == parse_core->unknowns()){ // if(w->host() == parse_core->unknowns()){
unknowns.setUnderlineStyle(QTextCharFormat::UnderlineStyle::WaveUnderline); // unknowns.setUnderlineStyle(QTextCharFormat::UnderlineStyle::WaveUnderline);
unknowns.setUnderlineColor(QColor(Qt::red)); // unknowns.setUnderlineColor(QColor(Qt::red));
setFormat(w->column()-1, w->toString().length(), unknowns); // setFormat(w->column()-1, w->toString().length(), unknowns);
} // }
else if(!w->host()->check(xerrors)){ // else if(!w->host()->check(xerrors)){
setFormat(w->column()-1, w->toString().length(), error); // setFormat(w->column()-1, w->toString().length(), error);
} // }
else{ // else{
setFormat(w->column()-1, w->toString().length(), generate); // setFormat(w->column()-1, w->toString().length(), generate);
} // }
} // }
} //}

View File

@ -3,7 +3,6 @@
#include <QObject> #include <QObject>
#include <QSyntaxHighlighter> #include <QSyntaxHighlighter>
#include <libParse.h>
namespace Core { namespace Core {
class AppCore; class AppCore;
@ -22,20 +21,20 @@ namespace Enhancement {
/** /**
* @brief * @brief
*/ */
class KeywordsHighlighter : public QSyntaxHighlighter // class KeywordsHighlighter : public QSyntaxHighlighter
{ // {
public: // public:
KeywordsHighlighter(QObject *parent = nullptr); // KeywordsHighlighter(QObject *parent = nullptr);
void reset(Parse::Result::DocCore *base); // void reset(Parse::Result::DocCore *base);
private: // private:
Parse::Result::DocCore *parse_core; // Parse::Result::DocCore *parse_core;
// QSyntaxHighlighter interface // // QSyntaxHighlighter interface
protected: // protected:
virtual void highlightBlock(const QString &text) override; // virtual void highlightBlock(const QString &text) override;
}; // };
} }

View File

@ -232,13 +232,13 @@ void MainWindow::initial_menubar(QMenuBar *mbar) {
XApp::disp_core->postCommand(CompVisible(this, this->errors_present, true)); XApp::disp_core->postCommand(CompVisible(this, this->errors_present, true));
XApp::disp_core->postCommand(Build(false)); XApp::disp_core->postCommand(Build(false));
}); });
sync_kernel->actionCheckSync(msgs, [this]() -> bool { return bottom_funcs->instContains(errors_present); }); sync_kernel->actionCheckSync(msgs, [this]() -> bool { return bottom_funcs->contains(errors_present); });
} }
// 脉络统计 // 脉络统计
{ {
auto chain_v = func->addAction("脉络统计", [this](bool v) { XApp::disp_core->postCommand(CompVisible(this, this->chains_view, v)); }); auto chain_v = func->addAction("脉络统计", [this](bool v) { XApp::disp_core->postCommand(CompVisible(this, this->chains_view, v)); });
chain_v->setCheckable(true); chain_v->setCheckable(true);
sync_kernel->registerTrigger([this]() -> bool { return right_funcs->instContains(chains_view); }, sync_kernel->registerTrigger([this]() -> bool { return right_funcs->contains(chains_view); },
[chain_v](bool v) { [chain_v](bool v) {
if (v != chain_v->isChecked()) if (v != chain_v->isChecked())
chain_v->setChecked(v); chain_v->setChecked(v);
@ -248,7 +248,7 @@ void MainWindow::initial_menubar(QMenuBar *mbar) {
{ {
auto unit_v = func->addAction("单元统计", [this](bool v) { XApp::disp_core->postCommand(CompVisible(this, this->units_view, v)); }); auto unit_v = func->addAction("单元统计", [this](bool v) { XApp::disp_core->postCommand(CompVisible(this, this->units_view, v)); });
unit_v->setCheckable(true); unit_v->setCheckable(true);
sync_kernel->registerTrigger([this]() -> bool { return right_funcs->instContains(units_view); }, sync_kernel->registerTrigger([this]() -> bool { return right_funcs->contains(units_view); },
[unit_v](bool v) { [unit_v](bool v) {
if (v != unit_v->isChecked()) if (v != unit_v->isChecked())
unit_v->setChecked(v); unit_v->setChecked(v);
@ -258,7 +258,7 @@ void MainWindow::initial_menubar(QMenuBar *mbar) {
{ {
auto board_v = func->addAction("故事统计", [this](bool v) { XApp::disp_core->postCommand(CompVisible(this, boards_view, v)); }); auto board_v = func->addAction("故事统计", [this](bool v) { XApp::disp_core->postCommand(CompVisible(this, boards_view, v)); });
board_v->setCheckable(true); board_v->setCheckable(true);
sync_kernel->registerTrigger([this]() -> bool { return right_funcs->instContains(boards_view); }, sync_kernel->registerTrigger([this]() -> bool { return right_funcs->contains(boards_view); },
[board_v](bool v) { [board_v](bool v) {
if (v != board_v->isChecked()) if (v != board_v->isChecked())
board_v->setChecked(v); board_v->setChecked(v);
@ -268,7 +268,7 @@ void MainWindow::initial_menubar(QMenuBar *mbar) {
{ {
auto concept_v = func->addAction("概念统计", [this](bool v) { XApp::disp_core->postCommand(CompVisible(this, concept_view, v)); }); auto concept_v = func->addAction("概念统计", [this](bool v) { XApp::disp_core->postCommand(CompVisible(this, concept_view, v)); });
concept_v->setCheckable(true); concept_v->setCheckable(true);
sync_kernel->registerTrigger([this]() -> bool { return right_funcs->instContains(concept_view); }, sync_kernel->registerTrigger([this]() -> bool { return right_funcs->contains(concept_view); },
[concept_v](bool v) { [concept_v](bool v) {
if (v != concept_v->isChecked()) if (v != concept_v->isChecked())
concept_v->setChecked(v); concept_v->setChecked(v);
@ -278,7 +278,7 @@ void MainWindow::initial_menubar(QMenuBar *mbar) {
{ {
auto fragments_v = func->addAction("情节序列", [this](bool v) { XApp::disp_core->postCommand(CompVisible(this, fragments_order, v)); }); auto fragments_v = func->addAction("情节序列", [this](bool v) { XApp::disp_core->postCommand(CompVisible(this, fragments_order, v)); });
fragments_v->setCheckable(true); fragments_v->setCheckable(true);
sync_kernel->registerTrigger([this]() -> bool { return right_funcs->instContains(fragments_order); }, sync_kernel->registerTrigger([this]() -> bool { return right_funcs->contains(fragments_order); },
[fragments_v](bool v) { [fragments_v](bool v) {
if (v != fragments_v->isChecked()) if (v != fragments_v->isChecked())
fragments_v->setChecked(v); fragments_v->setChecked(v);
@ -446,7 +446,7 @@ PresentBase *MainWindow::remove(const Route &unique) {
} }
} }
bool MainWindow::instContains(MakeTools::PresentBase *ins) const { return false; } bool MainWindow::contains(MakeTools::PresentBase *ins) const { return false; }
QWidget *MainWindow::hostWidget() const { return (QWidget *)this; } QWidget *MainWindow::hostWidget() const { return (QWidget *)this; }

View File

@ -85,7 +85,7 @@ class MainWindow : public QMainWindow, public Components::PresentHost, public Co
virtual bool active(const Core::Route &unique) override; virtual bool active(const Core::Route &unique) override;
virtual MakeTools::PresentBase *remove(const Core::Route &unique) override; virtual MakeTools::PresentBase *remove(const Core::Route &unique) override;
virtual bool instContains(MakeTools::PresentBase *ins) const override; virtual bool contains(MakeTools::PresentBase *ins) const override;
// HostListener interface // HostListener interface
public: public:

View File

@ -6,75 +6,120 @@ using namespace Components;
using namespace Core; using namespace Core;
using namespace DataModel; using namespace DataModel;
DocumentsManager::DocumentsManager(AppCore *src, DocumentsManager::DocumentsManager(Core::AppCore *src, Project::ProjectManager *project) : rtcore(src), pjtins(project), present_ui(nullptr) {}
Project::ProjectManager *project,
PresentHost *direct_con)
: rtcore(src), pjtins(project), present_ui(direct_con) {}
Project::ProjectManager *DocumentsManager::projectManager() const void DocumentsManager::setPresent(Components::PresentHost *container) { present_ui = container; }
{
return pjtins;
}
void DocumentsManager::newPackage(const Route &link) Project::ProjectManager *DocumentsManager::projectManager() const { return pjtins; }
{
pjtins->newPackage(link.links());
}
void DocumentsManager::newPackage(const Route &group, const QString &name) QList<QString> DocumentsManager::fileTypes() const {
{
newPackage(group|name);
}
QList<QString> DocumentsManager::fileTypes() const
{
QList<QString> all_types; QList<QString> all_types;
for(auto &it : rtcore->allViews()) for (auto &it : factory_map.keys())
all_types.append(it->suffixes()); all_types.append(it);
all_types.removeAll("*");
return all_types; return all_types;
} }
void DocumentsManager::newFile(const Route &group_path, const QString &name, const QString &suffix) void DocumentsManager::createPackage(const Core::Route &link) { pjtins->operateAccess()->newPackage(link.links()); }
{
auto list = rtcore->extensions(suffix);
QDir root = pjtins->directory();
auto rst = list.first()->create(root, name, suffix); void DocumentsManager::createFile(const Core::Route &group_path, const QString &name, const QString &suffix) {
if(std::get<0>(rst)){ auto all_types = fileTypes();
auto rpath = root.relativeFilePath(std::get<1>(rst)); if (!all_types.contains(suffix))
auto idx = pjtins->appendFile(converter(group_path), name, rpath); throw new SimpleException("指定文件类型无法打开:" + suffix);
openFile(converter(idx));
} auto midx = convertPath(group_path);
else{ auto fidx = projectManager()->operateAccess()->newFile(midx, name, suffix);
throw new SimpleException("无法创建文件:" + name); auto fileinfo = projectManager()->queryAccess()->queryInfo(fidx);
factory_map[suffix]->create(fileinfo);
}
void DocumentsManager::renameNode(const Core::Route &node_path, const QString &name) {
pjtins->operateAccess()->rename(convertPath(node_path), name);
auto activie_file_nodes = actives();
if (activie_file_nodes.contains(node_path)) {
auto inst = convertPresent(node_path);
inst->applySetting(name, rtcore);
doc_openning.remove(node_path);
auto old_link = node_path.links();
auto npath = Core::Route::collect(old_link.mid(0, old_link.size() - 1)) | name;
doc_openning[npath] = inst;
active(npath);
} }
} }
QModelIndex DocumentsManager::converter(const Route &path) void DocumentsManager::deleteNode(const Core::Route &node_path) {
{ auto node_mindex = convertPath(node_path);
auto file_nodes = pjtins->queryAccess()->filesGather(node_mindex);
auto activie_file_nodes = actives();
QList<Core::Route> path_buff;
for (auto &n : file_nodes) {
auto target = convertPath(n);
if (activie_file_nodes.contains(target))
path_buff << target;
}
closeFile(path_buff);
pjtins->operateAccess()->deleteT(node_mindex);
}
void DocumentsManager::openFile(const QList<Route> &doc_paths) {
for (auto &it : doc_paths) {
auto openning = actives();
if (openning.contains(it)) {
doc_openning[it]->applySetting(it.links().last(), rtcore);
active(it);
continue;
}
auto info = pjtins->queryAccess()->queryInfo(convertPath(it));
if (!info.isFile())
throw new SimpleException("指向的节点不是文件节点");
auto view = factory_map[info.suffix()]->newInst(present_ui->hostWidget());
doc_openning[it] = view;
view->load(info);
view->applySetting(it.links().last(), rtcore);
present_ui->append(view);
}
}
void DocumentsManager::closeFile(const QList<Core::Route> &doc_paths) {
auto actives = this->actives();
for (auto &idx : doc_paths)
if (actives.contains(idx)) {
auto inst = convertPresent(idx);
inst->saveAs();
present_ui->remove(inst);
delete inst;
doc_openning.remove(idx);
}
}
QModelIndex DocumentsManager::convertPath(const Core::Route &path) {
auto path_list = path.links(); auto path_list = path.links();
auto itor_node = pjtins->model()->item(0); auto itor_node = pjtins->model()->item(0);
while (path_list.size() > 1) { while (path_list.size() > 1) {
auto item = path_list.takeAt(1); auto item = path_list.takeAt(1);
int idx = 0; int idx = 0;
for(; idx<itor_node->rowCount(); ++idx){ for (; idx < itor_node->rowCount(); ++idx) {
if(itor_node->child(idx)->text() == item){ if (itor_node->child(idx)->text() == item) {
itor_node = itor_node->child(idx); itor_node = itor_node->child(idx);
break; break;
} }
} }
if (idx == itor_node->parent()->rowCount()) if (idx == itor_node->parent()->rowCount())
throw new SimpleException("指定的path非法/"+ path.links().join("/")); throw new SimpleException("指定的path非法/" + path.links().join("/"));
} }
return itor_node->index(); return itor_node->index();
} }
Route DocumentsManager::converter(const QModelIndex &index) Route DocumentsManager::convertPath(const QModelIndex &index) {
{ Core::Route path;
Route path;
auto item = pjtins->model()->itemFromIndex(index); auto item = pjtins->model()->itemFromIndex(index);
while (item != nullptr) { while (item != nullptr) {
path.prepend(item->text().trimmed()); path.prepend(item->text().trimmed());
@ -84,184 +129,23 @@ Route DocumentsManager::converter(const QModelIndex &index)
return path; return path;
} }
void DocumentsManager::removeNode(const Route &node_path) Route DocumentsManager::convertPresent(MakeTools::FilePresent *ins) const { return doc_openning.key(ins); }
{
auto node_mindex = converter(node_path);
auto activie_file_nodes = actives(); MakeTools::FilePresent *DocumentsManager::convertPresent(const Core::Route &node_path) { return doc_openning[node_path]; }
auto file_nodes = pjtins->filesGather(node_mindex);
QList<Route> path_buff;
for(auto &n : file_nodes){
auto target = converter(n);
if(activie_file_nodes.contains(target))
path_buff << target;
}
close(path_buff);
pjtins->delete(node_mindex);
}
void DocumentsManager::renameNode(const Route &node_path, const QString &name)
{
pjtins->rename(converter(node_path), name);
auto activie_file_nodes = actives();
if(activie_file_nodes.contains(node_path)){
auto inst = activePresentOf(node_path);
inst->applySetting(name, rtcore);
present_ui->active(node_path);
}
}
void DocumentsManager::openFile(const Route &path_node)
{
auto info = pjtins->queryInfo(converter(path_node));
if(!info.isFile())
throw new SimpleException("打开的节点不是文件节点");
if(actives().contains(path_node)){
doc_openning[path_node]->applySetting(path_node.links().last(), rtcore);
present_ui->active(path_node);
return;
}
auto list = rtcore->extensions(info.suffix());
auto nview = list.first()->newInst();
nview->load(info);
nview->applySetting(path_node.links().last(), rtcore);
doc_openning[path_node] = nview;
present_ui->append(nview, path_node);
functions_build[nview] = [this, nview](const QString &file_path) {
auto nv = dynamic_cast<MakeTools::CompileFeature *>(nview);
auto content = nv->getText();
rtcore->getMakeCore()->compileSource(file_path, content, nview->name());
};
functions_render[nview] = [nview, this](const QString &) {
QObject::disconnect(nview, &MakeTools::FilePresent::dataChanged, nullptr, nullptr);
auto nv = dynamic_cast<Enhancement::HighlightFeature *>(nview);
nv->renderRepeat();
auto func_build = functions_build[nview];
auto func_render = functions_render[nview];
QObject::connect(nview, &MakeTools::FilePresent::dataChanged, func_build);
QObject::connect(nview, &MakeTools::FilePresent::dataChanged, func_render);
};
auto flags = nview->features();
// 编译机制 =========================================
if (flags.testFlag(MakeTools::FilePresent::Feature::Compile)) {
QObject::connect(nview, &MakeTools::FilePresent::dataChanged, functions_build[nview]);
}
// 高亮机制 =========================================
if (flags.testFlag(MakeTools::FilePresent::Feature::HighLight)) {
auto nv = dynamic_cast<Enhancement::HighlightFeature *>(nview);
nv->contexBinding(rtcore);
QObject::connect(nview, &MakeTools::FilePresent::dataChanged, functions_render[nview]);
}
}
QList<Route> DocumentsManager::actives() const { return doc_openning.keys(); } QList<Route> DocumentsManager::actives() const { return doc_openning.keys(); }
MakeTools::FilePresent *DocumentsManager::activePresentOf(const Route &node_path) void DocumentsManager::active(const Core::Route &node_path) {
{ if (doc_openning.contains(node_path)) {
return doc_openning[node_path]; auto inst = convertPresent(node_path);
present_ui->active(inst);
}
} }
void DocumentsManager::save(const QList<Route> &docs_path) void DocumentsManager::save() {
{
auto actives_paths = this->actives(); auto actives_paths = this->actives();
for(auto &idx_path : docs_path) for (auto &p : actives_paths)
if(actives_paths.contains(idx_path)) convertPresent(p)->saveAs();
activePresentOf(idx_path)->saveAs();
} }
void DocumentsManager::close(const QList<Route> &doc_paths) QString DocumentsManager::name() const { return NAME(DocumentsManager); }
{
auto actives = this->actives();
for(auto &idx : doc_paths)
if(actives.contains(idx)){
auto inst = activePresentOf(idx);
inst->saveAs();
present_ui->remove(idx);
delete inst;
doc_openning.remove(idx);
}
}
Route DocumentsManager::pathOf(MakeTools::FilePresent *ins) const
{
return doc_openning.key(ins);
}
Route DocumentsManager::pathOf(const QModelIndex &p) const
{
if(!p.isValid())
throw new SimpleException("传入非法QModelIndex");
auto item = projectManager()->model()->itemFromIndex(p);
auto proot = projectManager()->model()->item(0);
Route retv;
while(proot != item){
retv = retv|item->text();
item = item->parent();
}
return retv;
}
void DocumentsManager::build(bool all_from_disk)
{
if(!all_from_disk)
save();
auto chains = pjtins->filesWithEnds("storychain");
for(auto &it : chains){
rtcore->getMakeCore()->compile(std::get<1>(it), std::get<0>(it));
}
auto units = pjtins->filesWithEnds("storyunit");
for(auto &it : units)
rtcore->getMakeCore()->compile(std::get<1>(it), std::get<0>(it));
auto storys = pjtins->filesWithEnds("storyboard");
for(auto &it : storys)
rtcore->getMakeCore()->compile(std::get<1>(it), std::get<0>(it));
auto volumes = pjtins->filesWithEnds("storyvolume");
for(auto &it : volumes)
rtcore->getMakeCore()->compile(std::get<1>(it), std::get<0>(it));
auto concepts = pjtins->filesWithEnds("storyconcept");
for(auto &it : concepts)
rtcore->getMakeCore()->compile(std::get<1>(it), std::get<0>(it));
}
QString DocumentsManager::name() const
{
return NAME(DocumentsManager);
}
void DocumentsManager::hasBeenAccepted(const Core::Route &key) {}
void DocumentsManager::hasBeenRemoved(const Core::Route &key) {
}
void DocumentsManager::hasBeenClosed(const Core::Route &key) {
if (!doc_openning.contains(key))
return;
auto inst = doc_openning[key];
inst->widget()->setVisible(false);
delete inst;
doc_openning.remove(key);
}

View File

@ -4,10 +4,11 @@
#include "DocsManager.h" #include "DocsManager.h"
#include "route.h" #include "route.h"
#include <QList>
#include <QTreeView> #include <QTreeView>
#include <QWidget> #include <QWidget>
#include <libProjectManager.h>
#include <commandsdispatcher.h> #include <commandsdispatcher.h>
#include <libProjectManager.h>
namespace Core { namespace Core {
class AppCore; class AppCore;
@ -19,15 +20,6 @@ namespace MakeTools {
namespace Components { namespace Components {
class HostListener {
public:
virtual ~HostListener() = default;
virtual void hasBeenAccepted(const Core::Route &key) = 0;
virtual void hasBeenRemoved(const Core::Route &key) = 0;
virtual void hasBeenClosed(const Core::Route &key) = 0;
};
class PresentHost { class PresentHost {
public: public:
virtual ~PresentHost() = default; virtual ~PresentHost() = default;
@ -42,22 +34,23 @@ namespace Components {
* @brief * @brief
* @param ins * @param ins
*/ */
virtual void append(MakeTools::PresentBase *ins, const Core::Route &key) = 0; virtual void append(MakeTools::PresentBase *ins) = 0;
/** /**
* @brief * @brief
* @param ins * @param ins
*/ */
virtual bool active(const Core::Route &key) = 0; virtual bool active(const MakeTools::PresentBase *ins) = 0;
/** /**
* @brief * @brief
* @param ins * @param ins
*/ */
virtual MakeTools::PresentBase *remove(const Core::Route &key) = 0; virtual void remove(const MakeTools::PresentBase *ins) = 0;
/**
virtual bool instContains(MakeTools::PresentBase *ins) const = 0; * @brief
* @param ins
virtual void setVisibleState(bool state) = 0; * @return
virtual bool visibleState() const = 0; */
virtual bool contains(const MakeTools::PresentBase *ins) const = 0;
}; };
} // namespace Components } // namespace Components
@ -67,121 +60,135 @@ namespace DataModel {
/** /**
* @brief * @brief
*/ */
class DocumentsManager : public Schedule::AccessibleObject, public Components::HostListener { class DocumentsManager : public Schedule::AccessibleObject {
public: public:
DocumentsManager(Core::AppCore *src, Project::ProjectManager *project, Components::PresentHost *direct_con); DocumentsManager(Core::AppCore *src, Project::ProjectManager *project);
virtual ~DocumentsManager() = default; virtual ~DocumentsManager() = default;
Project::ProjectManager* projectManager() const; /**
* @brief
* @param container
*/
void setPresent(Components::PresentHost *container);
/** /**
* @brief * @brief
* @param path [/x_name]+ * @return
*/ */
void newPackage(const Core::Route &link); Project::ProjectManager *projectManager() const;
// ==========================================================
/** /**
* @brief Index * @brief
* @param group * @param ins
* @param name
* @throw SimpleException
*/ */
void newPackage(const Core::Route &group, const QString &name); template <class PresentType> void registPresentType(MakeTools::TypedPresentFactory<PresentType> *ins) {
auto suffix = MakeTools::TypedPresentFactory<PresentType>::suffix();
factory_map[suffix] = ins;
}
// ==========================================================
/** /**
* @brief * @brief
* @return {txt, storychain, } * @return {txt, storyboard, }
*/ */
QList<QString> fileTypes() const; QList<QString> fileTypes() const;
/**
* @brief
* @param link
* @throw SimpleException
*/
void createPackage(const Core::Route &link);
/** /**
* @brief * @brief
* @param group * @param group_path
* @param name * @param name
* @param suffix * @param suffix
* @throw SimpleException * @throw SimpleException
*/ */
void newFile(const Core::Route &group_path, const QString &name, const QString &suffix); void createFile(const Core::Route &group_path, const QString &name, const QString &suffix);
QModelIndex converter(const Core::Route &path);
Core::Route converter(const QModelIndex &index);
/**
* @brief
* @param node
* @throw SimpleException
*/
void removeNode(const Core::Route &node_path);
/** /**
* @brief * @brief
* @param node Index * @param node_path
* @param name * @param name
* @throw SimpleException * @throw SimpleException
*/ */
void renameNode(const Core::Route &node_path, const QString &name); void renameNode(const Core::Route &node_path, const QString &name);
/**
* @brief
* @param node_path
* @throw SimpleException
*/
void deleteNode(const Core::Route &node_path);
/** /**
* @brief * @brief
* @param path_node * @param path_node
* @throw SimpleException * @throw SimpleException
*/ */
void openFile(const Core::Route &path_node); void openFile(const QList<Core::Route> &doc_paths);
/**
* @brief
* @param doc_paths
*/
void closeFile(const QList<Core::Route> &doc_paths = QList<Core::Route>());
/**
* @brief
* @param path
* @return
*/
QModelIndex convertPath(const Core::Route &path);
/**
* @brief
* @param path
* @return
*/
Core::Route convertPath(const QModelIndex &index);
/**
* @brief
* @param ins
* @return
*/
Core::Route convertPresent(MakeTools::FilePresent *ins) const;
/**
* @brief null
* @param node_path
* @return null或打开的展示实例
*/
MakeTools::FilePresent *convertPresent(const Core::Route &node_path);
/** /**
* @brief * @brief
* @return * @return
*/ */
QList<Core::Route> actives() const; QList<Core::Route> actives() const;
/**
* @brief null void active(const Core::Route &node_path);
* @param node
* @return null或打开的展示实例
*/
MakeTools::FilePresent* activePresentOf(const Core::Route &node_path);
/** /**
* @brief * @brief
* @param docs * @param docs
*/ */
void save(const QList<Core::Route> &docs = QList<Core::Route>()); void save();
/**
* @brief
* @param docs
*/
void close(const QList<Core::Route> &doc_paths = QList<Core::Route>());
/**
* @brief ModelIndex
* @param ins
*/
Core::Route pathOf(MakeTools::FilePresent *ins) const;
Core::Route pathOf(const QModelIndex &p) const;
/**
* @brief
* @param disk
*/
void build(bool disk);
// AccessibleObject interface // AccessibleObject interface
public: public:
virtual QString name() const override; virtual QString name() const override;
// HostListener interface private:
public:
virtual void hasBeenAccepted(const Core::Route &key) override;
virtual void hasBeenRemoved(const Core::Route &key) override;
virtual void hasBeenClosed(const Core::Route &key) override;
private:
Core::AppCore *const rtcore; Core::AppCore *const rtcore;
Project::ProjectManager *pjtins; Project::ProjectManager *pjtins;
Components::PresentHost *present_ui; Components::PresentHost *present_ui;
QHash<QString, MakeTools::PresentFactory *> factory_map;
QHash<Core::Route, MakeTools::FilePresent *> doc_openning; QHash<Core::Route, MakeTools::FilePresent *> doc_openning;
QHash<MakeTools::FilePresent *, std::function<void(const QString &)>> functions_build;
QHash<MakeTools::FilePresent *, std::function<void(const QString &)>> functions_render;
}; };
} // namespace DataModel } // namespace DataModel

View File

@ -1,37 +1,8 @@
#include "messagespresent.h" #include "messagespresent.h"
using namespace Components; using namespace Components;
using namespace Parse;
using namespace Parse::Result;
MessagesPresent::MessagesPresent(MakeTools::StoryTool *tool, QWidget *parent) MessagesPresent::MessagesPresent(QStandardItemModel *base, QWidget *parent) : QTableView(parent), items_present(base) { setModel(items_present); }
: QTableView(parent), core_ins(tool), items_present(new QStandardItemModel(this)) {
setModel(items_present);
}
void MessagesPresent::refresh() {
items_present->clear();
QList<ErrorMessage> errors;
core_ins->checkPass(errors);
for(auto &err : errors){
QList<QStandardItem*> row;
row << new QStandardItem(err.Reason);
row << new QStandardItem(err.Text);
row << new QStandardItem(err.FilePath);
row << new QStandardItem(QString("%1").arg(err.CodeRow + 1));
row << new QStandardItem(QString("%1").arg(err.CodeCol));
for(auto &ins : row)
ins->setEditable(false);
items_present->appendRow(row);
}
items_present->setHorizontalHeaderLabels(QStringList() << "错误原因"<<"源文本"<<"磁盘路径"<<"代码行"<<"代码列");
this->resizeColumnsToContents();
this->resizeRowsToContents();
}
QWidget *MessagesPresent::widget() const { return (QWidget *)this; } QWidget *MessagesPresent::widget() const { return (QWidget *)this; }

View File

@ -2,33 +2,27 @@
#define MESSAGEPRESENT_H #define MESSAGEPRESENT_H
#include "DocsManager.h" #include "DocsManager.h"
#include "StoryTool.h"
#include <QStandardItemModel> #include <QStandardItemModel>
#include <QTableView> #include <QTableView>
#include <QWidget> #include <QWidget>
#include <libParse.h>
namespace Components { namespace Components {
/** /**
* @brief * @brief
*/ */
class MessagesPresent : public QTableView, public MakeTools::PresentBase { class MessagesPresent : public QTableView, public MakeTools::PresentBase {
public: public:
MessagesPresent(MakeTools::StoryTool *tool, QWidget *parent = nullptr); MessagesPresent(QStandardItemModel *base, QWidget *parent = nullptr);
virtual ~MessagesPresent() = default; virtual ~MessagesPresent() = default;
void refresh();
private: private:
MakeTools::StoryTool *const core_ins;
QStandardItemModel *const items_present; QStandardItemModel *const items_present;
// PresentBase interface // PresentBase interface
public: public:
virtual QWidget *widget() const override; virtual QWidget *widget() const override;
virtual QString name() const override; virtual QString name() const override;
}; };
} } // namespace Components
#endif // MESSAGEPRESENT_H #endif // MESSAGEPRESENT_H

View File

@ -254,14 +254,16 @@ void ParseBridge::load_article(const QDomElement &article_elm, QStandardItem *pi
QStandardItem *ParseBridge::locate_node(QStandardItemModel *model, const QStringList path) { QStandardItem *ParseBridge::locate_node(QStandardItemModel *model, const QStringList path) {
QStandardItem *current_item = nullptr; QStandardItem *current_item = nullptr;
for (auto n : path) { for (auto &n : path) {
if (!current_item) if (!current_item) {
current_item = model->findChild<QStandardItem *>(n, Qt::FindChildOption::FindDirectChildrenOnly); for (auto idx = 0; idx < model->rowCount(); ++idx) {
else { if (model->item(idx)->text() == n)
current_item = model->item(idx);
}
} else {
for (auto idx = 0; idx < current_item->rowCount(); ++idx) { for (auto idx = 0; idx < current_item->rowCount(); ++idx) {
if (current_item->child(idx)->text() == n) { if (current_item->child(idx)->text() == n) {
current_item = current_item->child(idx); current_item = current_item->child(idx);
continue;
} }
} }
} }

View File

@ -126,7 +126,7 @@ namespace bridge {
template <class T, int idx> class SupplyItem : public QStandardItem { template <class T, int idx> class SupplyItem : public QStandardItem {
public: public:
SupplyItem(const T *bitem) : value_store(bitem) { setText(bitem[idx]); } SupplyItem(T *bitem) : value_store(bitem) { setText((*bitem)[idx]); }
private: private:
const T *const value_store; const T *const value_store;

View File

@ -78,7 +78,7 @@ PresentBase *PresentContainer::remove(const Core::Route &key) {
return inst; return inst;
} }
bool PresentContainer::instContains(MakeTools::PresentBase *ins) const { bool PresentContainer::contains(MakeTools::PresentBase *ins) const {
for (auto &insit : items_store) { for (auto &insit : items_store) {
if (insit == ins) if (insit == ins)
return true; return true;

View File

@ -20,7 +20,7 @@ namespace Components {
virtual void append(MakeTools::PresentBase *ins, const Core::Route &key) override; virtual void append(MakeTools::PresentBase *ins, const Core::Route &key) override;
virtual bool active(const Core::Route &key) override; virtual bool active(const Core::Route &key) override;
virtual MakeTools::PresentBase *remove(const Core::Route &key) override; virtual MakeTools::PresentBase *remove(const Core::Route &key) override;
virtual bool instContains(MakeTools::PresentBase *ins) const override; virtual bool contains(MakeTools::PresentBase *ins) const override;
virtual void setVisibleState(bool state) override; virtual void setVisibleState(bool state) override;
virtual bool visibleState() const override; virtual bool visibleState() const override;

View File

@ -8,30 +8,34 @@
#include <QTextStream> #include <QTextStream>
using namespace Components; using namespace Components;
using namespace Parse::Result;
using namespace Enhancement; using namespace Enhancement;
using namespace Core; using namespace Core;
class Impl_EditError : public MakeTools::EditException {
public:
Impl_EditError(const QString &title, const QString &reason) {
this->t = title;
this->r = reason;
buffer = r.toLocal8Bit();
}
// exception interface
public:
virtual const char *what() const override { return buffer; }
DefaultTextEdit:: DefaultTextEdit() // ParseException interface
:edit_square(new QTextEdit){} public:
virtual QString reason() const override { return r; }
virtual QString title() const override { return t; }
private:
QString r, t;
QByteArray buffer;
};
void DefaultTextEdit::modeReset(const QString &) const QString DefaultTextEdit::file_suffix = "txt";
{
} DefaultTextEdit::DefaultTextEdit(QObject *parent) : MakeTools::FilePresent(parent), edit_square(new QTextEdit) {}
QList<QString> DefaultTextEdit::modes() const
{
return QList<QString>() << "文本";
}
QString DefaultTextEdit::currentMode() const
{
return modes()[0];
}
void DefaultTextEdit::jumpTo(const QList<QString> &path) void DefaultTextEdit::jumpTo(const QList<QString> &path)
{ {
@ -43,24 +47,6 @@ MakeTools::FilePresent::Features DefaultTextEdit::features()
return Features(); return Features();
} }
std::tuple<bool, QString> DefaultTextEdit::create(const QDir &target, const QString &name, const QString &suffix)
{
auto x = target.filePath(QString("%1.%2").arg(name, suffix));
if(QFileInfo::exists(x))
return std::make_tuple(false, x);
QFile xf(x);
if(!xf.open(QIODevice::WriteOnly|QIODevice::Text))
throw new std::exception(QString("指定文件无法建立:" + x).toLocal8Bit());
return std::make_tuple(true, target.relativeFilePath(x));
}
MakeTools::FilePresent * DefaultTextEdit::newInst() const
{
return new DefaultTextEdit();
}
void DefaultTextEdit::applySetting(const QString &name, Core::AppCore *core) void DefaultTextEdit::applySetting(const QString &name, Core::AppCore *core)
{ {
name_store = name; name_store = name;
@ -74,12 +60,12 @@ QString DefaultTextEdit::name() const
void DefaultTextEdit::load(const QFileInfo &target_file) void DefaultTextEdit::load(const QFileInfo &target_file)
{ {
if(!target_file.exists()) if(!target_file.exists())
throw new std::exception(QString("指定文件未找到:%1").arg(target_file.absoluteFilePath()).toLocal8Bit()); throw new Impl_EditError("解析错误", QString("指定文件未找到:%1").arg(target_file.absoluteFilePath()));
target_file_path = target_file.canonicalFilePath(); target_file_path = target_file.canonicalFilePath();
QFile bin(target_file_path); QFile bin(target_file_path);
if(!bin.open(QIODevice::ReadOnly | QIODevice::Text)) if(!bin.open(QIODevice::ReadOnly | QIODevice::Text))
throw new std::exception(QString("指定文件无法打开:%1").arg(target_file.absoluteFilePath()).toLocal8Bit()); throw new Impl_EditError("解析错误", QString("指定文件无法打开:%1").arg(target_file.absoluteFilePath()));
QTextStream tin(&bin); QTextStream tin(&bin);
tin.setCodec("UTF-8"); tin.setCodec("UTF-8");
@ -110,23 +96,22 @@ QString DefaultTextEdit::relativeTargetPath(const QDir &base) const
return base.relativeFilePath(target_file_path); return base.relativeFilePath(target_file_path);
} }
bool DefaultTextEdit::isModified() const bool DefaultTextEdit::isModified() const { return true; }
{
return true;
}
QList<QString> DefaultTextEdit::suffixes() const QString DefaultTextEdit::absoluteTargetPath() const { return target_file_path; }
{
return QStringList() << "txt" << "*";
}
QString DefaultTextEdit::absoluteTargetPath() const QWidget *DefaultTextEdit::widget() const { return edit_square; }
{
return target_file_path;
}
void DefaultTextEditFactory::create(const QFileInfo &target) {
QFile base_f(target.canonicalFilePath());
if (!base_f.exists()) {
throw new Impl_EditError("新建错误", "指定路径不合法,文件不存在:" + target.absoluteFilePath());
}
QWidget * DefaultTextEdit::widget() const if (!base_f.open(QIODevice::WriteOnly | QIODevice::Text))
{ throw new Impl_EditError("新建错误", QString("指定文件无法建立:" + target.absoluteFilePath()));
return edit_square;
base_f.write(" ");
base_f.flush();
base_f.close();
} }

View File

@ -2,27 +2,22 @@
#define SRCEDIT_DEFAULTTEXT_H #define SRCEDIT_DEFAULTTEXT_H
#include "DocsManager.h" #include "DocsManager.h"
#include "ContentPresent.h"
#include <QSyntaxHighlighter> #include <QSyntaxHighlighter>
#include <QFileInfo>
#include <QTextEdit> #include <QTextEdit>
namespace Components { namespace Components {
/** /**
* @brief Text默认文本编辑视图 * @brief Text默认文本编辑视图
*/ */
class DefaultTextEdit : public MakeTools::FilePresent, public Presents::ModeView { class DefaultTextEdit : public MakeTools::FilePresent {
public: DECL_PRESENT(DefaultTextEdit);
DefaultTextEdit();
virtual ~DefaultTextEdit() = default;
// ModeView interface
public: public:
virtual void modeReset(const QString &) const override; DefaultTextEdit(QObject *parent);
virtual QList<QString> modes() const override; virtual ~DefaultTextEdit() = default;
virtual QString currentMode() const override;
private: private:
QTextEdit * edit_square; QTextEdit * edit_square;
@ -32,21 +27,26 @@ namespace Components {
// ContentPresent interface // ContentPresent interface
public: public:
virtual std::tuple<bool, QString> create(const QDir &target, const QString &name, const QString &suffix) override;
virtual QWidget *widget() const override; virtual QWidget *widget() const override;
virtual MakeTools::FilePresent *newInst() const override;
virtual void applySetting(const QString &name, Core::AppCore *core) override; virtual void applySetting(const QString &name, Core::AppCore *core) override;
virtual QString name() const override; virtual QString name() const override;
virtual void load(const QFileInfo &target_file) override; virtual void load(const QFileInfo &target_file) override;
virtual void saveAs(const QString &path) override; virtual void saveAs(const QString &path) override;
virtual QString relativeTargetPath(const QDir &base) const override; virtual QString relativeTargetPath(const QDir &base) const override;
virtual bool isModified() const override; virtual bool isModified() const override;
virtual QList<QString> suffixes() const override;
virtual QString absoluteTargetPath() const override; virtual QString absoluteTargetPath() const override;
virtual void jumpTo(const QList<QString> &path) override; virtual void jumpTo(const QList<QString> &path) override;
virtual Features features() override; virtual Features features() override;
}; };
}
class DefaultTextEditFactory : public MakeTools::TypedPresentFactory<DefaultTextEdit> {
public:
virtual ~DefaultTextEditFactory() = default;
// PresentFactory interface
public:
virtual void create(const QFileInfo &target) override;
};
} // namespace Components
#endif // SRCEDIT_DEFAULTTEXT_H #endif // SRCEDIT_DEFAULTTEXT_H

View File

@ -7,61 +7,47 @@
#include <QVBoxLayout> #include <QVBoxLayout>
using namespace Components; using namespace Components;
using namespace Parse::Result;
using namespace Enhancement; using namespace Enhancement;
using namespace Core; using namespace Core;
class Impl_EditError2 : public MakeTools::EditException {
public:
Impl_EditError2(const QString &title, const QString &reason) {
this->t = title;
this->r = reason;
buffer = r.toLocal8Bit();
}
StorySourceEdit::StorySourceEdit() // exception interface
: words_highlighter(new KeywordsHighlighter(this)), public:
edit_square(new QTextEdit) virtual const char *what() const override { return buffer; }
{
words_highlighter->setDocument(this->edit_square->document()); // ParseException interface
public:
virtual QString reason() const override { return r; }
virtual QString title() const override { return t; }
private:
QString r, t;
QByteArray buffer;
};
QString StorySourceEdit::file_suffix = "storyboard";
StorySourceEdit::StorySourceEdit(QObject *parent)
: MakeTools::FilePresent(parent),
// words_highlighter(new KeywordsHighlighter(this)),
edit_square(new QTextEdit) {
// words_highlighter->setDocument(this->edit_square->document());
connect(edit_square, &QTextEdit::textChanged, [this](){ connect(edit_square, &QTextEdit::textChanged, [this](){
emit this->dataChanged(filepath_store); emit this->dataChanged(filepath_store);
}); });
} }
void StorySourceEdit::modeReset(const QString &) const{}
QList<QString> StorySourceEdit::modes() const
{
return QList<QString>() << "源码";
}
QString StorySourceEdit::currentMode() const
{
return modes()[0];
}
void StorySourceEdit::contexBinding(Core::AppCore *app) { this->core_temp = app; } void StorySourceEdit::contexBinding(Core::AppCore *app) { this->core_temp = app; }
void StorySourceEdit::renderRepeat() const void StorySourceEdit::renderRepeat() const {
{ // this->words_highlighter->rehighlight();
this->words_highlighter->rehighlight();
}
QList<QString> StorySourceEdit::suffixes() const
{
return QList<QString>() << "storyboard";
}
std::tuple<bool, QString> StorySourceEdit::create(const QDir &target, const QString &name, const QString &suffix)
{
auto path = target.filePath(QString("%1.%2").arg(name, suffix));
if(QFileInfo::exists(path))
return std::make_tuple(false, path);
QFile nwf(path);
if(!nwf.open(QIODevice::WriteOnly|QIODevice::Text))
throw new SimpleException("指定文件无法创建:"+path);
return std::make_tuple(true, target.relativeFilePath(path));
}
MakeTools::FilePresent *StorySourceEdit::newInst() const
{
return new StorySourceEdit();
} }
QWidget *StorySourceEdit::widget() const QWidget *StorySourceEdit::widget() const
@ -132,22 +118,35 @@ void StorySourceEdit::applySetting(const QString &name, Core::AppCore *core)
} }
void StorySourceEdit::jumpTo(const QList<QString> &path) void StorySourceEdit::jumpTo(const QList<QString> &path) {
{ // auto fpath = this->absoluteTargetPath();
auto fpath = this->absoluteTargetPath(); // 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(); // auto first_word = storynode->refered()[0];
auto first_word = storynode->refered()[0];
auto textblock = this->edit_square->document()->findBlockByNumber(first_word->row()); // auto textblock = this->edit_square->document()->findBlockByNumber(first_word->row());
auto cur = this->edit_square->textCursor(); // auto cur = this->edit_square->textCursor();
cur.setPosition(textblock.position()); // cur.setPosition(textblock.position());
this->edit_square->setTextCursor(cur); // this->edit_square->setTextCursor(cur);
} // }
} }
MakeTools::FilePresent::Features StorySourceEdit::features() MakeTools::FilePresent::Features StorySourceEdit::features()
{ {
return Feature::Compile | Feature::HighLight; return Feature::Compile | Feature::HighLight;
} }
void StorySourceEditFactory::create(const QFileInfo &target) {
QFile base_f(target.canonicalFilePath());
if (!base_f.exists()) {
throw new Impl_EditError2("新建错误", "指定路径不合法,文件不存在:" + target.absoluteFilePath());
}
if (!base_f.open(QIODevice::WriteOnly | QIODevice::Text))
throw new Impl_EditError2("新建错误", QString("指定文件无法建立:" + target.absoluteFilePath()));
base_f.write(" ");
base_f.flush();
base_f.close();
}

View File

@ -8,23 +8,15 @@
namespace Components { namespace Components {
class StorySourceEdit : public Presents::ModeView, class StorySourceEdit : public MakeTools::CompileFeature, public MakeTools::FilePresent, public Enhancement::HighlightFeature {
public MakeTools::CompileFeature, DECL_PRESENT(StorySourceEdit);
public MakeTools::FilePresent,
public Enhancement::HighlightFeature {
public: public:
StorySourceEdit(); StorySourceEdit(QObject *parent);
virtual ~StorySourceEdit() = default; virtual ~StorySourceEdit() = default;
// ModeView interface
public:
virtual void modeReset(const QString &type) const override;
virtual QList<QString> modes() const override;
virtual QString currentMode() const override;
private: private:
QSyntaxHighlighter *const words_highlighter; // QSyntaxHighlighter *const words_highlighter;
Core::AppCore *core_temp; Core::AppCore *core_temp;
QString filepath_store; QString filepath_store;
QString name_store; QString name_store;
@ -32,14 +24,11 @@ namespace Components {
// HighlightDemand interface // HighlightDemand interface
public: public:
virtual void contexBinding(Core::AppCore *app) override; virtual void contexBinding(Core::AppCore *app) override;
virtual void renderRepeat() const override; virtual void renderRepeat() const override;
// ContentPresent interface // ContentPresent interface
public: public:
virtual QList<QString> suffixes() const override;
virtual std::tuple<bool, QString> create(const QDir &target, const QString &name, const QString &suffix) override;
virtual MakeTools::FilePresent *newInst() const override;
virtual QWidget *widget() const override; virtual QWidget *widget() const override;
virtual QString name() const override; virtual QString name() const override;
virtual void load(const QFileInfo &target_file) override; virtual void load(const QFileInfo &target_file) override;
@ -52,6 +41,14 @@ namespace Components {
virtual void jumpTo(const QList<QString> &path) override; virtual void jumpTo(const QList<QString> &path) override;
virtual Features features() override; virtual Features features() override;
}; };
}
class StorySourceEditFactory : public MakeTools::TypedPresentFactory<StorySourceEdit> {
// PresentFactory interface
public:
virtual void create(const QFileInfo &target) override;
};
} // namespace Components
#endif // SRCEDIT_STORYBOARD_H #endif // SRCEDIT_STORYBOARD_H

3
u_test/unnnn.cpp Normal file
View File

@ -0,0 +1,3 @@
#include "unnnn.h"
QString EditView::t = "txt";

16
u_test/unnnn.h Normal file
View File

@ -0,0 +1,16 @@
#ifndef UNNNN_H
#define UNNNN_H
#include <QString>
template <class TargetType> class TypeDefine {
public:
static QString suffix() { return TargetType::t; }
};
class EditView : public TypeDefine<EditView> {
public:
static QString t;
};
#endif // UNNNN_H