QtNovelUI/WordsIDE/manager_docs.cpp

152 lines
5.0 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "manager_docs.h"
#include "DocsManager.h"
#include "keywordshighlighter.h"
using namespace Components;
using namespace Core;
using namespace DataModel;
DocumentsManager::DocumentsManager(Core::AppCore *src, Project::ProjectManager *project) : rtcore(src), pjtins(project), present_ui(nullptr) {}
void DocumentsManager::setPresent(Components::PresentHost *container) { present_ui = container; }
Project::ProjectManager *DocumentsManager::projectManager() const { return pjtins; }
QList<QString> DocumentsManager::fileTypes() const {
QList<QString> all_types;
for (auto &it : factory_map.keys())
all_types.append(it);
return all_types;
}
void DocumentsManager::createPackage(const Core::Route &link) { pjtins->operateAccess()->newPackage(link.links()); }
void DocumentsManager::createFile(const Core::Route &group_path, const QString &name, const QString &suffix) {
auto all_types = fileTypes();
if (!all_types.contains(suffix))
throw new SimpleException("指定文件类型无法打开:" + suffix);
auto midx = convertPath(group_path);
auto fidx = projectManager()->operateAccess()->newFile(midx, name, suffix);
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);
}
}
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 itor_node = pjtins->model()->item(0);
while (path_list.size() > 1) {
auto item = path_list.takeAt(1);
int idx = 0;
for (; idx < itor_node->rowCount(); ++idx) {
if (itor_node->child(idx)->text() == item) {
itor_node = itor_node->child(idx);
break;
}
}
if (idx == itor_node->parent()->rowCount())
throw new SimpleException("指定的path非法/" + path.links().join("/"));
}
return itor_node->index();
}
Route DocumentsManager::convertPath(const QModelIndex &index) {
Core::Route path;
auto item = pjtins->model()->itemFromIndex(index);
while (item != nullptr) {
path.prepend(item->text().trimmed());
item = item->parent();
}
return path;
}
Route DocumentsManager::convertPresent(MakeTools::FilePresent *ins) const { return doc_openning.key(ins); }
MakeTools::FilePresent *DocumentsManager::convertPresent(const Core::Route &node_path) { return doc_openning[node_path]; }
QList<Route> DocumentsManager::actives() const { return doc_openning.keys(); }
void DocumentsManager::active(const Core::Route &node_path) {
if (doc_openning.contains(node_path)) {
auto inst = convertPresent(node_path);
present_ui->active(inst);
}
}
void DocumentsManager::save() {
auto actives_paths = this->actives();
for (auto &p : actives_paths)
convertPresent(p)->saveAs();
}
QString DocumentsManager::name() const { return NAME(DocumentsManager); }