From 81a4a2da240a85ea6e5090ee4fe0936cab654256 Mon Sep 17 00:00:00 2001 From: Joachim Kohlhammer Date: Sun, 9 Nov 2025 22:35:34 +0100 Subject: [PATCH] Using MultiMetricSelector in FavouriteMetricsPage (#4728) As the same type of metrics selector was needed for the settings of the PlanningCalendarView, a reusable widget MultiMetricSelector was created in #4679, duplicating code from FavouriteMetricsPage. This change elminates the duplication and uses the MultiMetricSelector also in the global settings. A user visible change for FavouriteMetricsPage is the new filter field for available metrics. --- src/Gui/Pages.cpp | 150 ++-------------------------------------------- src/Gui/Pages.h | 19 +----- 2 files changed, 9 insertions(+), 160 deletions(-) diff --git a/src/Gui/Pages.cpp b/src/Gui/Pages.cpp index d133ca6ab..cfda0f8b4 100644 --- a/src/Gui/Pages.cpp +++ b/src/Gui/Pages.cpp @@ -1591,62 +1591,11 @@ ColorsPage::saveClicked() } FavouriteMetricsPage::FavouriteMetricsPage(QWidget *parent) : - QWidget(parent), changed(false) + QWidget(parent) { HelpWhatsThis *help = new HelpWhatsThis(this); this->setWhatsThis(help->getWhatsThisText(HelpWhatsThis::Preferences_Metrics_Favourites)); - availList = new QListWidget; - availList->setSortingEnabled(true); - availList->setAlternatingRowColors(true); - availList->setSelectionMode(QAbstractItemView::SingleSelection); - - QVBoxLayout *availLayout = new QVBoxLayout; - availLayout->addWidget(new QLabel(HLO + tr("Available Metrics") + HLC)); - availLayout->addWidget(availList); - - selectedList = new QListWidget; - selectedList->setAlternatingRowColors(true); - selectedList->setSelectionMode(QAbstractItemView::SingleSelection); - - ActionButtonBox *actionButtons = new ActionButtonBox(ActionButtonBox::UpDownGroup); - actionButtons->defaultConnect(ActionButtonBox::UpDownGroup, selectedList); - - QVBoxLayout *selectedLayout = new QVBoxLayout; - selectedLayout->addWidget(new QLabel(HLO + tr("Favourites") + HLC)); - selectedLayout->addWidget(selectedList); - selectedLayout->addWidget(actionButtons); - -#ifndef Q_OS_MAC - leftButton = new QToolButton(this); - leftButton->setArrowType(Qt::LeftArrow); - leftButton->setFixedSize(20*dpiXFactor,20*dpiYFactor); - rightButton = new QToolButton(this); - rightButton->setArrowType(Qt::RightArrow); - rightButton->setFixedSize(20*dpiXFactor,20*dpiYFactor); -#else - leftButton = new QPushButton("<"); - rightButton = new QPushButton(">"); -#endif - leftButton->setEnabled(false); - rightButton->setEnabled(false); - - QHBoxLayout *inexcLayout = new QHBoxLayout; - inexcLayout->addStretch(); - inexcLayout->addWidget(leftButton); - inexcLayout->addWidget(rightButton); - inexcLayout->addStretch(); - - QVBoxLayout *buttonGrid = new QVBoxLayout; - buttonGrid->addStretch(); - buttonGrid->addLayout(inexcLayout); - buttonGrid->addStretch(); - - QHBoxLayout *hlayout = new QHBoxLayout(this);; - hlayout->addLayout(availLayout, 2); - hlayout->addLayout(buttonGrid, 1); - hlayout->addLayout(selectedLayout, 2); - QString s; if (appsettings->contains(GC_SETTINGS_FAVOURITE_METRICS)) s = appsettings->value(this, GC_SETTINGS_FAVOURITE_METRICS).toString(); @@ -1654,96 +1603,12 @@ FavouriteMetricsPage::FavouriteMetricsPage(QWidget *parent) : s = GC_SETTINGS_FAVOURITE_METRICS_DEFAULT; QStringList selectedMetrics = s.split(","); - const RideMetricFactory &factory = RideMetricFactory::instance(); - for (int i = 0; i < factory.metricCount(); ++i) { - QString symbol = factory.metricName(i); - if (selectedMetrics.contains(symbol) || symbol.startsWith("compatibility_")) - continue; - QSharedPointer m(factory.newMetric(symbol)); - QListWidgetItem *item = new QListWidgetItem(Utils::unprotect(m->name())); - item->setData(Qt::UserRole, symbol); - item->setToolTip(m->description()); - availList->addItem(item); - } - foreach (QString symbol, selectedMetrics) { - if (!factory.haveMetric(symbol)) - continue; - QSharedPointer m(factory.newMetric(symbol)); - QListWidgetItem *item = new QListWidgetItem(Utils::unprotect(m->name())); - item->setData(Qt::UserRole, symbol); - item->setToolTip(m->description()); - selectedList->addItem(item); - } + multiMetricSelector = new MultiMetricSelector(HLO + tr("Available Metrics") + HLC, HLO + tr("Favourites") + HLC, selectedMetrics); - connect(actionButtons, &ActionButtonBox::upRequested, this, &FavouriteMetricsPage::upClicked); - connect(actionButtons, &ActionButtonBox::downRequested, this, &FavouriteMetricsPage::downClicked); - connect(leftButton, SIGNAL(clicked()), this, SLOT(leftClicked())); - connect(rightButton, SIGNAL(clicked()), this, SLOT(rightClicked())); - connect(availList, SIGNAL(itemSelectionChanged()), this, SLOT(availChanged())); - connect(selectedList, SIGNAL(itemSelectionChanged()), this, SLOT(selectedChanged())); -} + QHBoxLayout *hlayout = new QHBoxLayout(this); + hlayout->addWidget(multiMetricSelector); -void -FavouriteMetricsPage::upClicked() -{ - assert(!selectedList->selectedItems().isEmpty()); - QListWidgetItem *item = selectedList->selectedItems().first(); - int row = selectedList->row(item); - assert(row > 0); - selectedList->takeItem(row); - selectedList->insertItem(row - 1, item); - selectedList->setCurrentItem(item); - changed = true; -} - -void -FavouriteMetricsPage::downClicked() -{ - assert(!selectedList->selectedItems().isEmpty()); - QListWidgetItem *item = selectedList->selectedItems().first(); - int row = selectedList->row(item); - assert(row < selectedList->count() - 1); - selectedList->takeItem(row); - selectedList->insertItem(row + 1, item); - selectedList->setCurrentItem(item); - changed = true; -} - -void -FavouriteMetricsPage::leftClicked() -{ - assert(!selectedList->selectedItems().isEmpty()); - QListWidgetItem *item = selectedList->selectedItems().first(); - selectedList->takeItem(selectedList->row(item)); - availList->addItem(item); - changed = true; - selectedChanged(); -} - -void -FavouriteMetricsPage::rightClicked() -{ - assert(!availList->selectedItems().isEmpty()); - QListWidgetItem *item = availList->selectedItems().first(); - availList->takeItem(availList->row(item)); - selectedList->addItem(item); - changed = true; -} - -void -FavouriteMetricsPage::availChanged() -{ - rightButton->setEnabled(!availList->selectedItems().isEmpty()); -} - -void -FavouriteMetricsPage::selectedChanged() -{ - if (selectedList->selectedItems().isEmpty()) { - leftButton->setEnabled(false); - return; - } - leftButton->setEnabled(true); + connect(multiMetricSelector, &MultiMetricSelector::selectedChanged, [=]() { changed = true; }); } qint32 @@ -1751,10 +1616,7 @@ FavouriteMetricsPage::saveClicked() { if (!changed) return 0; - QStringList metrics; - for (int i = 0; i < selectedList->count(); ++i) - metrics << selectedList->item(i)->data(Qt::UserRole).toString(); - appsettings->setValue(GC_SETTINGS_FAVOURITE_METRICS, metrics.join(",")); + appsettings->setValue(GC_SETTINGS_FAVOURITE_METRICS, multiMetricSelector->getSymbols().join(",")); return 0; } diff --git a/src/Gui/Pages.h b/src/Gui/Pages.h index aa5fbaedf..5559aeeab 100644 --- a/src/Gui/Pages.h +++ b/src/Gui/Pages.h @@ -49,6 +49,7 @@ #include "RideAutoImportConfig.h" #include "RemoteControl.h" #include "Measures.h" +#include "MetricSelect.h" #include "TagStore.h" #include "ActionButtonBox.h" #include "StyledItemDelegates.h" @@ -374,25 +375,11 @@ class FavouriteMetricsPage : public QWidget FavouriteMetricsPage(QWidget *parent = NULL); public slots: - void upClicked(); - void downClicked(); - void leftClicked(); - void rightClicked(); - void availChanged(); - void selectedChanged(); qint32 saveClicked(); protected: - bool changed; - QListWidget *availList; - QListWidget *selectedList; -#ifndef Q_OS_MAC - QToolButton *leftButton; - QToolButton *rightButton; -#else - QPushButton *leftButton; - QPushButton *rightButton; -#endif + bool changed = false; + MultiMetricSelector *multiMetricSelector; }; class KeywordsPage : public QWidget