--- 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};