]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/search/dolphinfacetswidget.cpp
Merge branch 'release/21.04'
[dolphin.git] / src / search / dolphinfacetswidget.cpp
index d9943abcd4867ea425629fc6b9bb74710b4f2a49..db53d595fa4ec707b83aa1aba4e02ae3f1f8c678 100644 (file)
@@ -1,26 +1,14 @@
-/***************************************************************************
-*    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 *
-*    the Free Software Foundation; either version 2 of the License, or    *
-*    (at your option) any later version.                                  *
-*                                                                         *
-*    This program is distributed in the hope that it will be useful,      *
-*    but WITHOUT ANY WARRANTY; without even the implied warranty of       *
-*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        *
-*    GNU General Public License for more details.                         *
-*                                                                         *
-*    You should have received a copy of the GNU General Public License    *
-*    along with this program; if not, write to the                        *
-*    Free Software Foundation, Inc.,                                      *
-*    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA           *
-* **************************************************************************/
+/*
+ *  SPDX-FileCopyrightText: 2012 Peter Penz <peter.penz19@gmail.com>
+ *  SPDX-FileCopyrightText: 2019 Ismael Asensio <isma.af@mgmail.com>
+ *
+ *  SPDX-License-Identifier: GPL-2.0-or-later
+ */
 
 #include "dolphinfacetswidget.h"
 
 #include <KLocalizedString>
+#include <KProtocolInfo>
 
 #include <QComboBox>
 #include <QDate>
@@ -66,6 +54,12 @@ DolphinFacetsWidget::DolphinFacetsWidget(QWidget* parent) :
     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));
@@ -110,9 +104,7 @@ void DolphinFacetsWidget::resetSearchTerms()
     m_dateSelector->setCurrentIndex(0);
     m_ratingSelector->setCurrentIndex(0);
 
-    m_searchTags = QStringList();
-    updateTagsSelector();
-    updateTagsMenu();
+    resetSearchTags();
 }
 
 QStringList DolphinFacetsWidget::searchTerms() const
@@ -231,6 +223,13 @@ void DolphinFacetsWidget::removeSearchTag(const QString& tag)
     updateTagsSelector();
 }
 
+void DolphinFacetsWidget::resetSearchTags()
+{
+    m_searchTags = QStringList();
+    updateTagsSelector();
+    updateTagsMenu();
+}
+
 void DolphinFacetsWidget::initComboBox(QComboBox* combo)
 {
     combo->setFrame(false);
@@ -253,17 +252,21 @@ void DolphinFacetsWidget::updateTagsSelector()
     }
 
     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)
 {
-    m_tagsSelector->menu()->clear();
+    QMenu *tagsMenu = m_tagsSelector->menu();
+    tagsMenu->clear();
 
     QStringList allTags = QStringList(m_searchTags);
     for (const KFileItem &item: items) {
@@ -272,22 +275,31 @@ void DolphinFacetsWidget::updateTagsMenuItems(const QUrl&, const KFileItemList&
     allTags.sort(Qt::CaseInsensitive);
     allTags.removeDuplicates();
 
+    const bool onlyOneTag = allTags.count() == 1;
+
     for (const QString& tagName : qAsConst(allTags)) {
-        QAction* action = m_tagsSelector->menu()->addAction(QIcon::fromTheme(QStringLiteral("tag")), tagName);
+        QAction *action = tagsMenu->addAction(QIcon::fromTheme(QStringLiteral("tag")), tagName);
         action->setCheckable(true);
         action->setChecked(m_searchTags.contains(tagName));
 
-        connect(action, &QAction::triggered, this, [this, tagName](bool isChecked) {
+        connect(action, &QAction::triggered, this, [this, tagName, onlyOneTag](bool isChecked) {
             if (isChecked) {
                 addSearchTag(tagName);
             } else {
                 removeSearchTag(tagName);
             }
-            emit facetChanged();
+            Q_EMIT facetChanged();
 
-            m_tagsSelector->menu()->show();
+            if (!onlyOneTag) {
+                m_tagsSelector->menu()->show();
+            }
         });
     }
 
+    if (allTags.count() > 1) {
+        tagsMenu->addSeparator();
+        tagsMenu->addAction(m_clearTagsAction);
+    }
+
     updateTagsSelector();
 }