From 32d94343f96b6fea8385670c7f3436f428906f01 Mon Sep 17 00:00:00 2001 From: philmoz Date: Fri, 24 May 2024 09:51:13 +1000 Subject: [PATCH] fix(color): selected label, model list not correctly updating in single select mode (#5049) --- radio/src/gui/colorlcd/model_select.cpp | 63 +++++++++++++++++++------ radio/src/gui/colorlcd/model_select.h | 2 + 2 files changed, 50 insertions(+), 15 deletions(-) diff --git a/radio/src/gui/colorlcd/model_select.cpp b/radio/src/gui/colorlcd/model_select.cpp index 5085b5f77dd..81779ed3737 100644 --- a/radio/src/gui/colorlcd/model_select.cpp +++ b/radio/src/gui/colorlcd/model_select.cpp @@ -497,6 +497,11 @@ class LabelDialog : public ModalWindow }); } + void onCancel() override + { + deleteLater(); + } + protected: std::function saveHandler; char label[LABEL_LENGTH + 1]; @@ -671,7 +676,7 @@ void ModelLabelsWindow::newModel() void ModelLabelsWindow::newLabel() { tmpLabel[0] = '\0'; - new LabelDialog(parent, tmpLabel, [=](std::string label) { + new LabelDialog(this, tmpLabel, [=](std::string label) { int newlabindex = modelslabels.addLabel(label); if (newlabindex >= 0) { std::set newset; @@ -679,6 +684,8 @@ void ModelLabelsWindow::newLabel() auto labels = getLabels(); lblselector->setNames(labels); lblselector->setSelected(newset); + if (g_eeGeneral.labelSingleSelect) + lblselector->setActiveItem(newlabindex); updateFilteredLabels(newset); } }); @@ -895,6 +902,8 @@ void ModelLabelsWindow::buildBody(Window *window) std::set newset; lblselector->setNames(labels); lblselector->setSelected(newset); + if (g_eeGeneral.labelSingleSelect && selected == lblselector->getActiveItem()) + lblselector->setActiveItem(-1); updateFilteredLabels(newset); }); return 0; @@ -902,25 +911,13 @@ void ModelLabelsWindow::buildBody(Window *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; }); } @@ -930,6 +927,42 @@ void ModelLabelsWindow::buildBody(Window *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 5a3982a4d4b..c08f8a15ef6 100644 --- a/radio/src/gui/colorlcd/model_select.h +++ b/radio/src/gui/colorlcd/model_select.h @@ -57,6 +57,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;