--- a/src/modeleditcontext.h Fri Mar 06 23:45:44 2020 +0200 +++ b/src/modeleditcontext.h Mon Mar 09 14:21:54 2020 +0200 @@ -19,34 +19,54 @@ #pragma once #include "model.h" #include "linetypes/object.h" +#include "linetypes/quadrilateral.h" +#include "linetypes/triangle.h" class Model::EditContext { public: template<typename T, typename... Args> - ldraw::Id append(Args&&... args); - ldraw::Id append(std::unique_ptr<ldraw::Object>&& object); + ldraw::id_t append(Args&&... args); + ldraw::id_t append(std::unique_ptr<ldraw::Object>&& object); template<typename T, typename... Args> - ldraw::Id insert(int position, Args&&... args); + ldraw::id_t insert(int position, Args&&... args); void setObjectProperty( ldraw::Object* object, ldraw::Property property, const QVariant &value); - void invertObject(ldraw::Id id); + void invertObject(ldraw::id_t id); + Model& model(); private: EditContext(Model& model); friend class Model; - Model& model; + Model& storedModel; }; template<typename T, typename... Args> -ldraw::Id Model::EditContext::append(Args&&... args) +ldraw::id_t Model::EditContext::append(Args&&... args) { - return this->model.append<T>(args...); + return this->storedModel.append<T>(args...); } template<typename T, typename... Args> -ldraw::Id Model::EditContext::insert(int position, Args&&... args) +ldraw::id_t Model::EditContext::insert(int position, Args&&... args) +{ + return this->storedModel.insert<T>(position, args...); +} + +namespace ldraw { - return this->model.insert<T>(position, args...); + /// Determines how quadrilaterals are split into triangles + enum class QuadrilateralSplit + { + Split123_134, + Split124_234 + }; + + // Splits the specified quadrilateral into triangles. + // If it is not a quadrilateral then no action is performed + auto splitQuadrilateral(Model::EditContext& editor, + quadrilateralid_t quadrilateral_id, + QuadrilateralSplit splitType = QuadrilateralSplit::Split123_134 + ) -> std::optional<std::pair<triangleid_t, triangleid_t>>; }