QtNovelUI/WordsIDE/mainwindow.cpp

242 lines
8.3 KiB
C++
Raw Normal View History

2022-11-06 00:37:50 +00:00
#include "mainwindow.h"
2023-03-17 13:58:38 +00:00
#include "srcedit_defaulttext.h"
#include "srcedit_storyboard.h"
2023-03-17 13:58:38 +00:00
#include "xapp.h"
2022-11-06 00:37:50 +00:00
2023-03-17 13:58:38 +00:00
#include <QApplication>
#include <QDateTime>
#include <QDebug>
#include <QFileDialog>
#include <QInputDialog>
#include <QLabel>
2023-03-17 13:58:38 +00:00
#include <QList>
#include <QMenuBar>
2023-03-17 13:58:38 +00:00
#include <QMessageBox>
#include <QStatusBar>
#include <QTextEdit>
2022-11-15 08:07:02 +00:00
#include <QToolBar>
2023-03-17 13:58:38 +00:00
#include <QVBoxLayout>
2022-11-18 23:47:32 +00:00
#include <xmlconfig.h>
2022-11-15 08:07:02 +00:00
#include <xmlprojectmanager.h>
2023-03-10 13:01:19 +00:00
#include "command_list.h"
2022-11-15 08:07:02 +00:00
using namespace Project;
using namespace Components;
using namespace Core;
2022-12-01 13:54:04 +00:00
using namespace Tools;
2023-03-10 13:01:19 +00:00
using namespace CommandList;
using namespace bridge;
2022-11-06 00:37:50 +00:00
MainWindow::MainWindow(QWidget *parent)
2023-03-17 13:58:38 +00:00
: QMainWindow(parent),
2022-11-18 23:47:32 +00:00
sync_kernel(new StatusSyncCore(this)),
parse_service(new ParseBridge()),
2022-11-15 12:58:12 +00:00
project_manager(new XMLProjectManager(this)),
active_docscollect(new DocumentsManager(project_manager)),
2023-08-27 14:09:46 +00:00
present_host(new SplitFrame::ViewPresent(this)),
2023-08-29 01:37:58 +00:00
session_service(new ViewSession(XApp::global_configration, present_host)),
2023-08-27 14:09:46 +00:00
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)) {
2023-03-11 07:01:28 +00:00
2022-11-18 23:47:32 +00:00
QApplication::instance()->installEventFilter(this);
2023-03-17 13:58:38 +00:00
initial_commandlist(XApp::disp_core);
2023-03-11 07:01:28 +00:00
XApp::disp_core->registerMember(active_docscollect);
2022-11-18 23:47:32 +00:00
setMinimumSize(1000, 600);
2023-08-27 14:09:46 +00:00
setWindowTitle(tr("提线木偶"));
setCentralWidget(present_host->bind());
addToolBar(Qt::LeftToolBarArea, views_bar);
present_host->addListener(views_bar);
session_service->initPresentView(center_frame, project_present, parse_service->errorsPresentModel());
auto mbar = menuBar();
2023-03-10 13:01:19 +00:00
initial_menubar(mbar);
2023-08-20 17:22:48 +00:00
project_present->setVisible(true);
2023-08-27 14:09:46 +00:00
this->active_docscollect->setPresent(center_frame);
session_service->viewStatesRestore(this, present_host);
2023-03-10 13:01:19 +00:00
}
MainWindow::~MainWindow() {}
2023-03-17 13:58:38 +00:00
void MainWindow::initial_menubar(QMenuBar *mbar) {
2023-03-10 13:01:19 +00:00
// 项目菜单树
auto project = mbar->addMenu("项目");
2023-03-17 13:58:38 +00:00
auto opnp = project->addAction("打开项目", [this]() {
2022-11-15 08:07:02 +00:00
auto file = QFileDialog::getOpenFileName(this, "打开项目", QString(), "小说项目(*.nsf)");
2023-03-17 13:58:38 +00:00
if (file == "")
2022-11-15 08:07:02 +00:00
return;
2023-03-17 13:58:38 +00:00
XApp::disp_core->postCommand(OpenProject(file));
});
2023-08-13 10:02:21 +00:00
sync_kernel->actionEnableSync(opnp, [this]() -> bool { return !project_manager->isOpenning(); });
2023-03-10 13:01:19 +00:00
2023-03-11 07:01:28 +00:00
auto newp = project->addAction("新建项目", [this]() {
2022-11-15 08:07:02 +00:00
auto name = QInputDialog::getText(this, "输入项目名称", "项目名称");
2023-03-17 13:58:38 +00:00
if (name == "")
2022-11-15 08:07:02 +00:00
return;
auto dir_path = QFileDialog::getExistingDirectory(this, "指定项目存储路径");
2023-03-17 13:58:38 +00:00
if (dir_path == "")
2022-11-15 08:07:02 +00:00
return;
2023-03-17 13:58:38 +00:00
XApp::disp_core->postCommand(NewProject(QDir(dir_path), name));
2023-03-11 07:01:28 +00:00
});
2023-08-13 10:02:21 +00:00
sync_kernel->actionEnableSync(newp, [this]() -> bool { return !project_manager->isOpenning(); });
2023-03-10 13:01:19 +00:00
auto clsp = project->addAction("关闭项目", [this]() { XApp::disp_core->postCommand(CloseProject()); });
2023-08-13 10:02:21 +00:00
sync_kernel->actionEnableSync(clsp, [this]() -> bool { return project_manager->isOpenning(); });
project->addSeparator();
2023-03-10 13:01:19 +00:00
2023-03-11 07:01:28 +00:00
auto pnew = project->addAction("新建路径", [this]() {
2023-03-10 13:01:19 +00:00
auto packages = QInputDialog::getText(this, "输入包路径名称/PackA/PackB/PackC", "包路径:");
2023-03-17 13:58:38 +00:00
if (packages != "")
XApp::disp_core->postCommand(NewPackage(packages));
2023-03-11 07:01:28 +00:00
});
2023-08-13 10:02:21 +00:00
sync_kernel->actionEnableSync(pnew, [this]() -> bool { return project_manager->isOpenning(); });
2023-03-10 13:01:19 +00:00
auto _xnew = project->addMenu("新建文件");
2023-08-13 10:02:21 +00:00
_xnew->setEnabled(project_manager->isOpenning());
auto types = active_docscollect->fileTypes();
2023-03-17 13:58:38 +00:00
for (auto &t : types) {
_xnew->addAction(t, [this, &t]() {
2023-03-10 13:01:19 +00:00
auto name = QInputDialog::getText(this, "输入名称", "名称:");
2023-03-17 13:58:38 +00:00
if (name == "")
2023-03-10 13:01:19 +00:00
return;
2023-03-17 13:58:38 +00:00
auto idx = project_present->currentIndex();
if (!idx.isValid())
2023-03-10 13:01:19 +00:00
idx = project_manager->model()->item(0)->index();
auto group_path = active_docscollect->convertPath(idx);
2023-03-17 13:58:38 +00:00
XApp::disp_core->postCommand(NewFile(group_path, name, t));
2023-03-10 13:01:19 +00:00
});
}
2023-08-13 10:02:21 +00:00
sync_kernel->widgetEnableSync(_xnew, [this]() -> bool { return project_manager->isOpenning(); });
project->addSeparator();
2023-03-10 13:01:19 +00:00
2023-03-17 13:58:38 +00:00
auto sav = project->addAction("保存全部", [this]() { XApp::disp_core->postCommand(SaveAll()); });
2023-03-10 13:01:19 +00:00
sav->setShortcut(QKeySequence::StandardKey::Save);
2023-08-13 10:02:21 +00:00
sync_kernel->actionEnableSync(sav, [this]() -> bool { return project_manager->isOpenning(); });
2023-03-10 13:01:19 +00:00
project->addSeparator();
2023-03-11 07:01:28 +00:00
project->addAction("退出", [this]() {
2023-03-17 13:58:38 +00:00
XApp::disp_core->postCommand(SaveAll());
2023-03-11 07:01:28 +00:00
QApplication::exit(0);
});
// 编辑菜单
auto edit = mbar->addMenu("编辑");
edit->addAction("撤销一步");
edit->addAction("重做一步");
edit->addSeparator();
edit->addAction("查找关键词");
edit->addAction("替换关键词");
// 视图菜单
auto view = mbar->addMenu("视图");
2022-11-15 08:07:02 +00:00
auto area = view->addMenu("区域管理");
2022-11-18 23:47:32 +00:00
2023-03-17 13:58:38 +00:00
auto xtool = new QToolBar(this);
xtool->setVisible(false);
addToolBar(Qt::ToolBarArea::TopToolBarArea, xtool);
2022-11-15 08:07:02 +00:00
auto act_tool = area->addAction("工具栏");
2023-03-17 13:58:38 +00:00
sync_kernel->actionCheckSync(act_tool, [xtool]() -> bool { return xtool->isVisible(); });
connect(act_tool, &QAction::triggered, [xtool](bool v) { xtool->setVisible(v); });
2023-03-17 13:58:38 +00:00
auto xstatus = statusBar();
xstatus->setVisible(false);
xstatus->addWidget(new QLabel("文本消息", this));
2022-11-15 08:07:02 +00:00
auto act_status = area->addAction("状态栏");
2023-03-17 13:58:38 +00:00
sync_kernel->actionCheckSync(act_status, [xstatus]() -> bool { return xstatus->isVisible(); });
connect(act_status, &QAction::triggered, [xstatus](bool v) { xstatus->setVisible(v); });
view->addSeparator();
2022-11-15 08:07:02 +00:00
auto change = view->addMenu("内容切换");
change->addAction("序列视图");
change->addAction("编辑视图");
2022-11-15 08:07:02 +00:00
view->addSeparator();
auto func = view->addMenu("功能视图");
2023-08-13 10:02:21 +00:00
sync_kernel->widgetEnableSync(func, [this]() { return this->project_manager->isOpenning(); });
2023-03-17 13:58:38 +00:00
// 项目管理
// 工具菜单
auto tool = mbar->addMenu("工具");
auto word = tool->addMenu("敏感词检测");
word->addAction("工具配置");
word->addAction("敏感词编辑");
auto vcs = tool->addMenu("版本管理");
vcs->addAction("工具配置");
vcs->addAction("启用");
auto exp = tool->addMenu("导入导出");
2022-11-18 23:47:32 +00:00
exp->addAction("导入WsOutlines");
exp->addSeparator();
2022-11-15 08:07:02 +00:00
exp->addAction("导出TXT大纲");
2022-11-18 23:47:32 +00:00
exp->addAction("导出Web大纲");
exp->addAction("导出WsOutlines");
exp->addSeparator();
exp->addAction("导出TXT内容");
// 窗口菜单
auto window = mbar->addMenu("窗口");
window->addAction("新建窗口");
window->addAction("关闭窗口");
window->addSeparator();
window->addAction("布局管理");
window->addMenu("布局切换");
window->addMenu("窗口切换");
// 系统
auto sys = mbar->addMenu("系统");
sys->addAction("软件激活");
sys->addAction("系统信息");
sys->addSeparator();
sys->addAction("关于……");
2022-11-06 00:37:50 +00:00
}
2022-11-15 12:58:12 +00:00
2023-03-17 13:58:38 +00:00
void MainWindow::initial_commandlist(Schedule::CommandsDispatcher *host) {
host->registerCommand(new CloseProject());
2023-08-20 17:22:48 +00:00
host->registerCommand(new NewFile(Route(), "", "txt"));
2023-03-17 13:58:38 +00:00
host->registerCommand(new NewPackage(""));
host->registerCommand(new NewProject(QDir(), ""));
host->registerCommand(new OpenFile(Route()));
host->registerCommand(new OpenProject(""));
host->registerCommand(new SaveAll());
2023-01-01 05:10:31 +00:00
}
2023-03-17 13:58:38 +00:00
void MainWindow::closeEvent(QCloseEvent *event) {
// 关闭事件
2023-08-13 10:02:21 +00:00
if (project_manager->isOpenning()) {
2023-03-17 13:58:38 +00:00
XApp::disp_core->postCommand(CloseProject());
}
session_service->viewStatesSave(this, present_host);
XApp::global_configration->save();
QMainWindow::closeEvent(event);
2022-11-15 12:58:12 +00:00
}
2022-11-18 23:47:32 +00:00
2023-03-17 13:58:38 +00:00
bool MainWindow::eventFilter(QObject *watched, QEvent *event) {
2022-11-18 23:47:32 +00:00
auto ev = event->type();
2023-03-17 13:58:38 +00:00
switch (ev) {
case QEvent::Type::MouseButtonPress:
case QEvent::Type::MouseButtonRelease:
case QEvent::Type::Wheel:
case QEvent::Type::MouseMove:
case QEvent::Type::KeyPress:
case QEvent::Type::KeyRelease:
sync_kernel->sync();
break;
default:
break;
2022-11-18 23:47:32 +00:00
}
return QMainWindow::eventFilter(watched, event);
}