QtNovelUI/WordsIDE/storyunitspresent.cpp

126 lines
4.0 KiB
C++

#include "storyunitspresent.h"
#include "DocsManager.h"
#include <QSplitter>
#include <QVBoxLayout>
using namespace Components;
using namespace Parse::Result;
StoryunitsPresentModel::StoryunitsPresentModel(Core::AppCore *core)
: core_ins(core), model_ins(new QStandardItemModel),
details_backend(new QTextDocument) {}
StoryunitsPresentModel::~StoryunitsPresentModel() {
delete model_ins;
delete details_backend;
}
QStandardItemModel *StoryunitsPresentModel::treeModel() const {
return model_ins;
}
QTextDocument *StoryunitsPresentModel::detailsBackend() const {
return details_backend;
}
void StoryunitsPresentModel::refresh() {
model_ins->clear();
auto units = core_ins->parseCore()->allStoryUnits();
for (auto &unit : units) {
auto unit_node =
new QStandardItem(static_cast<NamedNode *>(unit)->name()[0]);
unit_node->setEditable(false);
model_ins->appendRow(unit_node);
auto children = unit->children();
for (auto &frag : children) {
if (frag->typeValue() == NODE_STORYFRAGMENT) {
auto frag_node = new QStandardItem(
static_cast<NamedNode *>(frag)->name()[0]);
frag_node->setEditable(false);
unit_node->appendRow(frag_node);
}
}
}
}
void StoryunitsPresentModel::show_node_description(const QModelIndex &curr) {
if (!curr.isValid())
return;
details_show->clear();
auto item = model_ins->itemFromIndex(curr);
if (item->parent() == nullptr) {
auto node = core_ins->parseCore()->queryStoryUnit(item->text());
auto children = node.first()->children();
for (auto &it : children) {
if (it->typeValue() != NODE_STORYFRAGMENT) {
details_show->appendPlainText(it->toString());
}
}
} else {
auto node =
core_ins->parseCore()->queryStoryUnit(item->parent()->text());
auto point = core_ins->parseCore()->queryStoryFragment(node.first(),
item->text());
auto children = point.first()->children();
for (auto &it : children) {
details_show->appendPlainText(it->toString());
}
}
}
void StoryunitsPresentModel::click_to(const QModelIndex &curr) {
if (!curr.isValid())
return;
auto pnode = this->model_ins->itemFromIndex(curr);
QList<QString> path;
while (pnode) {
path.insert(0, pnode->text());
pnode = pnode->parent();
}
auto unit_ins =
this->core_ins->parseCore()->queryStoryUnit(path[0]).first();
auto chain_doc = unit_ins->doc();
this->core_ins->getDocsManager()->openTextDocument(chain_doc->filePath(),
chain_doc->docName());
auto present = this->core_ins->getDocsManager()->queryTextComponent(
QFileInfo(chain_doc->filePath()));
if (path.size()) {
present->jumpTo(path);
}
}
StoryunitsPresent::StoryunitsPresent(Schedule::CommandsDispatcher *core,
QWidget *parent)
: QWidget(parent), core_ins(core), units_view(new QTreeView(this)),
details_show(new QTextEdit(this)) {
auto backend =
core->get<StoryunitsPresentModel>(NAME(StoryunitsPresentModel));
units_view->setHeaderHidden(true);
units_view->setModel(backend->treeModel());
details_show->setReadOnly(true);
details_show->setDocument(backend->detailsBackend());
auto layout = new QVBoxLayout(this);
auto splitter = new QSplitter(Qt::Vertical, this);
layout->addWidget(splitter);
splitter->addWidget(units_view);
splitter->addWidget(details_show);
layout->setMargin(0);
connect(units_view, &QTreeView::clicked, this,
&StoryunitsPresent::show_details);
connect(units_view, &QTreeView::doubleClicked, this,
&StoryunitsPresent::jump_to);
}
QString StoryunitsPresent::name() const { return NAME(StoryunitsPresent); }