src/model.h

changeset 333
07e65a4c6611
parent 328
3ea38fd469ca
child 336
e07425ac5834
--- a/src/model.h	Mon Jul 04 15:37:22 2022 +0300
+++ b/src/model.h	Mon Jul 04 19:53:13 2022 +0300
@@ -22,11 +22,13 @@
 #include "src/basics.h"
 #include "src/colors.h"
 
+#include <QTextDocument>
+using Model = QTextDocument;
+
 struct SubfileReference
 {
 	QString name;
 	glm::mat4 transformation;
-	bool inverted = false;
 };
 
 template<typename T>
@@ -116,34 +118,6 @@
 
 using PolygonElement = Colored<PlainPolygonElement>;
 
-template<typename T>
-struct remove_color {};
-
-template<typename T>
-struct remove_color<Colored<T>> { using type = T; };
-
-template<typename T>
-struct remove_color<Colored<T>&> { using type = T&; };
-
-template<typename T>
-struct remove_color<const Colored<T>&> { using type = const T&; };
-
-template<typename T>
-struct remove_color<Colored<T>&&> { using type = T&&; };
-
-template<typename T>
-using remove_color_t = typename remove_color<T>::type;
-
-static_assert(std::is_same_v<remove_color_t<Colored<Triangle>>, Triangle>);
-static_assert(std::is_same_v<remove_color_t<Colored<Triangle>&>, Triangle&>);
-static_assert(std::is_same_v<remove_color_t<const Colored<Triangle>&>, const Triangle&>);
-
-template<typename T>
-constexpr remove_color_t<T&&> extract_colored(T&& x)
-{
-	return static_cast<remove_color_t<T&&>>(x);
-}
-
 template<typename Ret, typename Fn1, typename Fn2, typename Fn3, typename Fn4, typename T>
 constexpr auto visitPolygon(Fn1&& f1, Fn2&& f2, Fn3&& f3, Fn4&& f4, T&& element)
 {
@@ -193,74 +167,6 @@
 		element);
 }
 
-QString modelElementToString(const ModelElement& element);
-struct ElementId
-{
-	std::int32_t value;
-	constexpr auto operator<=>(const ElementId& other) const = default;
-};
-
-constexpr auto qHash(ElementId id)
-{
-	return qHash(id.value);
-}
-
-class Model : public QAbstractListModel
-{
-	Q_OBJECT
-	struct Entry {
-		ModelElement data;
-		ElementId id;
-	};
-	std::vector<Entry> body;
-	std::map<ElementId, std::size_t> positions;
-	ElementId runningId = {1};
-public:
-	explicit Model(QObject* parent);
-	virtual ~Model();
-	ElementId append(const ModelElement& value);
-	const ModelElement& at(std::size_t position) const;
-	ElementId idAt(std::size_t position) const;
-	void assignAt(std::size_t position, const ModelElement& element);
-	std::optional<std::size_t> find(ElementId id) const;
-	void remove(std::size_t index);
-	int rowCount(const QModelIndex&) const override;
-	QVariant data(const QModelIndex& index, int role) const override;
-	const ModelElement& operator[](std::size_t index) const;
-	std::size_t size() const;
-	void clear();
-	auto operator[](const std::size_t index) {
-		struct {
-			Model& model;
-			const std::size_t index;
-			operator const ModelElement&() {
-				return model.at(index);
-			}
-			auto& operator=(const ModelElement& newData) {
-				model.assignAt(index, newData);
-				return *this;
-			}
-			const auto* operator&() {
-				return &(this->operator const ModelElement&());
-			}
-		} result{*this, index};
-		return result;
-	}
-};
-
-void save(const Model& model, QTextStream* stream);
-void updateHeaderNameField(Model& model, const QString &name);
-
-template<typename T>
-void iterate(const Model& model, std::function<void(const T&)> fn)
-{
-	for (std::size_t i = 0; i < model.size(); ++i) {
-		if (std::holds_alternative<T>(model[i])) {
-			fn(std::get<T>(model[i]));
-		}
-	}
-}
-
 constexpr Colored<LineSegment> edge(const glm::vec3& p1, const glm::vec3& p2)
 {
 	return Colored<LineSegment>{{.p1 = p1, .p2 = p2}, EDGE_COLOR};

mercurial