diff --git a/QtNovelDesc.pro.user b/QtNovelDesc.pro.user index d7dd0de..2a8bdde 100644 --- a/QtNovelDesc.pro.user +++ b/QtNovelDesc.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/WordsIDE/DocsManager.h b/WordsIDE/DocsManager.h index 4465e08..38b3831 100644 --- a/WordsIDE/DocsManager.h +++ b/WordsIDE/DocsManager.h @@ -43,13 +43,6 @@ namespace Components { explicit FilePresent(QObject *parent = nullptr); virtual ~FilePresent() = default; - enum class Feature { - HighLight = 0x01, - Compile = 0x02, - }; - Q_DECLARE_FLAGS(Features, Feature) - virtual Features features() = 0; - virtual Core::Route accessPath() const = 0; /** @@ -97,7 +90,6 @@ namespace Components { */ void dataChanged(const QString &filePath); }; - Q_DECLARE_OPERATORS_FOR_FLAGS(FilePresent::Features); class PresentFactory : public QObject { public: diff --git a/WordsIDE/WordsIDE.pro b/WordsIDE/WordsIDE.pro index 6f365fe..15cfdb4 100644 --- a/WordsIDE/WordsIDE.pro +++ b/WordsIDE/WordsIDE.pro @@ -35,7 +35,7 @@ SOURCES += \ srcedit_storyboard.cpp \ tools.cpp \ viewstackedbar.cpp \ - vsessionmaintenance.cpp \ + vsession.cpp \ welcomepanel.cpp \ xapp.cpp @@ -57,7 +57,7 @@ HEADERS += \ srcedit_storyboard.h \ tools.h \ viewstackedbar.h \ - vsessionmaintenance.h \ + vsession.h \ welcomepanel.h \ xapp.h diff --git a/WordsIDE/command_list.cpp b/WordsIDE/command_list.cpp index 0a96a9f..4930e60 100644 --- a/WordsIDE/command_list.cpp +++ b/WordsIDE/command_list.cpp @@ -7,6 +7,23 @@ using namespace CommandList; using namespace Components; using namespace Core; +NewProject::NewProject(const QDir &dir, const QString &name) : dir_symbo(dir), name_val(name) {} + +QString NewProject::name() const { return NAME(NewProject); } + +void NewProject::run(Schedule::CommandsDispatcher *core) const { + auto vmgr = core->get(NAME(DocumentsManager)); + vmgr->projectManager()->newProject(dir_symbo.absolutePath(), name_val); +} + +QString NewProject::toText() const { return QString("%1:%2").arg(dir_symbo.absolutePath(), name_val); } + +void NewProject::fromText(const QString &line) { + auto list = line.split(":"); + dir_symbo = QDir(list[0]); + name_val = list[1]; +} + NewPackage::NewPackage(const QString &path_string) { sequence = path_string.split("/"); @@ -137,39 +154,7 @@ QString CloseProject::toText() const { return ""; } void CloseProject::fromText(const QString &line) {} -NewProject::NewProject(const QDir &dir, const QString &name) - : dir_symbo(dir), name_val(name) -{ - -} - -QString NewProject::name() const -{ - return NAME(NewProject); -} - -void NewProject::run(Schedule::CommandsDispatcher *core) const -{ - auto vmgr = core->get(NAME(DocumentsManager)); - vmgr->projectManager()->newProject(dir_symbo.absolutePath(), name_val); -} - -QString NewProject::toText() const -{ - return QString("%1:%2").arg(dir_symbo.absolutePath(), name_val); -} - -void NewProject::fromText(const QString &line) -{ - auto list = line.split(":"); - dir_symbo = QDir(list[0]); - name_val = list[1]; -} - -OpenFile::OpenFile(const Core::Route &path_node) -{ - path_store = path_node.links(); -} +OpenFile::OpenFile(const Core::Route &path_node) { path_store = path_node.links(); } OpenFile::OpenFile(const QFileInfo &file_path) { diff --git a/WordsIDE/command_list.h b/WordsIDE/command_list.h index a79c9c8..9009d81 100644 --- a/WordsIDE/command_list.h +++ b/WordsIDE/command_list.h @@ -13,20 +13,21 @@ namespace Components { namespace CommandList { class NewProject : public Schedule::GeCommand { - public: + public: NewProject(const QDir &dir, const QString &name); // GeCommand interface - public: + public: virtual QString name() const override; virtual void run(Schedule::CommandsDispatcher *core) const override; virtual QString toText() const override; virtual void fromText(const QString &line) override; - private: + private: QDir dir_symbo; QString name_val; }; + class OpenProject : public Schedule::GeCommand { public: OpenProject(const QString &path); diff --git a/WordsIDE/mainwindow.cpp b/WordsIDE/mainwindow.cpp index 0441c6c..486506a 100644 --- a/WordsIDE/mainwindow.cpp +++ b/WordsIDE/mainwindow.cpp @@ -34,8 +34,8 @@ MainWindow::MainWindow(QWidget *parent) parse_service(new ParseBridge()), project_manager(new XMLProjectManager(this)), active_docscollect(new DocumentsManager(project_manager)), - session_service(new VSessionMaintenance(XApp::global_configration)), present_host(new SplitFrame::ViewPresent(this)), + session_service(new VSession(XApp::global_configration, present_host)), 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)) { @@ -51,7 +51,7 @@ MainWindow::MainWindow(QWidget *parent) addToolBar(Qt::LeftToolBarArea, views_bar); present_host->addListener(views_bar); - session_service->initPresentView(present_host, center_frame, project_present, parse_service->errorsPresentModel()); + session_service->initPresentView(center_frame, project_present, parse_service->errorsPresentModel()); auto mbar = menuBar(); initial_menubar(mbar); @@ -59,13 +59,10 @@ MainWindow::MainWindow(QWidget *parent) project_present->setVisible(true); this->active_docscollect->setPresent(center_frame); - session_service->viewStatesRestore(present_host); + session_service->viewStatesRestore(this, present_host); } -MainWindow::~MainWindow() { - this->session_service->viewStatesSave(present_host); - XApp::global_configration->save(); -} +MainWindow::~MainWindow() {} void MainWindow::initial_menubar(QMenuBar *mbar) { @@ -221,6 +218,8 @@ void MainWindow::closeEvent(QCloseEvent *event) { XApp::disp_core->postCommand(CloseProject()); } + session_service->viewStatesSave(this, present_host); + XApp::global_configration->save(); QMainWindow::closeEvent(event); } diff --git a/WordsIDE/mainwindow.h b/WordsIDE/mainwindow.h index a55eb8b..0946074 100644 --- a/WordsIDE/mainwindow.h +++ b/WordsIDE/mainwindow.h @@ -9,7 +9,7 @@ #include "projectpresent.h" #include "tools.h" #include "viewstackedbar.h" -#include "vsessionmaintenance.h" +#include "vsession.h" #include "welcomepanel.h" #include #include @@ -32,10 +32,10 @@ private: bridge::ParseBridge *const parse_service; Project::ProjectManager *const project_manager; Core::DocumentsManager *const active_docscollect; - Core::VSessionMaintenance *const session_service; + SplitFrame::ViewPresent *const present_host; + Core::VSession *const session_service; // view ============================================= - SplitFrame::ViewPresent *const present_host; Components::ViewStackedBar *const views_bar; Components::PresentContainer *const center_frame; Components::ProjectPresent *const project_present; diff --git a/WordsIDE/srcedit_defaulttext.cpp b/WordsIDE/srcedit_defaulttext.cpp index bcf9ff7..8e5b1ac 100644 --- a/WordsIDE/srcedit_defaulttext.cpp +++ b/WordsIDE/srcedit_defaulttext.cpp @@ -23,8 +23,6 @@ void DefaultTextEdit::jumpTo(const QList &path) } -FilePresent::Features DefaultTextEdit::features() { return Features(); } - Route DefaultTextEdit::accessPath() const { return path_store; } #include "manager_docs.h" diff --git a/WordsIDE/srcedit_defaulttext.h b/WordsIDE/srcedit_defaulttext.h index ca657fc..a2e71cb 100644 --- a/WordsIDE/srcedit_defaulttext.h +++ b/WordsIDE/srcedit_defaulttext.h @@ -38,7 +38,6 @@ namespace Components { virtual bool isModified() const override; virtual QString absoluteTargetPath() const override; virtual void jumpTo(const QList &path) override; - virtual Features features() override; virtual Core::Route accessPath() const override; // PresentBase interface diff --git a/WordsIDE/srcedit_storyboard.cpp b/WordsIDE/srcedit_storyboard.cpp index 4dfc4ec..ea521aa 100644 --- a/WordsIDE/srcedit_storyboard.cpp +++ b/WordsIDE/srcedit_storyboard.cpp @@ -100,8 +100,6 @@ void StorySourceEdit::jumpTo(const QList &path) { // } } -FilePresent::Features StorySourceEdit::features() { return Feature::Compile | Feature::HighLight; } - #include "manager_docs.h" void StorySourceEdit::beforeClose() { mgr_inst->save(); } diff --git a/WordsIDE/srcedit_storyboard.h b/WordsIDE/srcedit_storyboard.h index 21ecb1b..37c281a 100644 --- a/WordsIDE/srcedit_storyboard.h +++ b/WordsIDE/srcedit_storyboard.h @@ -40,7 +40,6 @@ namespace Components { virtual bool isModified() const override; virtual void applySetting(const QString &name) override; virtual void jumpTo(const QList &path) override; - virtual Features features() override; virtual void beforeClose() override; virtual Core::DocumentsManager *docsManager() const override; virtual Core::Route accessPath() const override; diff --git a/WordsIDE/vsession.cpp b/WordsIDE/vsession.cpp new file mode 100644 index 0000000..798813d --- /dev/null +++ b/WordsIDE/vsession.cpp @@ -0,0 +1,145 @@ +#include "vsession.h" +#include "messagespresent.h" +#include "presentcontainer.h" +#include "projectpresent.h" + +using namespace Config; +using namespace Core; +using namespace SplitFrame; +using namespace Components; + +VSession::VSession(Config::Configration *port, ViewPresent *host) : host(host), recover_port(port) {} + +void VSession::initPresentView(PresentContainer *center_frame, ProjectPresent *project_present, QStandardItemModel *error_model) { + split_infos.clear(); + + auto project_panel = host->appendView(project_present, QIcon(":/ui/icons/dir_icon.jpg"), tr("项目管理")); + host->markFreedom(project_panel); + view_store[project_panel->title()] = project_panel; + + edit_panel = host->appendView(center_frame, QIcon(":/ui/icons/file_icon.jpg"), tr("编辑窗口")); + view_store[edit_panel->title()] = edit_panel; + + auto msg_view = MessagesPresent::gen(host, error_model, host->bind()); + auto msg_panel = host->appendView(msg_view, QIcon(":/ui/icons/file_icon.jpg"), "信息提示"); + host->markFreedom(msg_panel); + 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) + continue; + + auto keys_path = base_path; + keys_path << QString("rect_%1").arg(child.indexOf(it)); + + auto conv = dynamic_cast(it); + if (conv) { // split + QHash values; + values["rect-type"] = "split"; + values["split-type"] = QString("%1").arg((int)conv->splitType()); + values["split-width"] = QString("%1").arg(conv->splitterWidth()); + values["split-pos"] = QString("%1").arg(conv->splitterPos()); + port->setMap(keys_path, values); + + auto split_childs = conv->child(); + views_state_store(port, keys_path, QList() << split_childs.first << split_childs.second); + } else { // view + QHash values; + values["rect-type"] = "view"; + values["view-title"] = it->title(); + port->setMap(keys_path, values); + } + } +} + +void VSession::viewStatesSave(QMainWindow *win, SplitFrame::ViewPresent *root) { + recover_port->deleteX(base_path); + auto childs = root->child(); + + auto grect = win->geometry(); + QHash values; + values["win-width"] = QString("%1").arg(grect.width()); + values["win-height"] = QString("%1").arg(grect.height()); + values["win-xpos"] = QString("%1").arg(grect.topLeft().x()); + values["win-ypos"] = QString("%1").arg(grect.topLeft().y()); + recover_port->setMap(base_path, values); + + views_state_store(recover_port, base_path, QList() << childs.first << childs.second); +} + +RectCom *VSession::views_state_restore(const QHash &cache, const QList &target_path, + Config::Configration *port, SplitFrame::ViewPresent *host) { + auto values = port->getMap(target_path); + if (!values.size()) + return nullptr; + + auto type = values["rect-type"]; + if (type == "view") { + auto title = values["view-title"]; + auto view = cache[title]; + host->markFreedom(view, false); + return view; + } else { + auto key_p0 = target_path; + key_p0 << "rect_0"; + auto rect0 = views_state_restore(cache, key_p0, port, host); + auto key_p1 = target_path; + key_p1 << "rect_1"; + auto rect1 = views_state_restore(cache, key_p1, port, host); + + auto ori = values["split-type"].toUInt(); + auto width = values["split-width"].toFloat(); + auto pos = values["split-pos"].toFloat(); + + auto split = host->createSplit(rect0, rect1); + + this->split_infos[split] = std::make_tuple((SplitType)ori, pos, width); + + return split; + } +} + +void VSession::relayout_cascade(SplitFrame::RectCom *root) { + auto xinst = dynamic_cast(root); + if (!xinst) + return; + + auto info = split_infos[xinst]; + xinst->setSplitInfo(std::get<0>(info), std::get<1>(info), std::get<2>(info)); + + auto child_pair = xinst->child(); + relayout_cascade(child_pair.first); + relayout_cascade(child_pair.second); +} + +bool VSession::eventFilter(QObject *watched, QEvent *event) { + if (watched == (QObject *)host && event->type() == QEvent::Show) { + relayout_cascade(host->child().first); + host->bind()->removeEventFilter(this); + } + + return QObject::eventFilter(watched, event); +} + +void VSession::viewStatesRestore(QMainWindow *win, SplitFrame::ViewPresent *root) { + auto key_path0 = base_path; + key_path0 << "rect_0"; + auto rect = views_state_restore(this->view_store, key_path0, recover_port, root); + if (!rect) + rect = edit_panel; + + root->resetEngross(rect); + root->objsRelateRebuild(); + + auto values = recover_port->getMap(base_path); + auto width = values["win-width"].toFloat(); + auto height = values["win-height"].toFloat(); + auto xpos = values["win-xpos"].toFloat(); + auto ypos = values["win-ypos"].toFloat(); + + win->setGeometry(xpos, ypos, width, height); + root->bind()->installEventFilter(this); +} diff --git a/WordsIDE/vsession.h b/WordsIDE/vsession.h new file mode 100644 index 0000000..828dd9d --- /dev/null +++ b/WordsIDE/vsession.h @@ -0,0 +1,46 @@ +#ifndef VSESSION_H +#define VSESSION_H + +#include "projectpresent.h" + +#include +#include +#include +#include +#include +#include + +namespace Core { + class VSession : public QObject { + Q_OBJECT + public: + VSession(Config::Configration *port, SplitFrame::ViewPresent *host); + + void initPresentView(Components::PresentContainer *center_frame, Components::ProjectPresent *project_present, QStandardItemModel *model); + + void viewStatesSave(QMainWindow *win, SplitFrame::ViewPresent *root); + void viewStatesRestore(QMainWindow *win, SplitFrame::ViewPresent *root); + + private: + SplitFrame::ViewPresent *host; + SplitFrame::RectCom *edit_panel = nullptr; + Config::Configration *const recover_port; + QHash view_store; + + typedef float split_pos; + typedef float split_width; + std::map> split_infos; + + SplitFrame::RectCom *views_state_restore(const QHash &cache, const QList &target_path, + Config::Configration *port, SplitFrame::ViewPresent *host); + + void relayout_cascade(SplitFrame::RectCom *root); + + // QObject interface + public: + virtual bool eventFilter(QObject *watched, QEvent *event) override; + }; + +} // namespace Core + +#endif // VSESSION_H diff --git a/WordsIDE/vsessionmaintenance.cpp b/WordsIDE/vsessionmaintenance.cpp deleted file mode 100644 index 37105f3..0000000 --- a/WordsIDE/vsessionmaintenance.cpp +++ /dev/null @@ -1,89 +0,0 @@ -#include "vsessionmaintenance.h" -#include "messagespresent.h" -#include "presentcontainer.h" -#include "projectpresent.h" - -using namespace Config; -using namespace Core; -using namespace SplitFrame; -using namespace Components; - -VSessionMaintenance::VSessionMaintenance(Config::Configration *port) : recover_port(port) {} - -void VSessionMaintenance::initPresentView(ViewPresent *host, PresentContainer *center_frame, ProjectPresent *project_present, - QStandardItemModel *error_model) { - - auto project_panel = host->appendView(project_present, QIcon(":/ui/icons/dir_icon.jpg"), tr("项目管理")); - host->markFreedom(project_panel); - view_store[project_panel->title()] = project_panel; - - auto edit_panel = host->appendView(center_frame, QIcon(":/ui/icons/file_icon.jpg"), tr("编辑窗口")); - host->resetEngross(edit_panel); - view_store[edit_panel->title()] = edit_panel; - - auto msg_view = MessagesPresent::gen(host, error_model, host->bind()); - auto msg_panel = host->appendView(msg_view, QIcon(":/ui/icons/file_icon.jpg"), "信息提示"); - host->markFreedom(msg_panel); - 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) - continue; - - auto keys_path = base_path; - keys_path << QString("rect_%1").arg(child.indexOf(it)); - - auto conv = dynamic_cast(it); - if (conv) { // split - QHash values; - values["rect-type"] = "split"; - values["split-type"] = QString("%1").arg((int)conv->splitType()); - values["split-width"] = QString("%1").arg(conv->splitterWidth()); - values["split-pos"] = QString("%1").arg(conv->splitterPos()); - port->setMap(keys_path, values); - - auto split_childs = conv->child(); - views_state_store(port, keys_path, QList() << split_childs.first << split_childs.second); - } else { // view - QHash values; - values["rect-type"] = "view"; - values["view-title"] = it->title(); - port->setMap(keys_path, values); - } - } -} - -void VSessionMaintenance::viewStatesSave(SplitFrame::ViewPresent *root) { - recover_port->deleteX(base_path); - auto childs = root->child(); - auto win = root->bind()->parentWidget(); - - QHash values; - values["win-width"] = win->width(); - values["win-height"] = win->height(); - values["win-xpos"] = win->rect().topLeft().x(); - values["win-ypos"] = win->rect().topLeft().y(); - recover_port->setMap(base_path, values); - - views_state_store(recover_port, base_path, QList() << childs.first << childs.second); -} - -RectCom *views_state_restore(const QHash &cache, const QList &target_path, Config::Configration *port) { - auto values = port->getMap(target_path); - if (!values.size()) - return nullptr; -} - -void VSessionMaintenance::viewStatesRestore(SplitFrame::ViewPresent *root) { - auto values = recover_port->getMap(base_path); - auto win = root->bind()->parentWidget(); - - auto width = values["win-width"].toFloat(); - auto height = values["win-height"].toFloat(); - auto xpos = values["win-xpos"].toFloat(); - auto ypos = values["win-ypos"].toFloat(); - win->setGeometry(xpos, ypos, width, height); -} diff --git a/WordsIDE/vsessionmaintenance.h b/WordsIDE/vsessionmaintenance.h deleted file mode 100644 index cc5cdfa..0000000 --- a/WordsIDE/vsessionmaintenance.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef VSESSIONMAINTENANCE_H -#define VSESSIONMAINTENANCE_H - -#include "projectpresent.h" - -#include -#include -#include -#include -#include - -namespace Core { - class VSessionMaintenance : public QObject { - Q_OBJECT - public: - VSessionMaintenance(Config::Configration *port); - - void initPresentView(SplitFrame::ViewPresent *host, Components::PresentContainer *center_frame, Components::ProjectPresent *project_present, - QStandardItemModel *model); - - void viewStatesSave(SplitFrame::ViewPresent *root); - void viewStatesRestore(SplitFrame::ViewPresent *root); - - private: - Config::Configration *const recover_port; - QHash view_store; - }; - -} // namespace Core - -#endif // VSESSIONMAINTENANCE_H diff --git a/libSplitView/splitpanel.cpp b/libSplitView/splitpanel.cpp index a51b96a..207683d 100644 --- a/libSplitView/splitpanel.cpp +++ b/libSplitView/splitpanel.cpp @@ -216,21 +216,30 @@ void ViewPresent::regist_basepanel(RectCom *it) { all_func_views << it; } -void ViewPresent::markFreedom(ViewRes *view) { +void ViewPresent::markFreedom(ViewRes *view, bool add) { if (!view) return; auto cinst = static_cast(view); - if (!freedom_views.contains(cinst)) { - freedom_views << cinst; + if (add) { + if (!freedom_views.contains(cinst)) { + freedom_views << cinst; - auto fview = static_cast(view); - for (auto &lsn : lsn_list) - lsn->freedomAppended(cinst, fview->viewIcon(), fview->title()); + auto fview = static_cast(view); + for (auto &lsn : lsn_list) + lsn->freedomAppended(cinst, fview->viewIcon(), fview->title()); + } + + cinst->bind()->setVisible(false); + cinst->setParentRes(nullptr); + } else { + if (freedom_views.contains(cinst)) { + freedom_views.removeAll(cinst); + + for (auto &lsn : lsn_list) + lsn->freedomRemoved(cinst); + } } - - cinst->bind()->setVisible(false); - cinst->setParentRes(nullptr); } void ViewPresent::purge(ViewRes *target) { @@ -291,10 +300,8 @@ RectCom *ViewPresent::adjustView() const { return this->adjust_view_temp; } QObject *ViewPresent::globalEventFilter() const { return dynamic_cast(const_cast(this)); } -SplitRect *ViewPresent::createSplit(RectCom *first, RectCom *next, SplitType sp, float pos, float split_width) { +SplitRect *ViewPresent::createSplit(RectCom *first, RectCom *next) { auto inst = new SplitView(first, next, this); - inst->setSplitInfo(sp, pos, split_width, false); - return inst; } diff --git a/libSplitView/splitpanel.h b/libSplitView/splitpanel.h index 49ac196..eebbf8b 100644 --- a/libSplitView/splitpanel.h +++ b/libSplitView/splitpanel.h @@ -54,7 +54,7 @@ namespace SplitFrame { virtual ViewPresent *viewPanel() const = 0; virtual void objsRelateRebuild() = 0; - virtual void markFreedom(ViewRes *view) = 0; + virtual void markFreedom(ViewRes *view, bool add = true) = 0; virtual void purge(ViewRes *target) = 0; }; @@ -147,7 +147,7 @@ namespace SplitFrame { bool adjustState() const; RectCom *adjustView() const; - SplitRect *createSplit(RectCom *first, RectCom *next, SplitType sp, float pos = 20, float split_width = 8); + SplitRect *createSplit(RectCom *first, RectCom *next); template RectCom *appendView(FnWrap *view_inst, const QIcon &icon, const QString &title) { if (view_inst->bindHost() != this) @@ -179,7 +179,7 @@ namespace SplitFrame { // ResManager interface public: virtual void objsRelateRebuild() override; - virtual void markFreedom(ViewRes *view) override; + virtual void markFreedom(ViewRes *view, bool add = true) override; virtual void purge(ViewRes *target) override; // SplitRect interface