X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/dd18909eecce59ae23b1e921b96937fd547c9558..faa37a6138fc0a7458f61d2799370994b936396e:/src/search/dolphinfacetswidget.cpp diff --git a/src/search/dolphinfacetswidget.cpp b/src/search/dolphinfacetswidget.cpp index b7315a01c..ae05509e7 100644 --- a/src/search/dolphinfacetswidget.cpp +++ b/src/search/dolphinfacetswidget.cpp @@ -1,5 +1,6 @@ /*************************************************************************** * Copyright (C) 2012 by Peter Penz * +* Copyright (C) 2019 by Ismael Asensio * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * @@ -19,179 +20,174 @@ #include "dolphinfacetswidget.h" -#include -#include -#include +#include + +#include #include -#include +#include #include -#include +#include DolphinFacetsWidget::DolphinFacetsWidget(QWidget* parent) : QWidget(parent), - m_documents(0), - m_images(0), - m_audio(0), - m_videos(0), - m_anytime(0), - m_today(0), - m_yesterday(0), - m_thisWeek(0), - m_thisMonth(0), - m_thisYear(0), - m_anyRating(0), - m_oneOrMore(0), - m_twoOrMore(0), - m_threeOrMore(0), - m_fourOrMore(0), - m_maxRating(0) + m_typeSelector(nullptr), + m_dateSelector(nullptr), + m_ratingSelector(nullptr) { - m_documents = createCheckBox(i18nc("@option:check", "Documents")); - m_images = createCheckBox(i18nc("@option:check", "Images")); - m_audio = createCheckBox(i18nc("@option:check", "Audio Files")); - m_videos = createCheckBox(i18nc("@option:check", "Videos")); - - QVBoxLayout* typeLayout = new QVBoxLayout(); - typeLayout->setSpacing(0); - typeLayout->addWidget(m_documents); - typeLayout->addWidget(m_images); - typeLayout->addWidget(m_audio); - typeLayout->addWidget(m_videos); - typeLayout->addStretch(); - - 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); - timespanLayout->addWidget(m_anytime); - timespanLayout->addWidget(m_today); - timespanLayout->addWidget(m_yesterday); - timespanLayout->addWidget(m_thisWeek); - timespanLayout->addWidget(m_thisMonth); - timespanLayout->addWidget(m_thisYear); - timespanLayout->addStretch(); - - 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); - ratingLayout->addWidget(m_anyRating); - ratingLayout->addWidget(m_oneOrMore); - ratingLayout->addWidget(m_twoOrMore); - ratingLayout->addWidget(m_threeOrMore); - ratingLayout->addWidget(m_fourOrMore); - ratingLayout->addWidget(m_maxRating); + m_typeSelector = new QComboBox(this); + m_typeSelector->addItem(QIcon::fromTheme(QStringLiteral("none")), i18nc("@item:inlistbox", "Any Type"), QString()); + m_typeSelector->addItem(QIcon::fromTheme(QStringLiteral("inode-directory")), i18nc("@item:inlistbox", "Folders") , QStringLiteral("Folder")); + m_typeSelector->addItem(QIcon::fromTheme(QStringLiteral("text-x-generic")), i18nc("@item:inlistbox", "Documents") , QStringLiteral("Document")); + m_typeSelector->addItem(QIcon::fromTheme(QStringLiteral("image-x-generic")), i18nc("@item:inlistbox", "Images") , QStringLiteral("Image")); + m_typeSelector->addItem(QIcon::fromTheme(QStringLiteral("audio-x-generic")), i18nc("@item:inlistbox", "Audio Files"), QStringLiteral("Audio")); + m_typeSelector->addItem(QIcon::fromTheme(QStringLiteral("video-x-generic")), i18nc("@item:inlistbox", "Videos") , QStringLiteral("Video")); + initComboBox(m_typeSelector); + + const QDate currentDate = QDate::currentDate(); + + m_dateSelector = new QComboBox(this); + m_dateSelector->addItem(QIcon::fromTheme(QStringLiteral("view-calendar")), i18nc("@item:inlistbox", "Any Date"), QDate()); + m_dateSelector->addItem(QIcon::fromTheme(QStringLiteral("go-jump-today")), i18nc("@item:inlistbox", "Today") , currentDate); + m_dateSelector->addItem(QIcon::fromTheme(QStringLiteral("go-jump-today")), i18nc("@item:inlistbox", "Yesterday") , currentDate.addDays(-1)); + m_dateSelector->addItem(QIcon::fromTheme(QStringLiteral("view-calendar-week")), i18nc("@item:inlistbox", "This Week") , currentDate.addDays(1 - currentDate.dayOfWeek())); + m_dateSelector->addItem(QIcon::fromTheme(QStringLiteral("view-calendar-month")), i18nc("@item:inlistbox", "This Month"), currentDate.addDays(1 - currentDate.day())); + m_dateSelector->addItem(QIcon::fromTheme(QStringLiteral("view-calendar-year")), i18nc("@item:inlistbox", "This Year") , currentDate.addDays(1 - currentDate.dayOfYear())); + initComboBox(m_dateSelector); + + m_ratingSelector = new QComboBox(this); + m_ratingSelector->addItem(QIcon::fromTheme(QStringLiteral("non-starred-symbolic")), i18nc("@item:inlistbox", "Any Rating"), 0); + m_ratingSelector->addItem(QIcon::fromTheme(QStringLiteral("starred-symbolic")), i18nc("@item:inlistbox", "1 or more"), 1); + m_ratingSelector->addItem(QIcon::fromTheme(QStringLiteral("starred-symbolic")), i18nc("@item:inlistbox", "2 or more"), 2); + m_ratingSelector->addItem(QIcon::fromTheme(QStringLiteral("starred-symbolic")), i18nc("@item:inlistbox", "3 or more"), 3); + m_ratingSelector->addItem(QIcon::fromTheme(QStringLiteral("starred-symbolic")), i18nc("@item:inlistbox", "4 or more"), 4); + m_ratingSelector->addItem(QIcon::fromTheme(QStringLiteral("starred-symbolic")), i18nc("@item:inlistbox", "Highest Rating"), 5); + initComboBox(m_ratingSelector); QHBoxLayout* topLayout = new QHBoxLayout(this); - topLayout->addLayout(typeLayout); - topLayout->addLayout(timespanLayout); - topLayout->addLayout(ratingLayout); - topLayout->addStretch(); + topLayout->setContentsMargins(0, 0, 0, 0); + topLayout->addWidget(m_typeSelector); + topLayout->addWidget(m_dateSelector); + topLayout->addWidget(m_ratingSelector); - m_anytime->setChecked(true); - m_anyRating->setChecked(true); + resetOptions(); } DolphinFacetsWidget::~DolphinFacetsWidget() { } -#ifdef HAVE_BALOO -Baloo::Term DolphinFacetsWidget::ratingTerm() const +void DolphinFacetsWidget::changeEvent(QEvent *event) { - 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; - } + if (event->type() == QEvent::EnabledChange && !isEnabled()) { + resetOptions(); + } +} - const int rating = stars * 2; +void DolphinFacetsWidget::resetOptions() +{ + m_typeSelector->setCurrentIndex(0); + m_dateSelector->setCurrentIndex(0); + m_ratingSelector->setCurrentIndex(0); +} - Baloo::Term term("rating", rating, Baloo::Term::GreaterEqual); - return term; - } +QString DolphinFacetsWidget::ratingTerm() const +{ + QStringList terms; - return Baloo::Term(); - - /* - // FIXME: Handle date time filters - 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()); - } + if (m_ratingSelector->currentIndex() > 0) { + const int rating = m_ratingSelector->currentData().toInt() * 2; + terms << QStringLiteral("rating>=%1").arg(rating); + } - Nepomuk2::Query::ComparisonTerm term(Nepomuk2::Vocabulary::NIE::lastModified(), - Nepomuk2::Query::LiteralTerm(QDateTime(date)), - Nepomuk2::Query::ComparisonTerm::GreaterOrEqual); - andTerm.addSubTerm(term); + if (m_dateSelector->currentIndex() > 0) { + const QDate date = m_dateSelector->currentData().toDate(); + terms << QStringLiteral("modified>=%1").arg(date.toString(Qt::ISODate)); } - */ + + return terms.join(QLatin1String(" AND ")); } -QStringList DolphinFacetsWidget::facetTypes() const +QString DolphinFacetsWidget::facetType() const { - QStringList types; - if (m_documents->isChecked()) { - types << "Document"; - } + return m_typeSelector->currentData().toString(); +} - if (m_images->isChecked()) { - types << "Image"; - } +bool DolphinFacetsWidget::isRatingTerm(const QString& term) const +{ + const QStringList subTerms = term.split(' ', QString::SkipEmptyParts); - if (m_audio->isChecked()) { - types << "Audio"; - } + // If term has sub terms, then sone of the sub terms are always "rating" and "modified" terms. + bool containsRating = false; + bool containsModified = false; - if (m_videos->isChecked()) { - types << "Video"; + foreach (const QString& subTerm, subTerms) { + if (subTerm.startsWith(QLatin1String("rating>="))) { + containsRating = true; + } else if (subTerm.startsWith(QLatin1String("modified>="))) { + containsModified = true; + } } - return types; + return containsModified || containsRating; +} + +void DolphinFacetsWidget::setRatingTerm(const QString& 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. + QStringList subTerms = term.split(' ', QString::SkipEmptyParts); + + foreach (const QString& subTerm, subTerms) { + if (subTerm.startsWith(QLatin1String("modified>="))) { + const QString value = subTerm.mid(10); + const QDate date = QDate::fromString(value, Qt::ISODate); + setTimespan(date); + } else if (subTerm.startsWith(QLatin1String("rating>="))) { + const QString value = subTerm.mid(8); + const int stars = value.toInt() / 2; + setRating(stars); + } + } } -#endif +void DolphinFacetsWidget::setFacetType(const QString& type) +{ + for (int index = 0; index <= m_typeSelector->count(); index++) { + if (type == m_typeSelector->itemData(index).toString()) { + m_typeSelector->setCurrentIndex(index); + break; + } + } +} +void DolphinFacetsWidget::setRating(const int stars) +{ + if (stars < 0 || stars > 5) { + return; + } + m_ratingSelector->setCurrentIndex(stars); +} -QCheckBox* DolphinFacetsWidget::createCheckBox(const QString& text) +void DolphinFacetsWidget::setTimespan(const QDate& date) { - QCheckBox* checkBox = new QCheckBox(text); - connect(checkBox, SIGNAL(clicked()), this, SIGNAL(facetChanged())); - return checkBox; + if (!date.isValid()) { + return; + } + m_dateSelector->setCurrentIndex(0); + for (int index = 1; index <= m_dateSelector->count(); index++) { + if (date >= m_dateSelector->itemData(index).toDate()) { + m_dateSelector->setCurrentIndex(index); + break; + } + } } -QRadioButton* DolphinFacetsWidget::createRadioButton(const QString& text, - QButtonGroup* group) +void DolphinFacetsWidget::initComboBox(QComboBox* combo) { - QRadioButton* button = new QRadioButton(text); - connect(button, SIGNAL(clicked()), this, SIGNAL(facetChanged())); - group->addButton(button); - return button; + combo->setFrame(false); + combo->setMinimumHeight(parentWidget()->height()); + combo->setCurrentIndex(0); + connect(combo, QOverload::of(&QComboBox::activated), this, &DolphinFacetsWidget::facetChanged); } -#include "dolphinfacetswidget.moc"