From 780b982635a57f3087e8ce094e007880edfc896d Mon Sep 17 00:00:00 2001 From: Jonas Kvinge Date: Fri, 7 Apr 2023 23:05:07 +0200 Subject: [PATCH] SmartPlaylistSearchTermWidget: Fix loading search terms Fixes #1172 --- src/core/metatypes.cpp | 3 ++ src/smartplaylists/smartplaylistsearchterm.h | 3 ++ .../smartplaylistsearchtermwidget.cpp | 47 ++++++++++--------- 3 files changed, 30 insertions(+), 23 deletions(-) diff --git a/src/core/metatypes.cpp b/src/core/metatypes.cpp index d5929743e..336fb7732 100644 --- a/src/core/metatypes.cpp +++ b/src/core/metatypes.cpp @@ -160,8 +160,11 @@ void RegisterMetaTypes() { qRegisterMetaType("PlaylistSettingsPage::PathType"); qRegisterMetaType("PlaylistGeneratorPtr"); + qRegisterMetaType("SmartPlaylistSearchTerm::Field"); qRegisterMetaType("SmartPlaylistSearchTerm::Operator"); qRegisterMetaType("SmartPlaylistSearchTerm::OperatorList"); + qRegisterMetaType("SmartPlaylistSearchTerm::Type"); + qRegisterMetaType("SmartPlaylistSearchTerm::DateType"); qRegisterMetaType("SmartPlaylistsItem::Type"); } diff --git a/src/smartplaylists/smartplaylistsearchterm.h b/src/smartplaylists/smartplaylistsearchterm.h index ba11b1844..1b1b24d61 100644 --- a/src/smartplaylists/smartplaylistsearchterm.h +++ b/src/smartplaylists/smartplaylistsearchterm.h @@ -138,7 +138,10 @@ class SmartPlaylistSearchTerm { QDataStream &operator<<(QDataStream &s, const SmartPlaylistSearchTerm &term); QDataStream &operator>>(QDataStream &s, SmartPlaylistSearchTerm &term); +Q_DECLARE_METATYPE(SmartPlaylistSearchTerm::Field) Q_DECLARE_METATYPE(SmartPlaylistSearchTerm::Operator) Q_DECLARE_METATYPE(SmartPlaylistSearchTerm::OperatorList) +Q_DECLARE_METATYPE(SmartPlaylistSearchTerm::Type) +Q_DECLARE_METATYPE(SmartPlaylistSearchTerm::DateType) #endif // SMARTPLAYLISTSEARCHTERM_H diff --git a/src/smartplaylists/smartplaylistsearchtermwidget.cpp b/src/smartplaylists/smartplaylistsearchtermwidget.cpp index 0120aa6ab..ae7acbd0e 100644 --- a/src/smartplaylists/smartplaylistsearchtermwidget.cpp +++ b/src/smartplaylists/smartplaylistsearchtermwidget.cpp @@ -104,18 +104,20 @@ SmartPlaylistSearchTermWidget::SmartPlaylistSearchTermWidget(CollectionBackend * // Populate the combo boxes for (int i = 0; i < static_cast(SmartPlaylistSearchTerm::Field::FieldCount); ++i) { - ui_->field->addItem(SmartPlaylistSearchTerm::FieldName(static_cast(i))); - ui_->field->setItemData(i, i); + const SmartPlaylistSearchTerm::Field field = static_cast(i); + ui_->field->addItem(SmartPlaylistSearchTerm::FieldName(field)); + ui_->field->setItemData(i, QVariant::fromValue(field)); } ui_->field->model()->sort(0); // Populate the date type combo box for (int i = 0; i < 5; ++i) { - ui_->date_type->addItem(SmartPlaylistSearchTerm::DateName(static_cast(i), false)); - ui_->date_type->setItemData(i, i); + const SmartPlaylistSearchTerm::DateType datetype = static_cast(i); + ui_->date_type->addItem(SmartPlaylistSearchTerm::DateName(datetype, false)); + ui_->date_type->setItemData(i, QVariant::fromValue(datetype)); - ui_->date_type_relative->addItem(SmartPlaylistSearchTerm::DateName(static_cast(i), false)); - ui_->date_type_relative->setItemData(i, i); + ui_->date_type_relative->addItem(SmartPlaylistSearchTerm::DateName(datetype, false)); + ui_->date_type_relative->setItemData(i, QVariant::fromValue(datetype)); } // Icons on the buttons @@ -140,13 +142,13 @@ SmartPlaylistSearchTermWidget::~SmartPlaylistSearchTermWidget() { delete ui_; } void SmartPlaylistSearchTermWidget::FieldChanged(int index) { - SmartPlaylistSearchTerm::Field field = static_cast(ui_->field->itemData(index).toInt()); - SmartPlaylistSearchTerm::Type type = SmartPlaylistSearchTerm::TypeOf(field); + const SmartPlaylistSearchTerm::Field field = ui_->field->itemData(index).value(); + const SmartPlaylistSearchTerm::Type type = SmartPlaylistSearchTerm::TypeOf(field); // Populate the operator combo box if (type != current_field_type_) { ui_->op->clear(); - for (SmartPlaylistSearchTerm::Operator op : SmartPlaylistSearchTerm::OperatorsForType(type)) { + for (const SmartPlaylistSearchTerm::Operator op : SmartPlaylistSearchTerm::OperatorsForType(type)) { const int i = ui_->op->count(); ui_->op->addItem(SmartPlaylistSearchTerm::OperatorText(type, op)); ui_->op->setItemData(i, QVariant::fromValue(op)); @@ -156,7 +158,7 @@ void SmartPlaylistSearchTermWidget::FieldChanged(int index) { // Show the correct value editor QWidget *page = nullptr; - SmartPlaylistSearchTerm::Operator op = static_cast(ui_->op->itemData(ui_->op->currentIndex()).toInt()); + const SmartPlaylistSearchTerm::Operator op = ui_->op->currentData().value(); switch (type) { case SmartPlaylistSearchTerm::Type::Time: page = ui_->page_time; @@ -207,9 +209,8 @@ void SmartPlaylistSearchTermWidget::OpChanged(int idx) { Q_UNUSED(idx); // Determine the currently selected operator - SmartPlaylistSearchTerm::Operator op = static_cast( - // This uses the operatorss index in the combobox to get its enum value - ui_->op->itemData(ui_->op->currentIndex()).toInt()); + // This uses the operatorss index in the combobox to get its enum value + const SmartPlaylistSearchTerm::Operator op = ui_->op->currentData().value(); // We need to change the page only in the following case if ((ui_->value_stack->currentWidget() == ui_->page_text) || (ui_->value_stack->currentWidget() == ui_->page_empty)) { @@ -317,8 +318,8 @@ float SmartPlaylistSearchTermWidget::overlay_opacity() const { void SmartPlaylistSearchTermWidget::SetTerm(const SmartPlaylistSearchTerm &term) { - ui_->field->setCurrentIndex(ui_->field->findData(static_cast(term.field_))); - ui_->op->setCurrentIndex(ui_->op->findData(static_cast(term.operator_))); + ui_->field->setCurrentIndex(ui_->field->findData(QVariant::fromValue(term.field_))); + ui_->op->setCurrentIndex(ui_->op->findData(QVariant::fromValue(term.operator_))); // The value depends on the data type switch (SmartPlaylistSearchTerm::TypeOf(term.field_)) { @@ -338,12 +339,12 @@ void SmartPlaylistSearchTermWidget::SetTerm(const SmartPlaylistSearchTerm &term) case SmartPlaylistSearchTerm::Type::Date: if (ui_->value_stack->currentWidget() == ui_->page_date_numeric) { ui_->value_date_numeric->setValue(term.value_.toInt()); - ui_->date_type->setCurrentIndex(static_cast(term.datetype_)); + ui_->date_type->setCurrentIndex(ui_->date_type->findData(QVariant::fromValue(term.datetype_))); } else if (ui_->value_stack->currentWidget() == ui_->page_date_relative) { ui_->value_date_numeric1->setValue(term.value_.toInt()); ui_->value_date_numeric2->setValue(term.second_value_.toInt()); - ui_->date_type_relative->setCurrentIndex(static_cast(term.datetype_)); + ui_->date_type_relative->setCurrentIndex(ui_->date_type_relative->findData(QVariant::fromValue(term.datetype_))); } else if (ui_->value_stack->currentWidget() == ui_->page_date) { ui_->value_date->setDateTime(QDateTime::fromSecsSinceEpoch(term.value_.toInt())); @@ -366,12 +367,12 @@ void SmartPlaylistSearchTermWidget::SetTerm(const SmartPlaylistSearchTerm &term) SmartPlaylistSearchTerm SmartPlaylistSearchTermWidget::Term() const { - const int field = ui_->field->itemData(ui_->field->currentIndex()).toInt(); - const int op = ui_->op->itemData(ui_->op->currentIndex()).toInt(); + const SmartPlaylistSearchTerm::Field field = ui_->field->currentData().value(); + const SmartPlaylistSearchTerm::Operator op = ui_->op->currentData().value(); SmartPlaylistSearchTerm ret; - ret.field_ = static_cast(field); - ret.operator_ = static_cast(op); + ret.field_ = field; + ret.operator_ = op; // The value depends on the data type const QWidget *value_page = ui_->value_stack->currentWidget(); @@ -391,11 +392,11 @@ SmartPlaylistSearchTerm SmartPlaylistSearchTermWidget::Term() const { ret.value_ = QTime(0, 0).secsTo(ui_->value_time->time()); } else if (value_page == ui_->page_date_numeric) { - ret.datetype_ = static_cast(ui_->date_type->currentIndex()); + ret.datetype_ = ui_->date_type->currentData().value(); ret.value_ = ui_->value_date_numeric->value(); } else if (value_page == ui_->page_date_relative) { - ret.datetype_ = static_cast(ui_->date_type_relative->currentIndex()); + ret.datetype_ = ui_->date_type_relative->currentData().value(); ret.value_ = ui_->value_date_numeric1->value(); ret.second_value_ = ui_->value_date_numeric2->value(); }