--- a/src/documentmanager.cpp Mon Jul 04 15:37:22 2022 +0300 +++ b/src/documentmanager.cpp Mon Jul 04 19:53:13 2022 +0300 @@ -111,6 +111,7 @@ * @param openType rationale behind opening this file * @returns model id, or no value on error */ +#include <QPlainTextDocumentLayout> std::optional<ModelId> DocumentManager::openModel( const QString& path, QTextStream& errorStream, @@ -119,10 +120,9 @@ QFile file{path}; const QString name = pathToName(QFileInfo{path}); file.open(QFile::ReadOnly | QFile::Text); - std::unique_ptr<Model> newModel = std::make_unique<Model>(nullptr); - QTextStream textStream{&file}; - Parser parser{textStream}; - parser.parseBody(*newModel); + std::unique_ptr<QTextDocument> newModel = std::make_unique<QTextDocument>(nullptr); + newModel->setDocumentLayout(new QPlainTextDocumentLayout{newModel.get()}); + newModel->setPlainText(file.readAll()); std::optional<ModelId> result; if (file.error() == QFile::NoError) { @@ -195,8 +195,7 @@ QSaveFile file{info->path}; file.setDirectWriteFallback(true); if (file.open(QSaveFile::WriteOnly)) { - QTextStream stream{&file}; - ::save(*info->model.get(), &stream); + file.write(info->model->toPlainText().toUtf8()); const bool commitSucceeded = file.commit(); if (not commitSucceeded) { errors << QObject::tr("Could not save: %1").arg(file.errorString()); @@ -332,10 +331,7 @@ } } }; - QObject::connect(model, &Model::dataChanged, modelModified); - QObject::connect(model, &Model::rowsInserted, modelModified); - QObject::connect(model, &Model::rowsRemoved, modelModified); - QObject::connect(model, &Model::modelReset, modelModified); + QObject::connect(model, &QTextDocument::contentsChanged, modelModified); } } @@ -359,9 +355,12 @@ static std::set<QString> referenceNames(const Model* model) { std::set<QString> result; - iterate<Colored<SubfileReference>>(*model, [&result](const SubfileReference& ref){ - result.insert(ref.name); - }); + for (const QString& line : model->toPlainText().split("\n")) { + const opt<ParsedLine> parsed = parse(line); + if (parsed.has_value() and std::holds_alternative<LineType1>(*parsed)) { + result.insert(std::get<LineType1>(*parsed).value.name); + } + } return result; }