Merge pull request #5985 from kleinfreund/master
Smart Playlists: Add empty/not empty operators
This commit is contained in:
commit
37262434b7
@ -128,6 +128,10 @@ QString SearchTerm::ToSql() const {
|
|||||||
} else {
|
} else {
|
||||||
return col + " <> " + value;
|
return col + " <> " + value;
|
||||||
}
|
}
|
||||||
|
case Op_Empty:
|
||||||
|
return col + " = ''";
|
||||||
|
case Op_NotEmpty:
|
||||||
|
return col + " <> ''";
|
||||||
}
|
}
|
||||||
|
|
||||||
return QString();
|
return QString();
|
||||||
@ -143,6 +147,11 @@ bool SearchTerm::is_valid() const {
|
|||||||
|
|
||||||
switch (TypeOf(field_)) {
|
switch (TypeOf(field_)) {
|
||||||
case Type_Text:
|
case Type_Text:
|
||||||
|
if (operator_ == SearchTerm::Op_Empty || operator_ == SearchTerm::Op_NotEmpty) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// Empty fields should be possible.
|
||||||
|
// All values for Type_Text should be valid.
|
||||||
return !value_.toString().isEmpty();
|
return !value_.toString().isEmpty();
|
||||||
case Type_Date:
|
case Type_Date:
|
||||||
return value_.toInt() != 0;
|
return value_.toInt() != 0;
|
||||||
@ -199,7 +208,8 @@ OperatorList SearchTerm::OperatorsForType(Type type) {
|
|||||||
switch (type) {
|
switch (type) {
|
||||||
case Type_Text:
|
case Type_Text:
|
||||||
return OperatorList() << Op_Contains << Op_NotContains << Op_Equals
|
return OperatorList() << Op_Contains << Op_NotContains << Op_Equals
|
||||||
<< Op_NotEquals << Op_StartsWith << Op_EndsWith;
|
<< Op_NotEquals << Op_Empty << Op_NotEmpty
|
||||||
|
<< Op_StartsWith << Op_EndsWith;
|
||||||
case Type_Date:
|
case Type_Date:
|
||||||
return OperatorList() << Op_Equals << Op_NotEquals << Op_GreaterThan
|
return OperatorList() << Op_Equals << Op_NotEquals << Op_GreaterThan
|
||||||
<< Op_LessThan << Op_NumericDate
|
<< Op_LessThan << Op_NumericDate
|
||||||
@ -249,6 +259,10 @@ QString SearchTerm::OperatorText(Type type, Operator op) {
|
|||||||
return QObject::tr("equals");
|
return QObject::tr("equals");
|
||||||
case Op_NotEquals:
|
case Op_NotEquals:
|
||||||
return QObject::tr("not equals");
|
return QObject::tr("not equals");
|
||||||
|
case Op_Empty:
|
||||||
|
return QObject::tr("empty");
|
||||||
|
case Op_NotEmpty:
|
||||||
|
return QObject::tr("not empty");
|
||||||
default:
|
default:
|
||||||
return QString();
|
return QString();
|
||||||
}
|
}
|
||||||
|
@ -80,7 +80,10 @@ class SearchTerm {
|
|||||||
// For numeric dates (e.g. not in the last X days)
|
// For numeric dates (e.g. not in the last X days)
|
||||||
Op_NumericDateNot = 10,
|
Op_NumericDateNot = 10,
|
||||||
|
|
||||||
// Next value = 11
|
Op_Empty = 11,
|
||||||
|
Op_NotEmpty = 12,
|
||||||
|
|
||||||
|
// Next value = 13
|
||||||
};
|
};
|
||||||
|
|
||||||
enum Type {
|
enum Type {
|
||||||
|
@ -163,7 +163,11 @@ void SearchTermWidget::FieldChanged(int index) {
|
|||||||
page = ui_->page_rating;
|
page = ui_->page_rating;
|
||||||
break;
|
break;
|
||||||
case SearchTerm::Type_Text:
|
case SearchTerm::Type_Text:
|
||||||
page = ui_->page_text;
|
if (ui_->op->currentIndex() == 4 || ui_->op->currentIndex() == 5) {
|
||||||
|
page = ui_->page_empty;
|
||||||
|
} else {
|
||||||
|
page = ui_->page_text;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case SearchTerm::Type_Invalid:
|
case SearchTerm::Type_Invalid:
|
||||||
page = nullptr;
|
page = nullptr;
|
||||||
@ -189,8 +193,21 @@ void SearchTermWidget::FieldChanged(int index) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SearchTermWidget::OpChanged(int index) {
|
void SearchTermWidget::OpChanged(int index) {
|
||||||
|
if ((ui_->value_stack->currentWidget() == ui_->page_text) ||
|
||||||
|
(ui_->value_stack->currentWidget() == ui_->page_empty)) {
|
||||||
|
QWidget* page = nullptr;
|
||||||
|
// This assumes the operators always appear in the same order.
|
||||||
|
// Needs a better way for checking which is the current operator.
|
||||||
|
if (index == 4 || index == 5) {
|
||||||
|
page = ui_->page_empty;
|
||||||
|
} else {
|
||||||
|
page = ui_->page_text;
|
||||||
|
}
|
||||||
|
ui_->value_stack->setCurrentWidget(page);
|
||||||
|
}
|
||||||
|
|
||||||
// We need to change the page only in the following case
|
// We need to change the page only in the following case
|
||||||
if ((ui_->value_stack->currentWidget() == ui_->page_date) ||
|
else if ((ui_->value_stack->currentWidget() == ui_->page_date) ||
|
||||||
(ui_->value_stack->currentWidget() == ui_->page_date_numeric) ||
|
(ui_->value_stack->currentWidget() == ui_->page_date_numeric) ||
|
||||||
(ui_->value_stack->currentWidget() == ui_->page_date_relative)) {
|
(ui_->value_stack->currentWidget() == ui_->page_date_relative)) {
|
||||||
QWidget* page = nullptr;
|
QWidget* page = nullptr;
|
||||||
@ -203,6 +220,7 @@ void SearchTermWidget::OpChanged(int index) {
|
|||||||
}
|
}
|
||||||
ui_->value_stack->setCurrentWidget(page);
|
ui_->value_stack->setCurrentWidget(page);
|
||||||
}
|
}
|
||||||
|
|
||||||
emit Changed();
|
emit Changed();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -267,7 +285,11 @@ void SearchTermWidget::SetTerm(const SearchTerm& term) {
|
|||||||
// The value depends on the data type
|
// The value depends on the data type
|
||||||
switch (SearchTerm::TypeOf(term.field_)) {
|
switch (SearchTerm::TypeOf(term.field_)) {
|
||||||
case SearchTerm::Type_Text:
|
case SearchTerm::Type_Text:
|
||||||
ui_->value_text->setText(term.value_.toString());
|
if (ui_->value_stack->currentWidget() == ui_->page_empty) {
|
||||||
|
ui_->value_text->setText("");
|
||||||
|
} else {
|
||||||
|
ui_->value_text->setText(term.value_.toString());
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SearchTerm::Type_Number:
|
case SearchTerm::Type_Number:
|
||||||
@ -313,6 +335,8 @@ SearchTerm SearchTermWidget::Term() const {
|
|||||||
const QWidget* value_page = ui_->value_stack->currentWidget();
|
const QWidget* value_page = ui_->value_stack->currentWidget();
|
||||||
if (value_page == ui_->page_text) {
|
if (value_page == ui_->page_text) {
|
||||||
ret.value_ = ui_->value_text->text();
|
ret.value_ = ui_->value_text->text();
|
||||||
|
} else if (value_page == ui_->page_empty) {
|
||||||
|
ret.value_ = "";
|
||||||
} else if (value_page == ui_->page_number) {
|
} else if (value_page == ui_->page_number) {
|
||||||
ret.value_ = ui_->value_number->value();
|
ret.value_ = ui_->value_number->value();
|
||||||
} else if (value_page == ui_->page_date) {
|
} else if (value_page == ui_->page_date) {
|
||||||
|
@ -71,6 +71,16 @@
|
|||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
|
<widget class="QWidget" name="page_empty">
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||||
|
<property name="spacing">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="margin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
<widget class="QWidget" name="page_rating">
|
<widget class="QWidget" name="page_rating">
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_6">
|
<layout class="QVBoxLayout" name="verticalLayout_6">
|
||||||
<property name="spacing">
|
<property name="spacing">
|
||||||
|
Loading…
x
Reference in New Issue
Block a user