diff --git a/radio/src/gui/colorlcd/model_select.cpp b/radio/src/gui/colorlcd/model_select.cpp index e96540ace..1ad34e3c0 100644 --- a/radio/src/gui/colorlcd/model_select.cpp +++ b/radio/src/gui/colorlcd/model_select.cpp @@ -437,6 +437,26 @@ void ModelsPageBody::deleteModel(ModelCell *model) }); } +void ModelsPageBody::saveAsTemplate(ModelCell *model) +{ + storageDirty(EE_MODEL); + storageCheck(true); + constexpr size_t size = sizeof(model->modelName) + sizeof(YAML_EXT); + char modelName[size]; + snprintf(modelName, size, "%s%s", model->modelName, YAML_EXT); + char templatePath[FF_MAX_LFN]; + snprintf(templatePath, FF_MAX_LFN, "%s%c%s", PERS_TEMPL_PATH, '/', modelName); + sdCheckAndCreateDirectory(TEMPLATES_PATH); + sdCheckAndCreateDirectory(PERS_TEMPL_PATH); + if (isFileAvailable(templatePath)) { + new ConfirmDialog(parent, STR_FILE_EXISTS, STR_ASK_OVERWRITE, [=] { + sdCopyFile(model->modelFilename, MODELS_PATH, modelName, PERS_TEMPL_PATH); + }); + } else { + sdCopyFile(model->modelFilename, MODELS_PATH, modelName, PERS_TEMPL_PATH); + } +} + void ModelsPageBody::editLabels(ModelCell* model) { auto labels = modelslabels.getLabels(); @@ -495,6 +515,7 @@ void ModelsPageBody::update(int selected) menu->addLine(STR_DELETE_MODEL, [=]() { deleteModel(model); }); } menu->addLine(STR_EDIT_LABELS, [=]() { editLabels(model); }); + menu->addLine(STR_SAVE_TEMPLATE, [=]() { saveAsTemplate(model);}); return 0; }); } diff --git a/radio/src/gui/colorlcd/model_select.h b/radio/src/gui/colorlcd/model_select.h index ab1e0e01b..66e1d9203 100644 --- a/radio/src/gui/colorlcd/model_select.h +++ b/radio/src/gui/colorlcd/model_select.h @@ -67,6 +67,7 @@ class ModelsPageBody : public FormWindow void duplicateModel(ModelCell* model); void deleteModel(ModelCell* model); void editLabels(ModelCell* model); + void saveAsTemplate(ModelCell *model); }; class ModelLabelsWindow : public Page