#include "manager_docs.h" #include "DocsManager.h" #include "keywordshighlighter.h" #include "xapp.h" using namespace Core; using namespace Config; using namespace Presents; DocumentsManager::DocumentsManager(XApp *host) : core_inst(host) { initContentViewPlugins(); } void DocumentsManager::appendPresent(PresentHost *container) { if (present_ui.contains(container)) return; present_ui << container; } void DocumentsManager::removePresent(PresentHost *container) {} Project::ProjectManager *DocumentsManager::projectManager() const { return core_inst->pjtManager(); } #include "srcedit_defaulttext.h" #include "srcedit_storyboard.h" void DocumentsManager::initContentViewPlugins() { registPresentType(new DefaultTextEditFactory); registPresentType(new StorySourceEditFactory); } void DocumentsManager::loadViewConfigWidgets(QTabWidget *stacked) { if (!projectManager()->isOpenning()) return; auto keys = factory_map.keys(); for (auto &it : keys) { auto panel = factory_map[it]->createTempConfigPanel(projectManager()->configraions()); if (panel) stacked->addTab(panel, it + "配置"); } } QList DocumentsManager::fileTypes() const { QList all_types; for (auto &it : factory_map.keys()) all_types.append(it); return all_types; } void DocumentsManager::createPackage(const Core::Route &link) { core_inst->pjtManager()->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) { core_inst->pjtManager()->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, core_inst->pjtManager()->configraions()); 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 = core_inst->pjtManager()->queryAccess()->filesGather(node_mindex); auto activie_file_nodes = actives(); QList path_buff; for (auto &n : file_nodes) { auto target = convertPath(n); if (activie_file_nodes.contains(target)) path_buff << target; } closeFile(path_buff); core_inst->pjtManager()->operateAccess()->deleteT(node_mindex); } void DocumentsManager::openFile(const QList &doc_paths) { for (auto &it : doc_paths) { auto openning = actives(); if (openning.contains(it)) { doc_openning[it]->applySetting(it.links().last(), core_inst->pjtManager()->configraions()); active(it); continue; } auto info = core_inst->pjtManager()->queryAccess()->queryInfo(convertPath(it)); if (!info.isFile()) throw new SimpleException("打开文件错误", "指向的节点不是文件节点"); auto view = factory_map[info.suffix()]->newInst(this, it); doc_openning[it] = view; view->load(info); view->applySetting(it.links().last(), core_inst->pjtManager()->configraions()); for (auto &con : present_ui) if (con->avaliable(view)) { con->append(view); return; } // 默认第一个打开 present_ui.first()->append(view); } } void DocumentsManager::closeFile(const QList &doc_paths) { auto actives = this->actives(); for (auto &idx : doc_paths) if (actives.contains(idx)) { auto inst = convertPresent(idx); inst->saveAs(); for (auto vit : present_ui) if (present_ui.contains(vit)) vit->remove(inst); delete inst; doc_openning.remove(idx); } } QModelIndex DocumentsManager::convertPath(const Core::Route &path) { auto path_list = path.links(); auto itor_node = core_inst->pjtManager()->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 = core_inst->pjtManager()->model()->itemFromIndex(index); while (item != nullptr) { path.prepend(item->text().trimmed()); item = item->parent(); } return path; } Route DocumentsManager::convertPresent(FilePresent *ins) const { return doc_openning.key(ins); } FilePresent *DocumentsManager::convertPresent(const Core::Route &node_path) { return doc_openning[node_path]; } QList 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); for (auto &vit : present_ui) if (vit->contains(inst)) vit->active(inst); } } void DocumentsManager::save() { auto actives_paths = this->actives(); for (auto &p : actives_paths) convertPresent(p)->saveAs(); // files auto pjt = core_inst->pjtManager(); auto list = pjt->queryAccess()->filesWithEnds("storyboard"); } QString DocumentsManager::name() const { return NAME(DocumentsManager); }