diff --git a/WordsIDE/DocsManager.h b/WordsIDE/DocsManager.h index 38b3831..71ee3d6 100644 --- a/WordsIDE/DocsManager.h +++ b/WordsIDE/DocsManager.h @@ -12,45 +12,41 @@ namespace Core { } namespace Components { - class PresentBase { + /** + * @brief 内容编辑和呈现接口 + */ + class FilePresent : public QObject { + Q_OBJECT public: - /** - * @brief 获取新实例内的widget - * @return - */ - virtual QWidget *widget() const = 0; + explicit FilePresent(QObject *parent = nullptr); + virtual ~FilePresent() = default; /** * @brief 获取实例的别名 * @return */ virtual QString name() const = 0; + virtual Core::Route accessPath() const = 0; + + /** + * @brief 获取新实例内的widget + * @return + */ + virtual QWidget *widget() const = 0; + virtual Core::DocumentsManager *docsManager() const = 0; /** * @brief 视图关闭处理,额外处理步骤 */ virtual void beforeClose() = 0; - virtual Core::DocumentsManager *docsManager() const = 0; - }; - - /** - * @brief 内容编辑和呈现接口 - */ - class FilePresent : public QObject, public PresentBase { - Q_OBJECT - public: - explicit FilePresent(QObject *parent = nullptr); - virtual ~FilePresent() = default; - - virtual Core::Route accessPath() const = 0; - /** * @brief 载入设置和命名 * @param core * @param name */ virtual void applySetting(const QString &name) = 0; + /** * @brief 使用此实例打开指定的路径文件,冲刷掉所有状态 * @param target_file 指定文件的info @@ -106,7 +102,7 @@ namespace Components { * @brief 生成一个新Present实例 * @return */ - virtual FilePresent *newInst(Core::DocumentsManager *mgr, const Core::Route &path, QObject *parent) const = 0; + virtual FilePresent *newInst(Core::DocumentsManager *mgr, const Core::Route &path, QObject *parent = nullptr) const = 0; }; template class TypedPresentFactory : public PresentFactory { @@ -117,7 +113,7 @@ namespace Components { * @return */ static QString suffix() { return PresentType::file_suffix; } - virtual FilePresent *newInst(Core::DocumentsManager *mgr, const Core::Route &path, QObject *parent) const { + virtual FilePresent *newInst(Core::DocumentsManager *mgr, const Core::Route &path, QObject *parent = nullptr) const { return new PresentType(mgr, path, parent); } }; diff --git a/WordsIDE/command_list.cpp b/WordsIDE/command_list.cpp index 4930e60..e522ecd 100644 --- a/WordsIDE/command_list.cpp +++ b/WordsIDE/command_list.cpp @@ -192,7 +192,7 @@ void OpenFile::fromText(const QString &line) using namespace Components; -CompVisible::CompVisible(PresentHost *host, PresentBase *target, bool state) : host_ins(host), target_ins(target), state_val(state) { +CompVisible::CompVisible(PresentHost *host, FilePresent *target, bool state) : host_ins(host), target_ins(target), state_val(state) { path = Route::collect(QList() << target->name()); } diff --git a/WordsIDE/command_list.h b/WordsIDE/command_list.h index 9009d81..0cf83eb 100644 --- a/WordsIDE/command_list.h +++ b/WordsIDE/command_list.h @@ -7,7 +7,7 @@ namespace Components { class PresentHost; - class PresentBase; + class FilePresent; } namespace CommandList { @@ -29,7 +29,7 @@ namespace CommandList { }; class OpenProject : public Schedule::GeCommand { - public: + public: OpenProject(const QString &path); // GeCommand interface @@ -115,7 +115,7 @@ namespace CommandList { // 切换视图组件 ================================================================ class CompVisible : public Schedule::GeCommand { public: - CompVisible(Components::PresentHost *host, Components::PresentBase *target, bool state); + CompVisible(Components::PresentHost *host, Components::FilePresent *target, bool state); // GeCommand interface public: @@ -126,7 +126,7 @@ namespace CommandList { private: Components::PresentHost *host_ins; - Components::PresentBase *target_ins; + Components::FilePresent *target_ins; Core::Route path; bool state_val; }; diff --git a/WordsIDE/main.cpp b/WordsIDE/main.cpp index 23473f4..406fc3b 100644 --- a/WordsIDE/main.cpp +++ b/WordsIDE/main.cpp @@ -42,7 +42,7 @@ int main(int argc, char *argv[]) } } - MainWindow w; + MainWindow w("default"); w.show(); #endif diff --git a/WordsIDE/mainwindow.cpp b/WordsIDE/mainwindow.cpp index 0c1ae60..5970749 100644 --- a/WordsIDE/mainwindow.cpp +++ b/WordsIDE/mainwindow.cpp @@ -28,14 +28,15 @@ using namespace Tools; using namespace CommandList; using namespace bridge; -MainWindow::MainWindow(QWidget *parent) +MainWindow::MainWindow(const QString &layout, QWidget *parent) : QMainWindow(parent), + layout_name_store(layout), sync_kernel(new StatusSyncCore(this)), parse_service(new ParseBridge()), project_manager(new XMLProjectManager(this)), active_docscollect(new DocumentsManager(project_manager)), present_host(new SplitFrame::ViewPresent(this)), - session_service(new ViewSession(XApp::global_configration, present_host)), + session_service(new ViewSession(XApp::global_configration, this)), views_bar(new ViewStackedBar(present_host, this)), center_frame(new PresentContainer(present_host, this)), project_present(new ProjectPresent(present_host, XApp::disp_core, active_docscollect, this)) { @@ -57,12 +58,16 @@ MainWindow::MainWindow(QWidget *parent) initial_menubar(mbar); project_present->setVisible(true); - this->active_docscollect->setPresent(center_frame); + this->active_docscollect->appendPresent(center_frame); session_service->viewStatesRestore(this, present_host); } -MainWindow::~MainWindow() {} +MainWindow::~MainWindow() { active_docscollect->removePresent(center_frame); } + +SplitFrame::ViewPresent *MainWindow::bindPresent() const { return present_host; } + +QString MainWindow::layoutName() const { return layout_name_store; } void MainWindow::initial_menubar(QMenuBar *mbar) { diff --git a/WordsIDE/mainwindow.h b/WordsIDE/mainwindow.h index 0c70b68..8e18a81 100644 --- a/WordsIDE/mainwindow.h +++ b/WordsIDE/mainwindow.h @@ -22,11 +22,15 @@ class MainWindow : public QMainWindow { Q_OBJECT - public: - MainWindow(QWidget *parent = nullptr); - ~MainWindow(); +public: + MainWindow(const QString &layout, QWidget *parent = nullptr); + virtual ~MainWindow(); + + SplitFrame::ViewPresent *bindPresent() const; + QString layoutName() const; private: + QString layout_name_store; // model ============================================ Tools::StatusSyncCore *const sync_kernel; bridge::ParseBridge *const parse_service; @@ -45,7 +49,7 @@ private: void initial_commandlist(Schedule::CommandsDispatcher *host); // QWidget interface - protected: +protected: virtual void closeEvent(QCloseEvent *event) override; // QObject interface diff --git a/WordsIDE/manager_docs.cpp b/WordsIDE/manager_docs.cpp index fccee27..263661f 100644 --- a/WordsIDE/manager_docs.cpp +++ b/WordsIDE/manager_docs.cpp @@ -6,15 +6,22 @@ using namespace Components; using namespace Core; using namespace Config; -DocumentsManager::DocumentsManager(Project::ProjectManager *project) : pjtins(project), present_ui(nullptr) { initViewPlugins(); } +DocumentsManager::DocumentsManager(Project::ProjectManager *project) : pjtins(project) { initContentViewPlugins(); } -void DocumentsManager::setPresent(Components::PresentHost *container) { present_ui = container; } +void DocumentsManager::appendPresent(Components::PresentHost *container) { + if (present_ui.contains(container)) + return; + + present_ui << container; +} + +void DocumentsManager::removePresent(Components::PresentHost *container) {} Project::ProjectManager *DocumentsManager::projectManager() const { return pjtins; } #include "srcedit_defaulttext.h" #include "srcedit_storyboard.h" -void DocumentsManager::initViewPlugins() { +void DocumentsManager::initContentViewPlugins() { registPresentType(new DefaultTextEditFactory); registPresentType(new StorySourceEditFactory); } @@ -85,11 +92,14 @@ void DocumentsManager::openFile(const QList &doc_paths) { if (!info.isFile()) throw new SimpleException("打开文件错误", "指向的节点不是文件节点"); - auto view = factory_map[info.suffix()]->newInst(this, it, present_ui->hostWidget()); + auto view = factory_map[info.suffix()]->newInst(this, it); doc_openning[it] = view; view->load(info); view->applySetting(it.links().last()); - present_ui->append(view); + + for (auto con : present_ui) + if (con->avaliable(view)) + con->append(view); } } @@ -100,7 +110,10 @@ void DocumentsManager::closeFile(const QList &doc_paths) { auto inst = convertPresent(idx); inst->saveAs(); - present_ui->remove(inst); + for (auto vit : present_ui) + if (present_ui.contains(vit)) + vit->remove(inst); + delete inst; doc_openning.remove(idx); } @@ -145,7 +158,9 @@ 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); - present_ui->active(inst); + for (auto vit : present_ui) + if (vit->contains(inst)) + vit->active(inst); } } diff --git a/WordsIDE/manager_docs.h b/WordsIDE/manager_docs.h index 499fde3..a64929a 100644 --- a/WordsIDE/manager_docs.h +++ b/WordsIDE/manager_docs.h @@ -22,27 +22,34 @@ namespace Components { */ virtual QWidget *hostWidget() const = 0; + /** + * @brief 是否可以放置此视图 + * @param vins + * @return + */ + virtual bool avaliable(FilePresent *vins) = 0; + /** * @brief 添加内容展示实例 * @param ins */ - virtual void append(Components::PresentBase *ins) = 0; + virtual void append(FilePresent *ins) = 0; /** * @brief 激活内容展示实例 * @param ins */ - virtual bool active(const Components::PresentBase *ins) = 0; + virtual bool active(const FilePresent *ins) = 0; /** * @brief 移除内容展示实例 * @param ins */ - virtual void remove(const Components::PresentBase *ins) = 0; + virtual void remove(const FilePresent *ins) = 0; /** * @brief 是否包含指定 * @param ins * @return */ - virtual bool contains(const Components::PresentBase *ins) const = 0; + virtual bool contains(const FilePresent *ins) const = 0; }; } // namespace Components @@ -61,7 +68,8 @@ namespace Core { * @brief 设置文档呈现窗口 * @param container */ - void setPresent(Components::PresentHost *container); + void appendPresent(Components::PresentHost *container); + void removePresent(Components::PresentHost *container); /** * @brief 项目获取管理器 @@ -69,7 +77,10 @@ namespace Core { */ Project::ProjectManager *projectManager() const; - void initViewPlugins(); + /** + * @brief 初始化内容视图插件 + */ + void initContentViewPlugins(); // ========================================================== /** @@ -178,7 +189,7 @@ namespace Core { private: Project::ProjectManager *pjtins; - Components::PresentHost *present_ui; + QList present_ui; QHash factory_map; QHash doc_openning; diff --git a/WordsIDE/presentcontainer.cpp b/WordsIDE/presentcontainer.cpp index 8221616..85db297 100644 --- a/WordsIDE/presentcontainer.cpp +++ b/WordsIDE/presentcontainer.cpp @@ -2,6 +2,7 @@ #include "DocsManager.h" #include "welcomepanel.h" +#include #include #include #include @@ -45,7 +46,7 @@ QWidget *PresentContainer::hostWidget() const { return (QWidget *)this; } #include using namespace Config; -void PresentContainer::append(PresentBase *ins) { +void PresentContainer::append(FilePresent *ins) { if (!items_store.contains(ins)) { items_store.append(ins); title_store->addItem(ins->name()); @@ -55,7 +56,7 @@ void PresentContainer::append(PresentBase *ins) { throw new SimpleException("非法操作", "重复添加视图:" + ins->name()); } -bool PresentContainer::active(const PresentBase *ins) { +bool PresentContainer::active(const FilePresent *ins) { if (!items_store.contains(ins)) return false; @@ -66,7 +67,7 @@ bool PresentContainer::active(const PresentBase *ins) { return true; } -void PresentContainer::remove(const PresentBase *ins) { +void PresentContainer::remove(const FilePresent *ins) { if (!items_store.contains(ins)) return; @@ -76,7 +77,7 @@ void PresentContainer::remove(const PresentBase *ins) { stack_container->removeWidget(ins->widget()); } -bool PresentContainer::contains(const PresentBase *ins) const { +bool PresentContainer::contains(const FilePresent *ins) const { for (auto &insit : items_store) { if (insit == ins) return true; @@ -84,6 +85,12 @@ bool PresentContainer::contains(const PresentBase *ins) const { return false; } +bool PresentContainer::avaliable(FilePresent *vins) { + if (!QApplication::activeWindow()) + return true; + return this->hasFocus(); +} + void PresentContainer::change_view(int view_index) { auto view_inst = items_store[view_index]; active(view_inst); @@ -94,5 +101,5 @@ void PresentContainer::change_view(int view_index) { #include void PresentContainer::close_current_view() { auto index = title_store->currentIndex(); - const_cast(items_store[index])->beforeClose(); + const_cast(items_store[index])->beforeClose(); } diff --git a/WordsIDE/presentcontainer.h b/WordsIDE/presentcontainer.h index 4d5c35d..854ea4c 100644 --- a/WordsIDE/presentcontainer.h +++ b/WordsIDE/presentcontainer.h @@ -21,13 +21,14 @@ namespace Components { public: virtual QWidget *hostWidget() const override; - virtual void append(PresentBase *ins) override; - virtual bool active(const PresentBase *ins) override; - virtual void remove(const PresentBase *ins) override; - virtual bool contains(const PresentBase *ins) const override; + virtual void append(FilePresent *ins) override; + virtual bool active(const FilePresent *ins) override; + virtual void remove(const FilePresent *ins) override; + virtual bool contains(const FilePresent *ins) const override; + virtual bool avaliable(FilePresent *vins) override; private: - QList items_store; + QList items_store; QComboBox *const title_store; QStackedWidget *const stack_container; diff --git a/WordsIDE/viewsession.cpp b/WordsIDE/viewsession.cpp index 2fdf5cd..c28cdeb 100644 --- a/WordsIDE/viewsession.cpp +++ b/WordsIDE/viewsession.cpp @@ -1,4 +1,5 @@ #include "viewsession.h" +#include "mainwindow.h" #include "messagespresent.h" #include "presentcontainer.h" #include "projectpresent.h" @@ -8,7 +9,9 @@ using namespace Core; using namespace SplitFrame; using namespace Components; -ViewSession::ViewSession(Config::Configration *port, ViewPresent *host) : host(host), recover_port(port) {} +ViewSession::ViewSession(Config::Configration *port, MainWindow *host) : host(host->bindPresent()), recover_port(port) { + base_path = {"sys-config", "front-end", host->layoutName(), "view-state"}; +} void ViewSession::initPresentView(PresentContainer *center_frame, ProjectPresent *project_present, QStandardItemModel *error_model) { split_infos.clear(); @@ -26,7 +29,6 @@ void ViewSession::initPresentView(PresentContainer *center_frame, ProjectPresent view_store[msg_panel->title()] = msg_panel; } -const QList base_path = {"sys-config", "front-end", "view-state"}; void views_state_store(Config::Configration *port, const QList &base_path, const QList &child) { for (auto &it : child) { if (!it) diff --git a/WordsIDE/viewsession.h b/WordsIDE/viewsession.h index d9aafc9..f88c3f9 100644 --- a/WordsIDE/viewsession.h +++ b/WordsIDE/viewsession.h @@ -10,11 +10,13 @@ #include #include +class MainWindow; + namespace Core { class ViewSession : public QObject { Q_OBJECT public: - ViewSession(Config::Configration *port, SplitFrame::ViewPresent *host); + ViewSession(Config::Configration *port, MainWindow *host); void initPresentView(Components::PresentContainer *center_frame, Components::ProjectPresent *project_present, QStandardItemModel *model); @@ -22,6 +24,7 @@ namespace Core { void viewStatesRestore(QMainWindow *win, SplitFrame::ViewPresent *root); private: + QList base_path; SplitFrame::ViewPresent *host; SplitFrame::RectCom *edit_panel = nullptr; Config::Configration *const recover_port; diff --git a/WordsIDE/welcomepanel.cpp b/WordsIDE/welcomepanel.cpp index e1a4fcd..268f2fa 100644 --- a/WordsIDE/welcomepanel.cpp +++ b/WordsIDE/welcomepanel.cpp @@ -12,3 +12,19 @@ QString WelcomePanel::name() const { return "WelcomePanel"; } void WelcomePanel::beforeClose() {} DocumentsManager *WelcomePanel::docsManager() const { return nullptr; } + +Route WelcomePanel::accessPath() const { return Route(); } + +void WelcomePanel::applySetting(const QString &name) {} + +void WelcomePanel::load(const QFileInfo &target_file) {} + +void WelcomePanel::saveAs(const QString &path) {} + +QString WelcomePanel::relativeTargetPath(const QDir &base) const { return ""; } + +QString WelcomePanel::absoluteTargetPath() const { return ""; } + +bool WelcomePanel::isModified() const { return false; } + +void WelcomePanel::jumpTo(const QList &path) {} diff --git a/WordsIDE/welcomepanel.h b/WordsIDE/welcomepanel.h index 43bdb02..b873e84 100644 --- a/WordsIDE/welcomepanel.h +++ b/WordsIDE/welcomepanel.h @@ -7,16 +7,25 @@ namespace Components { - class WelcomePanel : public QWidget, public Components::PresentBase { + class WelcomePanel : public QWidget, public Components::FilePresent { public: WelcomePanel(QWidget *parent = nullptr); - // PresentBase interface + // FilePresent interface public: virtual QWidget *widget() const override; virtual QString name() const override; virtual void beforeClose() override; virtual Core::DocumentsManager *docsManager() const override; + + virtual Core::Route accessPath() const override; + virtual void applySetting(const QString &name) override; + virtual void load(const QFileInfo &target_file) override; + virtual void saveAs(const QString &path) override; + virtual QString relativeTargetPath(const QDir &base) const override; + virtual QString absoluteTargetPath() const override; + virtual bool isModified() const override; + virtual void jumpTo(const QList &path) override; }; } // namespace Components