/***************************************************************************
* Copyright (C) 2012 by Peter Penz <peter.penz19@gmail.com> *
+* Copyright (C) 2019 by Ismael Asensio <isma.af@mgmail.com> *
* *
* 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 *
#include "dolphinfacetswidget.h"
-#include <KLocale>
-#include <QButtonGroup>
-#include <QCheckBox>
+#include <KLocalizedString>
+
+#include <QComboBox>
#include <QDate>
-#include <QRadioButton>
+#include <QEvent>
#include <QHBoxLayout>
-#include <QVBoxLayout>
-
-#ifdef HAVE_NEPOMUK
- #include <Nepomuk/Query/AndTerm>
- #include <Nepomuk/Query/ComparisonTerm>
- #include <Nepomuk/Query/LiteralTerm>
- #include <Nepomuk/Query/OrTerm>
- #include <Nepomuk/Query/Query>
- #include <Nepomuk/Query/ResourceTypeTerm>
- #include <Nepomuk/Vocabulary/NFO>
- #include <Nepomuk/Vocabulary/NIE>
- #include <Soprano/Vocabulary/NAO>
-#endif
+#include <QIcon>
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_NEPOMUK
-Nepomuk::Query::Term DolphinFacetsWidget::facetsTerm() const
+void DolphinFacetsWidget::changeEvent(QEvent *event)
{
- Nepomuk::Query::AndTerm andTerm;
+ if (event->type() == QEvent::EnabledChange && !isEnabled()) {
+ resetOptions();
+ }
+}
- const bool hasTypeFilter = m_documents->isChecked() ||
- m_images->isChecked() ||
- m_audio->isChecked() ||
- m_videos->isChecked();
- if (hasTypeFilter) {
- Nepomuk::Query::OrTerm orTerm;
+void DolphinFacetsWidget::resetOptions()
+{
+ m_typeSelector->setCurrentIndex(0);
+ m_dateSelector->setCurrentIndex(0);
+ m_ratingSelector->setCurrentIndex(0);
+}
- if (m_documents->isChecked()) {
- orTerm.addSubTerm(Nepomuk::Query::ResourceTypeTerm(Nepomuk::Vocabulary::NFO::Document()));
- }
+QString DolphinFacetsWidget::ratingTerm() const
+{
+ QStringList terms;
- if (m_images->isChecked()) {
- orTerm.addSubTerm(Nepomuk::Query::ResourceTypeTerm(Nepomuk::Vocabulary::NFO::Image()));
- }
+ if (m_ratingSelector->currentIndex() > 0) {
+ const int rating = m_ratingSelector->currentData().toInt() * 2;
+ terms << QStringLiteral("rating>=%1").arg(rating);
+ }
- if (m_audio->isChecked()) {
- orTerm.addSubTerm(Nepomuk::Query::ComparisonTerm(Nepomuk::Vocabulary::NIE::mimeType(),
- Nepomuk::Query::LiteralTerm("audio")));
- }
+ if (m_dateSelector->currentIndex() > 0) {
+ const QDate date = m_dateSelector->currentData().toDate();
+ terms << QStringLiteral("modified>=%1").arg(date.toString(Qt::ISODate));
+ }
- if (m_videos->isChecked()) {
- orTerm.addSubTerm(Nepomuk::Query::ComparisonTerm(Nepomuk::Vocabulary::NIE::mimeType(),
- Nepomuk::Query::LiteralTerm("video")));
- }
+ return terms.join(QLatin1String(" AND "));
+}
- andTerm.addSubTerm(orTerm);
- }
+QString DolphinFacetsWidget::facetType() const
+{
+ return m_typeSelector->currentData().toString();
+}
- 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;
- }
+bool DolphinFacetsWidget::isRatingTerm(const QString& term) const
+{
+ const QStringList subTerms = term.split(' ', QString::SkipEmptyParts);
+
+ // If term has sub terms, then sone of the sub terms are always "rating" and "modified" terms.
+ bool containsRating = false;
+ bool containsModified = false;
- const int rating = stars * 2;
- Nepomuk::Query::ComparisonTerm term(Soprano::Vocabulary::NAO::numericRating(),
- Nepomuk::Query::LiteralTerm(rating),
- Nepomuk::Query::ComparisonTerm::GreaterOrEqual);
- andTerm.addSubTerm(term);
+ foreach (const QString& subTerm, subTerms) {
+ if (subTerm.startsWith(QLatin1String("rating>="))) {
+ containsRating = true;
+ } else if (subTerm.startsWith(QLatin1String("modified>="))) {
+ containsModified = true;
+ }
}
- if (!m_anytime->isChecked()) {
- QDate date = QDate::currentDate(); // represents m_today
- if (m_yesterday->isChecked()) {
- date.addDays(-1);
- } else if (m_thisWeek->isChecked()) {
- date.addDays(1 - date.dayOfWeek());
- } else if (m_thisMonth->isChecked()) {
- date.addDays(1 - date.day());
- } else if (m_thisYear->isChecked()) {
- date.addDays(1 - date.dayOfYear());
+ 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);
}
+ }
+}
- Nepomuk::Query::ComparisonTerm term(Nepomuk::Vocabulary::NIE::lastModified(),
- Nepomuk::Query::LiteralTerm(QDateTime(date)),
- Nepomuk::Query::ComparisonTerm::GreaterOrEqual);
- andTerm.addSubTerm(term);
+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;
+ }
}
+}
- return andTerm;
+void DolphinFacetsWidget::setRating(const int stars)
+{
+ if (stars < 0 || stars > 5) {
+ return;
+ }
+ m_ratingSelector->setCurrentIndex(stars);
}
-#endif
-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<int>::of(&QComboBox::activated), this, &DolphinFacetsWidget::facetChanged);
}
-#include "dolphinfacetswidget.moc"