From 3e4b8530d17b88ebfb01a97d2fadeb864ff85748 Mon Sep 17 00:00:00 2001 From: Neil Horne <15316949+elecpower@users.noreply.github.com> Date: Sat, 1 Nov 2025 14:12:04 +1100 Subject: [PATCH] chore(cpn): move exclusivecombogroup to shared (#6754) --- companion/src/generaledit/hardware.cpp | 57 +--------------- companion/src/shared/CMakeLists.txt | 1 + companion/src/shared/exclusivecombogroup.cpp | 70 ++++++++++++++++++++ companion/src/shared/exclusivecombogroup.h | 47 +++++++++++++ 4 files changed, 121 insertions(+), 54 deletions(-) create mode 100644 companion/src/shared/exclusivecombogroup.cpp create mode 100644 companion/src/shared/exclusivecombogroup.h diff --git a/companion/src/generaledit/hardware.cpp b/companion/src/generaledit/hardware.cpp index 823bdbba3..31620feee 100644 --- a/companion/src/generaledit/hardware.cpp +++ b/companion/src/generaledit/hardware.cpp @@ -30,6 +30,7 @@ #include "autobitmappedcombobox.h" #include "autobitmappedcheckbox.h" #include "namevalidator.h" +#include "exclusivecombogroup.h" #include #include @@ -46,60 +47,8 @@ constexpr char FIM_FLEXSWITCHES[] {"Flex Switches"}; constexpr char FIM_FLEXTYPE_SWITCH[] {"Flex Type Switch"}; constexpr char FIM_FLEXTYPE_NOSWITCH[] {"Flex Type No Switch"}; -class ExclusiveComboGroup: public QObject -{ - public: - ExclusiveComboGroup(QObject *parent, std::function filter) : - QObject(parent), filter(std::move(filter)) - { - } - - typedef QList ComboBoxes; - - ComboBoxes* getComboBoxes() - { - return &combos; - } - - void addCombo(QComboBox *comboBox) - { - connect(comboBox, QOverload::of(&QComboBox::activated), - [=](int index) { this->handleActivated(comboBox, index); }); - combos.append(comboBox); - } - - void handleActivated(QComboBox* target, int index) { - auto data = target->itemData(index); - auto targetidx = combos.indexOf(target); - for (auto combo : combos) { - if (target == combo) continue; - auto view = dynamic_cast(combo->view()); - Q_ASSERT(view); - - auto previous = combo->findData(targetidx, _role); - if (previous >= 0) { - view->setRowHidden(previous, false); - combo->setItemData(previous, QVariant(), _role); - } - if (!filter(data)) { - auto idx = combo->findData(data); - if (idx >= 0) { - view->setRowHidden(idx, true); - combo->setItemData(idx, targetidx, _role); - } - } - } - } - - private: - static constexpr auto _role = Qt::UserRole + 500; - - ComboBoxes combos; - std::function filter; - -}; - -HardwarePanel::HardwarePanel(QWidget * parent, GeneralSettings & generalSettings, Firmware * firmware, CompoundItemModelFactory * sharedItemModels): +HardwarePanel::HardwarePanel(QWidget * parent, GeneralSettings & generalSettings, + Firmware * firmware, CompoundItemModelFactory * sharedItemModels): GeneralPanel(parent, generalSettings, firmware), board(firmware->getBoard()), editorItemModels(sharedItemModels), diff --git a/companion/src/shared/CMakeLists.txt b/companion/src/shared/CMakeLists.txt index 5da221b8d..b66feb722 100644 --- a/companion/src/shared/CMakeLists.txt +++ b/companion/src/shared/CMakeLists.txt @@ -21,6 +21,7 @@ set(${PROJECT_NAME}_NAMES genericpanel scrollarea textvalidator + exclusivecombogroup ) AddHeadersSources() diff --git a/companion/src/shared/exclusivecombogroup.cpp b/companion/src/shared/exclusivecombogroup.cpp new file mode 100644 index 000000000..3c73ecbac --- /dev/null +++ b/companion/src/shared/exclusivecombogroup.cpp @@ -0,0 +1,70 @@ +/* + * Copyright (C) EdgeTX + * + * Based on code named + * opentx - https://github.com/opentx/opentx + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "exclusivecombogroup.h" + +#include + +ExclusiveComboGroup::ExclusiveComboGroup(QObject *parent, + std::function filter) : + QObject(parent), + filter(std::move(filter)) +{ +} + +void ExclusiveComboGroup::addCombo(QComboBox *comboBox) +{ + connect(comboBox, QOverload::of(&QComboBox::activated), [=](int index) { + this->handleActivated(comboBox, index); + }); + + combos.append(comboBox); +} + +void ExclusiveComboGroup::handleActivated(QComboBox* target, int index) +{ + auto data = target->itemData(index); + auto targetidx = combos.indexOf(target); + + for (auto combo : combos) { + if (target == combo) + continue; + + auto view = dynamic_cast(combo->view()); + Q_ASSERT(view); + + auto previous = combo->findData(targetidx, _role); + + if (previous >= 0) { + view->setRowHidden(previous, false); + combo->setItemData(previous, QVariant(), _role); + } + + if (!filter(data)) { + auto idx = combo->findData(data); + + if (idx >= 0) { + view->setRowHidden(idx, true); + combo->setItemData(idx, targetidx, _role); + } + } + } +} diff --git a/companion/src/shared/exclusivecombogroup.h b/companion/src/shared/exclusivecombogroup.h new file mode 100644 index 000000000..76b3934dd --- /dev/null +++ b/companion/src/shared/exclusivecombogroup.h @@ -0,0 +1,47 @@ +/* + * Copyright (C) EdgeTX + * + * Based on code named + * opentx - https://github.com/opentx/opentx + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#pragma once + +#include +#include +#include + +class ExclusiveComboGroup: public QObject +{ + Q_OBJECT + + public: + typedef QList ComboBoxes; + + ExclusiveComboGroup(QObject *parent, std::function filter); + + ComboBoxes* getComboBoxes() { return &combos; } + + void addCombo(QComboBox *comboBox); + void handleActivated(QComboBox* target, int index); + + private: + static constexpr auto _role = Qt::UserRole + 500; + + ComboBoxes combos; + std::function filter; +};