#include "session_binder.h" #include "mainwindow.h" #include "message_view.h" #include "present_container.h" #include "project_view.h" #include #include using namespace Config; using namespace Core; using namespace Components; using namespace split_window; SessionBinder::SessionBinder(XApp *core) : QObject(core), bind_window(new split_window::SplitWindow), pjt_manager(new ProjectView(bind_window, core->cmdsPort(), core->docsPort())), msg_present(new MessageView(bind_window, core)), bind_core(core), project_op(new QMenu("项目管理")), edit_op(new QMenu("内容编辑")), view_op(new QMenu("视图管理")), build_op(new QMenu("构建服务")), tool_op(new QMenu("功能拓展")), system_op(new QMenu("系统帮助")) { connect(bind_window, &SplitWindow::windowActived, [this](SplitWindow *inst){ menus_refresh(inst->menuBar()); }); menus_refresh(bind_window->menuBar(), true); } #include void SessionBinder::menus_refresh(QMenuBar *mbar, bool rebuild) { if(rebuild){ mbar->addMenu(project_op); project_op->addActions(pjt_manager->bindMenu()->actions()); mbar->addMenu(edit_op); mbar->addMenu(view_op); view_op->addAction("新建窗口"); view_op->addAction("关闭窗口"); view_op->addSeparator(); for(auto &t : bind_core->viewTemplates()){ auto act_item = view_op->addAction(t->typeName()); act_item->setCheckable(t->type() == ExtendType::FEATURE_PRESENT); std::function open_view = [=, &open_view](bool state){ auto vinst = t->newInst(bind_window, bind_core); auto wrap_v = new dock_panel::DockableView(bind_window, vinst->presentWidget()); bind_window->freedomHasBeenAppended(wrap_v); if(t->type() == ExtendType::FEATURE_PRESENT){ disconnect(act_item, &QAction::triggered, nullptr, nullptr); connect(act_item, &QAction::triggered, [=, &open_view](bool state){ vinst->presentWidget()->setParent(nullptr); bind_window->doRetrieve(wrap_v); bind_window->doClose(wrap_v); delete vinst; disconnect(act_item, &QAction::triggered, nullptr, nullptr); connect(act_item, &QAction::triggered, open_view); }); } }; connect(act_item, &QAction::triggered, open_view); } mbar->addMenu(build_op); build_op->addActions(msg_present->bindMenu()->actions()); mbar->addMenu(tool_op); mbar->addMenu(system_op); system_op->addAction("关于Qt", []() { QApplication::aboutQt(); }); } auto action_list = edit_op->actions(); for(auto &it : action_list) edit_op->removeAction(it); }