SmartPlaylistSearchTermWidget: Fix loading search terms

Fixes #1172
This commit is contained in:
Jonas Kvinge 2023-04-07 23:05:07 +02:00
parent 74bbc1f19f
commit 780b982635
3 changed files with 30 additions and 23 deletions

View File

@ -160,8 +160,11 @@ void RegisterMetaTypes() {
qRegisterMetaType<PlaylistSettingsPage::PathType>("PlaylistSettingsPage::PathType");
qRegisterMetaType<PlaylistGeneratorPtr>("PlaylistGeneratorPtr");
qRegisterMetaType<SmartPlaylistSearchTerm::Field>("SmartPlaylistSearchTerm::Field");
qRegisterMetaType<SmartPlaylistSearchTerm::Operator>("SmartPlaylistSearchTerm::Operator");
qRegisterMetaType<SmartPlaylistSearchTerm::OperatorList>("SmartPlaylistSearchTerm::OperatorList");
qRegisterMetaType<SmartPlaylistSearchTerm::Type>("SmartPlaylistSearchTerm::Type");
qRegisterMetaType<SmartPlaylistSearchTerm::DateType>("SmartPlaylistSearchTerm::DateType");
qRegisterMetaType<SmartPlaylistsItem::Type>("SmartPlaylistsItem::Type");
}

View File

@ -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

View File

@ -104,18 +104,20 @@ SmartPlaylistSearchTermWidget::SmartPlaylistSearchTermWidget(CollectionBackend *
// Populate the combo boxes
for (int i = 0; i < static_cast<int>(SmartPlaylistSearchTerm::Field::FieldCount); ++i) {
ui_->field->addItem(SmartPlaylistSearchTerm::FieldName(static_cast<SmartPlaylistSearchTerm::Field>(i)));
ui_->field->setItemData(i, i);
const SmartPlaylistSearchTerm::Field field = static_cast<SmartPlaylistSearchTerm::Field>(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<SmartPlaylistSearchTerm::DateType>(i), false));
ui_->date_type->setItemData(i, i);
const SmartPlaylistSearchTerm::DateType datetype = static_cast<SmartPlaylistSearchTerm::DateType>(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<SmartPlaylistSearchTerm::DateType>(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<SmartPlaylistSearchTerm::Field>(ui_->field->itemData(index).toInt());
SmartPlaylistSearchTerm::Type type = SmartPlaylistSearchTerm::TypeOf(field);
const SmartPlaylistSearchTerm::Field field = ui_->field->itemData(index).value<SmartPlaylistSearchTerm::Field>();
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<SmartPlaylistSearchTerm::Operator>(ui_->op->itemData(ui_->op->currentIndex()).toInt());
const SmartPlaylistSearchTerm::Operator op = ui_->op->currentData().value<SmartPlaylistSearchTerm::Operator>();
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<SmartPlaylistSearchTerm::Operator>(
// 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<SmartPlaylistSearchTerm::Operator>();
// 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<int>(term.field_)));
ui_->op->setCurrentIndex(ui_->op->findData(static_cast<int>(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<int>(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<int>(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<SmartPlaylistSearchTerm::Field>();
const SmartPlaylistSearchTerm::Operator op = ui_->op->currentData().value<SmartPlaylistSearchTerm::Operator>();
SmartPlaylistSearchTerm ret;
ret.field_ = static_cast<SmartPlaylistSearchTerm::Field>(field);
ret.operator_ = static_cast<SmartPlaylistSearchTerm::Operator>(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<SmartPlaylistSearchTerm::DateType>(ui_->date_type->currentIndex());
ret.datetype_ = ui_->date_type->currentData().value<SmartPlaylistSearchTerm::DateType>();
ret.value_ = ui_->value_date_numeric->value();
}
else if (value_page == ui_->page_date_relative) {
ret.datetype_ = static_cast<SmartPlaylistSearchTerm::DateType>(ui_->date_type_relative->currentIndex());
ret.datetype_ = ui_->date_type_relative->currentData().value<SmartPlaylistSearchTerm::DateType>();
ret.value_ = ui_->value_date_numeric1->value();
ret.second_value_ = ui_->value_date_numeric2->value();
}