diff -r ae7f7fbb9cda -r 07e65a4c6611 src/model.h --- 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 +using Model = QTextDocument; + struct SubfileReference { QString name; glm::mat4 transformation; - bool inverted = false; }; template @@ -116,34 +118,6 @@ using PolygonElement = Colored; -template -struct remove_color {}; - -template -struct remove_color> { using type = T; }; - -template -struct remove_color&> { using type = T&; }; - -template -struct remove_color&> { using type = const T&; }; - -template -struct remove_color&&> { using type = T&&; }; - -template -using remove_color_t = typename remove_color::type; - -static_assert(std::is_same_v>, Triangle>); -static_assert(std::is_same_v&>, Triangle&>); -static_assert(std::is_same_v&>, const Triangle&>); - -template -constexpr remove_color_t extract_colored(T&& x) -{ - return static_cast>(x); -} - template 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 body; - std::map 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 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 -void iterate(const Model& model, std::function fn) -{ - for (std::size_t i = 0; i < model.size(); ++i) { - if (std::holds_alternative(model[i])) { - fn(std::get(model[i])); - } - } -} - constexpr Colored edge(const glm::vec3& p1, const glm::vec3& p2) { return Colored{{.p1 = p1, .p2 = p2}, EDGE_COLOR};