New design for extended search options

Summary:
Replace the arrays of radiobuttons in dolphin search box to more simple dropdown boxes.
This provides a leaner look, saving a lot user space on the main view and it is more consistent with the 'Search tools' in the most known sites (Google, DuckDuckGo, etc.)
There is room for improvement, as `QComboBox` doesn't match perfectly with the tool buttons used avobe, but I think it is an improvement over the current situation.

BEFORE:
{F7581883}

AFTER:
{F7580952}

Test Plan: Same behavior with different aesthetics

Reviewers: elvisangelaccio, #dolphin, #vdg

Subscribers: ndavis, ngraham, kfm-devel

Tags: #dolphin

Differential Revision: https://phabricator.kde.org/D24602
This commit is contained in:
Ismael Asensio 2019-10-27 22:38:15 +01:00 committed by Elvis Angelaccio
parent c3b914a7fa
commit 1c50de3b38
2 changed files with 69 additions and 200 deletions

View file

@ -1,5 +1,6 @@
/*************************************************************************** /***************************************************************************
* Copyright (C) 2012 by Peter Penz <peter.penz19@gmail.com> * * 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 * * 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 * * it under the terms of the GNU General Public License as published by *
@ -21,91 +22,51 @@
#include <KLocalizedString> #include <KLocalizedString>
#include <QButtonGroup> #include <QComboBox>
#include <QCheckBox>
#include <QDate> #include <QDate>
#include <QEvent> #include <QEvent>
#include <QHBoxLayout> #include <QHBoxLayout>
#include <QRadioButton> #include <QIcon>
DolphinFacetsWidget::DolphinFacetsWidget(QWidget* parent) : DolphinFacetsWidget::DolphinFacetsWidget(QWidget* parent) :
QWidget(parent), QWidget(parent),
m_folders(nullptr), m_typeSelector(nullptr),
m_documents(nullptr), m_dateSelector(nullptr),
m_images(nullptr), m_ratingSelector(nullptr)
m_audio(nullptr),
m_videos(nullptr),
m_anytime(nullptr),
m_today(nullptr),
m_yesterday(nullptr),
m_thisWeek(nullptr),
m_thisMonth(nullptr),
m_thisYear(nullptr),
m_anyRating(nullptr),
m_oneOrMore(nullptr),
m_twoOrMore(nullptr),
m_threeOrMore(nullptr),
m_fourOrMore(nullptr),
m_maxRating(nullptr)
{ {
QButtonGroup* filetypeGroup = new QButtonGroup(this); m_typeSelector = new QComboBox(this);
m_anyType = createRadioButton(i18nc("@option:check", "Any"), filetypeGroup); m_typeSelector->addItem(QIcon::fromTheme(QStringLiteral("none")), i18nc("@item:inlistbox", "Any Type"), QString());
m_folders = createRadioButton(i18nc("@option:check", "Folders"), filetypeGroup); m_typeSelector->addItem(QIcon::fromTheme(QStringLiteral("inode-directory")), i18nc("@item:inlistbox", "Folders") , QStringLiteral("Folder"));
m_documents = createRadioButton(i18nc("@option:check", "Documents"), filetypeGroup); m_typeSelector->addItem(QIcon::fromTheme(QStringLiteral("text-x-generic")), i18nc("@item:inlistbox", "Documents") , QStringLiteral("Document"));
m_images = createRadioButton(i18nc("@option:check", "Images"), filetypeGroup); m_typeSelector->addItem(QIcon::fromTheme(QStringLiteral("image-x-generic")), i18nc("@item:inlistbox", "Images") , QStringLiteral("Image"));
m_audio = createRadioButton(i18nc("@option:check", "Audio Files"), filetypeGroup); m_typeSelector->addItem(QIcon::fromTheme(QStringLiteral("audio-x-generic")), i18nc("@item:inlistbox", "Audio Files"), QStringLiteral("Audio"));
m_videos = createRadioButton(i18nc("@option:check", "Videos"), filetypeGroup); m_typeSelector->addItem(QIcon::fromTheme(QStringLiteral("video-x-generic")), i18nc("@item:inlistbox", "Videos") , QStringLiteral("Video"));
initComboBox(m_typeSelector);
QVBoxLayout* typeLayout = new QVBoxLayout(); const QDate currentDate = QDate::currentDate();
typeLayout->setSpacing(0);
typeLayout->addWidget(m_anyType);
typeLayout->addWidget(m_folders);
typeLayout->addWidget(m_documents);
typeLayout->addWidget(m_images);
typeLayout->addWidget(m_audio);
typeLayout->addWidget(m_videos);
typeLayout->addStretch();
QButtonGroup* timespanGroup = new QButtonGroup(this); m_dateSelector = new QComboBox(this);
m_anytime = createRadioButton(i18nc("@option:option", "Anytime"), timespanGroup); m_dateSelector->addItem(QIcon::fromTheme(QStringLiteral("view-calendar")), i18nc("@item:inlistbox", "Any Date"), QDate());
m_today = createRadioButton(i18nc("@option:option", "Today"), timespanGroup); m_dateSelector->addItem(QIcon::fromTheme(QStringLiteral("go-jump-today")), i18nc("@item:inlistbox", "Today") , currentDate);
m_yesterday = createRadioButton(i18nc("@option:option", "Yesterday"), timespanGroup); m_dateSelector->addItem(QIcon::fromTheme(QStringLiteral("go-jump-today")), i18nc("@item:inlistbox", "Yesterday") , currentDate.addDays(-1));
m_thisWeek = createRadioButton(i18nc("@option:option", "This Week"), timespanGroup); m_dateSelector->addItem(QIcon::fromTheme(QStringLiteral("view-calendar-week")), i18nc("@item:inlistbox", "This Week") , currentDate.addDays(1 - currentDate.dayOfWeek()));
m_thisMonth = createRadioButton(i18nc("@option:option", "This Month"), timespanGroup); m_dateSelector->addItem(QIcon::fromTheme(QStringLiteral("view-calendar-month")), i18nc("@item:inlistbox", "This Month"), currentDate.addDays(1 - currentDate.day()));
m_thisYear = createRadioButton(i18nc("@option:option", "This Year"), timespanGroup); m_dateSelector->addItem(QIcon::fromTheme(QStringLiteral("view-calendar-year")), i18nc("@item:inlistbox", "This Year") , currentDate.addDays(1 - currentDate.dayOfYear()));
initComboBox(m_dateSelector);
QVBoxLayout* timespanLayout = new QVBoxLayout(); m_ratingSelector = new QComboBox(this);
timespanLayout->setSpacing(0); m_ratingSelector->addItem(QIcon::fromTheme(QStringLiteral("non-starred-symbolic")), i18nc("@item:inlistbox", "Any Rating"), 0);
timespanLayout->addWidget(m_anytime); m_ratingSelector->addItem(QIcon::fromTheme(QStringLiteral("starred-symbolic")), i18nc("@item:inlistbox", "1 or more"), 1);
timespanLayout->addWidget(m_today); m_ratingSelector->addItem(QIcon::fromTheme(QStringLiteral("starred-symbolic")), i18nc("@item:inlistbox", "2 or more"), 2);
timespanLayout->addWidget(m_yesterday); m_ratingSelector->addItem(QIcon::fromTheme(QStringLiteral("starred-symbolic")), i18nc("@item:inlistbox", "3 or more"), 3);
timespanLayout->addWidget(m_thisWeek); m_ratingSelector->addItem(QIcon::fromTheme(QStringLiteral("starred-symbolic")), i18nc("@item:inlistbox", "4 or more"), 4);
timespanLayout->addWidget(m_thisMonth); m_ratingSelector->addItem(QIcon::fromTheme(QStringLiteral("starred-symbolic")), i18nc("@item:inlistbox", "Highest Rating"), 5);
timespanLayout->addWidget(m_thisYear); initComboBox(m_ratingSelector);
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);
QHBoxLayout* topLayout = new QHBoxLayout(this); QHBoxLayout* topLayout = new QHBoxLayout(this);
topLayout->addLayout(typeLayout); topLayout->addWidget(m_typeSelector);
topLayout->addLayout(timespanLayout); topLayout->addWidget(m_dateSelector);
topLayout->addLayout(ratingLayout); topLayout->addWidget(m_ratingSelector);
topLayout->addStretch();
resetOptions(); resetOptions();
} }
@ -123,43 +84,22 @@ void DolphinFacetsWidget::changeEvent(QEvent *event)
void DolphinFacetsWidget::resetOptions() void DolphinFacetsWidget::resetOptions()
{ {
m_anyType->setChecked(true); m_typeSelector->setCurrentIndex(0);
m_anytime->setChecked(true); m_dateSelector->setCurrentIndex(0);
m_anyRating->setChecked(true); m_ratingSelector->setCurrentIndex(0);
} }
QString DolphinFacetsWidget::ratingTerm() const QString DolphinFacetsWidget::ratingTerm() const
{ {
QStringList terms; QStringList terms;
if (!m_anyRating->isChecked()) { if (m_ratingSelector->currentIndex() > 0) {
int stars = 1; // represents m_oneOrMore const int rating = m_ratingSelector->currentData().toInt() * 2;
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;
terms << QStringLiteral("rating>=%1").arg(rating); terms << QStringLiteral("rating>=%1").arg(rating);
} }
if (!m_anytime->isChecked()) { if (m_dateSelector->currentIndex() > 0) {
QDate date = QDate::currentDate(); // represents m_today const QDate date = m_dateSelector->currentData().toDate();
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());
}
terms << QStringLiteral("modified>=%1").arg(date.toString(Qt::ISODate)); terms << QStringLiteral("modified>=%1").arg(date.toString(Qt::ISODate));
} }
@ -168,19 +108,7 @@ QString DolphinFacetsWidget::ratingTerm() const
QString DolphinFacetsWidget::facetType() const QString DolphinFacetsWidget::facetType() const
{ {
if (m_folders->isChecked()) { return m_typeSelector->currentData().toString();
return QStringLiteral("Folder");
} else if (m_documents->isChecked()) {
return QStringLiteral("Document");
} else if (m_images->isChecked()) {
return QStringLiteral("Image");
} else if (m_audio->isChecked()) {
return QStringLiteral("Audio");
} else if (m_videos->isChecked()) {
return QStringLiteral("Video");
}
return QString();
} }
bool DolphinFacetsWidget::isRatingTerm(const QString& term) const bool DolphinFacetsWidget::isRatingTerm(const QString& term) const
@ -224,75 +152,41 @@ void DolphinFacetsWidget::setRatingTerm(const QString& term)
void DolphinFacetsWidget::setFacetType(const QString& type) void DolphinFacetsWidget::setFacetType(const QString& type)
{ {
if (type == QLatin1String("Folder")) { for (int index = 1; index <= m_typeSelector->count(); index++) {
m_folders->setChecked(true); if (type == m_typeSelector->itemData(index).toString()) {
} else if (type == QLatin1String("Document")) { m_typeSelector->setCurrentIndex(index);
m_documents->setChecked(true); break;
} 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) void DolphinFacetsWidget::setRating(const int stars)
{ {
switch (stars) { if (stars < 0 || stars > 5) {
case 5: return;
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);
} }
m_ratingSelector->setCurrentIndex(stars);
} }
void DolphinFacetsWidget::setTimespan(const QDate& date) void DolphinFacetsWidget::setTimespan(const QDate& date)
{ {
const QDate currentDate = QDate::currentDate(); if (!date.isValid()) {
const int days = date.daysTo(currentDate); return;
}
if (days <= 0) { m_dateSelector->setCurrentIndex(0);
m_today->setChecked(true); for (int index = 1; index <= m_dateSelector->count(); index++) {
} else if (days <= 1) { if (date >= m_dateSelector->itemData(index).toDate()) {
m_yesterday->setChecked(true); m_dateSelector->setCurrentIndex(index);
} else if (days <= currentDate.dayOfWeek()) { break;
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, void DolphinFacetsWidget::initComboBox(QComboBox* combo)
QButtonGroup* group)
{ {
QRadioButton* button = new QRadioButton(text); combo->setFrame(false);
connect(button, &QRadioButton::clicked, this, &DolphinFacetsWidget::facetChanged); combo->setMinimumHeight(parentWidget()->height());
group->addButton(button); combo->setCurrentIndex(0);
return button; connect(combo, QOverload<int>::of(&QComboBox::activated), this, &DolphinFacetsWidget::facetChanged);
} }

View file

@ -22,10 +22,9 @@
#include <QWidget> #include <QWidget>
class QButtonGroup; class QComboBox;
class QDate; class QDate;
class QEvent; class QEvent;
class QRadioButton;
/** /**
* @brief Allows to filter search-queries by facets. * @brief Allows to filter search-queries by facets.
@ -70,36 +69,12 @@ protected:
private: private:
void setRating(const int stars); void setRating(const int stars);
void setTimespan(const QDate& date); void setTimespan(const QDate& date);
void initComboBox(QComboBox* combo);
/**
* @return New radiobutton which is connected to the
* slotFacedChanged() slot whenever it has
* been toggled.
*/
QRadioButton* createRadioButton(const QString& text,
QButtonGroup* group);
private: private:
QRadioButton* m_anyType; QComboBox* m_typeSelector;
QRadioButton* m_folders; QComboBox* m_dateSelector;
QRadioButton* m_documents; QComboBox* m_ratingSelector;
QRadioButton* m_images;
QRadioButton* m_audio;
QRadioButton* m_videos;
QRadioButton* m_anytime;
QRadioButton* m_today;
QRadioButton* m_yesterday;
QRadioButton* m_thisWeek;
QRadioButton* m_thisMonth;
QRadioButton* m_thisYear;
QRadioButton* m_anyRating;
QRadioButton* m_oneOrMore;
QRadioButton* m_twoOrMore;
QRadioButton* m_threeOrMore;
QRadioButton* m_fourOrMore;
QRadioButton* m_maxRating;
}; };
#endif #endif