src/documentmanager.cpp

changeset 333
07e65a4c6611
parent 329
6d75fa09cc0c
child 334
083b0d8e220a
--- 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;
 }
 

mercurial