diff --git a/radio/src/gui/horus/menu_model_select.cpp b/radio/src/gui/horus/menu_model_select.cpp index c32383d59..0354357af 100644 --- a/radio/src/gui/horus/menu_model_select.cpp +++ b/radio/src/gui/horus/menu_model_select.cpp @@ -203,6 +203,11 @@ bool menuModelSelect(evt_t event) initModelsList(); break; + case EVT_KEY_BREAK(KEY_ENTER): + if (selectMode == MODE_MOVE_MODEL) + selectMode = MODE_SELECT_MODEL; + break; + case EVT_KEY_FIRST(KEY_EXIT): switch (selectMode) { case MODE_MOVE_MODEL: @@ -215,34 +220,40 @@ bool menuModelSelect(evt_t event) break; case EVT_KEY_FIRST(KEY_PGUP): - if (categoriesVerticalPosition == 0) - categoriesVerticalPosition = modelslist.categories.size() - 1; - else + if (selectMode == MODE_SELECT_MODEL) { + if (categoriesVerticalPosition == 0) + categoriesVerticalPosition = modelslist.categories.size() - 1; + else + categoriesVerticalPosition -= 1; + setCurrentCategory(categoriesVerticalPosition); + } + else if (selectMode == MODE_MOVE_MODEL && categoriesVerticalPosition > 0) { + ModelsCategory * previous_category = currentCategory; + ModelCell * model = currentModel; categoriesVerticalPosition -= 1; - setCurrentCategory(categoriesVerticalPosition); - putEvent(EVT_REFRESH); + setCurrentCategory(categoriesVerticalPosition); + modelslist.moveModel(model, previous_category, currentCategory); + setCurrentModel(currentCategory->size()-1); + } break; case EVT_KEY_FIRST(KEY_PGDN): - categoriesVerticalPosition += 1; - if (categoriesVerticalPosition >= modelslist.categories.size()) - categoriesVerticalPosition = 0; - setCurrentCategory(categoriesVerticalPosition); - putEvent(EVT_REFRESH); + if (selectMode == MODE_SELECT_MODEL) { + categoriesVerticalPosition += 1; + if (categoriesVerticalPosition >= modelslist.categories.size()) + categoriesVerticalPosition = 0; + setCurrentCategory(categoriesVerticalPosition); + } + else if (selectMode == MODE_MOVE_MODEL && categoriesVerticalPosition < modelslist.categories.size()-1) { + ModelsCategory * previous_category = currentCategory; + ModelCell * model = currentModel; + categoriesVerticalPosition += 1; + setCurrentCategory(categoriesVerticalPosition); + modelslist.moveModel(model, previous_category, currentCategory); + setCurrentModel(currentCategory->size()-1); + } break; - - /*if (selectMode == MODE_SELECT_CATEGORY) { - menuVerticalPosition = categoriesVerticalPosition; - menuVerticalOffset = categoriesVerticalOffset; - if (navigate(event, modelslist.categories.size(), 10)) { - categoriesVerticalPosition = menuVerticalPosition; - categoriesVerticalOffset = menuVerticalOffset; - putEvent(EVT_REFRESH); - setCurrentCategory(categoriesVerticalPosition); - } - }*/ - case EVT_KEY_LONG(KEY_ENTER): if (selectMode == MODE_SELECT_MODEL) { killEvents(event); diff --git a/radio/src/storage/modelslist.h b/radio/src/storage/modelslist.h index 1e3c0d8a9..ced6a774d 100644 --- a/radio/src/storage/modelslist.h +++ b/radio/src/storage/modelslist.h @@ -239,46 +239,53 @@ class ModelsList } } - ModelsCategory * createCategory() - { - ModelsCategory * result = new ModelsCategory("Category"); - categories.push_back(result); - save(); - return result; - } + ModelsCategory * createCategory() + { + ModelsCategory * result = new ModelsCategory("Category"); + categories.push_back(result); + save(); + return result; + } - ModelCell * addModel(ModelsCategory * category, const char * name) - { - ModelCell * result = category->addModel(name); - modelsCount++; - save(); - return result; - } + ModelCell * addModel(ModelsCategory * category, const char * name) + { + ModelCell * result = category->addModel(name); + modelsCount++; + save(); + return result; + } - void removeCategory(ModelsCategory * category) - { - modelsCount -= category->size(); - delete category; - categories.remove(category); - } + void removeCategory(ModelsCategory * category) + { + modelsCount -= category->size(); + delete category; + categories.remove(category); + } - void removeModel(ModelsCategory * category, ModelCell * model) - { - category->removeModel(model); - modelsCount--; - save(); - } + void removeModel(ModelsCategory * category, ModelCell * model) + { + category->removeModel(model); + modelsCount--; + save(); + } - void moveModel(ModelsCategory * category, ModelCell * model, int8_t step) - { - category->moveModel(model, step); - save(); - } + void moveModel(ModelsCategory * category, ModelCell * model, int8_t step) + { + category->moveModel(model, step); + save(); + } - std::list categories; - ModelsCategory * currentCategory; - ModelCell * currentModel; - unsigned int modelsCount; + void moveModel(ModelCell * model, ModelsCategory * previous_category, ModelsCategory * new_category) + { + previous_category->remove(model); + new_category->push_back(model); + save(); + } + + std::list categories; + ModelsCategory * currentCategory; + ModelCell * currentModel; + unsigned int modelsCount; protected: FIL file;