X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/67f58d5082cbab3a1a4a83926e77ade299ec07ea..fc4315d57e8fe64d05aad2a1c24800f0149b21da:/src/search/dolphinfacetswidget.cpp diff --git a/src/search/dolphinfacetswidget.cpp b/src/search/dolphinfacetswidget.cpp index 1a912af48..8e1a9c470 100644 --- a/src/search/dolphinfacetswidget.cpp +++ b/src/search/dolphinfacetswidget.cpp @@ -20,7 +20,9 @@ #include "dolphinfacetswidget.h" #include +#include #include +#include #include #include #include @@ -44,25 +46,29 @@ DolphinFacetsWidget::DolphinFacetsWidget(QWidget* parent) : m_fourOrMore(0), m_maxRating(0) { - m_documents = new QCheckBox(i18nc("@option:check", "Documents")); - m_images = new QCheckBox(i18nc("@option:check", "Images")); - m_audio = new QCheckBox(i18nc("@option:check", "Audio")); - m_videos = new QCheckBox(i18nc("@option:check", "Videos")); + QButtonGroup* filetypeGroup = new QButtonGroup(this); + m_anyType = createRadioButton(i18nc("@option:check", "Any"), filetypeGroup); + m_documents = createRadioButton(i18nc("@option:check", "Documents"), filetypeGroup); + m_images = createRadioButton(i18nc("@option:check", "Images"), filetypeGroup); + m_audio = createRadioButton(i18nc("@option:check", "Audio Files"), filetypeGroup); + m_videos = createRadioButton(i18nc("@option:check", "Videos"), filetypeGroup); QVBoxLayout* typeLayout = new QVBoxLayout(); typeLayout->setSpacing(0); + typeLayout->addWidget(m_anyType); typeLayout->addWidget(m_documents); typeLayout->addWidget(m_images); typeLayout->addWidget(m_audio); typeLayout->addWidget(m_videos); typeLayout->addStretch(); - m_anytime = new QRadioButton(i18nc("@option:option", "Anytime")); - m_today = new QRadioButton(i18nc("@option:option", "Today")); - m_yesterday = new QRadioButton(i18nc("@option:option", "Yesterday")); - m_thisWeek = new QRadioButton(i18nc("@option:option", "This Week")); - m_thisMonth = new QRadioButton(i18nc("@option:option", "This Month")); - m_thisYear = new QRadioButton(i18nc("@option:option", "This Year")); + QButtonGroup* timespanGroup = new QButtonGroup(this); + m_anytime = createRadioButton(i18nc("@option:option", "Anytime"), timespanGroup); + m_today = createRadioButton(i18nc("@option:option", "Today"), timespanGroup); + m_yesterday = createRadioButton(i18nc("@option:option", "Yesterday"), timespanGroup); + m_thisWeek = createRadioButton(i18nc("@option:option", "This Week"), timespanGroup); + m_thisMonth = createRadioButton(i18nc("@option:option", "This Month"), timespanGroup); + m_thisYear = createRadioButton(i18nc("@option:option", "This Year"), timespanGroup); QVBoxLayout* timespanLayout = new QVBoxLayout(); timespanLayout->setSpacing(0); @@ -74,12 +80,13 @@ DolphinFacetsWidget::DolphinFacetsWidget(QWidget* parent) : timespanLayout->addWidget(m_thisYear); timespanLayout->addStretch(); - m_anyRating = new QRadioButton(i18nc("@option:option", "Any Rating")); - m_oneOrMore = new QRadioButton(i18nc("@option:option", "1 or more")); - m_twoOrMore = new QRadioButton(i18nc("@option:option", "2 or more")); - m_threeOrMore = new QRadioButton(i18nc("@option:option", "3 or more")); - m_fourOrMore = new QRadioButton(i18nc("@option:option", "4 or more")); - m_maxRating = new QRadioButton(i18nc("@option:option", "Maximum Rating")); + QButtonGroup* ratingGroup = new QButtonGroup(this); + m_anyRating = createRadioButton(i18nc("@option:option", "Any Rating"), ratingGroup); + m_oneOrMore = createRadioButton(i18nc("@option:option", "1 or more"), ratingGroup); + m_twoOrMore = createRadioButton(i18nc("@option:option", "2 or more"), ratingGroup); + m_threeOrMore = createRadioButton(i18nc("@option:option", "3 or more"), ratingGroup); + m_fourOrMore = createRadioButton(i18nc("@option:option", "4 or more"), ratingGroup); + m_maxRating = createRadioButton(i18nc("@option:option", "Highest Rating"), ratingGroup); QVBoxLayout* ratingLayout = new QVBoxLayout(); ratingLayout->setSpacing(0); @@ -96,7 +103,7 @@ DolphinFacetsWidget::DolphinFacetsWidget(QWidget* parent) : topLayout->addLayout(ratingLayout); topLayout->addStretch(); - // TODO: + m_anyType->setChecked(true); m_anytime->setChecked(true); m_anyRating->setChecked(true); } @@ -105,4 +112,191 @@ DolphinFacetsWidget::~DolphinFacetsWidget() { } -#include "dolphinfacetswidget.moc" +#ifdef HAVE_BALOO +Baloo::Term DolphinFacetsWidget::ratingTerm() const +{ + Baloo::Term ratingTerm; + Baloo::Term modifiedTerm; + + if (!m_anyRating->isChecked()) { + int stars = 1; // represents m_oneOrMore + if (m_twoOrMore->isChecked()) { + stars = 2; + } else if (m_threeOrMore->isChecked()) { + stars = 3; + } else if (m_fourOrMore->isChecked()) { + stars = 4; + } else if (m_maxRating->isChecked()) { + stars = 5; + } + + const int rating = stars * 2; + ratingTerm = Baloo::Term("rating", rating, Baloo::Term::GreaterEqual); + } + + if (!m_anytime->isChecked()) { + QDate date = QDate::currentDate(); // represents m_today + if (m_yesterday->isChecked()) { + date = date.addDays(-1); + } else if (m_thisWeek->isChecked()) { + date = date.addDays(1 - date.dayOfWeek()); + } else if (m_thisMonth->isChecked()) { + date = date.addDays(1 - date.day()); + } else if (m_thisYear->isChecked()) { + date = date.addDays(1 - date.dayOfYear()); + } + + modifiedTerm = Baloo::Term("modified", date, Baloo::Term::GreaterEqual); + } + + if (ratingTerm.isValid() && modifiedTerm.isValid()) { + Baloo::Term term(Baloo::Term::And); + term.addSubTerm(ratingTerm); + term.addSubTerm(modifiedTerm); + + return term; + } else if (modifiedTerm.isValid()) { + return modifiedTerm; + } else if (ratingTerm.isValid()) { + return ratingTerm; + } + + return Baloo::Term(); +} + +QString DolphinFacetsWidget::facetType() const +{ + if (m_documents->isChecked()) { + return QLatin1String("Document"); + } else if (m_images->isChecked()) { + return QLatin1String("Image"); + } else if (m_audio->isChecked()) { + return QLatin1String("Audio"); + } else if (m_videos->isChecked()) { + return QLatin1String("Video"); + } + + return QString(); +} + +bool DolphinFacetsWidget::isRatingTerm(const Baloo::Term& term) const +{ + const QList subTerms = term.subTerms(); + if (subTerms.isEmpty()) { + // If term has no sub terms, then the term itself is either a "rating" term + // or a "modified" term. + return term.property() == QLatin1String("modified") || + term.property() == QLatin1String("rating"); + + } else if (subTerms.size() == 2) { + // If term has sub terms, then the sub terms are always "rating" and "modified" terms. + + QStringList properties; + foreach (const Baloo::Term& subTerm, subTerms) { + properties << subTerm.property(); + } + + return properties.contains(QLatin1String("modified")) && + properties.contains(QLatin1String("rating")); + } + + return false; +} + +void DolphinFacetsWidget::setRatingTerm(const Baloo::Term& term) +{ + // If term has sub terms, then the sub terms are always "rating" and "modified" terms. + // If term has no sub terms, then the term itself is either a "rating" term or a "modified" + // term. To avoid code duplication we add term to subTerms list, if the list is empty. + QList subTerms = term.subTerms(); + if (subTerms.isEmpty()) { + subTerms << term; + } + + foreach (const Baloo::Term& subTerm, subTerms) { + const QString property = subTerm.property(); + + if (property == QLatin1String("modified")) { + const QDate date = subTerm.value().toDate(); + setTimespan(date); + } else if (property == QLatin1String("rating")) { + const int stars = subTerm.value().toInt() / 2; + setRating(stars); + } + } +} + +#endif + +void DolphinFacetsWidget::setFacetType(const QString& type) +{ + if (type == QLatin1String("Document")) { + m_documents->setChecked(true); + } else if (type == QLatin1String("Image")) { + m_images->setChecked(true); + } else if (type == QLatin1String("Audio")) { + m_audio->setChecked(true); + } else if (type == QLatin1String("Video")) { + m_videos->setChecked(true); + } else { + m_anyType->setChecked(true); + } +} + +void DolphinFacetsWidget::setRating(const int stars) +{ + switch (stars) { + case 5: + m_maxRating->setChecked(true); + break; + + case 4: + m_fourOrMore->setChecked(true); + break; + + case 3: + m_threeOrMore->setChecked(true); + break; + + case 2: + m_twoOrMore->setChecked(true); + break; + + case 1: + m_oneOrMore->setChecked(true); + break; + + default: + m_anyRating->setChecked(true); + } +} + +void DolphinFacetsWidget::setTimespan(const QDate& date) +{ + const QDate currentDate = QDate::currentDate(); + const int days = date.daysTo(currentDate); + + if (days <= 0) { + m_today->setChecked(true); + } else if (days <= 1) { + m_yesterday->setChecked(true); + } else if (days <= currentDate.dayOfWeek()) { + m_thisWeek->setChecked(true); + } else if (days <= currentDate.day()) { + m_thisMonth->setChecked(true); + } else if (days <= currentDate.dayOfYear()) { + m_thisYear->setChecked(true); + } else { + m_anytime->setChecked(true); + } +} + +QRadioButton* DolphinFacetsWidget::createRadioButton(const QString& text, + QButtonGroup* group) +{ + QRadioButton* button = new QRadioButton(text); + connect(button, &QRadioButton::clicked, this, &DolphinFacetsWidget::facetChanged); + group->addButton(button); + return button; +} +