#include "dolphinfacetswidget.h"
#include <KLocalizedString>
+#include <KProtocolInfo>
#include <QComboBox>
#include <QDate>
#include <QMenu>
#include <QToolButton>
-DolphinFacetsWidget::DolphinFacetsWidget(QWidget* parent) :
- QWidget(parent),
- m_typeSelector(nullptr),
- m_dateSelector(nullptr),
- m_ratingSelector(nullptr),
- m_tagsSelector(nullptr)
+DolphinFacetsWidget::DolphinFacetsWidget(QWidget *parent)
+ : QWidget(parent)
+ , m_typeSelector(nullptr)
+ , m_dateSelector(nullptr)
+ , m_ratingSelector(nullptr)
+ , m_tagsSelector(nullptr)
{
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("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"));
+ 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()));
+ 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("starred-symbolic")), i18nc("@item:inlistbox", "Highest Rating"), 5);
initComboBox(m_ratingSelector);
+ m_clearTagsAction = new QAction(QIcon::fromTheme(QStringLiteral("edit-clear-all")), i18nc("@action:inmenu", "Clear Selection"), this);
+ connect(m_clearTagsAction, &QAction::triggered, this, [this]() {
+ resetSearchTags();
+ Q_EMIT facetChanged();
+ });
+
m_tagsSelector = new QToolButton(this);
m_tagsSelector->setIcon(QIcon::fromTheme(QStringLiteral("tag")));
m_tagsSelector->setMenu(new QMenu(this));
connect(&m_tagsLister, &KCoreDirLister::itemsAdded, this, &DolphinFacetsWidget::updateTagsMenuItems);
updateTagsMenu();
- QHBoxLayout* topLayout = new QHBoxLayout(this);
+ QHBoxLayout *topLayout = new QHBoxLayout(this);
topLayout->setContentsMargins(0, 0, 0, 0);
topLayout->addWidget(m_typeSelector);
topLayout->addWidget(m_dateSelector);
}
}
+QSize DolphinFacetsWidget::minimumSizeHint() const
+{
+ return QSize(0, m_typeSelector->minimumHeight());
+}
+
void DolphinFacetsWidget::resetSearchTerms()
{
m_typeSelector->setCurrentIndex(0);
m_dateSelector->setCurrentIndex(0);
m_ratingSelector->setCurrentIndex(0);
- m_searchTags = QStringList();
- updateTagsSelector();
- updateTagsMenu();
+ resetSearchTags();
}
QStringList DolphinFacetsWidget::searchTerms() const
return m_typeSelector->currentData().toString();
}
-bool DolphinFacetsWidget::isSearchTerm(const QString& term) const
+bool DolphinFacetsWidget::isSearchTerm(const QString &term) const
{
- static const QLatin1String searchTokens[] {
- QLatin1String("modified>="),
- QLatin1String("rating>="),
- QLatin1String("tag:"), QLatin1String("tag=")
- };
+ static const QLatin1String searchTokens[]{QLatin1String("modified>="), QLatin1String("rating>="), QLatin1String("tag:"), QLatin1String("tag=")};
for (const auto &searchToken : searchTokens) {
if (term.startsWith(searchToken)) {
return false;
}
-void DolphinFacetsWidget::setSearchTerm(const QString& term)
+void DolphinFacetsWidget::setSearchTerm(const QString &term)
{
if (term.startsWith(QLatin1String("modified>="))) {
const QString value = term.mid(10);
const QString value = term.mid(8);
const int stars = value.toInt() / 2;
setRating(stars);
- } else if (term.startsWith(QLatin1String("tag:")) ||
- term.startsWith(QLatin1String("tag="))) {
+ } else if (term.startsWith(QLatin1String("tag:")) || term.startsWith(QLatin1String("tag="))) {
const QString value = term.mid(4);
addSearchTag(value);
}
}
-void DolphinFacetsWidget::setFacetType(const QString& type)
+void DolphinFacetsWidget::setFacetType(const QString &type)
{
for (int index = 0; index <= m_typeSelector->count(); index++) {
if (type == m_typeSelector->itemData(index).toString()) {
m_ratingSelector->setCurrentIndex(stars);
}
-void DolphinFacetsWidget::setTimespan(const QDate& date)
+void DolphinFacetsWidget::setTimespan(const QDate &date)
{
if (!date.isValid()) {
return;
}
}
-void DolphinFacetsWidget::addSearchTag(const QString& tag)
+void DolphinFacetsWidget::addSearchTag(const QString &tag)
{
if (tag.isEmpty() || m_searchTags.contains(tag)) {
return;
updateTagsSelector();
}
-void DolphinFacetsWidget::removeSearchTag(const QString& tag)
+void DolphinFacetsWidget::removeSearchTag(const QString &tag)
{
if (tag.isEmpty() || !m_searchTags.contains(tag)) {
return;
updateTagsSelector();
}
-void DolphinFacetsWidget::initComboBox(QComboBox* combo)
+void DolphinFacetsWidget::resetSearchTags()
+{
+ m_searchTags = QStringList();
+ updateTagsSelector();
+ updateTagsMenu();
+}
+
+void DolphinFacetsWidget::initComboBox(QComboBox *combo)
{
combo->setFrame(false);
combo->setMinimumHeight(parentWidget()->height());
combo->setCurrentIndex(0);
- connect(combo, QOverload<int>::of(&QComboBox::activated), this, &DolphinFacetsWidget::facetChanged);
+ connect(combo, &QComboBox::activated, this, &DolphinFacetsWidget::facetChanged);
}
void DolphinFacetsWidget::updateTagsSelector()
if (hasSelectedTags) {
const QString tagsText = m_searchTags.join(i18nc("String list separator", ", "));
- m_tagsSelector->setText(i18ncp("@action:button %2 is a list of tags",
- "Tag: %2", "Tags: %2",m_searchTags.count(), tagsText));
+ m_tagsSelector->setText(i18ncp("@action:button %2 is a list of tags", "Tag: %2", "Tags: %2", m_searchTags.count(), tagsText));
} else {
m_tagsSelector->setText(i18nc("@action:button", "Add Tags"));
}
m_tagsSelector->setEnabled(isEnabled() && (hasListedTags || hasSelectedTags));
+ m_clearTagsAction->setEnabled(hasSelectedTags);
}
void DolphinFacetsWidget::updateTagsMenu()
{
updateTagsMenuItems({}, {});
- m_tagsLister.openUrl(QUrl(QStringLiteral("tags:/")), KCoreDirLister::OpenUrlFlag::Reload);
+ if (KProtocolInfo::isKnownProtocol(QStringLiteral("tags"))) {
+ m_tagsLister.openUrl(QUrl(QStringLiteral("tags:/")), KCoreDirLister::OpenUrlFlag::Reload);
+ }
}
-void DolphinFacetsWidget::updateTagsMenuItems(const QUrl&, const KFileItemList& items)
+void DolphinFacetsWidget::updateTagsMenuItems(const QUrl &, const KFileItemList &items)
{
- m_tagsSelector->menu()->clear();
+ QMenu *tagsMenu = m_tagsSelector->menu();
+ tagsMenu->clear();
QStringList allTags = QStringList(m_searchTags);
- for (const KFileItem &item: items) {
+ for (const KFileItem &item : items) {
allTags.append(item.name());
}
allTags.sort(Qt::CaseInsensitive);
const bool onlyOneTag = allTags.count() == 1;
- for (const QString& tagName : qAsConst(allTags)) {
- QAction* action = m_tagsSelector->menu()->addAction(QIcon::fromTheme(QStringLiteral("tag")), tagName);
+ for (const QString &tagName : std::as_const(allTags)) {
+ QAction *action = tagsMenu->addAction(QIcon::fromTheme(QStringLiteral("tag")), tagName);
action->setCheckable(true);
action->setChecked(m_searchTags.contains(tagName));
});
}
+ if (allTags.count() > 1) {
+ tagsMenu->addSeparator();
+ tagsMenu->addAction(m_clearTagsAction);
+ }
+
updateTagsSelector();
}
+
+#include "moc_dolphinfacetswidget.cpp"