From 074224a4b5ad98588fecc5e7ca78eebbec9bb3c5 Mon Sep 17 00:00:00 2001 From: philmoz Date: Fri, 24 May 2024 09:49:25 +1000 Subject: [PATCH] fix(color): selected label, model list not correctly updating in single select mode (#5048) --- radio/src/gui/colorlcd/model_select.cpp | 56 ++++++++++++++++++------- radio/src/gui/colorlcd/model_select.h | 2 + 2 files changed, 44 insertions(+), 14 deletions(-) diff --git a/radio/src/gui/colorlcd/model_select.cpp b/radio/src/gui/colorlcd/model_select.cpp index a2f64ec01f9..3d0ac69966e 100644 --- a/radio/src/gui/colorlcd/model_select.cpp +++ b/radio/src/gui/colorlcd/model_select.cpp @@ -709,6 +709,8 @@ void ModelLabelsWindow::newLabel() auto labels = getLabels(); lblselector->setNames(labels); lblselector->setSelected(newset); + if (g_eeGeneral.labelSingleSelect) + lblselector->setActiveItem(newlabindex); updateFilteredLabels(newset); } }); @@ -927,6 +929,8 @@ void ModelLabelsWindow::buildBody(FormWindow *window) std::set newset; lblselector->setNames(labels); lblselector->setSelected(newset); + if (g_eeGeneral.labelSingleSelect && selected == lblselector->getActiveItem()) + lblselector->setActiveItem(-1); updateFilteredLabels(newset); }); return 0; @@ -934,25 +938,13 @@ void ModelLabelsWindow::buildBody(FormWindow *window) if (modelslabels.getLabels().size() > 1) { if (selected != 0) { menu->addLine(STR_MOVE_UP, [=]() { - modelslabels.moveLabelTo(selected, selected - 1); - std::set newset; - newset.insert(selected - 1); - auto labels = getLabels(); - lblselector->setNames(labels); - lblselector->setSelected(newset); - updateFilteredLabels(newset); + moveLabel(selected, -1); return 0; }); } if (selected != (int)modelslabels.getLabels().size() - 1) { menu->addLine(STR_MOVE_DOWN, [=]() { - modelslabels.moveLabelTo(selected, selected + 1); - std::set newset; - newset.insert(selected + 1); - auto labels = getLabels(); - lblselector->setNames(labels); - lblselector->setSelected(newset); - updateFilteredLabels(newset); + moveLabel(selected, 1); return 0; }); } @@ -962,6 +954,42 @@ void ModelLabelsWindow::buildBody(FormWindow *window) }); } +void ModelLabelsWindow::moveLabel(int selected, int direction) +{ + int swapSelected = selected + direction; + + modelslabels.moveLabelTo(selected, swapSelected); + + std::set newset = lblselector->getSelection(); + bool isSelected = newset.find(selected) != newset.end(); + bool isSwapSelected = newset.find(swapSelected) != newset.end(); + if (isSelected && !isSwapSelected) { + newset.erase(newset.find(selected)); + newset.insert(swapSelected); + } else if (isSwapSelected && !isSelected) { + newset.erase(newset.find(swapSelected)); + newset.insert(selected); + } + + lblselector->setNames(getLabels()); + + if (g_eeGeneral.labelSingleSelect) { + int active = lblselector->getActiveItem(); + if (active == selected) { + lblselector->setActiveItem(swapSelected); + newset.insert(swapSelected); + } else if (active == swapSelected) { + lblselector->setActiveItem(selected); + newset.insert(selected); + } else if (active >= 0) { + newset.insert(active); + } + } + + lblselector->setSelected(newset); + updateFilteredLabels(newset); +} + void ModelLabelsWindow::updateFilteredLabels(std::set selected, bool setdirty) { diff --git a/radio/src/gui/colorlcd/model_select.h b/radio/src/gui/colorlcd/model_select.h index 2051e7772cf..477071d5aa4 100644 --- a/radio/src/gui/colorlcd/model_select.h +++ b/radio/src/gui/colorlcd/model_select.h @@ -58,6 +58,8 @@ class ModelLabelsWindow : public Page void labelRefreshRequest(); void setTitle(); + void moveLabel(int selected, int direction); + #if defined(HARDWARE_KEYS) void onPressSYS() override; void onLongPressSYS() override;