X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/ebba84fbdd1effc828f88e08966dad5982371ecc..a0d3cf4aa8ffa76ed22a67efa4ea156eb2ef9f68:/src/search/searchcriterionselector.cpp diff --git a/src/search/searchcriterionselector.cpp b/src/search/searchcriterionselector.cpp index 08987153a..b62008029 100644 --- a/src/search/searchcriterionselector.cpp +++ b/src/search/searchcriterionselector.cpp @@ -20,8 +20,17 @@ #include "searchcriterionselector.h" +#define DISABLE_NEPOMUK_LEGACY +#include +#include +#include + +#include "nie.h" #include "searchcriterionvalue.h" +#include +#include + #include #include #include @@ -53,15 +62,16 @@ SearchCriterionSelector::SearchCriterionSelector(Type type, QWidget* parent) : m_removeButton = new QPushButton(this); m_removeButton->setIcon(KIcon("list-remove")); + m_removeButton->setToolTip(i18nc("@info", "Remove search option")); m_removeButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); connect(m_removeButton, SIGNAL(clicked()), this, SIGNAL(removeCriterion())); m_layout = new QHBoxLayout(this); m_layout->setMargin(0); + m_layout->addWidget(m_removeButton); m_layout->addWidget(m_descriptionsBox); m_layout->addWidget(m_comparatorBox); m_layout->addWidget(filler); - m_layout->addWidget(m_removeButton); setLayout(m_layout); @@ -73,71 +83,30 @@ SearchCriterionSelector::~SearchCriterionSelector() { } -void SearchCriterionSelector::createDescriptions() +Nepomuk::Query::Term SearchCriterionSelector::queryTerm() const { - Q_ASSERT(m_descriptionsBox != 0); - Q_ASSERT(m_comparatorBox != 0); - - // TODO: maybe this creation should be forwarded to a factory if - // the number of items increases in future - QList defaultComps; - defaultComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Greater Than"), ">", "+")); - defaultComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Greater Than or Equal to"), ">=", "+")); - defaultComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Less Than"), "<", "+")); - defaultComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Less Than or Equal to"), "<=", "+")); - - // add "Date" description - QList dateComps; - dateComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Anytime"))); // TODO - dateComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Today"))); // TODO - dateComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "This week"))); // TODO - dateComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "This month"))); // TODO - foreach (const SearchCriterionDescription::Comparator& comp, defaultComps) { - dateComps.append(comp); + if (m_valueWidget == 0) { + return Nepomuk::Query::Term(); } - DateValue* dateValue = new DateValue(this); - dateValue->hide(); - SearchCriterionDescription date(i18nc("@label", "Date"), - "sourceModified", - dateComps, - dateValue); - - // add "Size" description - QList sizeComps = defaultComps; - sizeComps.insert(0, SearchCriterionDescription::Comparator(i18nc("@label Any (file size)", "Any"))); - - SizeValue* sizeValue = new SizeValue(this); - sizeValue->hide(); - SearchCriterionDescription size(i18nc("@label", "Size"), - "contentSize", - sizeComps, - sizeValue); - - // add "Tag" description - QList tagComps; - tagComps.append(SearchCriterionDescription::Comparator(i18nc("@label All (tags)", "All"))); - tagComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Equal to"), "==")); + const int descIndex = m_descriptionsBox->currentIndex(); + const SearchCriterionDescription& descr = m_descriptions[descIndex]; - TagValue* tagValue = new TagValue(this); - tagValue->hide(); - SearchCriterionDescription tag(i18nc("@label", "Tag"), - "tag", - tagComps, - tagValue); + const int compIndex = m_comparatorBox->currentIndex(); + const SearchCriterionDescription::Comparator& comp = descr.comparators()[compIndex]; + if (!comp.isActive) { + return Nepomuk::Query::Term(); + } - Q_ASSERT(static_cast(SearchCriterionSelector::Date) == 0); - Q_ASSERT(static_cast(SearchCriterionSelector::Size) == 1); - Q_ASSERT(static_cast(SearchCriterionSelector::Tag) == 2); - m_descriptions.append(date); - m_descriptions.append(size); - m_descriptions.append(tag); + const Nepomuk::Query::ComparisonTerm term(descr.identifier(), + m_valueWidget->value(), + comp.value); + return term; +} - // add all descriptions to the combo box - const int count = m_descriptions.count(); - for (int i = 0; i < count; ++i) { - m_descriptionsBox->addItem(m_descriptions[i].name(), i); - } +SearchCriterionSelector::Type SearchCriterionSelector::type() const +{ + return static_cast(m_descriptionsBox->currentIndex()); } void SearchCriterionSelector::slotDescriptionChanged(int index) @@ -161,7 +130,7 @@ void SearchCriterionSelector::slotDescriptionChanged(int index) // add value widget m_valueWidget = description.valueWidget(); - m_layout->insertWidget(2, m_valueWidget); + m_layout->insertWidget(3, m_valueWidget); m_comparatorBox->setCurrentIndex(0); slotComparatorChanged(0); @@ -176,11 +145,100 @@ void SearchCriterionSelector::slotComparatorChanged(int index) const int descIndex = m_descriptionsBox->currentIndex(); const SearchCriterionDescription& descr = m_descriptions[descIndex]; const SearchCriterionDescription::Comparator& comp = descr.comparators()[index]; - m_valueWidget->setVisible(!comp.operation.isEmpty()); - // create query string - const QString queryString = comp.prefix + descr.identifier() + comp.operation + m_valueWidget->value(); - emit criterionChanged(queryString); + m_valueWidget->initializeValue(comp.autoValueType); + // only show the value widget, if an operation is defined + // and no automatic calculation is provided + m_valueWidget->setVisible(comp.isActive && comp.autoValueType.isEmpty()); + + emit criterionChanged(); +} + +void SearchCriterionSelector::createDescriptions() +{ + Q_ASSERT(m_descriptionsBox != 0); + Q_ASSERT(m_comparatorBox != 0); + + // TODO: maybe this creation should be forwarded to a factory if + // the number of items increases in future + QList defaultComps; + defaultComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Greater Than"), Nepomuk::Query::ComparisonTerm::Greater)); + defaultComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Greater Than or Equal to"), Nepomuk::Query::ComparisonTerm::GreaterOrEqual)); + defaultComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Less Than"), Nepomuk::Query::ComparisonTerm::Smaller)); + defaultComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Less Than or Equal to"), Nepomuk::Query::ComparisonTerm::SmallerOrEqual)); + + // add "Date" description + QList dateComps; + dateComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Anytime"))); + dateComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Today"), Nepomuk::Query::ComparisonTerm::GreaterOrEqual, "today")); + dateComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "This Week"), Nepomuk::Query::ComparisonTerm::GreaterOrEqual, "thisWeek")); + dateComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "This Month"), Nepomuk::Query::ComparisonTerm::GreaterOrEqual, "thisMonth")); + dateComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "This Year"), Nepomuk::Query::ComparisonTerm::GreaterOrEqual, "thisYear")); + foreach (const SearchCriterionDescription::Comparator& comp, defaultComps) { + dateComps.append(comp); + } + + DateValue* dateValue = new DateValue(this); + dateValue->hide(); + SearchCriterionDescription date(i18nc("@label", "Date:"), + Nepomuk::Vocabulary::NIE::lastModified(), + dateComps, + dateValue); + Q_ASSERT(static_cast(SearchCriterionSelector::Date) == 0); + m_descriptions.append(date); + + // add "Size" description + QList sizeComps = defaultComps; + sizeComps.insert(0, SearchCriterionDescription::Comparator(i18nc("@label Any (file size)", "Any"))); + + SizeValue* sizeValue = new SizeValue(this); + sizeValue->hide(); + SearchCriterionDescription size(i18nc("@label", "Size:"), + Soprano::Vocabulary::NAO::lastModified(), // TODO + sizeComps, + sizeValue); + Q_ASSERT(static_cast(SearchCriterionSelector::Size) == 1); + m_descriptions.append(size); + + // add "Tag" description + QList tagComps; + tagComps.append(SearchCriterionDescription::Comparator(i18nc("@label All (tags)", "All"))); + tagComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Equal to"), Nepomuk::Query::ComparisonTerm::Equal)); + // It is unclear yet how to express != for tags with the new Nepomuk query API. Disable it for KDE 4.4, + // but leave the translation string there to be able to enable this functionality for KDE 4.4.x: + const QString dummy = i18nc("@label", "Not Equal to"); + Q_UNUSED(dummy); + //tagComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Not Equal to"), Nepomuk::Query::ComparisonTerm::Equal)); // TODO + + TagValue* tagValue = new TagValue(this); + tagValue->hide(); + SearchCriterionDescription tag(i18nc("@label", "Tag:"), + Soprano::Vocabulary::NAO::hasTag(), + tagComps, + tagValue); + Q_ASSERT(static_cast(SearchCriterionSelector::Tag) == 2); + m_descriptions.append(tag); + + // add "Rating" description + QList ratingComps = defaultComps; + ratingComps.insert(0, SearchCriterionDescription::Comparator(i18nc("@label Any (rating)", "Any"))); + + RatingValue* ratingValue = new RatingValue(this); + ratingValue->hide(); + SearchCriterionDescription rating(i18nc("@label", "Rating:"), + Soprano::Vocabulary::NAO::numericRating(), + ratingComps, + ratingValue); + Q_ASSERT(static_cast(SearchCriterionSelector::Rating) == 3); + m_descriptions.append(rating); + + // add all descriptions to the combo box and connect the value widgets + int i = 0; + foreach (const SearchCriterionDescription& desc, m_descriptions) { + m_descriptionsBox->addItem(desc.name(), i); + connect(desc.valueWidget(), SIGNAL(valueChanged(Nepomuk::Query::LiteralTerm)), this, SIGNAL(criterionChanged())); + ++i; + } } #include "searchcriterionselector.moc"